From d023955ee030e4c48f906c85b678d0d11808544b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Mart=C3=ADnez=20Portela?= Date: Tue, 25 Oct 2022 23:45:30 +0200 Subject: [PATCH] Skip links to private notes. --- scripts/generate.py | 96 ++++++++++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 41 deletions(-) diff --git a/scripts/generate.py b/scripts/generate.py index d7ded60..e80be56 100644 --- a/scripts/generate.py +++ b/scripts/generate.py @@ -57,6 +57,18 @@ ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) STATIC_PATH = os.path.join(ROOT_DIR, 'static') +class NonExistingLocalNoteError(AssertionError): + def __init__(self, note_id, src_headline): + AssertionError.__init__(self) + self.note_id = note_id + self.src_headline = src_headline + + def get_message(self): + return ("Cannot follow link to '{}' on headline '{}' ({})" + .format(self.note_id, + self.src_headline.id, + self.src_headline.title.get_text().strip())) + def is_git_path(path): return any([chunk == ".git" for chunk in path.split(os.sep)]) @@ -312,10 +324,7 @@ def get_headline_with_name(target_name, doc): def assert_id_exists(id, src_headline, graph): if id not in graph["nodes"]: - raise AssertionError("Cannot follow link to '{}' on headline '{}' ({})" - .format(id, - src_headline.id, - src_headline.title.get_text())) + raise NonExistingLocalNoteError(id, src_headline) def print_tree(tree, indentation=0, headline=None): # if headline and headline.id != INDEX_ID: @@ -447,47 +456,52 @@ def render_text_tokens(tokens, acc, headline, graph): elif isinstance(chunk, Link): link_target = chunk.value is_internal_link = True - if link_target.startswith('id:'): - assert_id_exists(link_target[3:], headline, graph) - link_target = './' + link_target[3:] + '.node.html' - elif link_target.startswith('./') or link_target.startswith('../'): - if '::' in link_target: - logging.warn('Not implemented headline links to other files. Used on {}'.format(link_target)) - - else: - target_path = os.path.abspath(os.path.join(os.path.dirname(headline.doc.path), link_target)) - if target_path not in graph['main_headlines']: - logging.warn('Link to doc not in graph: {}'.format(target_path)) - else: - assert_id_exists(graph['main_headlines'][target_path].id, headline, graph) - link_target = './' + graph['main_headlines'][target_path].id + '.node.html' - elif link_target.startswith('attachment:'): - logging.warn('Not implemented `attachment:` links. Used on {}'.format(link_target)) - elif link_target.startswith('* '): - target_headline = get_headline_with_name(link_target.lstrip('* '), headline.doc) - if target_headline is None: - logging.warn('No headline found corresponding to {}. On file {}'.format(link_target, headline.doc.path)) - else: - assert_id_exists(target_headline.id, headline, graph) - link_target = './' + target_headline.id + '.node.html' - else: - is_internal_link = False - if not ( - link_target.startswith('https://') - or link_target.startswith('http://') - or link_target.startswith('/') - ): - raise NotImplementedError('Unknown link type: {}' - .format(link_target)) description = chunk.description if description is None: description = chunk.value - acc.append('{}'.format( - html.escape(link_target), - 'internal' if is_internal_link else 'external', - html.escape(description), - )) + try: + if link_target.startswith('id:'): + assert_id_exists(link_target[3:], headline, graph) + link_target = './' + link_target[3:] + '.node.html' + elif link_target.startswith('./') or link_target.startswith('../'): + if '::' in link_target: + logging.warn('Not implemented headline links to other files. Used on {}'.format(link_target)) + + else: + target_path = os.path.abspath(os.path.join(os.path.dirname(headline.doc.path), link_target)) + if target_path not in graph['main_headlines']: + logging.warn('Link to doc not in graph: {}'.format(target_path)) + else: + assert_id_exists(graph['main_headlines'][target_path].id, headline, graph) + link_target = './' + graph['main_headlines'][target_path].id + '.node.html' + elif link_target.startswith('attachment:'): + logging.warn('Not implemented `attachment:` links. Used on {}'.format(link_target)) + elif link_target.startswith('* '): + target_headline = get_headline_with_name(link_target.lstrip('* '), headline.doc) + if target_headline is None: + logging.warn('No headline found corresponding to {}. On file {}'.format(link_target, headline.doc.path)) + else: + assert_id_exists(target_headline.id, headline, graph) + link_target = './' + target_headline.id + '.node.html' + else: + is_internal_link = False + if not ( + link_target.startswith('https://') + or link_target.startswith('http://') + or link_target.startswith('/') + ): + raise NotImplementedError('Unknown link type: {}' + .format(link_target)) + + acc.append('{}'.format( + html.escape(link_target), + 'internal' if is_internal_link else 'external', + html.escape(description), + )) + except NonExistingLocalNoteError as err: + logging.warning(err.get_message()) + acc.append(html.escape(description)) # else: # raise NotImplementedError('TextToken: {}'.format(chunk)) acc.append('

')