Подписаться на блог

Jekyll & Poster

Немного о блоге

Кстати, о заказчиках и проектах. Впервые столь ответственно подхожу к заказу, над которым работаю “в соло”.

Вчера сегодня в связи с некоторыми обстоятельствами я бодрствовал глубокой ночью и, как обычно, смотрел в монитор. Думал, чем бы заняться, лишь бы не скучно было. Проекты писать не могу, ибо заказчики скидывают ТЗ уже несколько недель, а другие только пишут его, писать лабы — точно не моё.

В этот момент я снова наткнулся на папочку с Jekyll.
Таким образом мне в голову пришла идея взяться и, наконец, точно доделать свой блог на GitHub Pages + Jekyll, ибо уж очень нравится мне эта связка.

Снова я начал с поиска тем. За весь процесс “сборки” этого блога большую часть времени я тратил именно на поиск тем. Обязательными условиями для меня были поддержка всех особенностей md-разметки GitHub и лаконичная главная страница.
Подходящих тем было несколько, в итоге я остановился на “Arctic Fox”, подправил немного разметку и стили и… всё.

Вроде бы на этом всё, однако я опять-таки начал думать о том, как бы всё это пооблегчить, ведь каждый раз создавать новый файлик, закидывать в папку, push’ить это на git — не особо-то и приятно, плюс ко всему для того же twitter я написал консольную постилку, чтобы в случае необходимости если вдруг захочется, запостить что-то из терминала. Почему бы не написать подобное и для Jekyll-блога?

Jekyll-poster

Язык для сего “творения” я выбирал не долго. Хотя правильнее сказать, что я его и не выбирал, кроме Python я ни на что и не смотрел.

Единственная “левая” зависимость в скрипте — termcolor, т. к. люблю цветастые выводы скриптов и делаю их цветастыми где можно и нужно, и где нельзя.

Здесь можно разводить дискуссии о том, что это небезопасно, что пароль вытащат, но скрипт чисто для личного использования на домашнем компьютере, да и… вот так вот.

Все необходимые данные, что нужны скрипту:

  • dir — директория с блогом;
  • username — логин от github;
  • password — пароль от github;
  • repository — репозиторий с блогом на github.

Первым делом для поста генерируем имя файла нашего поста, согласно структуре Jekyll, дата — сегодня, разумеется.

def fileNameGen(title):
    now = datetime.datetime.now()
    date = str(now.year) + "-" + str(now.month) + "-" + str(now.day)
    fileName = date + "-" + title + ".md"
    return fileName

“Шапка” поста тоже — необходимость Jekyll, о которой я всё время забывал, “закидывая” посты с телефона.

def headerGen(title):
    headerGen = "---\nlayout: post\ntitle: " + title + "\n---"
    return headerGen

Сохранения файла в дерикторию нашего блога элементарное (как и весь скрипт, да).

def saveFile(fileName, fileHeader, fileText):
    os.chdir(dir+"/_posts")
    postFile = open(fileName, 'w')
    postFile.write(fileHeader + '\n' + fileText)
    postFile.close()
    pass

На самом деле у меня просто не получилось.

Самая важная, но в тот же момент кривая функция — ввод текста. Я на Python делал только элементарное, и многострочное редактирование текста не входит в этот список. Сделал максимально “костыльно”. В самом начале, конечно, думал, что можно будет nano вызвать как подпроцесс, но, увы, так нельзя.

def postTextGet():
    postText = ""
    print(colored("Post text: ","blue"))
    text = input(colored("(input \"%%END%%\" for close input)\n","red"))
    while (text != "%%END%%"):
        postText += "\n" + text
        text = input()
        pass
    return postText

На GitHub всё засылаем тут же.

def gitPush(repository, username, password):    
    os.chdir(dir)    
    #commit    
    commit=os.popen('git add . && git commit -m "New post"')    
    print(commit.read())    
    commit.close()    
    #push    
    push=os.popen('git push https://' + username + ':' + password + '@' + repository + ' --all')    
    result=push.read()    
    push.close()    
    return result

Затем всё объединяем.

def main():
    print(colored("Create new post to your Jekyll-blog!","cyan"))
    postTitle = input(colored("Post [page]-title: ","blue"))
    postLink = input(colored("Post [link]-title: ","blue"))
    fileName = fileNameGen(postLink)
    postText = postTextGet()
    saveFile(fileName, headerGen(postTitle), postText)
    gitPush(repository, username, password)   
    print(colored("Posted!","green"))
    pass

Заключение

Как видно, вся получилось максимально просто и криво, без каких-либо проверок и подобного, но они мне и не особо были нужны. Скрипт со своей задачей справляется отлично, вот только неудобный многострочный ввод всё портит, а как исправлять это — не знаю.

В качестве наиболее удобной альтернативы моей поделки можно использовать Prose.io.

На самом деле весь этот пост чисто для того, чтобы проверить шаблон и показать, какой у меня теперь блог есть. Не буду же просто так ссылочками спать, а тут “полезный” пост. Лежит все в репозитории.