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