]> git.phdru.name Git - bookmarks_db.git/blob - sort_db.py
Fix(Robot): Stop splitting and un-splitting URLs
[bookmarks_db.git] / sort_db.py
1 #! /usr/bin/env python3
2 """Sort bookmarks DB according to a rule:
3       -a - by AddDate
4       -v - by LastVisit
5       -m - by LastModified
6       -z - by Size
7       -t - by LastTested
8    default is -m
9       -r - reverse the sort order
10
11 This file is a part of Bookmarks database and Internet robot.
12
13 """
14
15 __author__ = "Oleg Broytman <phd@phdru.name>"
16 __copyright__ = "Copyright (C) 2000-2023 PhiloSoft Design"
17 __license__ = "GNU GPL"
18
19 import sys
20
21
22 class SortKey(object):
23     def __init__(self, sort_by):
24         self.sort_by = sort_by
25
26     def __call__(self, o1):
27         try:
28             return int(getattr(o1, self.sort_by))
29         except (AttributeError, TypeError, ValueError):
30             return 1
31
32
33 def walk_linear(linear, walker):
34     for object in linear:
35         if object.isBookmark:
36             walker.bookmark(object, 0)
37
38
39 def run():
40     from getopt import getopt
41     optlist, args = getopt(sys.argv[1:], "avmztrs")
42
43     sort_by = "last_modified"
44     reverse = 0
45     report_stats = 1
46
47     for _opt, _arg in optlist:
48         if _opt == '-a':
49             sort_by = "add_date"
50         elif _opt == '-v':
51             sort_by = "last_visit"
52         elif _opt == '-m':
53             sort_by = "last_modified"
54         elif _opt == '-z':
55             sort_by = "size"
56         elif _opt == '-t':
57             sort_by = "last_tested"
58         elif _opt == '-r':
59             reverse = 1
60         elif _opt == '-s':
61             report_stats = 0
62     try:
63         del _opt, _arg
64     except NameError:
65         pass
66
67     from storage import storage
68     storage = storage()
69
70     if report_stats:
71         sys.stdout.write("Loading %s: " % storage.filename)
72         sys.stdout.flush()
73
74     root_folder = storage.load()
75
76     if report_stats:
77         print("Ok")
78         sys.stdout.write("Sorting (by %s): " % sort_by)
79         sys.stdout.flush()
80
81     from bkmk_objects import make_linear
82     make_linear(root_folder)
83
84     linear = root_folder.linear
85     del linear[0]  # exclude root folder from sorting
86
87     sort_key = SortKey(sort_by)
88     linear.sort(key=sort_key)
89
90     from writers import writer
91     output_filename = "%s-sorted_by-%s" % (writer.filename, sort_by)
92
93     if reverse:
94         linear.reverse()
95         output_filename = output_filename + "-reverse"
96
97     if report_stats:
98         print("done")
99         sys.stdout.write("Writing %s: " % output_filename)
100         sys.stdout.flush()
101
102     outfile = open(output_filename, 'wt', encoding='utf-8')
103     writer = writer(outfile)
104     writer.root_folder(root_folder)
105     walk_linear(linear, writer)
106     outfile.close()
107
108     if report_stats:
109         print("Ok")
110
111
112 if __name__ == '__main__':
113     run()