brechtm / rinohtype

The Python document processor
http://www.mos6581.org/rinohtype
GNU Affero General Public License v3.0
498 stars 59 forks source link

References not resolved correctly for orphan pages #424

Open mason3k opened 6 months ago

mason3k commented 6 months ago

Is there an existing issue for this?

Sphinx or rinoh output

Traceback (most recent call last):
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/sphinx/events.py", line 96, in emit
    results.append(listener.handler(self.app, *args))
  File "/Users/sjones/Code/ADI/docs/source/_ext/directives/properties.py", line 32, in add_references
    make_refnode(
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/sphinx/util/nodes.py", line 551, in make_refnode
    node['refuri'] = (builder.get_relative_uri(fromdocname, todocname) +
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/rinoh/frontend/sphinx/__init__.py", line 175, in get_relative_uri
    return self.get_target_uri(to, typ)
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/rinoh/frontend/sphinx/__init__.py", line 169, in get_target_uri
    raise NoUri(docname, typ)
sphinx.errors.NoUri: ('shared/terms', None)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/sphinx/cmd/build.py", line 290, in build_main
    app.build(args.force_all, args.filenames)
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/sphinx/application.py", line 347, in build
    self.builder.build_all()
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/sphinx/builders/__init__.py", line 249, in build_all
    self.build(None, summary=__('all source files'), method='all')
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/sphinx/builders/__init__.py", line 360, in build
    self.write(docnames, list(updated_docnames), method)
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/rinoh/frontend/sphinx/__init__.py", line 257, in write
    self.write_document(entry)
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/rinoh/frontend/sphinx/__init__.py", line 263, in write_document
    rinoh_document = self.construct_rinohtype_document(data)
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/rinoh/frontend/sphinx/__init__.py", line 276, in construct_rinohtype_document
    doctree, docnames = self.assemble_doctree(doc, toctree_only)
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/rinoh/frontend/sphinx/__init__.py", line 210, in assemble_doctree
    self.env.resolve_references(largetree, indexfile, self)
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/sphinx/environment/__init__.py", line 658, in resolve_references
    self.apply_post_transforms(doctree, fromdocname)
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/sphinx/environment/__init__.py", line 675, in apply_post_transforms
    self.events.emit('doctree-resolved', doctree, docname)
  File "/Users/sjones/Code/ADI/.venv/lib/python3.9/site-packages/sphinx/events.py", line 107, in emit
    raise ExtensionError(__("Handler %r for event %r threw an exception") %
sphinx.errors.ExtensionError: Handler <function add_references at 0x1097abf70> for event 'doctree-resolved' threw an exception (exception: ('shared/terms', None))

Extension error (directives.properties):
Handler <function add_references at 0x1097abf70> for event 'doctree-resolved' threw an exception (exception: ('shared/terms', None))

Source files

rinoh/frontend/sphinx/__init__.py get_target_uri

Versions

rinohtype 0.5.4 (2022-06-17)
Sphinx 7.1.1
Python 3.9.6 (default, Nov 10 2023, 13:38:27) 
[Clang 15.0.0 (clang-1500.1.0.2.5)]
macOS-14.2.1-arm64-arm-64bit
mason3k commented 6 months ago

I think this is because the page in question is an orphan. Thus, it will not be located when traversing the table of contents. I suggest the following change:

    def get_target_uri(self, docname, typ=None):
        if docname not in self.env.all_docs: # this is my code replacing the line below
        # if docname not in self._docnames:
            raise NoUri(docname, typ)
        else:
            return '%' + docname
brechtm commented 6 months ago

Thanks for the bug report and suggested fix!

Can you provide a (preferably minimal) Sphinx project that triggers the bug?