Hi,
On Sat, Sep 13, 2025 at 04:13:16AM -0700, Ales Horak wrote:
> current https://trac-hacks.org/wiki/IncludeMacro does not run under Trac 1.6
> due to genshi imports
>
> see the attached patch to make it functional
>
> --
> ales horak
Thanks for the patch! However, it seems to be incomplete.
$ pyflakes includemacro/macros.py
includemacro/macros.py:214:59: undefined name 'TracHTMLSanitizer'
includemacro/macros.py:244:23: undefined name 'ParseError'
includemacro/macros.py:255:27: undefined name 'ParseError'
includemacro/macros.py:288:20: undefined name 'ParseError'
Could you please try the attached patch?
--
You received this message because you are subscribed to the Google Groups "Trac
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/trac-users/aMY8Eia7Pi0d/sOV%40localhost.
Index: includemacro/macros.py
===================================================================
--- includemacro/macros.py (revision 18705)
+++ includemacro/macros.py (working copy)
@@ -10,16 +10,11 @@
#
try:
from urllib2 import urlopen, URLError
- from StringIO import StringIO
except ImportError:
from urllib.request import urlopen
from urllib.error import URLError
- from io import StringIO
import re
-
-from genshi.filters.html import HTMLSanitizer
-from genshi.input import HTMLParser, ParseError
from trac.core import TracError, implements
from trac.mimeview.api import Mimeview, get_mimetype
from trac.perm import IPermissionRequestor
@@ -26,14 +21,12 @@
from trac.resource import ResourceNotFound
from trac.ticket.model import Ticket
from trac.util import as_bool, as_int
-from trac.util.html import escape
-from trac.util.text import to_unicode
-from trac.util.translation import _
+from trac.util.translation import _, cleandoc_
from trac.versioncontrol.api import NoSuchChangeset, NoSuchNode, \
RepositoryManager
from trac.web.chrome import web_context
from trac.wiki.api import WikiSystem, parse_args
-from trac.wiki.formatter import WikiParser, system_message
+from trac.wiki.formatter import WikiParser, WikiProcessor, system_message
from trac.wiki.macros import WikiMacroBase
from trac.wiki.model import WikiPage
@@ -44,11 +37,18 @@
basestring = str
+class IncludeMacroError(Exception):
+
+ pass
+
+
class IncludeMacro(WikiMacroBase):
+ _domain = 'messages'
+ _description = cleandoc_(
"""A macro to include other resources in wiki pages.
More documentation to follow.
- """
+ """)
implements(IPermissionRequestor)
@@ -60,6 +60,8 @@
# IWikiMacroProvider methods
def expand_macro(self, formatter, name, content):
+ self.env.log.debug("hello from IncludeMacro")
+
largs, kwargs = parse_args(content)
if len(largs) == 1:
largs.append(None)
@@ -202,13 +204,8 @@
if dest_format:
out = Mimeview(self.env).render(ctxt, dest_format, out, '', None, annotations)
- # Escape if needed.
- if not self.config.getbool('wiki', 'render_unsafe_content', False):
- out = to_unicode(out)
- try:
- out = HTMLParser(StringIO(out)).parse() | HTMLSanitizer()
- except ParseError:
- out = escape(out)
+ # Sanitize
+ out = WikiProcessor(formatter, 'html').process(out)
return out
@@ -235,7 +232,7 @@
if match:
start = src.count('\n', 0, match.start())
else:
- raise ParseError('start regexp "%s" does not match any text' % start)
+ raise IncludeMacroError('start regexp "%s" does not match any text' % start)
if end:
end = as_int(end, end)
@@ -246,7 +243,7 @@
if match:
end = start + src2.count('\n', 0, match.start())
else:
- raise ParseError('end regexp "%s" does not match any text' % end)
+ raise IncludeMacroError('end regexp "%s" does not match any text' % end)
else:
if start_regex:
end += start
@@ -279,7 +276,7 @@
dest_format = node.content_type or get_mimetype(path, out)
try:
out, start, end = self._handle_partial_source(out, start, end)
- except ParseError as e:
+ except IncludeMacroError as e:
return system_message(e), None, None, None
annotations = lineno and ['lineno'] or None
@@ -289,11 +286,11 @@
return out, ctxt, dest_format, annotations
def _extract_section(self, text, section):
- m1 = re.search("(^\s*(?P<heading>={1,6})\s(.*?)(\#%s)\s*$)" % section,
+ m1 = re.search(r"(^\s*(?P<heading>={1,6})\s(.*?)(\#%s)\s*$)" % section,
text, re.MULTILINE)
if m1:
stext = text[m1.end(0):]
- m2 = re.search("(^\s*%s\s(.*?)(\#%s)?\s*$)"
+ m2 = re.search(r"(^\s*%s\s(.*?)(\#%s)?\s*$)"
% (m1.group('heading'), WikiParser.XML_NAME),
stext, re.MULTILINE)
if m2: