Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

A link referencing another document makes the preview crash #35

Open
mbideau opened this issue Aug 6, 2021 · 5 comments
Open

A link referencing another document makes the preview crash #35

mbideau opened this issue Aug 6, 2021 · 5 comments
Milestone

Comments

@mbideau
Copy link

mbideau commented Aug 6, 2021

Try this mardown content example :

# test file
A link referencing another document in the same folder is crashing, example :
[crashing link](otherdoc.md)

That produce the following error in the preview pane :

Exception Error!

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/formiko/renderer.py", line 267, in render_output
    html = publish_string(**kwargs).decode('utf-8')
  File "/usr/lib/python3/dist-packages/docutils/core.py", line 407, in publish_string
    output, pub = publish_programmatically(
  File "/usr/lib/python3/dist-packages/docutils/core.py", line 665, in publish_programmatically
    output = pub.publish(enable_exit_status=enable_exit_status)
  File "/usr/lib/python3/dist-packages/docutils/core.py", line 220, in publish
    output = self.writer.write(self.document, self.destination)
  File "/usr/lib/python3/dist-packages/docutils/writers/__init__.py", line 78, in write
    self.translate()
  File "/usr/lib/python3/dist-packages/docutils/writers/_html_base.py", line 78, in translate
    self.document.walkabout(visitor)
  File "/usr/lib/python3/dist-packages/docutils/nodes.py", line 214, in walkabout
    if child.walkabout(visitor):
  File "/usr/lib/python3/dist-packages/docutils/nodes.py", line 214, in walkabout
    if child.walkabout(visitor):
  File "/usr/lib/python3/dist-packages/docutils/nodes.py", line 206, in walkabout
    visitor.dispatch_visit(self)
  File "/usr/lib/python3/dist-packages/docutils/nodes.py", line 1995, in dispatch_visit
    return method(node)
  File "/usr/lib/python3/dist-packages/docutils/nodes.py", line 2018, in unknown_visit
    raise NotImplementedError(
NotImplementedError:  visiting unknown node type: pending_xref

If I preprend the link href with an "http://" or a "#" the exception disappear.

I think this is very problematic to not be able to use reference to other document in the same folder/tree.

PS: thank you very much for this software that is working really fine for me except for this bug 🙏

@ondratu
Copy link
Owner

ondratu commented Aug 18, 2021

Hi can you tell me which version of Formiko and which vesion of docutils you have?

pip3 list | grep -E 'formiko|docutils'

@mbideau
Copy link
Author

mbideau commented Aug 19, 2021

Sure, sorry I didn't include this information from the start.

Formiko is from the debian package of bullseye: 1.3.0-2 (package web page)
And same for the Python 3 docutils (package is named python3-docutils): 0.16+dfsg-4 (package web page)

I also tried with formiko install from pip3 :

❯ pip3 list | grep -E 'formiko|docutils'
docutils                      0.14     
docutils-html5-writer         1.0.3    
docutils-tinyhtmlwriter       1.3.0    
formiko                       1.4.3

And it yield almost the same error

Library Error

Sorry about that. This seems to be not supported functionality in dependent library Reader or Writer

Traceback (most recent call last):
  File "/home/michael/.local/lib/python3.7/site-packages/formiko/renderer.py", line 371, in render_output
    html = publish_string(**kwargs).decode('utf-8')
  File "/usr/lib/python3/dist-packages/docutils/core.py", line 416, in publish_string
    enable_exit_status=enable_exit_status)
  File "/usr/lib/python3/dist-packages/docutils/core.py", line 664, in publish_programmatically
    output = pub.publish(enable_exit_status=enable_exit_status)
  File "/usr/lib/python3/dist-packages/docutils/core.py", line 219, in publish
    output = self.writer.write(self.document, self.destination)
  File "/usr/lib/python3/dist-packages/docutils/writers/__init__.py", line 80, in write
    self.translate()
  File "/usr/lib/python3/dist-packages/docutils/writers/_html_base.py", line 71, in translate
    self.document.walkabout(visitor)
  File "/usr/lib/python3/dist-packages/docutils/nodes.py", line 174, in walkabout
    if child.walkabout(visitor):
  File "/usr/lib/python3/dist-packages/docutils/nodes.py", line 174, in walkabout
    if child.walkabout(visitor):
  File "/usr/lib/python3/dist-packages/docutils/nodes.py", line 174, in walkabout
    if child.walkabout(visitor):
  [Previous line repeated 4 more times]
  File "/usr/lib/python3/dist-packages/docutils/nodes.py", line 166, in walkabout
    visitor.dispatch_visit(self)
  File "/usr/lib/python3/dist-packages/docutils/nodes.py", line 1882, in dispatch_visit
    return method(node)
  File "/usr/lib/python3/dist-packages/docutils/nodes.py", line 1907, in unknown_visit
    % (self.__class__, node.__class__.__name__))
NotImplementedError:  visiting unknown node type: pending_xref

Other parameters :

  • Horizontal preview
  • Auto scroll
  • Common mark parser
  • Docutils HTML 4 writer

The error seems to happen also with empty URL.

Thanks in advance for digging into it 🙏

@coldtobi
Copy link

TL;DR: For those coming to the issue: Add an anchor to the link as workaound.

I can reproduce this bug as well. I'm also on Debian 11. Formiko is at 1.3.0 with Debian revision -2 (1.3.0-2)
I additionally tried python3-docutils 0.17.1+dfsg-1 from Debian/experimental, so the current installed dependencies are:

ii  gir1.2-gtksource-3.0  3.24.11-2
ii  gir1.2-gtkspell3-3.0  3.0.10-1
ii  gir1.2-webkit2-4.0    2.32.3-1
ii  librsvg2-common       2.50.3+dfsg-1
ii  python3               3.9.2-3
ii  python3-docutils      0.17.1+dfsg-1
ii  python3-gi            3.38.0-2
ii  python3-recommonmark  0.6.0+ds-1

An additional observation:
For me, the backtrace appears regardless whether the target file exists or not; adding an anchor text (#x) to the link makes the backtrace disappear. Here's a doc I used to test for this report: The offending lines are commented out below.

# issue 35 test

## link to existing b.md in same directory.

<!-- [bad link](b.md)     ---> backtrace
[good link](b.md#x)     -- no backtrace

## link to dir/c.md (exiting)

<!-- [bad link](dir/c.md)    --> backtrace
[good link](dit/c.md#x)     -- no backtrace

## link to nonexisting in same dir

<!-- [bad link](nothere.md)    --> backtrace
[good link](dit/nothere.md#x)     -- no backtrace

Might be unrelated; formiko spits out on the console when loading the test document, (as shown above, with all bad links commented out):

/usr/lib/python3/dist-packages/recommonmark/parser.py:75: UserWarning: Container node skipped: type=document
  warn("Container node skipped: type={0}".format(mdnode.t))

However, this might be a red herring.
Update: Above message is printed to console also when I open formiko with an empty document and add one character. So very likely unrelated.

Many kudos for formiko! Its is a very helpful tool :)

@ondratu
Copy link
Owner

ondratu commented Aug 27, 2021

Thank you very much for great report. It seems that there is problem in recommonmark library. At this moment, this problem is solved with replacing markdown library which Formiko use. I was plan update Formiko to new 1.4.3 release version to debian testing, but this error is still here.

For a few time, please use formiko from this repository, from master branch. I try to release new 1.5.0 version out as soon as possible.

@ondratu ondratu added this to the 1.5.x milestone Aug 27, 2021
@coldtobi
Copy link

coldtobi commented Aug 27, 2021

(FWIW, I made a local package of recommonmark 0.7.1 -- issue still triggers in that version. However, upstream of recommonmark deprecated the usage of this library, so I guess hopes that this will be fixed are slim...)

If you need a sponsor in Debian, ping me (tobi (at) debian.org). I'm usually not doing python packages, but for this I'll make an exception :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants