Notion断捨離用にConfluenceエクスポートファイル内の最終更新日付を洗い出してみた

NotionはConfluenceのインポートを行う際に最終更新日付を反映しません。ですが、アーカイブ内には日付が記載されています。そこでファイル名一覧に合わせる形で日付を取得し、参考用の一覧としてみました。
2022.07.11

ConfluenceのエクスポートファイルをNotionに取り込んだ後で悩まされる要因の一つではないかと思われるのは、最終更新日時が欠落することです。何年前のドキュメントもつい先日つくったドキュメントも、エクスポートファイルを取り込んだ後には同じ日付での扱いになります。

都度Confluenceを見に行くのは割と手間であるため、エクスポートしたファイル内に最終更新日が残っていないか、残っている場合は日付とページの組み合わせによる管理を実現できないか試してみました。

エクスポートファイル内にある日付

前提としてHTMLファイルによるエクスポートでダウンロードしておきます。Notionの取り込みはHTMLが前提になるためです。

エクスポートしたファイル内容を確認するために解凍します。

unzip Confluence-space-export-XXXXX.html.zip

出てきたファイルからHTMLファイルを一つ選んで開き、ページ内でMETA指定されている要素をたどります。すると最終更新日付の記載が確認できます。

ファイルとパスと日付の一覧出力

この表記はNotionに取り込み反映されないため、取り込まれたドキュメントは日付上ではフラットな扱いとなります。古いドキュメントかどうかの区別をつけやすくしたいので、zipファイル内のファイル名Confluence上のパス日付の3要素による確認用リストを出力してみます。

from pathlib import Path
import re
import argparse


parser = argparse.ArgumentParser(description='Conflunece Archive.')
parser.add_argument('workspace')
args = parser.parse_args()

workspace = args.workspace
_filename = re.compile(fr"{workspace}/(.+_)?(?P<pageid>\d+).html")
_title = re.compile(r'<title>.* : (?P<filename>[^<]+)</title>')    
_modified = re.compile(r'Created by <span class=\'author\'> .*</span>(, last modified)?( by <span class=\'editor\'> .*</span>)? on (?P<last_modified>\d{4}/\d{2}/\d{2})') 
_bc_line = re.compile(r'<span><a href=".+\.html">(?P<name>.+)</a></span>')
output = Path(f"{workspace}/timestamp_list.txt").open('w')
output.write(f"filename,breadcrumbs,modified\n")
for p in Path(workspace).glob('*.html'):
        filename = str(p)
    if not _filename.match(filename):
        continue

    breadcrumbs_list = []
    with open(filename, 'r') as search_bc:
        is_breadcrumbs_list = False
        is_line_text = False

        for line in search_bc:
            if is_breadcrumbs_list and re.match(r'.*(</ol>).*', line):
                is_breadcrumbs_list = False
                break

            if is_line_text:
                breadcrumbs_list.append(_bc_line.findall(line)[0])
                is_line_text = False
                continue

            if is_breadcrumbs_list and (not is_line_text) and re.match(r'.*<li', line):
                is_line_text = True
                continue

            if (not is_breadcrumbs_list) and re.match(r'.*(<ol id="breadcrumbs">).*', line):
                is_breadcrumbs_list = True
                continue

    data = p.read_text()
    title = _title.findall(data)[0]
    modified = _modified.findall(data)[0][-1]
    breadcrumbs_list.pop(0)
    breadcrumbs_list.append(title)
    breadcrumbs = '/'.join(breadcrumbs_list)
    output.write(f"{filename},{breadcrumbs},{modified}\n")
% python timestamp_list.py WORKSPACE`
% cat WORKSPACE/timestamp_list.txt
filename,breadcrumbs,modified
WORKSPACE/XXXXXXX.html,ホーム/開発者ガイド/環境構築/負荷試験環境構築,2018/04/13

HTML内の最終更新日時部分は作成者名と更新者名が異なっていたりする等様々なケースがありましたが、パターンをカバーして日付の取り逃しは防いでいます。

あとがき

製作者及び最終更新者も取れますが、日付を重用視していたために省きました。

Notion内でツリー整理を行うことを考慮して、各ドキュメントのコメントに最終更新日付を入れる等しておくと確認の手間を省けるかもしれません。