# از وردپرس به نیکولا



خیلی وقت بود که به فکر انتقال وبلاگم به یکی از سیستم‌های وبلاگ ایستا (Static)
بودم. عمده‌ترین دلیلش هم قابلیت خوب Github برای انتشار چنین وبلاگ‌هایی بود. اما
بیشتر از یک سال این فکر را عقب انداختم تا دیگر کم کم نگهداری از هاست و دامین
وبلاگ آن هم با نوع سرویس دهی شرکت‌های ایرانی‌، برایم خسته کننده شد. وبلاگ‌نویسی
قرار نیست تمام فکر و ذکرم را به خودش مشغول کند‌! قرار است یک جای ساده باشد که
خیلی راحت بتوان تویش نوشت و منتشر کرد. (الان که دارم می‌نویسم‌، دامین اصلی وبلاگم
Shahinism.com لنگ به هواست و نمی‌توانم DNS را به هاست قبلی منتقل کنم)



## چرا یک وبلاگ ایستا؟


خوب به طور کلی دلایلش از این قرارند:


* **سرعت‌، سرعت‌، سرعت:** دیگر در این نوع از وبلاگ‌، خبری از پایگاه داده نیست.
همین‌طور قرار نیست هیچ پردازشی در سمت سرور وبلاگ قرار گیرد. و خوب طبیعتا خیلی
خیلی امکاناتی که این ابزار‌ها فراهم می‌کنند را نمی‌توانم داشته باشم. اما حقیقتش
در یک وبلاگ‌، به بسیاری از این ابزار‌ها نیاز ندارم. به هر حال این نبودن‌ها‌، یعنی
سرعت بیشتر. در مورد من‌، سرعت لود صفحات‌، حدودا سه برابر بیشتر شد.
* **سادگی:** فکر نمی‌کنم چیز زیادی در این زمینه برای گفتن باقی گذاشته باشم.
* **امنیت:** وقتی تنها با صفحات سادهٔ HTML روبرو هستید. وقتی یک سیستم انتشار قابل
اطمینان دارید‌‌، دیگر نباید نگران آپدیت بودن ابزار وبلاگ‌نویسی‌تان و یا هک شدنش
باشید. این‌طور نیست؟
* **محدود نبودن پهنای باند:** این یکی از آن کابوس‌هایی است که بی‌خبر به سراغ‌تان
می‌آید. ولی خوب خوشبختانه روی گیت‌هاب‌، این نگرانی را نداریم ;-)
* **قابلیت بازیابی:** خوب این یکی زیاد مربوط به خود سیستم وبلاگ‌نویسی نیست. ولی
چون نتیجهٔ کارش را می‌توان با هر سیستم دلخواهی منتشر کرد و من گیت را انتخاب
کرده‌ام‌، خیلی راحت می‌توانم در صورت گند زدن‌، بدون هیچ استرسی آن را به حالت قبل
برگردانم. این قابلیت روی هاست‌های اشتراکی پولی و گران است و در سرور‌های اختصاصی‌،
خیلی پر دردسر‌تر از چیزی که در این‌جا با آن طرفیم ;-)





## کدام سیستم؟


به هر حال‌، پس از قطعی شدن تصمیم انتقال‌، باید یکی از سیستم‌ها را انتخاب می‌کردم. به
طور کلی این سیستم‌ها اعم از [Nikola](http://nikola.ralsina.com.ar/), [Pelican](http://docs.getpelican.com/), [Octopress](http://octopress.github.ip/) و خیلی‌های دیگر که با یک
سرچ در اینترنت می‌توانید پیدایشان کنید‌، تفاوت عمده‌ای در نتیجهٔ کار ندارند. طرز
کارشان فوق‌العاده ساده است. شما متن پست وبلاگ‌تان را در یک فایل حالا به هر فرمتی
که سیستم مورد نظر برای‌تان مهیا کرده می‌نویسید‌، یک قالب هم بر اساس قوائد تعیین شدهٔ
سیستم به آن می‌خورانید و می‌گویید که وبلاگ آماده شود. در نهایت این سیستم می‌آید یک
سایت کاملا ایستا در فایل‌های html آماده می‌کند که شامل پست‌های شماست و بر اساس قالب
مورد نظر‌تان قالب‌بندی شده.


من [Nikola](http://nikola.ralsina.com.ar/) را انتخاب کردم‌، چون اولا پایتونی است‌ و بعد از آن خیلی راحت‌تر از
[Pelican](http://docs.getpelican.com/) که آن هم پایتونی است نصب می‌شود. همین!





## نام فارسی پست‌ها و مشکلاتش


برای انتقال وبلاگ وردپرسی‌ام کافی بود که یک خروجی XML از وبلاگم بگیرم و آن را به
صورت زیر به نیکولا بخورانم:



```
nikola import_wordpress wordpress_output.xml

```

و در این‌جا یک مشکل ساده پیش رویم بود. من روی وبلاگ وردپرسی‌ام از URL‌های فارسی
برای پست‌ها استفاده می‌کردم. همان‌طور که می‌دانید کاراکتر‌های Unicode در URL‌ها به
صورت خاصی کد می‌شوند و اگر ما آن‌ها را در مرورگرمان به صورت فارسی می‌بینیم‌، این
تنها قابلیت مرورگرمان است و بس! یعنی آدرس اصلی URL‌ها همان کد‌های در هم و شلخته
است. به هر حال روی وردپرس این امکان مشکل زیادی ایجاد نمی‌کرد و از قرار به SEO
سایت هم کمک می‌کرد.


در فرآیند انتقال‌، نیکولا به ازای هر پست یک فایل تکست که حاوی متن پست است با
پسوند wp و یک فایل جدا با فرمت meta که حاوی تگ‌ها و اطلاعات دیگر پست است ایجاد
می‌کند. نام این فایل‌ها را با کمی دستکاری‌، از روی آدرس قبلی پست‌ها بر می‌دارد. اولین
باری که وبلاگ را وارد کردم‌، یک کابوس واقعی بود‌! اسم فایل‌ها همان کاراکتر‌های
یونیکد کد شده بود و مدیریت‌شان واقعا سخت.


خوشبختانه پایتون در ماژول urllib متدی به اسم unqoute دارد که می‌تواند این رشته‌ها
را به هم‌تای یونیکدی‌شان ترجمه کند. این مساله را با نویسندهٔ [Nikola](http://nikola.ralsina.com.ar/) در میان گذاشتم
و او هم این قابلیت را به نیکولا اضافه کرد. با این تفاوت که اسم فایل‌ها باز هم
فارسی نبود. برای مثال پستی به اسم **این ایمکس دوست داشتنی (بالانس کردن
پرانتز‌ها)** اسمی به صورت **yn-ymkhs-dwst-dshtny-blns-khrdn-prn** می‌گرفت. خوب که
توجه کنید یک تلاش ناشیانه برای فینگلیش کردن کاراکتر‌ها را می‌بینید. این‌طور نیست؟
خوب این برایم خیلی جالب بود. این عمل با استفاده از تابع [unidecode](http://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/) پایتون در متد
slugify نیکولا انجام می‌گرفت. چند نفر دیگر هم این مشکل را با توسعه دهندهٔ [Nikola](http://nikola.ralsina.com.ar/)
در میان گذاشتند‌، ولی از قرار فعلا نیکولا لازم است که از این تابع استفاده کند‌ و
راهی برای دور زدنش نیست (من هم هرچند سوادش را ندارم‌، ولی زیاد درگیرش نشده‌ام).


این است که پست‌های قبلی وبلاگم‌، آدرس‌هایی کوتاه‌تر‌، شکیل‌تر ولی نامفهوم و غیر SEO
دارند. اما هر چه باشد‌، فعلا قابل تحمل است‌، شاید در آینده فکری به حالش کردم.




## طراحی قالب


نیکولا قابلیت استفاده از دو زبان برای طراحی قالبش را دارد. [Mako](http://www.makotemplates.org/) و [Jinja2](http://jinja.pocoo.org/). من
به خاطر خوشگلی [Jinja2](http://jinja.pocoo.org/) را انتخاب کردم و پس از مطالعهٔ [مستنداتش](http://jinja.pocoo.org/docs/templates/) شروع به نوشتن یک
قالب برای [Nikola](http://nikola.ralsina.com.ar/) کردم. و خوب از آن‌جایی که بنیاد اصلی قالب‌های نیکولا [Mako](http://www.makotemplates.org/) بود‌،
زیاد دستم به جایی بند نبود. این بود که قالب **Orphan** نیکولا را که با [Mako](http://www.makotemplates.org/)
نوشته شده بود به [Jinja2](http://jinja.pocoo.org/) ترجمه کردم و روی آن کار کردم. ترکیبش با استایل و Markup
قالب وردپرسی [Manifest](http://themes.jimbarraud.com/manifest) چیزی است که الان روی این وبلاگ می‌بینید. ترجمهٔ Jinja2‌ای
قالب Orphan را برای اضافه شدن به [Nikola](http://nikola.ralsina.com.ar/) کامیت کردم‌، ولی هنوز اضافه نشدم (همان
بهتر که اضافه نشده‌، چون مشکلاتی دارد که باید حل کنم). قالب فعلی هم بعد از تکامل
به لیست قالب‌های [Nikola](http://nikola.ralsina.com.ar/) اضافه می‌شود.




## Syntax highlighter در پست‌ها


خوب من در وبلاگم زیاد کد به اشتراک می‌گذارم. این است که یک **Syntax highlighter**
خوب می‌تواند خیلی کمک کننده باشد. قبلا از دو افزونهٔ مختلف وردپرس که هر کدام نحو
مخصوص به خودشان را داشتند استفاده کرده بودم و با هزار بدبختی نحو یکی را با دیگری
منطبق کردم که ساختار وبلاگ یک‌پارچه به نظر آید. ولی بعد از انتقال به [Nikola](http://nikola.ralsina.com.ar/) هیچ
کدام از این نحو‌ها درست کار نمی‌کرد.


باید بیش از ۲۰۰ پست را جستجو می‌کردم و هر جا کدی بود آن را به صورت دستی ویرایش
می‌کردم و به شکلی منطبق با **Markdown** در می‌آوردم ([Nikola](http://nikola.ralsina.com.ar/) پس از وارد کردن
پست‌های وردپرسی به وبلاگ‌، به صورت خودکار آن‌ها را با Markdown کامپایل می‌کند). خوب
وقتی [Emacs](http://shahinism.github.io/categories/emacs.html) کبیر ویرایش‌گر محبوب‌تان باشد‌، با **dired** و یک Query می‌توانید کل این
ویرایش‌ها را یک‌جا انجام دهید (نکات تکنیکی کار را بعدا در پست‌های جداگانه می‌نویسم.
ولی همین اشاره‌ها هم باید به قدر کافی روشنگر باشند).


این را هم اضافه کنم که [Nikola](http://nikola.ralsina.com.ar/) برای این کار از Pygments استفاده می‌کند که لیست
Lexer‌هایش را می‌توانید از [اینجا](http://pygments.org/docs/lexers/) ببینید.




## دیدگاه‌ها


قبلا گفتم که با [Nikola](http://nikola.ralsina.com.ar/) دیگر خبری از پایگاه داده نیست. تنها ابزار خیلی خیلی مهم
مورد نیاز برای وبلاگ‌نویسی بخش دیدگاه‌هاست که از چند وقت پیش دوباره برگردانده
بودمش روی [Disqus](http://disqus.com). این ابزار فوق‌العاده است. ولی خوب فعلا یک مشکل عمده‌ای که با آن
دارم این است که نمی‌توانم متن کامنت‌ها را در آن راست به چپ کنم. قبلا این امکان در
آن وجود داشت که با CSS آن را کنترل کنم. ولی در نسخهٔ جدید این امکان را حذف
کرده‌اند (چرا؟ نمی‌دانم). با مدیرانش تماس گرفتم و گفتند که در تلاشند تا امکان
نمایش درست دیدگاه‌های RTL را به [Disqus](http://disqus.com) اضافه کنند. تا آن موقع مجبوریم با این یکی
کنار بیاییم D:


اما یک نکتهٔ دیگر هم باقی می‌ماند. همانطور که قبلا گفتیم‌، بعد از انتقال به [Nikola](http://nikola.ralsina.com.ar/)
آدرس پست‌های‌مان تغییر کرده. در نتیجه‌، [Disqus](http://disqus.com) از آدرس‌های جدید برای کامنت‌های
وبلاگ‌مان استفاده می‌کند و کامنت‌های قبلی‌مان را در جای درست نشان نمی‌دهد. [Disqus](http://disqus.com)
برای این کار یک قابلیت Migration دارد که با گرفتن یک فایل ‎.csv آدرس کامنت‌های
قبلی را به هم‌تایان جدید‌شان تبدیل می‌کند. [Nikola](http://nikola.ralsina.com.ar/) به طور خودکار پس از وارد کردن
وردپرس‌، این فایل را در شاخهٔ اصلی ایجاد می‌کند که می‌توانید استفاده کنید.




## استفاده از Github


برای این‌کار کافی است یک مخزن در [Github](http://github.com) ایجاد کنید و پوشهٔ **output** را به آن
بسپارید. ضمنا توجه کنید در صورتی که قصد دارید مثل من وبلاگ (برای کاربر یا یک
گروه) ایجاد کنید نام مخزن باید به صورت **username.github.io** باشد و صفحات در
برنچ **master** آپلود شوند.



### انتقال دامنه


اگر مثل من قصد داشتید که یک دامنهٔ مستقل به وبلاگ پیوند بزنید‌، کافیست یک فایل به
اسم CNAME که تنها حاوی دامنهٔ مورد نظر به صورت text است در شاخهٔ اصلی مخزن اضافه
کنید. و سپس در دامنه‌تان یک [A Record](http://en.wikipedia.org/wiki/Domain_Name_System) به IP شمارهٔ 204.232.175.78
اضافه کنید (برای این کار باید به DNS Management دامنه‌تان دسترسی داشته باشید). و
خوب مشکل بعدی این‌جا سر راهم سبز شد. در هنگام ثبت دامنه‌ام‌، قرار بود من دسترسی
کامل به دامنه داشته باشم و چون قبل از این نمی‌دانستم A Record چیست‌، فکر می‌کردم
همین‌طور هم هست. می‌توانستم DNS‌ها را کنترل کنم‌، ولی هیچ‌وقت نیاز به یک Record
نداشتم. به هر حال‌‌، چون دیدم به DNS Manager دسترسی ندارم‌، یک تیکت به ثبت کنندهٔ
دامنه‌ام زدم و کاشف به عمل آمد این یکی جزء خدمات پولی است‌! خوب چون مدت زیادی به
پایان دامنه‌ام نمانده‌، قصد دارم دامنه را به یک Provider اجنبی منتقل کنم که این
خدمات و خیلی چیز‌های دیگر که تا قبل از این نمی‌دانستم می‌توانم با دامنه‌ام انجام دهم
را مجانی بهم می‌دهد و پول تمدید خیلی کمتری هم طلب می‌کند!




### 301 Redirect


چون نمی‌توانستم دامینم را منتقل کنم (این اتفاق بانی خیر شد)‌، یک‌جور‌هایی ناجور بود
که دو دامنهٔ متفاوت با یک محتوا فعال باشند (Google به این خاطر امتیاز کم می‌کند).
جستجو کردم و دیدم از قبل برای این کار پیش‌بینی‌های لازم شده. این اخطار‌های ۴.۴ یا
۴۰۳ (که این دومی را ما ایرانی‌ها خوب می‌شناسیم) را که یادتان هست. از قرار در زمان
اولیه اینترنت اتاق ۳۰۱‌ای بوده که وظیفهٔ انتقال دادن درخواست‌ها را بر عهده داشته.


اما قبل از این که به چگونگی این کار بپردازم به این نکته اشاره کنم که اول از همه
به فکرم رسید که دامین را فروارد کنم (که خوشبختانه رایگان بود D:) و این کار را هم
کردم. ولی نمی‌دانم Github چرا دامین منتقل شده را درک نمی‌کند و اخطار ۴۰۴ می‌دهد. به
هر حال بعدش بود که تغییر مسیر ۳۰۱ را پیدا کردم و دیدم که چقدر بهتر از آن Forward
است.


برای این کار چند انتخاب داشتم. اول این که ‎.htaccess را دستکاری کنم. دوم این که
به مخزن عظیم پلاگین‌های وردپرس پناه ببرم. خوب من دومی را انتخاب کردم. چون این‌طوری
هنوز هم به خیلی از اطلاعات دیگری که وردپرس فعلا می‌تواند در اختیارم بگذارد دسترسی
دارم. افزونهٔ [Redirection](http://wordpress.org/extend/plugins/redirection/)
وردپرس این کار را انجام می‌دهد. و خوشبختانه هم فایل با پسوند CSV‌مان را می‌خواند هم
دستور ‎.htaccess را به عنوان ورودی می‌گیرد.


من که یک فایل CSV که [Nikola](http://nikola.ralsina.com.ar/) برایم آماده کرده بود را داشتم‌، هدفم هم استفاده از
همان بود. ولی یک مشکلی بود! آدرس‌ها با این فرض ساخته شده بود که دامینم بعد از
انتقال Shahinism.com می‌ماند که فعلا این‌طور نیست. یعنی یک همچین چیزی:



```
shahinism.com/oldversion/page1, shahinism.com/page1

```

که من می‌خواستم به همچین شکلی در آید:



```
shahinism.com/oldversion/page1, shahinsm.github.io/page1

```

خوب برای یک خط ساده است‌‌، ولی برای دویست و خرده‌ای خط و قاطی با کلی کاراکتر کد شدهٔ
یونیکد چطور؟ آن هم ساده است. باز هم [Emacs](http://shahinism.github.io/categories/emacs.html) و این‌بار با کمک [Multiple cursor](http://emacsrocks.com/e13.html) که اعجوبه‌ای است برای خودش. این است که تا موعد
سر رسیدن هاستینگم‌، آدرس تمام پست‌های قبلی به این وبلاگ منتقل می‌شوند و گوگل هم گم
نمی‌شود.


بعد از آن هم که دیگر امیدوارم دامین اصلی‌ام روی وبلاگ سوار شده باشد.


منابع دیگر:


* [راهنمای نیکولا](http://nikola.ralsina.com.ar/handbook.html)
* [راهنمای صفحات گیت‌هاب](http://pages.github.com/)
* [راهنمای restructuredText](http://docutils.sourceforge.net/docs/user/rst/quickref.html#external-hyperlink-targets) که من برای نوشتن این پست از آن استفاده کردم و فوق‌العاده لذت بردم.
* [راهنمای سادهٔ تغییر قالب Orphan با Mako](http://nikola.ralsina.com.ar/creating-a-theme.html)






