dersblog

Markdown Bazli Web Yayinciligi, Github Pages

Artık Github'ta içinde markdown dosyaları içeren bir depo direk Github üzerinden blog tarzı Internet'te yayınlanır hale getirilebilir. Github Pages teknolojisi arka planda Jekyll yazılımı üzerinen markdown dosyalarını otomatik olarak HTML'e çeviriyor.

Bu özelliğin aktif edilmesi için repoya gidip Settings'e tıklanır, ve en altta Github Pages bölümü aktif edilir. Farklı temalar da buradan seçilebilir. Bunlar yapılınca dizinde otomatik bir _config.yml yaratılacak, bunun içine mesela

plugins:
  - jekyll-sitemap

eklersek Github Pages bizim için bir sitemap.xml üretir.

GP'ın güzel tarafı markdown ıcinde sanki HTML'den haberimiz yokmuş gibi davranabiliriz, mesela ben alt dizin şub1/şub2 içindeyim, ve şub3/şub4 içindeki bir yazı.md dosyasına bağlantı vermek istiyorum, bunun için [buraya tıkla](../../sub3/sub4/yazi.md) yazmam yeterli, bu bağlantı GP tarafından https://github.io/../repo1/sub3/sub4/yazi.html şeklindeki bir bağlantıya çevirilecektir .

Matematik Formülleri

Eğer Github Pages kendi şablonu üzerinen, mesela Slate şablonu üzerinden matematik formülleri servis etmek istersek, şurada anlatılıyor,

https://github.com/cjerdonek/gh-pages-theme-slate

ana dizinde /_layouts/default.html dosyasi yaratiriz, ve bu dosyaya

https://github.com/pages-themes/slate/blob/master/_layouts/default.html

görülen kodu koyarız. Bu kod mevcut Slate şablonu ile aynı kod, bu kodu olduğu gibi kullanınca öncesi sonrası hiçbir değişiklik görmemeniz lazım. Sonra bu kod içine istediğimiz ekleri yaparız, mesela MathJax için

<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    tex2jax: {inlineMath: [["$","$"],["\\(","\\)"]]}
  });
</script>
<script type="text/javascript"
   src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS_HTML-full">
</script>

<head> içine eklenir, bundan sonra Markdown dosyamızda iki $$ arası formüller gösterilecektir.

Jekyl Iptali

Github Pages aslında iki işi aynı anda yapıyor, hem arka planda HTML üretiyor, hem de bildiğimiz Web servisi gibi bu HTML'leri servis ediyor. Fakat eğer biz kendi HTML'imizi Markdown dosyalarından üretirsek, Jekyl üretimini iptal edip kendi sayfalarımızı servis edebiliriz.

İptal için en üst seviyede bir .nojekyll dosyası yaratmak lazım, içi boş olabilir önemli değil, GH bunu görünce HTML üretimini iptal edecek.

Şimdi kendi html dosyalarımızı markdown'dan üretmeye gelelim, alttaki gibi bir kod olabilir,

import os, sys, re, shutil, markdown

def ls(d,ignore_list=[]):
    print ('ls ignore lst', ignore_list)
    dirs = []; files = []
    for root, directories, filenames in os.walk(d):
        for directory in directories:
            path = os.path.join(root, directory)
            do_add = True
            for ignore in ignore_list:
                if ignore in path:
                    print ('ignoring', path); do_add = False
            if do_add: dirs.append(path)
        for filename in filenames: 
            path = os.path.join(root,filename)
            do_add = True
            for ignore in ignore_list:
                if ignore in path: do_add = False
            if do_add: files.append((path, os.path.getsize(path)))
    return dirs, files

def clean_html():
    if sys.argv[1] == 'clean-html2':
        dirs, files = ls(os.getcwd())
        for (f,size) in files:
            if ".md" in f:
                path = os.path.dirname(f)
                fmd = os.path.basename(f)
                fhtml = os.path.basename(f).replace(".md",".html")
                if os.path.isfile(path + "/" + fhtml):
                    print ('Erasing', path + "/" + fhtml)
                    os.remove(path + "/" + fhtml)

def gen_html():
        dirs, files = ls(os.getcwd())
        for (f,size) in files:
            if ".md" in f:
                path = os.path.dirname(f)
                fmd = os.path.basename(f)
                fhtml = os.path.basename(f).replace(".md",".html")
                update = True
                if os.path.isfile(path + "/" + fhtml):
                    mdtime = os.path.getmtime(path + "/" + fmd)
                    htmltime = os.path.getmtime(path + "/" + fhtml)
                    if htmltime > mdtime: update = False
                if update:
                    print ('Generating html for', f)
                    content = open(path + "/" + fmd).read()
                    res = markdown.markdown(content, extensions=['fenced_code'])
                    fout = open(path + "/" + fhtml, "w")
                    fout.write(res)
                    fout.close()

Kod en üst dizin seviyesinden işletilir, ve gördüğü her .md dosyası için aynı isimde bir .html dosyası üretir.


Yukarı