« Bash on Ubuntu on Windowsにpyenvとanacondaをインストール | トップページ | Bash on Ubuntu on WindowsでemacsやRStudioをインストールしてX Windowで動かす »

2016.10.08

ScrapBookのリンク静的HTMLファイル作成スクリプト

以前よりFirefoxのアドインScrapBookを便利に使っております。
欠点は、ScrapBookのデータが大きくなると、操作が重くなること。
インデックスファイルを静的HTMLファイルにすれば表示が遅くなることはないでしょう。

WindowsではScrapIndexerがありますが、OS Xで同様のことを行うことを考えます。

以下のサイトを参考にスクリプトを作ってみました。
scrapbookのデータディレクトリのインデックスを作る:るびゅ備忘録
ありがとうございます。

動作確認は、Python 3.5.2で行いました。

次のように使用します。


$ python scrap_index_generate.py ScrapBookディレクトリ HTMLファイルの作成先ディレクトリ

使用例:


$ python scrap_index_generate.py ~/Library/Application\ Support/Firefox/Profiles/[profaile名].default/ScrapBook/ /Volumes/Home/ScrapBook/

スクリプトは以下のとおり。


#!/usr/bin/env python
# coding:utf-8
"""
scrap_index_generate.py
scrapbookのデータディレクトリのインデックスを生成する
引数
1.datapath
データディレクトリのパスをフルパス又は相対パスで指定する
ScrapBookなど、scrapbook.rdfが存在するディレクトリ
ScrapBook/dataではない
2.putpath
出力ディレクトリのパスをフルパス又は相対パスで指定する
ScrapBookHtmlなど、出力先のディレクトリ
当該ディレクトリは予め作成しておくこと
This Script is available for Python version 3.5 or later
"""
#
import sys
import os
import codecs
import re
import datetime
import math
#
#setting
itemPP = 400 # number of item per page
putname = 'scrap-%s-%s.html'
#
now = datetime.datetime.now().strftime('%y/%m/%d %H:%M:%S')
errorStr_read_index_dat = 'readerror(index.dat)'
#
# ファイルパスを生成
def toJavaScriptPath(path):
if re.match(r'^[A-Za-z]:', path):
# Windowsのドライブレターにも対応
drive = path[0].upper()
javapath = drive + path[1:]
javapath.replace('\\', '/')
return 'file:///' + javapath
else:
return path
#
# インデックスを作成
re_dat = re.compile(r'^([^\t]+)\t(.+)$')
#
def read_index_dat(path):
dat = {}
try:
lines = codecs.open(path, 'r', 'utf-8')
for line in lines:
m = re_dat.search(line)
if m:
key = m.group(1)
data = m.group(2)
dat[key] = data
return dat
except:
return {}
#
# scrapbook.rdfからフォルダ構造を取得
re_rdf_00 = re.compile(r'<RDF:Seq.+?root')
re_rdf_01 = re.compile(r'<RDF:Seq.+?item(\d+)')
re_rdf_02 = re.compile(r'<RDF:li.+?item(\d+)')
re_rdf_03 = re.compile(r'</RDF:Seq>')
#
re_rdf_11 = re.compile(r'<RDF:Description.+?item(\d+)')
re_rdf_12 = re.compile(r'type=\"folder\"')
re_rdf_13 = re.compile(r'title=\"(.+?)\"')
re_rdf_19 = re.compile(r'/>')
#
def read_scrapbook_rdf(path):
urn_group = {}
urn_type = {}
in_seq = False
in_description = False
key = ''
try:
lines = codecs.open(path, 'r', 'utf-8')
for line in lines:
m = re_rdf_00.search(line)
if m:
key = 'root'
urn_group.setdefault(key, [])
in_seq = True
continue
m = re_rdf_01.search(line)
if m:
key = m.group(1)
urn_group.setdefault(key, [])
in_seq = True
continue
m = re_rdf_02.search(line)
if m and in_seq:
urn_group[key].append(m.group(1))
continue
m = re_rdf_03.search(line)
if m and in_seq:
in_seq = False
continue
m = re_rdf_11.search(line)
if m:
key = m.group(1)
urn_type[key] = {}
urn_type[key]['type'] = 'urn'
in_description = True
continue
m = re_rdf_12.search(line)
if m and in_description:
urn_type[key]['type'] = 'folder'
continue
m = re_rdf_13.search(line)
if m and in_description:
urn_type[key]['title'] = m.group(1)
continue
m = re_rdf_19.search(line)
if m and in_description:
in_description = False
continue
return urn_group, urn_type
except:
return {}, {}
#
# topページ作成
def put_top_page(tree, putpath):
html = []
html.append(''.join([
"""\n"""
"""\n"""
"""\n"""
"""\n"""
"""scrapbook %s\n""" % now,
"""\n"""
"""\n"""
"""\n"""
"""
generated on %s
\n""" % now,
"""
ScrapBook
\n"""
]))
#
# foldersを生成
folders = {}
tree_title =[]
count = 0
depth = 0
# rootフォルダ
folders.setdefault(count, {'folder':['ROOT']})
# サブフォルダ
for i in tree:
id, attr = i
if attr['type'] == 'folder':
count += 1
depth = attr['depth']
title = attr['title']
tree_title = tree_title[:depth]
tree_title.append(title)
folders[count] = {}
folders[count]['folder'] = tree_title
folders[count]['depth'] = depth
elif attr['type'] == 'urn' and attr['depth'] != 0:
tmp_tree_title = tree_title[:attr['depth']]
for j in folders.keys():
if folders[j]['folder'] == tmp_tree_title:
folders[j].setdefault('urn', []).append(id)
elif attr['type'] == 'urn' and attr['depth'] == 0: # root直下
folders[0].setdefault('urn', []).append(id)
# htmlファイルを生成
for key in sorted(folders.keys()):
linkPath = os.path.join(putpath, putname % (key, 1))
title_start = ''
title_end = ''
if len(folders[key]['folder']) > 1:
title_start = '&nbsp;&nbsp;' + \
'&nbsp;-&gt;&nbsp;'.join(folders[key]['folder'][:-1]) + \
'&nbsp;-&gt;&nbsp;'
title_end = folders[key]['folder'][-1]
if 'urn' in folders[key]:
title = """%s%s(%s)""" % \
(title_start, toJavaScriptPath(linkPath), title_end, \
str(len(folders[key]['urn'])))
else:
title = """&nbsp;&nbsp;%s%s""" % \
(title_start, title_end)
html.append("""
""")
html.append(title)
html.append("""
\n""")
html.append("""\n\n""")
html_text = ''.join(html)
#print(html)
codecs.open(os.path.join(putpath, 'scrapbook.html'), \
'w', 'utf-8').write(html_text)
#print(folders)
return folders
#
# フォルダごとのリンクページを作成
def put_pages(folder, j, maxPage, nowPage, arr, datapath, putpath):
parent = os.path.join(datapath, 'data')
start = arr[0]
end = arr[-1]
html = []
html.append(''.join([
"""\n"""
"""\n"""
"""\n"""
"""\n"""
"""scrap [%s/%s] %s\n""" % (nowPage, maxPage, now),
"""\n"""
"""\n"""
"""\n"""
"""
generated on %s
\n""" % now,
"""
%s
\n""" % \
'&nbsp;-&gt;&nbsp;'.join(folder['folder'])
]))
#
pbar = []
pbar.append("""
""")
for i in range(1, maxPage + 1):
if i == nowPage:
pbar.append("""%s""" % i)
else:
pbar.append("""%s""" % ((putname % (j, i)), i))
pbar.append("""
\n""")
pbar = ''.join(pbar)
#
html.append(pbar)
for d in arr:
datPath = os.path.join(parent, d, 'index.dat')
linkPath = os.path.join(parent, d, 'index.html')
faviconPath = os.path.join(parent, d, 'favicon.ico')
#
if os.path.exists(faviconPath):
favicon = '' % toJavaScriptPath(faviconPath)
else:
favicon = ''
#
dat = read_index_dat(datPath)
if 'id' in dat:
id = """[%s]""" % dat['id']
else:
id = """[%s]""" % d
if 'title' in dat:
title = """%s""" % (toJavaScriptPath(linkPath), \
dat['title'])
else:
title = """%s""" % (toJavaScriptPath(linkPath), \
errorStr_read_index_dat)
if 'source' in dat:
source = u"""ソースURLを開く""" % dat['source']
else:
source = ''
#
html.append("""
""")
html.append(id)
html.append(favicon)
html.append(title)
html.append(source)
html.append("""
\n""")
#
html.append(pbar)
html.append("""\n\n""")
html_text = ''.join(html)
#print(html)
codecs.open(os.path.join(putpath, putname % (j, nowPage)), \
'w', 'utf-8').write(html_text)
# フォルダとURNのツリー構造を取得
def get_tree(key, urn_group, urn_type, list, depth):
for i in urn_group[key]:
if urn_type[i]['type'] == 'folder':
urn_type[i]['depth'] = depth
list.append([i, urn_type[i]])
list = get_tree(i, urn_group, urn_type, list, depth + 1)
else:
urn_type[i]['depth'] = depth
list.append([i, urn_type[i]])
return list
#
# main routine
def gen(itemPP, datapath, putpath):
urn_group, urn_type = \
read_scrapbook_rdf(os.path.join(datapath, 'scrapbook.rdf'))
tree = get_tree('root', urn_group, urn_type, [], 0)
#for i in tree:
# print(i)
# scrapbook.rdfに含まれないフォルダを取得する
datadir = os.path.join(datapath, 'data')
list = os.listdir(datadir)
dir = []
for i in list:
i = os.path.join(datadir, i)
if os.path.isdir(i):
dir.append(i)
dir.sort()
for i in dir:
m = re.search(r'(\d+)$', i)
path = m.group(1)
if not path in urn_type:
tree.append([path, {'type':'urn', 'depth':0, 'title':''}])
# トップページを生成
folders = put_top_page(tree, putpath)
# 個別ページを生成
for i in sorted(folders.keys()):
#print(i, folders[i])
if 'urn' in folders[i]:
urn_list = sorted(folders[i]['urn'])
maxPage = int(math.ceil(float(len(urn_list)) / itemPP))
for j in range(maxPage):
put_pages(folders[i], i, maxPage, j + 1, \
urn_list[j * itemPP:(j + 1) * itemPP], \
datapath, putpath)
#
# initial routine
if __name__ == '__main__':
argvs = sys.argv
if len(argvs) == 3:
datapath = argvs[1]
putpath = argvs[2]
gen(itemPP, datapath, putpath)
else:
print("error: wrong parameters", file=sys.stderr)
print("usage: python scrap_index_nagerate_**.py ScrapBook_Path ScrapBookHtml_Path", file=sys.stderr)
sys.exit(1)

以上です。

|

« Bash on Ubuntu on Windowsにpyenvとanacondaをインストール | トップページ | Bash on Ubuntu on WindowsでemacsやRStudioをインストールしてX Windowで動かす »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1024423/67856630

この記事へのトラックバック一覧です: ScrapBookのリンク静的HTMLファイル作成スクリプト:

« Bash on Ubuntu on Windowsにpyenvとanacondaをインストール | トップページ | Bash on Ubuntu on WindowsでemacsやRStudioをインストールしてX Windowで動かす »