Pull to refresh

Emacs для начинающих: Подготовка статей для Хабра в Emacs

Reading time4 min
Views4.3K
Введение


Мы уже много говорили о мощи Emacs. Давайте решим какую-нибудь практическую задачу. Например научимся готовить тексты статей для Хабра с минимумом ручной работы.

Прикинем, что нам нужно:

  • Преобразование текста в HTML
  • Спеллчекер
  • Подсветка синтаксиса текстов программ разных языков


Приступаем.

Преобразование текста в HTML: режим muse


Самый традиционный UNIX-вэй. Суть в том, что пишем статью в текстовом виде, соблюдая некоторые соглашения, достаточно простые, такие простейшие правила разметки, а потом обрабатываем этот текст парсером, который превращает наш текст в HTML файл, который мы и вставляем в форму редактирования статьи Хабра.

Установка


В Debian/Ubuntu пакет с этим режимом называется muse-el. Итак:

apt-get muse-el


В .emacs добавляем:

(require 'muse)
(require 'muse-html)


Теперь можно включать режим muse:

M-x muse-mode


Разметка


Разметка при работе с muse очень простая, так например если строку начать со звездочки, или несокольких, при трансляции muse превратит эту строку в заголовок с уровнем, равным количеству звездочек. Например так:

* Заголовок первого уровня
** Заголовок второго уровня


Для того, чтобы сделать параграф, нужно оставить пустую строку в
тексте. Для того, чтобы выделить слово, надо обрамить его одной, двумя
или тремя звездочками:

*выделенное слово* **сильнее** ***еще сильнее*** _подчеркнутое_ =моноспейс=


выделенное слово сильнее еще сильнее подчеркнутое моноспейс

Можно делать таблицы:

  Двойноя черта  || Разделяет поля заголовка
  Одиночная черта  | Разделяет поля тела таблицы
  Еще один ряд | тела таблицы
  Тройная черта  || Разделяет поля футера


Двойноя черта Разделяет поля заголовка
Одиночная черта Разделяет поля тела таблицы
Еще один ряд тела таблицы


Спеллчекер: flyspell


В Ubuntu 9.04 flyspell входит в emacs. Так что:

M-x flyspell-mode


и спеллинг проверяется на лету.

Форматирование исходных текстов программ: muse + python


Есть встроенный перевод исходных текстов программ в HTML при помощи пакета htmlizer.el, но к сожалению в Хабре такой HTML не показывается. Придется извращаться.

Хорошо переводит исходники в HTML утилита code2html, но ее выход нужно немножко подправить, чтобы текст программы хорошо выглядел в Хабре. А именно, вставить вместо лидирующих пробелов &nobsp;

Для этого пишем небольшую функцию на Python. Затем в текст статьи вставляем тэг вызова интерпретатора питона, текст программы и вызов нашей функции, Примерно так:

<python markup="">
import srcform
src = """
i = 1
while i < 10:
    print i
    i += 1
"""
srcform.src_form('code2html -lpython -H -t4',src)
</python>


Результат работы:

i = 1
while i < 10:
    print i
    i += 1

Преобразование в HTML


M-x muse-publish-this-file
Publish with style: html


Проблемы


При работе с muse пришлось встретится с некоторыми проблемами.

1. В режиме muse-mode в faces для отображения заголовков указан фонт helv. Но в нем нет русских символов. Если кастомизируем faces, muse при включении все равно переписывает значения настроек для faces. Пришлось сделать функцию-обертку, в которой после установки режима muse-mode опять переконфигурируются faces.
2. Хабр не отображает одиночную цифру 0 (ноль), расцвеченную таким образом.

В комментах alexott подсказал решение проблемы 1. Нужно в face 'variable-pitch' заменить фонт 'helv' на какой-нибудь другой, например 'fixed-misc' или 'arial'.

Если кто не знает, то делается это легче всего так. Набираем команду:

M-x describe-face variable-pitch


В полученном описании face щелкаем по ссылке '(customize this face)'. В появившемся буфере кастомизации меняем значение в поле 'Font family' с 'helv' на то, что Вам нужно, например на 'arial'. Теперь нажимаем на кнопочку 'Save for Future Sessions'. Команды изменения face будут дописаны в конец Вашего файла .emacs .

Приложение


Текст скрипта для вызова утилиты.

import subprocess

def src_form(command,in_src):
    in_str = in_src
    proc = subprocess.Popen([command],
                            shell=True,
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,)
    stdout_value = proc.communicate(in_str)[0]
    lines_in = stdout_value.splitlines()
    lines_out = []
    print "<literal>"
    for line in lines_in:
        l_out = ""
        l_out = line.lstrip()
        spaces = len(line) - len(l_out)
        for j in xrange(spaces):
            l_out = "&nbsp;" + l_out
        print l_out
    print "</literal>"
Tags:
Hubs:
Total votes 43: ↑36 and ↓7+29
Comments52

Articles