کتاب موبایل کتابخوان epub

کتاب نویسی دیجیتال: نسخه کتاب به فرمت epub

اینم یه تجربه پراکنده دیگه!

همانطور که میدونید من اخیرا کتاب پیش‌نمونه‌سازی رو ترجمه کردم. کلی چیزهای مفید در راه این ترجمه یاد گرفتم. حالا به پیشنهاد جادی سراغ این رفتم که نسخه epub این کتاب رو هم ایجاد کنم تا آدم‌های بیشتری بتونن راحت‌تر بخوننش و ازش استفاده کنن. همچنین باید بگم که جادی زحمت کشیده توی لینک‌های شاد دوشنبه آخر ماه این کتاب رو معرفی کرده.

کلا هم بخاطر وجود ابزار بسیار خوبی به اسم pandoc و نوشته شدن متن به فرمت markdown این عملیات تقریبا راحته!

مراحل این کار بصورت خلاصه اینهاست:

  1. اول از همه نوشتن متادیتاهای کتاب توی یک فایل خاص به اسم title.txt به فرمت yaml. این متا دیتا شامل اسم کتاب نام نویسنده و این دست اطلاعات است.
  2. تهیه کردن یک css برای تعیین فونت متن. لازم میدونم که اضافه کنم که epub یه فرمت خاص از xhtml و css یه سری متادیتای دیگه‌است که بصورت فشرده شده ارائه می شه. css بوسیله این سوئیج epub-stylesheet به pandoc معرفی می‌شه.
  3. اضافه کردن فونت‌ها درون فایل epub تا در صورتی که فایل روی خواننده مقصد وجود نداشته باشه از این فونت‌ها استفاده بشه. فرمت فونت‌هایی که بصورت رسمی پشتیبانی میشه oft و woff هست. اما استفاده از ttf و تقریبا سایر فرمت‌های فونت‌های وب هم پشتیبانی می‌شه. pandoc این کار رو با سوئیچ epub-embed-font انجام میده.
  4. اضافه کردن نحوه ورق خوردن کتاب که از راست به چپ باشه. این کار با کلید page-progression-direction توی متادیتای کتاب در فایل title.txt انجام می‌شه.
  5. برای اینکه متن‌ها هم چپ به راست باشن بایستی به تگ ‍‍‍‍‍‍ هریک از بخشها یک ویژگی اضافه بشه. اینکار بصورت مستقیم قابل انجام نبود و به همین خاطر با رجوع به میلینگ لیست pandoc و پرسیدن در این مورد با استفاده از چیزی به اسم template این مشکل هم حل شد.

نمونه انجام این کار توی شاخه epub تو github کتاب قابل روئیته.

همین!

pandoc-filter

لذت برنامه نویسی: نوشتن یک pandoc filter با python

اینم یه تجربه پراکنده دیگه!

همنطور که اخیرا زیاد نوشتم فرمت مورد علاقه تولید مستندات من markdown شده و برای تبدیل کردنش به یه متن تر و تمیز pdf از pandoc به همراه xepersian استفاده می‌کنم. حالا این وسط من یه مشکلی داشتم و اونم این بود که متون انگلیسی توی فارسی به درستی به فرمت xepersian تبدیل نمی‌شدند و هی مجبور بودم بصورت دستی متن latex بدست آمده رو ویرایش کنم. به همین خاطر علاقه مند شدم که ببینم چطور می‌شه این مشکل رو توی pandoc حل کرد. راه حل از این قراره که شما بایستی یه فیلتر برای pandoc تعریف کنی و اون pandoc filter اون کاری که ما دوست داریم رو برای ما انجام میده!

فیلترهای pandoc

زبان برنامه نویسی که pandoc با اون توسعه یافته haskell هست که خب به نظر من زبان عجیب غریبی هست. شما می‌تونید با استفاده از این زبان فیلترها رو توسعه بدید. کل ماجرای فیلترها هم از این قراره که ابتدا pandoc متن ورودی رو میخونه و به ساختار سلسله مراتبی داخلی خودش تبدیل می‌کنه. حالا این ساختار رو بصورت اصلی (که فقط در زبان haskell در دسترسه) یا بصورت json در اختیار فیلتر شما قرار می‌ده و فیلتر شما بر اساس فرمت نهایی، نوع المنت و متا دیتاهای مربوط به اون المنت تصمیم می‌گیره که چه کاری انجام بده. تقریبا هیچ مستندات درست حسابی من پیدا نکردم که همه چیز رو توضیح داده باشه، اما سعی کردم به کمک آزمایش و خطا و همچنین دیدن فیلترهای مشابهی که برای کارهای مختلف توسعه پیدا کرده بود گلیم خودم رو از آب بیرون بکشم.

همچنین میشه این فیلترها رو به زبانی غیر از haskell توسعه داد. این زبان‌های پایتون، جاوا اسکریپت(در محیط nodejs)، پرل و php هست. من به علت آشنایی بیشترم با پایتون از اون استفاده کردم

نحوه توسعه

کل روند از این قراره که شما فایل پایتون رو بصورت یک فیلتر با دسترسی اجرایی در اختیار pandoc قرار میدید و اون تابع main رو صدا میزنه. پس از اون اطلاعات از stdin به برنامه داده شده و خروجی‌ها از stdout گرفته می‌شه. خود توسعه دهنده pandoc هم پکیجی به نام pandocfilters توسعه داده که با استفاده از pip یا ابزارهای مشابه قابل نصب و استفاده است.

تنها کاری که باید انجام بشه اینه که تابعی نوشته بشه و به عنوان آرگومان به تابع ‍‍

پاس داده بشه. این تابع بایستی چهارتا ورودی داشته باشه که به ترتیبت ‍‍

هستن و نوع، مقدار، فرمت خروجی و متادیتاهاست. همین من با استفاده از همین‌‌ها فیلترم رو توسعه دادم و گذاشتم روی گیت‌هاب که اگه دیگران هم خواستن ازش استفاده کنن.

همین!
پ.ن.: برای مطالعه بیشتر به اینجا مراجعه کنید.

Markdown Doc Generation

markdown فرمت مورد علاقه تولید محتوای این روزهای من

اینم یه تجربه پراکنده دیگه!

من معمولا محتواهای زیادی تولید می‌کنم. یعنی گزارش پروژه، مستند‌سازی و … انجام میدم. معمولا قبلا برای این‌کار از word و office استفاده می‌کردم. بزرگترین مشکلی که با این سیستم داشتم این بود که به علت اینکه سیستم عامل اصلیم لینوکسه مجبور بودم توی یک ماشین مجازی کار کنم که به علت سرعت کم هارد دیسک لپ تاپم معمولا اذیتم می‌کرد. اما اخیرا یه مستند تقریبا ۷۰ صفحه‌ای با استفاده از markdown نوشتم که من رو به این نتیجه رسوند که الان وقت مهاجرت از ورد رسیده

قبلا نوشته بودم که چطور میشه یه متن رو یه بار نوشت و به فرمت‌های مختلف اون رو داشت. حالا من به کمک pandoc و markdown و latex و xepersian تونستم یه مجموعه ابزار کامل برای تبدیل متن با سر و شکل قابل قبول و قابل ارائه ایجاد کنم. حالا تصمیم گرفتم که این کار رو ادامه بدم و مشکلاتی که ممکنه بر بخورم رو اینجا مستند کنم.

همین!