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