mbutterick / pollen-users

please use https://forums.matthewbutterick.com/c/typesetting/ instead
https://forums.matthewbutterick.com/c/typesetting/
52 stars 0 forks source link

Inserting html comment with pollen command #126

Open jaybonthius opened 2 years ago

jaybonthius commented 2 years ago

I want to insert an html comment <!-- like this --> with a pollen command, but I'm not sure how I would define a tag function, since a comment doesn't take the same form as other tags.

EDIT: I'm realizing that a tag is probably not the way to accomplish this. But how would I insert a < or > without getting turned into &lt; or &gt;?

(define html-comment `(!-- "this is a comment"))

From this pollen markup:

this is a paragraph ◊html-comment

I want to get this:

<p>
  this is a paragraph
  <!-- this is a comment -->
</p>

but I'm getting this:

<p>
  this is a paragraph
  <!-->this is a comment</!-->
</p>

which the browser isn't sure how to interpret, and turns into this:

<p>
  this is a paragraph
  <!---->
  this is a comment
  <!--!---->
</p>
sorawee commented 2 years ago

The documentation of ->html suggests that it consumes an arbitrary xexpr?. The grammar shows that a misc, particularly a comment? from the xml module is considered an xexpr?. So ideally this should work:

#lang pollen

◊(require xml)

◊(comment "abc")

Unfortunately, it's not, and I personally consider this a Pollen bug.

That being said, I'm curious why do you want to generate HTML comments? They won't be displayed to users anyway. And if you want to write a comment in the source, wouldn't it be better to do so in the Pollen source rather than HTML source? Pollen does support a comment syntax already:

#lang pollen

◊;abc

def
mbutterick commented 2 years ago

I just pushed an update to the underlying txexpr library that should fix your case:

#lang pollen/mode racket
(require pollen/tag pollen/template/html rackunit)

(define html-comment '(@ "<!-- this is a comment -->"))
(define root (default-tag-function 'root))
(define doc ◊root{this is a paragraph ◊html-comment})
(check-equal? (->html doc) "<root>this is a paragraph <!-- this is a comment --></root>")

Keep in mind that the comment string, like a CDATA string, has to be separated from adjacent string elements. (Ordinarily, adjacent strings will be concatenated in the output.) In this case I’ve used the splicing tag @ to do this without adding an extra tag to the generated HTML.

jaybonthius commented 2 years ago

Whoops, didn't mean to close the issue.

@sorawee I am using an HTML presentation framework (reveal.js) to make a web-based slideshow. Weirdly enough, some attributes can be controlled through HTML comments. (https://revealjs.com/markdown/#element-attributes).

@mbutterick Amazing! Thank you!

mbutterick commented 2 years ago

See also https://github.com/applied-science/talks/tree/master/mxnet

(example of using Pollen to orchestrate reveal.js)