میخواهیم یک کتابخانه برای تجزیهی جدول بنویسیم.
یکی از علاقهمندیهای ما در نوشتن این کتابخانه، شیگرا نوشتن آن است پس برای نوشتن آن کلاسهایی را در نظر میگیریم.
هدف اصلی ما این است که این کتابخانه ورودیای مانند زیر بگیرد:
id|first header|second header|third header
1|salam|khoobi|khooshi?
2|quera|codecup 4|digikala
3|something|nothing|everything
4|this|is|easy
و در آخر یک کد htmlشده از جدول مثل
<table><tr><th>id</th><th>first header</th><th>second header</th><th>third header</th></tr><tr><td>1</td><td>salam</td><td>khoobi</td><td>khooshi?</td></tr><tr><td>2</td><td>quera</td><td>codecup 4</td><td>digikala</td></tr><tr><td>3</td><td>something</td><td>nothing</td><td>everything</td></tr><tr><td>4</td><td>this</td><td>is</td><td>easy</td></tr></table>
خروجی دهد.
در ادامه به شرح کلاسها و جزئیات پیادهسازی آنها میپردازیم.
جزئیات
کلاسها
\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
است و خروجیای مانند شکل زیر دارد:
<table><tr><th>header one</th><th>header two</td>...</tr><tr><td>row 1.1</td><td>row 1.2</td></tr><tr><td>row 2.1</td><td>row 2.2</td></tr>...</table>
دقت کنید هیچ فاصلهای در بین تگها یا در انتهای خروجی مجاز نیست.
\Quera\CodeCup4\TableParser\Row
یک ابسترکت کلاس است که \Quera\CodeCup4\TableParser\Header
و \Quera\CodeCup4\TableParser\Data
این کلاس را به ارث میبرند.
\Quera\CodeCup4\TableParser\Header
این کلاس وظیفهی نگهداری سطر اول جدول را بر عهده دارد و شامل توابع زیر است:
- یک کانتسراکتور که یک آرایه که در واقع ستونهای سطر اولند میگیرد. ستونها تنها میتوانند شامل حروف کوچک انگلیسی و اسپیس باشند و نباید خالی باشند همچنین محتوای ستونها باید از هم متمایز باشد در غیر اینصورت باید یک اکسپشن از نوع
InvalidHeaderException
پرت شود. - تابع
columnsCount
که تعداد ستونها را برگرداند. - تابع
render
که باید یک کدhtml
با تگtr
وth
به شکل زیر خروجی دهد:
<tr><th>first column</th><th>second column</th>...</tr>
دقت کنید هیچ فاصلهای نباید در بین تگها یا در ابتدا یا انتهای آنها باشد.
\Quera\CodeCup4\TableParser\Data
این کلاس وظیفهی نگهداری دیگر سطرهای جدول را بر عهده دارد و شامل توابع زیر است:
- یک کانستراکتور که یک آرایه که در واقع ستونهای سطر اند و یک هدر میگیرد. تعداد ستونهای سطر باید با تعداد ستونهای هدر برابر باشد؛ در غیر این صورت باید اکسپشنی از نوع
InvalidRowException
پرت شود. - تابع
columnsCount
که تعداد ستونها را برگرداند. - تابع
get
که یک ورودی مثلx
دارد، اگر ورودی از نوع عدد بود، آنگاه مقدار ستونx
ام (با شروع از ۰) سطر را برگرداند و در غیر اینصورت مقدار متناظر با سطر اولی که مقدار آن به شکلCamelCase
برابر باx
است را برگرداند. در هر دو صورت اگر ستون پیدا نشد یک اکسپشن از نوعColumnNotFoundException
پرت کند. - توابع به شکل
get*
دیگر توابعی که باget
شروع میشوند، باید به شکلCamelCase
مقدار ستون متناظر با هدرش را برگرداند (در مثالها توضیحات بیشتری داده میشود.) و در صورتی که تابع نامعتبر بود اکسپشنی از نوعInvalidMethodException
پرت شود. - تابع
render
که باید یک کدhtml
با تگtr
وtd
به شکل زیر خروجی دهد:
<tr><td>first column</td><td>second column</td>...</tr>
دقت کنید هیچ فاصلهای نباید در بین تگها یا در ابتدا یا انتهای آنها باشد.
کلاسهای دیگری نیز قابل استفاده هستند که در پروژهی اولیه آنها را میبینید.
CamelCase
منظور از CamelCase
در تبدیل این است که فاصلههای رشته حذف شده و حروف اول همهی کلمات به شکل بزرگ و بقیهی حرفها به کوچک نوشته شوند. به طور مثال alireza amir
به AlirezaAmir
تبدیل شود.
مثال
یک نمونه از اجرای این کلاسها شکل زیر است:
$table = \Quera\CodeCup4\TableParser\Parser::parse("id|first header|second header|third header
1|salam|khoobi|khooshi?
2|quera|codecup 4|digikala
3|something|nothing|everything
4|this|is|easy");
echo $table->render();
// <table><tr><th>id</th><th>first header</th><th>second header</th><th>third header</th></tr><tr><td>1</td><td>salam</td><td>khoobi</td><td>khooshi?</td></tr><tr><td>2</td><td>quera</td><td>codecup 4</td><td>digikala</td></tr><tr><td>3</td><td>something</td><td>nothing</td><td>everything</td></tr><tr><td>4</td><td>this</td><td>is</td><td>easy</td></tr></table>
echo $table->getHeader()->columnsCount();
// 4
echo $table->getHeader()->render();
// <tr><th>id</th><th>first header</th><th>second header</th><th>third header</th></tr>
echo $table->getRows()[0]->get(1);
// salam
echo $table->getRows()[0]->getId();
// 1
echo $table->getRows()[1]->getSecondHeader();
// codecup 4
echo $table->getRows()[1]->get("ThirdHeader");
// digikala
echo $table->getRows()[1]->getThirdHeader();
// digikala
echo $table->getRows()[1]->get(10);
// throws Quera\CodeCup4\TableParser\ColumnNotFoundException
echo $table->getRows()[1]->get("thirdHeader");
// throws Quera\CodeCup4\TableParser\ColumnNotFoundException
echo $table->getRows()[1]->get("third header");
// throws Quera\CodeCup4\TableParser\ColumnNotFoundException
echo $table->getRows()[1]->getInvalidHeader();
// throws Quera\CodeCup4\TableParser\InvalidMethodException
echo $table->getRows()[1]->randomFunction();
// throws Quera\CodeCup4\TableParser\InvalidMethodException
echo \Quera\CodeCup4\TableParser\Parser::parseHeader("a|b|c|d2")->render();
// throws Quera\CodeCup4\TableParser\InvalidHeaderException
echo (new \Quera\CodeCup4\TableParser\Header(['a', 'b', 'c']))->render();
// <tr><th>a</th><th>b</th><th>c</th></tr>
بارگذاری
پروژهی اولیه را میتوانید از زیر دانلود کنید. دانلود کدهای اولیه پروژه
در بارگذاری تنها کافی است پوشهی Quera
را داخل یک فایل زیپ قرار داده و ارسال کنید.
ارسال پاسخ برای این سؤال