]> git.phdru.name Git - bookmarks_db.git/blob - db2bkmk.py
7d9ab2cd6e8a65b0989f5828b3c4299f662307c7
[bookmarks_db.git] / db2bkmk.py
1 #! /usr/bin/env python
2 """Convert a bkmk database back to bookmarks.html
3 (or other format defined by writer)
4
5 This file is a part of Bookmarks database and Internet robot.
6 """
7
8 __author__ = "Oleg Broytman <phd@phdru.name>"
9 __copyright__ = "Copyright (C) 2000-2023 PhiloSoft Design"
10 __license__ = "GNU GPL"
11
12 import sys
13
14
15 def run():
16     from getopt import getopt
17     optlist, args = getopt(sys.argv[1:], "sp:o:t:r")
18
19     report_stats = 1
20     prune = None
21
22     from writers import writer
23     output_filename = writer.filename
24
25     transl = 0
26     transl_name = ""  # dictionary translation; default is no translation
27
28     for _opt, _arg in optlist:
29         if _opt == '-s':
30             report_stats = 0
31         if _opt == '-p':
32             prune = _arg
33         if _opt == '-o':
34             output_filename = _arg
35         if _opt == '-t':
36             transl = 1
37             transl_name = _arg
38         if _opt == '-r':
39             transl = 2
40     try:
41         del _opt, _arg
42     except NameError:
43         pass
44
45     if args:
46         sys.stderr.write("db2bkmk: too many arguments\n")
47         sys.stderr.write("Usage: db2bkmk [-s] [-p prune_folder]"
48                          " [-o filename] [-t trans] [-r]\n")
49         sys.exit(1)
50
51     from storage import storage
52     storage = storage()
53
54     if report_stats:
55         sys.stdout.write("Loading %s: " % storage.filename)
56         sys.stdout.flush()
57
58     root_folder = storage.load()
59
60     if report_stats:
61         print("Ok")
62         sys.stdout.write("Writing %s: " % output_filename)
63         sys.stdout.flush()
64
65     if transl:
66         new_ext = str(transl)
67         transl_d = {}
68
69         from m_lib.flad import fladm
70         transl_db = fladm.load_from_file(
71             transl_name, fladm.check_record, ["URL1", "URL2"], [""])
72         #    This prevents any other key to appear in transl_db ^
73
74         # Generate translation dictionary (hash table)
75         if transl == 1:
76             for record in transl_db:
77                 transl_d[record["URL1"]] = record["URL2"]
78         elif transl == 2:
79             for record in transl_db:
80                 transl_d[record["URL2"]] = record["URL1"]
81         else:
82             raise ValueError("transl (%d) must be 1 or 2" % transl)
83
84         del transl_db  # Save few bytes of memory
85
86         from bkmk_objects import Walker
87
88         class Transl(Walker):
89             def __init__(self, transl_d):  # noqa: E306 expected 1 blank line
90                 self.transl_d = transl_d
91
92             def bookmark(self, b, level):
93                 href = b.href
94                 transl_d = self.transl_d
95
96                 if transl_d.has_key(href):
97                     b.href = transl_d[href]
98
99         root_folder.walk_depth(Transl(transl_d))
100
101     outfile = open(output_filename, 'w')
102     root_folder.walk_depth(writer(outfile, prune))
103     outfile.close()
104
105     if report_stats:
106         print("Ok")
107
108
109 if __name__ == '__main__':
110     run()