"""
__author__ = "Oleg Broytman <phd@phdru.name>"
-__copyright__ = "Copyright (C) 2000-2023 PhiloSoft Design"
+__copyright__ = "Copyright (C) 2000-2024 PhiloSoft Design"
__license__ = "GNU GPL"
__all__ = ['Folder', 'Bookmark', 'Ruler', 'Walker', 'Writer', 'Robot',
'InverseLinker', 'Linear', 'make_linear', 'make_tree', 'break_tree',
'quote_title', 'unquote_title', 'parse_params', 'set_params',
- ]
+ ]
-import os, urllib
+from urllib.parse import urlsplit, quote, unquote
+import os
BKMK_FORMAT = os.environ.get("BKMK_FORMAT", "MOZILLA")
+
class Folder(list):
isFolder = 1
isBookmark = 0
self.last_modified = last_modified
def walk_depth(self, walker, level=0):
- if hasattr(self, "header"): # root folder
+ if hasattr(self, "header"): # root folder
prune = 0
walker.root_folder(self)
else:
def __init__(self, href, add_date, last_visit=None, last_modified=None,
keyword=None, comment='', icon_href=None, icon=None,
charset=None, parser_charset=None):
- protocol, request = urllib.splittype(href)
- user, password, port = None, None, None
- host, path = urllib.splithost(request)
- if host:
- user, host = urllib.splituser(host)
- if user:
- user, password = urllib.splitpasswd(user)
- host, port = urllib.splitport(host)
- if port: port = int(port)
+ split_results = urlsplit(href)
+ protocol, netloc, path, query, tag = split_results
+ user = split_results.username
+ password = split_results.password
+ host = split_results.hostname
+ port = split_results.port
if protocol == 'place':
href = protocol + ":"
else:
href = protocol + "://"
if user:
- href += urllib.quote(user)
+ href += quote(user)
if password:
- href += ':' + urllib.quote(password)
+ href += ':' + quote(password)
href += '@'
if host:
- href += host.decode(parser_charset or 'utf-8').encode('idna')
+ href += host.encode('idna').decode('ascii')
if port:
href += ':%d' % port
if path:
self.log = log
def stop(self):
- pass # Nothing to do on cleanup
+ pass # Nothing to do on cleanup
# Helper class to make inverese links (nodes linked to their parent)
def start_folder(self, f, level):
f.parent = self.parent_stack[-1]
- self.parent_stack.append(f) # Push the folder onto the stack of parents
+ # Push the folder onto the stack of parents
+ self.parent_stack.append(f)
def end_folder(self, f, level):
del self.parent_stack[-1] # Pop off the stack
self.add_object(r)
-# Helper - make linked linear represenatation of the tree, suitable to be stored in sequential storage
+# Helper - make linked linear represenatation of the tree,
+# suitable to be stored in sequential storage.
def make_linear(root_folder):
linker = InverseLinker()
root_folder.walk_depth(linker)
root_folder.walk_depth(linear)
-# Helper, opposite of make_linear - make a tree from the linked linear representation
+# Helper, opposite of make_linear -
+# make a tree from the linked linear representation.
def make_tree(linear):
root_folder = linear[0]
del linear[0]
return root_folder
+
def break_tree(linear):
del linear[0]
title = title.replace("'", "'")
return title
+
def unquote_title(title):
if BKMK_FORMAT == "MOZILLA":
- from HTMLParser import HTMLParser
- title = HTMLParser().unescape(title.replace("&", '&').decode('utf-8'))
- title = title.encode('utf-8').replace("'", "'")
+ try:
+ from HTMLParser import HTMLParser
+ except ImportError:
+ from html import unescape
+ else:
+ unescape = HTMLParser().unescape
+ title = unescape(
+ title.replace("&", '&'))
+ title = title.replace("'", "'")
return title
param_list = {}
for param in params:
key, value = param.split('=', 1)
- param_list[key] = value
+ param_list[key] = unquote(value)
return main_param, param_list
+
def set_params(obj, params):
if hasattr(params, "items"):
params = params.items()