]> git.phdru.name Git - bookmarks_db.git/blob - db2bkmk.py
Fix(Robot): Stop splitting and un-splitting URLs
[bookmarks_db.git] / db2bkmk.py
1 #! /usr/bin/env python3
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         transl_d = {}
67
68         from m_lib.flad import fladm
69         transl_db = fladm.load_from_file(
70             transl_name, fladm.check_record, ["URL1", "URL2"], [""])
71         #    This prevents any other key to appear in transl_db ^
72
73         # Generate translation dictionary (hash table)
74         if transl == 1:
75             for record in transl_db:
76                 transl_d[record["URL1"]] = record["URL2"]
77         elif transl == 2:
78             for record in transl_db:
79                 transl_d[record["URL2"]] = record["URL1"]
80         else:
81             raise ValueError("transl (%d) must be 1 or 2" % transl)
82
83         del transl_db  # Save few bytes of memory
84
85         from bkmk_objects import Walker
86
87         class Transl(Walker):
88             def __init__(self, transl_d):  # noqa: E306 expected 1 blank line
89                 self.transl_d = transl_d
90
91             def bookmark(self, b, level):
92                 href = b.href
93                 transl_d = self.transl_d
94
95                 if href in transl_d:
96                     b.href = transl_d[href]
97
98         root_folder.walk_depth(Transl(transl_d))
99
100     outfile = open(output_filename, 'wt', encoding='utf-8')
101     root_folder.walk_depth(writer(outfile, prune))
102     outfile.close()
103
104     if report_stats:
105         print("Ok")
106
107
108 if __name__ == '__main__':
109     run()