Преобразование XML документа (описывающего файл уценки) в файл уценки - PullRequest
0 голосов
/ 18 июня 2020

Некоторое время использовал Ulysses App (приложение для записи уценки для Ma c) и создал сотни заметок. Ulysses App позволит вам писать в разметке, но внутри он сохраняет заметки в формате XML.

Теперь я хотел бы переместить свои заметки из него, но он не предлагает простой способ Сделай так. (По крайней мере, в некоторых крайних случаях, когда у вас есть встроенные изображения.)

Вот пример примечания в формате XML:

<sheet version="5" app_version="19.2">
<string xml:space="preserve">
<p><tags><tag kind="heading1"># </tag></tags>Ulysses App - Example note</p>
<p></p>
<p><tags><tag kind="heading2">## </tag></tags>This is a header 2</p>
<p></p>
<p>And here is some text under headar 2.</p>
<p></p>
<p><tags><tag kind="heading2">## </tag></tags>Now some more</p>
<p></p>
<p><tags><tag kind="orderedList">1. </tag></tags>Item one</p>
<p><tags><tag kind="orderedList">2. </tag></tags>Item two</p>
<p></p>
<p><tags><tag kind="heading2">## </tag></tags>Finally some code</p>
<p></p>
<p><tags><tag kind="codeblock"></tag></tags><attribute identifier="syntax">python</attribute>for j in range(10):</p>
<p><tags><tag kind="codeblock"></tag></tags>    print(j)</p>
<p></p>
<p></p>
<p></p></string>
</sheet>

Он будет отображаться как:

# Ulysses App - Example note

## This is a header 2

And here is some text under headar 2.

## Now some more

1. Item one
2. Item two

## Finally some code

```python
for j in range(10):
    print(j)
``

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

Может ли кто-нибудь указать мне правильное направление? Правильно ли выполнять преобразование XML через XSLT? Или это слишком тяжеловесно?

Я свободно говорю на Python. Имеет ли смысл разобрать XML в Python и попытаться преобразовать его через Python?

Все советы приветствуются и приветствуются.

Правила преобразования

На мой взгляд, правила преобразования выглядят так:

  • Документ состоит из абзацев. Даже заголовок находится (в) абзаце
  • Каждый абзац может иметь один или несколько «определителей».
  • Таким образом, абзац может содержать только простой текст, например <p>And here is some text under headar 2.</p>, или может иметь квалификатор до или после текста, как здесь: <p><tags><tag kind="orderedList">1. </tag></tags>Item one</p>.

В первой попытке я можно разобрать XML в Python, чтобы получить текст абзаца. Это даст мне самую суть моей записки.

Во второй итерации я могу сосредоточиться на синтаксическом анализе «тегов» (или квалификаторов).

После завершения я опубликую здесь свои результаты.

Вопрос: «Легко ли это» «сделать в XSLT?»

Обновление: Наивное решение в Python

Я придумал решение в Python3, которое получает все внутренние тексты абзацев и их дочерних элементов. Это очень похоже на мой файл уценки:

#!/usr/bin/env python3
import argparse
import xml.etree.ElementTree as ET



def load_xml(filename):
    tree = ET.parse(filename)
    root = tree.getroot()
    # Traverse second child!
    # First: "markdown", second: "string" (contains the content of the doc)
    content = root[1]
    return content


def main():
    # get filename from command line
    parser = argparse.ArgumentParser()
    parser.add_argument("--file", "-f", type=str, required=True)
    args = parser.parse_args()
    filename = args.file

    # load xml content
    content = load_xml(filename)

    # get all text from all children
    # https://stackoverflow.com/a/34240893/5115219
    para = list(content.itertext())
    # join text list
    text = "".join(para)
    print(text)


if __name__ == "__main__":
    main()

Тестовый прогон

➜  (venv:ulysses_xml) ulysses_xml ./process_xml.py -f Content.xml

# Ulysses App - Example note

## This is a header 2

And here is some text under headar 2.

## Now some more

1. Item one
2. Item two

## Finally some code

pythonfor j in range(10):
    print(j)

Конечно, некоторые вещи отсутствуют. Например, разметка блока кода внизу. И еще несколько мелких деталей. Но хотя бы первый старт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...