diff --git a/htmlcc/emitter/__init__.py b/htmlcc/emitter/__init__.py
index 5198572..7fb1e4d 100644
--- a/htmlcc/emitter/__init__.py
+++ b/htmlcc/emitter/__init__.py
@@ -45,6 +45,11 @@ class Emitter:
raise NotImplementedError()
+ def output_variable_urlencoded(self, variable: str) -> None:
+ """Emit code to output a variable, as encoded URL component"""
+
+ raise NotImplementedError()
+
def start_block(self, block_name: str) -> None:
"""Called at {% block ... %}"""
diff --git a/htmlcc/emitter/cgit.py b/htmlcc/emitter/cgit.py
index c169921..84cd5ab 100644
--- a/htmlcc/emitter/cgit.py
+++ b/htmlcc/emitter/cgit.py
@@ -35,6 +35,9 @@ class CgitEmitter(Emitter):
def output_variable_as_text(self, variable: str) -> None:
self.emit(f'html_txt({variable});')
+ def output_variable_urlencoded(self, variable: str) -> None:
+ self.emit(f'html_url_arg({variable});')
+
def start_page(self, page_name: str) -> None:
super().start_page(page_name)
self.emit('cgit_print_http_headers();')
diff --git a/htmlcc/parser.py b/htmlcc/parser.py
index 05f4f00..b0b80ea 100644
--- a/htmlcc/parser.py
+++ b/htmlcc/parser.py
@@ -129,6 +129,10 @@ class Parser:
# Output as HTML attribute
variable = variable[:-len('attr')].rstrip()[:-1].rstrip()
self.emitter.output_variable_as_attr(variable)
+ elif variable.endswith('urlencode') and variable[:-len('urlencode')].rstrip().endswith('|'):
+ # Output as URL component
+ variable = variable[:-len('urlencode')].rstrip()[:-1].rstrip()
+ self.emitter.output_variable_urlencoded(variable)
else:
# No filter - output as text
self.emitter.output_variable_as_text(variable)