blueswen / mkdocs-glightbox

A MkDocs plugin supports image lightbox (zoom effect) with GLightbox.
https://blueswen.github.io/mkdocs-glightbox/
MIT License
115 stars 14 forks source link

Full parse of each page increases build time twice #14

Closed AnastasiaTWW closed 1 year ago

AnastasiaTWW commented 1 year ago

As far as I can see, the plugin parses each page of documentation that increase docs build time twice. Is it possible to optimize the plugin work? Usually, mkdocs built-in plugins use regular expressions to match the specific subsections of documents and then only parse those identified fragments. This is also why the privacy and optimize plugins are very fast, albeit they inspect and alter the HTML output.

usulpt commented 1 year ago

this is a problem for me and while I love the simple and beautiful way the lightbox is displayed, the extra build time kills my pipeline and I have to stop using it :(

blueswen commented 1 year ago

Sorry for the late reply. In the newest version(v0.3.3) I refactored the processing logic with regex (thanks ChatGPT!). I tested with mkdocs on 50 markdown files and over 300 images for each markdown, and there was no noticeable difference in build time whether or not the mkdocs-glightbox plugin was used. I hope this meets your requirements.

Thank you all for loving this plugin. Let me know if I can improve it further.

usulpt commented 1 year ago

well, it worked :) excellent stuff, I'm back to using and enjoying it! thanks for the quick fix!

tgit-hub commented 1 year ago

Unfortunately, following an update to 0.3.3, my build failed with:

Traceback (most recent call last):
  File "./myapp/bin/mkdocs", line 8, in <module>
    sys.exit(cli())
  File "./myapp/lib/python3.10/site-packages/click/core.py", line 1130, in __call__
    return self.main(*args, **kwargs)
  File "./myapp/lib/python3.10/site-packages/click/core.py", line 1055, in main
    rv = self.invoke(ctx)
  File "./myapp/lib/python3.10/site-packages/click/core.py", line 1657, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "./myapp/lib/python3.10/site-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "./myapp/lib/python3.10/site-packages/click/core.py", line 760, in invoke
    return __callback(*args, **kwargs)
  File "./myapp/lib/python3.10/site-packages/mkdocs/__main__.py", line 234, in serve_command
    serve.serve(dev_addr=dev_addr, livereload=livereload, watch=watch, **kwargs)
  File "./myapp/lib/python3.10/site-packages/mkdocs/commands/serve.py", line 83, in serve
    builder(config)
  File "./myapp/lib/python3.10/site-packages/mkdocs/commands/serve.py", line 76, in builder
    build(config, live_server=live_server, dirty=dirty)
  File "./myapp/lib/python3.10/site-packages/mkdocs/commands/build.py", line 308, in build
    _populate_page(file.page, config, files, dirty)
  File "./myapp/lib/python3.10/site-packages/mkdocs/commands/build.py", line 184, in _populate_page
    page.content = config.plugins.run_event(
  File "./myapp/lib/python3.10/site-packages/mkdocs/plugins.py", line 520, in run_event
    result = method(item, **kwargs)
  File "./myapp/lib/python3.10/site-packages/mkdocs_glightbox/plugin.py", line 106, in on_page_content
    html = pattern.sub(
  File "./myapp/lib/python3.10/site-packages/mkdocs_glightbox/plugin.py", line 107, in <lambda>
    lambda match: self.wrap_img_with_anchor(
  File "./myapp/lib/python3.10/site-packages/mkdocs_glightbox/plugin.py", line 151, in wrap_img_with_anchor
    else re.search(r"alt=[\"\']([^\"\']+)", img_attr).group(1)
AttributeError: 'NoneType' object has no attribute 'group'

Will attempt to determine which line in the markdown caused this and report once found, but for now, have fixed on 0.3.2

tgit-hub commented 1 year ago

OK, tracked it down to an alt value that starts with a single quote, such as:

alt="'Weird Al' Yankovic"

However, any value that includes a single quote will also not return the full "alt" value, only upto the first single quote. For example:

>>> import re
>>> img_attr="alt=\"Dwayne 'The Rock' Johnson\""
>>> re.search(r"alt=[\"\']([^\"\']+)", img_attr).group(1)
'Dwayne '
blueswen commented 1 year ago

@tgit-hub Apologies for any inconvenience caused. The latest version (v0.3.4) of the plugin has addressed this issue, and if any other wrapping errors occur, a warning log will be generated instead of causing the build to fail.

tgit-hub commented 1 year ago

Appreciate the prompt update. Now working.