Выделение текста жирным шрифтом с помощью фильтра 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.

Другие вопросы по тегам