Выделение текста жирным шрифтом с помощью фильтра Python Pandoc
Есть ли способ сделать текст жирным, используя пакет 'pandocfilters' ( https://github.com/jgm/pandocfilters/tree/master/examples) в pandoc?
В качестве минимального рабочего примера, предположим, у меня есть файл уценки ('foo.md'):
foobar.
Я хочу написать "filter.py" что-то вроде
from pandocfilters import toJSONFilter, Str,Emph
def boldify(key, val, fmt, meta):
if key == 'Str' and "foo" in val:
# this is the part I can't don't know how to do
# I would like to make the value be bold
return [Emph(val)]
if __name__ == '__main__':
toJSONFilter(boldify)
Таким образом, мы запускаем все это как
pandoc 'foo.md' --filter='filter.py' -o 'foo.docx'
Используя это, я получаю следующую ошибку:
pandoc: Error in $.blocks[0].c[0].c: expected [a], encountered String
CallStack (from HasCallStack):
error, called at pandoc.hs:144:42 in main:Main
Любая помощь будет оценена.
1 ответ
Я нашел ответ, и я опубликую то, что я нашел (и как я обнаружил это) в надежде помочь кому-то еще.
Что я нашел
Элемент Strong (или выделенный жирным шрифтом) требует список элементов Str в качестве входных данных, чтобы это работало
Мы должны изменить filter.py, чтобы вернуть
[Strong([Str(val)])]
вместо
[Strong(val)]
или же
[Strong(Str(val))]
Как я нашел ответ
Если мы изменим "foo.md" на:
**(foo)** bar
И получить абстрактное синтаксическое дерево через:
pandoc -t json -s foo.md
мы получаем
{"blocks":[{"t":"Para","c":[{"t":"Strong","c":[{"t":"Str","c":"(foo)"}]},{"t":"Space"},{"t":"Str","c":"bar"}]}],"pandoc-api-version":[1,17,0,5],"meta":{}}[1]+
В частности, немного:
{ "Т": "Сильный","С":[{"Т": "ул","С":"(Foo)"}]}
говорит нам форматирование, которое нам нужно, чтобы получить работающий AST.