summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/typst-html/src/encode.rs17
-rw-r--r--tests/ref/html/html-pre-starting-with-newline.html17
-rw-r--r--tests/suite/html/syntax.typ5
3 files changed, 39 insertions, 0 deletions
diff --git a/crates/typst-html/src/encode.rs b/crates/typst-html/src/encode.rs
index 2bfa78a7..82a5df47 100644
--- a/crates/typst-html/src/encode.rs
+++ b/crates/typst-html/src/encode.rs
@@ -97,6 +97,11 @@ fn write_element(w: &mut Writer, element: &HtmlElement) -> SourceResult<()> {
let pretty = w.pretty;
if !element.children.is_empty() {
+ // See HTML spec ยง 13.1.2.5.
+ if element.tag == tag::pre && starts_with_newline(element) {
+ w.buf.push('\n');
+ }
+
let pretty_inside = allows_pretty_inside(element.tag)
&& element.children.iter().any(|node| match node {
HtmlNode::Element(child) => wants_pretty_around(child.tag),
@@ -133,6 +138,18 @@ fn write_element(w: &mut Writer, element: &HtmlElement) -> SourceResult<()> {
Ok(())
}
+/// Whether the first character in the element is a newline.
+fn starts_with_newline(element: &HtmlElement) -> bool {
+ for child in &element.children {
+ match child {
+ HtmlNode::Tag(_) => {}
+ HtmlNode::Text(text, _) => return text.starts_with(['\n', '\r']),
+ _ => return false,
+ }
+ }
+ false
+}
+
/// Whether we are allowed to add an extra newline at the start and end of the
/// element's contents.
///
diff --git a/tests/ref/html/html-pre-starting-with-newline.html b/tests/ref/html/html-pre-starting-with-newline.html
new file mode 100644
index 00000000..676d1a80
--- /dev/null
+++ b/tests/ref/html/html-pre-starting-with-newline.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ </head>
+ <body>
+ <pre>hello</pre>
+ <pre>
+
+hello</pre>
+ <pre>
+
+
+hello</pre>
+ </body>
+</html>
diff --git a/tests/suite/html/syntax.typ b/tests/suite/html/syntax.typ
index c95fa06e..fb5caf3b 100644
--- a/tests/suite/html/syntax.typ
+++ b/tests/suite/html/syntax.typ
@@ -5,3 +5,8 @@
--- html-void-element-with-children html ---
// Error: 2-27 HTML void elements must not have children
#html.elem("img", [Hello])
+
+--- html-pre-starting-with-newline html ---
+#html.pre("hello")
+#html.pre("\nhello")
+#html.pre("\n\nhello")