Save Page WE及びScrapBookのインデックスリンク静的HTMLファイル作成スクリプト
Firefox Quantumになって以降、プラグインScrapBookが動かなくなりました。
Firefox Quantum (Firefox 57) にバージョンアップしたらレガシー・アドオンが動かなくなった
とりあえず、ScrapBookのインデックスを作成するスクリプトを書いて、過去のScrapBookで保存したファイルを参照可能にはしております。
ScrapBookのリンク静的HTMLファイル作成スクリプト
後継プラグインとして、私はPage Save WEを導入しております。
どうも、FIrefoxが推奨する後継プラグインは、OneNote Web Clipperのようです。
Page Save WEは、単純に表示中のWeb PageをSingle HTMLファイルとして保存するプラグインなので、インデックスを作成するツールを作成して利用しております。
保存したファイル群をNASに保存して、ローカル環境下で共有可能にしています。
前提:
ディレクトリ構成例は以下のとおり。
ScrapBook/
+- laptop2017/
+- SrapBook/ # ScrapBookのデータファイル置き場
+- SrapBookHtml/ # ScrapBookのインデックスHTMLファイル置き場
+- laptop2018/
+- SrapBook2/ # Page Save WEのデータファイル置き場
+- SrapBookHtml2/ # Page Save WEのインデックスHTMLファイル置き場
+- macmini2017/
+- SrapBook/ # ScrapBookのデータファイル置き場
+- SrapBookHtml/ # ScrapBookのインデックスHTMLファイル置き場
+- macmini2018/
+- SrapBook2/ # Page Save WEのデータファイル置き場
+- SrapBookHtml2/ # Page Save WEのインデックスHTMLファイル置き場
+- ScrapBookHtmlTop/ # 全体インデックスHTMLファイル置き場
+- script/ # スクリプトファイル置き場
Save Page WE保存ファイルはカテゴリ毎にサブディレクトリを作って保存すればOKです。
Firefox Plugin "Save Page WE"用
1.ScrapBookHtml2ディレクトリを作成してcd ScrapBookHtml2してScrapBookHtml2ディレクトリに移動
2.Python3で動作。必要に応じて切替
3.python ../../script/scrap_index_generate2.py ../ScrapBook2 .
scrap_index_generate2.py
#!/usr/bin/env python
# coding:utf-8
"""
scrap_index_generate.py
scrapbookのデータディレクトリのインデックスを生成する
引数
1.datapath
データディレクトリのパスをフルパス又は相対パスで指定する
ScrapBookなど、保存したHTMLファイルが存在するディレクトリ
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)'
# 正規表現パターン
re_01 = re.compile(r'^(.+)(\.html|\.htm|pdf)$') # ファイル名(タイトル)抽出
re_02 = re.compile(r'^<base href=\"(.+?)\">$') # ソースURL抽出
# ファイルパスを生成
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
# topページ作成
def put_top_page(tree, putpath):
html = []
html.append(''.join([
"""<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\n"""
"""<html>\n"""
"""<head>\n"""
"""<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n"""
"""<title>scrapbook %s</title>\n""" % now,
"""<style type='text/css'>\n"""
"""div.gentime{ text-align:right; }\n"""
"""div.start2end{ text-align:center; font-size:x-large; margin:10px;}\n"""
"""div.item{margin:5px; font-size:small; }\n"""
"""div.item a{margin-left:10px;}\n"""
"""div.item img{height:16px; margin-left:10px;}\n"""
"""div.pbar {margin-bottom:10px; border-bottom:1px solit silver;}\n"""
"""div.pbar span, div.pbar a{margin:5px; font-size:small;}\n"""
"""div.pbar span{font-size:x-large;}\n"""
"""</style>\n"""
"""</head>\n"""
"""<body>\n"""
"""<div class="gentime">generated on %s</div>\n""" % now,
"""<div class="start2end">ScrapBook</div>\n"""
]))
# foldersを生成
folders = {}
tree_title =[]
count = 0
depth = 0
# rootフォルダ
depth = 0
title = 'ROOT'
tree_title = ['ROOT']
folders[count] = {}
folders[count]['folder'] = tree_title
folders[count]['depth'] = depth
folders[count]['urn'] = tree['ROOT']
# サブフォルダ
for i in sorted(tree.keys()):
if i != 'ROOT':
count += 1
path_tmp = i.split('/')
# 空要素を削除
path_tmp = list(filter(lambda str: str != '', path_tmp))
depth = len(path_tmp)
title = path_tmp[depth - 1]
tree_title = path_tmp[:depth]
folders[count] = {}
#print(count, i, path_tmp, title, depth, tree_title)
folders[count]['folder'] = tree_title
folders[count]['depth'] = depth
folders[count]['urn'] = tree[i]
# 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 = ' ' + \
' -> '.join(folders[key]['folder'][:-1]) + \
' -> '
title_end = folders[key]['folder'][-1]
if len(folders[key]['urn']) > 0:
title = """%s<a href="%s">%s</a>(%s)""" % \
(title_start, toJavaScriptPath(linkPath), title_end, \
str(len(folders[key]['urn'])))
else:
title = """ %s%s""" % \
(title_start, title_end)
html.append("""<div class="item">""")
html.append(title)
html.append("""</div>\n""")
html.append("""</body>\n</html>\n""")
html_text = ''.join(html)
codecs.open(os.path.join(putpath, 'scrapbook.html'), \
'w', 'utf-8').write(html_text)
return folders
# フォルダごとのリンクページを作成
def put_pages(folder, j, maxPage, nowPage, arr, datapath, putpath):
parent = datapath
start = arr[0]
end = arr[-1]
html = []
html.append(''.join([
"""<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\n"""
"""<html>\n"""
"""<head>\n"""
"""<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n"""
"""<title>scrap [%s/%s] %s</title>\n""" % (nowPage, maxPage, now),
"""<style type='text/css'>\n"""
"""div.gentime{ text-align:right; }\n"""
"""div.start2end{ text-align:center; font-size:x-large; margin:10px;}\n"""
"""div.item{margin:5px; font-size:small; }\n"""
"""div.item a{margin-left:10px;}\n"""
"""div.item img{height:16px; margin-left:10px;}\n"""
"""div.pbar {margin-bottom:10px; border-bottom:1px solit silver;}\n"""
"""div.pbar span, div.pbar a{margin:5px; font-size:small;}\n"""
"""div.pbar span{font-size:x-large;}\n"""
"""</style>\n"""
"""</head>\n"""
"""<body>\n"""
"""<div class="gentime">generated on %s</div>\n""" % now,
"""<div class="start2end">%s</div>\n""" % \
' -> '.join(folder['folder'])
]))
pbar = []
pbar.append("""<div class="pbar">""")
for i in range(1, maxPage + 1):
if i == nowPage:
pbar.append("""<span class="now">%s</span>""" % i)
else:
pbar.append("""<a href="%s">%s</a>""" % ((putname % (j, i)), i))
pbar.append("""</div>\n""")
pbar = ''.join(pbar)
html.append(pbar)
for d in arr:
linkPath = os.path.join(parent, '/'.join(folder['folder']), d)
title_tmp = ''
source_tmp = ''
m = re_01.search(d)
title_tmp = m.group(1)
try:
lines = codecs.open(linkPath, 'r', 'utf-8')
for line in lines:
m = re_02.search(line)
if m:
source_tmp = m.group(1)
break
except:
pass
title = """<a href="%s">%s</a>""" % (toJavaScriptPath(linkPath), \
title_tmp)
source = u"""<a href="%s">ソースURLを開く</a>""" % source_tmp
html.append("""<div class="item">""")
html.append(title)
html.append(source)
html.append("""</div>\n""")
html.append(pbar)
html.append("""</body>\n</html>\n""")
html_text = ''.join(html)
#print(html)
codecs.open(os.path.join(putpath, putname % (j, nowPage)), \
'w', 'utf-8').write(html_text)
# main routine
def gen(itemPP, datapath, putpath):
tree = {}
for path, subdirs, files in os.walk(datapath):
if len(path) > len(datapath):
tree.setdefault(path[len(datapath):], [])
for file in files:
if re_01.search(file):
tree[path[len(datapath):]].append(file)
else:
tree.setdefault('ROOT', [])
for file in files:
if re_01.search(file):
tree['ROOT'].append(file)
# トップページを生成
folders = put_top_page(tree, putpath)
#print(folders)
# 個別ページを生成
for i in sorted(folders.keys()):
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 ./ScrapBookHtml", file=sys.stderr)
sys.exit(1)
次に、Firefox Plugin ScrapbookとSave Page WEのインデックスを統合したリンクに対する目次を作るスクリプトを示します。ScrapBookHtmlTopディレクトリにscrapbook_top.htmlができるので、これをブラウザで開いて利用してください。
Firefox Plugin Scrapbook 及び "Save Page WE"のインデックスを統合した目次を作るスクリプト 1.ScrapBookHtmlTopディレクトリを作成してcd ScrapBookHtmlTopしてScrapBookHtmlTopディレクトリに移動。 2.Python3で動作。必要に応じて切替 3.python ../script/scrap_index_generate2.py ../ .
scrap_index_generate3.py
#!/usr/bin/env python
# coding:utf-8
"""
scrap_index_generate.py
scrapbookのデータディレクトリのインデックスを生成する
引数
1.datapath
データディレクトリのパスをフルパス又は相対パスで指定する
配下ディレクトリに存在するscrapbook.htmlをサーチする
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
putname = 'scrap-%s-%s.html'
scrapbook_file = 'scrapbook.html'
now = datetime.datetime.now().strftime('%y/%m/%d %H:%M:%S')
errorStr_read_index_dat = 'readerror(index.dat)'
# 正規表現パターン
re_01 = re.compile(r'^<div\s+class=\"item\">(.+?)</div>$') # 目次抽出
# ファイルパスを生成
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
# topページ作成
def put_top_page(tree, datapath, putpath):
html = []
html.append(''.join([
"""<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\n"""
"""<html>\n"""
"""<head>\n"""
"""<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n"""
"""<title>scrapbook %s</title>\n""" % now,
"""<style type='text/css'>\n"""
"""div.gentime{ text-align:right; }\n"""
"""div.start2end{ text-align:center; font-size:x-large; margin:10px;}\n"""
"""div.item{margin:5px; font-size:small; }\n"""
"""div.item a{margin-left:10px;}\n"""
"""div.item img{height:16px; margin-left:10px;}\n"""
"""div.pbar {margin-bottom:10px; border-bottom:1px solit silver;}\n"""
"""div.pbar span, div.pbar a{margin:5px; font-size:small;}\n"""
"""div.pbar span{font-size:x-large;}\n"""
"""</style>\n"""
"""</head>\n"""
"""<body>\n"""
"""<div class="gentime">generated on %s</div>\n""" % now
]))
# foldersを生成
folders = []
# htmlファイルを生成
for key in sorted(tree.keys()):
dataPath = os.path.join(datapath, key, tree[key][0])
html.append("""<div class="start2end">%s</div>\n""" % key)
try:
lines = codecs.open(dataPath, 'r', 'utf-8')
for line in lines:
m1 = re_01.search(line)
if m1:
str0 = m1.group(0)
f1 = m1.group(1)
m2 = re.search(r'href=\"(.+?)\"', f1)
if m2:
f2 = m2.group(1)
f3 = f2.split('/')
f4 = f3[-1]
linkPath = os.path.join(datapath, key, f4)
str1 = re.sub(r'href=\".+?\"', \
'href=\"%s\"' % linkPath, str0)
html.append(str1 + "\n")
else:
html.append(str0 + "\n")
except:
pass
html.append("""</body>\n</html>\n""")
html_text = ''.join(html)
codecs.open(os.path.join(putpath, 'scrapbook_top.html'), \
'w', 'utf-8').write(html_text)
return folders
# main routine
def gen(datapath, putpath):
tree = {}
for path, subdirs, files in os.walk(datapath):
for file in files:
if file == scrapbook_file:
tree.setdefault(path[len(datapath):], [])
tree[path[len(datapath):]].append(file)
# トップページを生成
folders = put_top_page(tree, datapath, putpath)
# initial routine
if __name__ == '__main__':
argvs = sys.argv
if len(argvs) == 3:
datapath = argvs[1]
putpath = argvs[2]
gen(datapath, putpath)
else:
print("error: wrong parameters", file=sys.stderr)
print("usage: python scrap_index_nagerate_**.py ./ScrapBook ./ScrapBookHtml", file=sys.stderr)
sys.exit(1)
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- 実家のAmazon Echo Show 5に別アカウントのAmazon Alexaアプリから呼びかけするためのAlexaアプリによる設定(2025.01.02)
- Intel Mac で ELYZA-japanese-Llama-2-13b 及び phi-2 とllama.cppで戯れてみた(2024.01.14)
- 分離型キーボードで親指シフト(NICOLA配列)を試す(Majestouch Xacro M10SP JIS配列)(2024.01.06)
- Microsoft Office Word のショートカットキーの一部をEmacs風のキーバインドにしてみた(2023.12.18)
- Intel Mac上でllama.cppのサーバ機能を使って日本語LLMを使ってみる(2023.11.12)
コメント