Некоторое время использовал 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)
Конечно, некоторые вещи отсутствуют. Например, разметка блока кода внизу. И еще несколько мелких деталей. Но хотя бы первый старт.