میخواهیم یک کتابخانه برای تجزیهی جدول بنویسیم.
یکی از علاقهمندیهای ما در نوشتن این کتابخانه، شیگرا نوشتن آن است پس برای نوشتن آن کلاسهایی را در نظر میگیریم.
هدف اصلی ما این است که این کتابخانه ورودیای مانند زیر بگیرد:
و در آخر یک کد htmlشده از جدول مثل
خروجی دهد.
در ادامه به شرح کلاسها و جزئیات پیادهسازی آنها میپردازیم.
\Quera\CodeCup4\TableParser\Parser
🔗این کلاس کلاسِ اصلی ما است که دارای سه تابع زیر از نوع استاتیک است:
parse
که یک کد میگیرد و یک خروجی از نوع \Quera\CodeCup4\TableParser\Table
بر میگرداند که جدول ساخته شده است، کد جدول از چندین سطر تشکیل شده که ستونهای هر سطر با |
از هم جدا شدهاند.parseHeader
که یک خط کد به عنوان سطر اول جدول میگیرد و یک خروجی از نوع \Quera\CodeCup4\TableParser\Header
بر میگرداند و در صورت معتبر نبودن کد یک اکسپشن از نوع InvalidHeaderException
پرت میکند.parseRow
که یک خط کد به عنوان سطر جدول و یک Header
میگیرد و یک خروجی از نوع \Quera\CodeCup4\TableParser\Data
بر میگرداند و در صورت معتبر نبودن کد یک اکسپشن از نوع InvalidRowException
پرت میکند.\Quera\CodeCup4\TableParser\Table
🔗این کلاس وظیفهی نگهداری جدول را بر عهده دارد و شامل توابع زیر است:
Header
و یک آرایه از نوع Data
میگیرد و جدول را از روی آن میسازد.getHeader
که سطر اول را بر میگرداند.getRows
که یک آرایه از سطرها برمیگرداند.render
که کد html
مربوط به جدول را ساخته و بر میگرداند.
این تابع تنها شامل تگهای table
، tr
، td
و th
است و خروجیای مانند شکل زیر دارد:دقت کنید هیچ فاصلهای در بین تگها یا در انتهای خروجی مجاز نیست.
\Quera\CodeCup4\TableParser\Row
🔗یک ابسترکت کلاس است که \Quera\CodeCup4\TableParser\Header
و \Quera\CodeCup4\TableParser\Data
این کلاس را به ارث میبرند.
\Quera\CodeCup4\TableParser\Header
🔗این کلاس وظیفهی نگهداری سطر اول جدول را بر عهده دارد و شامل توابع زیر است:
InvalidHeaderException
پرت شود.columnsCount
که تعداد ستونها را برگرداند.render
که باید یک کد html
با تگ tr
و th
به شکل زیر خروجی دهد:دقت کنید هیچ فاصلهای نباید در بین تگها یا در ابتدا یا انتهای آنها باشد.
\Quera\CodeCup4\TableParser\Data
🔗این کلاس وظیفهی نگهداری دیگر سطرهای جدول را بر عهده دارد و شامل توابع زیر است:
InvalidRowException
پرت شود.columnsCount
که تعداد ستونها را برگرداند.get
که یک ورودی مثل x
دارد، اگر ورودی از نوع عدد بود، آنگاه مقدار ستون x
ام (با شروع از ۰) سطر را برگرداند و در غیر اینصورت مقدار متناظر با سطر اولی که مقدار آن به شکل CamelCase
برابر با x
است را برگرداند. در هر دو صورت اگر ستون پیدا نشد یک اکسپشن از نوع ColumnNotFoundException
پرت کند.get*
دیگر توابعی که با get
شروع میشوند، باید به شکل CamelCase
مقدار ستون متناظر با هدرش را برگرداند (در مثالها توضیحات بیشتری داده میشود.) و در صورتی که تابع نامعتبر بود اکسپشنی از نوع InvalidMethodException
پرت شود.render
که باید یک کد html
با تگ tr
و td
به شکل زیر خروجی دهد:دقت کنید هیچ فاصلهای نباید در بین تگها یا در ابتدا یا انتهای آنها باشد.
کلاسهای دیگری نیز قابل استفاده هستند که در پروژهی اولیه آنها را میبینید.
CamelCase
🔗منظور از CamelCase
در تبدیل این است که فاصلههای رشته حذف شده و حروف اول همهی کلمات به شکل بزرگ و بقیهی حرفها به کوچک نوشته شوند. به طور مثال alireza amir
به AlirezaAmir
تبدیل شود.
یک نمونه از اجرای این کلاسها شکل زیر است:
پروژهی اولیه را میتوانید از زیر دانلود کنید. دانلود کدهای اولیه پروژه
در بارگذاری تنها کافی است پوشهی Quera
را داخل یک فایل زیپ قرار داده و ارسال کنید.