Jekyll & Poster

Published • 4 min read

#Jekyll, #Blog

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

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

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

В этот момент я снова наткнулся на папочку с 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.


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


© Igor Fedyukin 2009 - 2020