mirror of
https://github.com/urbit/shrub.git
synced 2024-12-25 13:04:17 +03:00
248 lines
3.9 KiB
Plaintext
248 lines
3.9 KiB
Plaintext
# Appendix B: An alternate spec for HTML blocks {-}
|
|
|
|
(The following spec departs less from original markdown than the
|
|
one described above, but is also less flexible.)
|
|
|
|
An [HTML block](#html-block) <a id="html-block-tag"/> begins
|
|
with an [open tag](#open-tag), [HTML comment](#html-comment),
|
|
[processing instruction](#processing-instruction),
|
|
[declaration](#declaration), or [CDATA section](#cdata-section).
|
|
This opening element may optionally be preceded by 1-3 spaces,
|
|
and must not be followed on a line by anything other than white space.
|
|
|
|
If the opening tag is self-closing, or if it is an [HTML
|
|
comment](#html-comment), [processing
|
|
instruction](#processing-instruction), [declaration](#declaration), or
|
|
[CDATA section](#cdata-section), then the [HTML block](#html-block)
|
|
contains just that tag.
|
|
|
|
If it is an [open tag](#open-tag), then the [HTML block](#html-block)
|
|
continues until a matching closing tag is found, or until the end
|
|
of the document. Note that the matching closing tag is not necessarily
|
|
the first closing tag of the same type that is encountered, since
|
|
that tag may close a later open tag of the same type. Open and closing
|
|
tags must be balanced.
|
|
|
|
The contents of the HTML block are interpreted as raw HTML, and will not
|
|
be escaped in HTML output.
|
|
|
|
Some simple examples:
|
|
|
|
.
|
|
<table>
|
|
<tr>
|
|
<td>
|
|
hi
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
okay.
|
|
.
|
|
<table>
|
|
<tr>
|
|
<td>
|
|
hi
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p>okay.</p>
|
|
.
|
|
|
|
|
|
.
|
|
<div class="outer">
|
|
|
|
<div class="inner">
|
|
|
|
<p>fooö</p>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
.
|
|
<div class="outer">
|
|
|
|
<div class="inner">
|
|
|
|
<p>fooö</p>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
.
|
|
|
|
A self-closing tag:
|
|
|
|
.
|
|
<div />
|
|
.
|
|
<div />
|
|
.
|
|
|
|
Here we have an unclosed tag, and the block continues to the end of
|
|
the document:
|
|
|
|
.
|
|
<div>
|
|
<div>
|
|
foo
|
|
</div>
|
|
|
|
*bar*
|
|
.
|
|
<div>
|
|
<div>
|
|
foo
|
|
</div>
|
|
|
|
*bar*
|
|
.
|
|
|
|
A comment:
|
|
|
|
.
|
|
<!-- Foo
|
|
bar
|
|
baz -->
|
|
.
|
|
<!-- Foo
|
|
bar
|
|
baz -->
|
|
.
|
|
|
|
A processing instruction:
|
|
|
|
.
|
|
<?php
|
|
echo 'foo'
|
|
?>
|
|
.
|
|
<?php
|
|
echo 'foo'
|
|
?>
|
|
.
|
|
|
|
CDATA:
|
|
|
|
.
|
|
<![CDATA[
|
|
function matchwo(a,b)
|
|
{
|
|
if (a < b && a < 0) then
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
]]>
|
|
.
|
|
<![CDATA[
|
|
function matchwo(a,b)
|
|
{
|
|
if (a < b && a < 0) then
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
]]>
|
|
.
|
|
|
|
The opening tag can be indented 1-3 spaces, but not 4:
|
|
|
|
.
|
|
<!-- foo -->
|
|
<!-- foo -->
|
|
.
|
|
<!-- foo -->
|
|
<pre><code><!-- foo -->
|
|
</code></pre>
|
|
.
|
|
|
|
The opening tag must be on a line (or lines) by itself:
|
|
|
|
.
|
|
<table><tr><td>
|
|
foo
|
|
</td></tr></table>
|
|
.
|
|
<p><table><tr<td> foo </td></tr></table></p>
|
|
.
|
|
|
|
.
|
|
<!-- foo -->bar
|
|
.
|
|
<p><!-- foo -->bar</p>
|
|
.
|
|
|
|
The opening tag need not be an HTML block tag or even an HTML tag:
|
|
|
|
.
|
|
<a>
|
|
foo
|
|
</a>
|
|
.
|
|
<a>
|
|
foo
|
|
</a>
|
|
.
|
|
|
|
.
|
|
<foo>
|
|
bar
|
|
</foo>
|
|
.
|
|
<foo>
|
|
bar
|
|
</foo>
|
|
.
|
|
|
|
So, note the difference:
|
|
|
|
.
|
|
<del>
|
|
bar
|
|
</del>
|
|
|
|
<del>bar</del>
|
|
.
|
|
<del>
|
|
bar
|
|
</del>
|
|
<p><del>bar</del></p>
|
|
.
|
|
|
|
This rule differs from John Gruber's original markdown syntax
|
|
specification, which says:
|
|
|
|
> The only restrictions are that block-level HTML elements —
|
|
> e.g. `<div>`, `<table>`, `<pre>`, `<p>`, etc. — must be separated from
|
|
> surrounding content by blank lines, and the start and end tags of the
|
|
> block should not be indented with tabs or spaces.
|
|
|
|
In some ways Gruber's rule is more restrictive than the one given
|
|
here:
|
|
|
|
- It requires that an HTML block be preceded and followed by a blank line.
|
|
- It does not allow the start tag to be indented.
|
|
- It does not allow the end tag to be indented.
|
|
- It does not require that the open tag be an HTML block-level tag.
|
|
|
|
Indeed, most markdown implementations, including some of Gruber's
|
|
own perl implementations, do not impose these restrictions.
|
|
|
|
However, unlike Gruber's rule, this one requires that the open
|
|
tag be on a line by itself. It also differs from most markdown
|
|
implementations in how it handles the case where there is no matching
|
|
closing tag (a case not mentioned in Gruber's rule). In such a case,
|
|
the rule stated above includes the whole rest of the document in the
|
|
HTML block.
|
|
|