emacs-lispが書けないので、pythonでorg-modeのパーサ探したらあったのでお試し。
サンプルorgファイルの読み込みと、読み込み結果のorgテキスト化を試します。
公式ドキュメントはこちら。
https://orgparse.readthedocs.io/en/latest/
今回使うのは以下のサンプル。
$ cat sample.org
* Heading 1
:PROPERTIES:
:ID: 48c4a07e-95c1-41ff-a1f0-8e2f6ad88761
:END:
** TODO [#B] Heading 2
DEADLINE: <2020-05-09 Sat>
** DONE Heading 2
CLOSED: [2020-05-09 Sat 22:21]
*** Heading 3
SCHEDULED: <2020-05-09 Sat>
* Heading 1 :ARCHIVE:
まずは必要なパッケージのインストール。
読み込みと書き込みでパッケージが別々になっています。
$ pip install orgparse orger
読み書きのサンプルコードは以下。
$ cat org-parse.py
from orgparse import load
from orger import inorganic
root = load('sample.org')
print('--- for node in root[1:] ---')
# 上の行のノードから順に実行
for node in root[1:]:
print(node.heading)
# 上の階層のノードから順に実行
print('--- for node in root.children ---')
# for node in root.children
for node in root.children:
print(node.heading)
# 書き込み用のパッケージへのコピー
def get_node(node):
children = [get_node(child) for child in node.children]
scheduled = None if node.scheduled is None else node.scheduled.start
return inorganic.node(
heading=node.heading, # タイトル読み込み
todo=node.todo, # TODO, DONE など読み込み
tags=node.tags, # タグ読み込み
scheduled=scheduled, # scheduled 読み込み, 読み込みはdeadlineもあり
properties=node.properties, # 個別読み込みは node.get_property('ID')
body=node.body, # 中身の読み込み
children=children
)
print('--- write to org file ---')
for node in root.children:
node = get_node(node)
print(node.render())
実行結果
$ python3 org-parse.py
--- for node in root[1:] ---
Heading 1
Heading 2
Heading 2
Heading 3
Heading 1
--- for node in root.children ---
Heading 1
Heading 1
--- write to org file ---
* Heading 1
:PROPERTIES:
:ID: 48c4a07e-95c1-41ff-a1f0-8e2f6ad88761
:END:
** TODO Heading 2
** DONE Heading 2
*** Heading 3
SCHEDULED: <2020-05-09 Sat>
* Heading 1 :ARCHIVE:
簡単に org ファイルの読み書きが出来ました。
これで todo の集計などが python スクリプトで書けそうです。
なお、2020/05/09 現時点では書き込み専用パッケージの inorganic 側が closed や deadline に対応していない模様。
※ 読み込みは問題なくできます
orgの書き込みパッケージはまだ仮段階で、APIの検討中らしいです。
関連 issue : https://github.com/karlicoss/orgparse/issues/11
ちなみに、今回の関連リポジトリは以下の通り。全部同じ方が作ってくださっています。
- https://github.com/karlicoss/orgparse
- https://github.com/karlicoss/inorganic
- https://github.com/karlicoss/orger
特に orger というパッケージは github, pdf, tiwtter などを org 化し、
あらゆる情報を org で管理することが目標のようです。
evernote の emacs-org 版みたいなものですかね。いずれ使ってみたいです。