Getting around div tags
John Gruber
gruber at fedora.net
Sat Mar 20 13:35:30 EST 2004
Andy Fragen <lists at thefragens.com> wrote on 03/19/04 at 10:41a:
> I just joined the list and I've already encountered this problem.
Can I ask why you're using `<div>` tags within an article body? Just
curious -- is there a URL where I can see what you're doing in
action?
> Textile seems to work around the problem in the following manner.
>
> If there is an empty line surrounding the markup, eg a list inside a div
> then the textile markup occurs.
>
> <div>
>
> * item1
> * item 2
> * item 3
>
> </div>
>
> The above would cause texile to markup a list. The following would not.
>
> <div>
> * item1
> * item2
> * item3
> </div>
>
> Is this a potential solution?
Well, yes, it's a potential solution.
But I don't like it. It strikes me as too arbitrary, and also seems
counter to be basic rule-of-thumb for using inline HTML blocks in
Markdown. Which rule of thumb is basically: "Put the start and end
tags for an inline HTML block at the left margin, and Markdown will
preserve the block and not touch the contents."
A "sometimes it will, sometimes it won't" rule adds a lot of
complexity.
It's also the case that Markdown's existing HTML block parser is, in
my opinion, too dumb. For example, if you pass in the following:
<div>
<div>
*Crazy*.
</div>
*Crazy*.
</div>
Markdown *should* leave that completely untouched. But it actually turns it into:
<div>
<div>
*Crazy*.
</div>
<p><em>Crazy</em>.
</div></p>
Because it thinks the outermost `<div>` ends at the first `</div>`.
What you'd need to do, currently, is write the input like this:
<div>
<div>
*Crazy*.
</div>
*Crazy*.
</div>
So that the real end tag for the block is the only one at the
outermost level.
I plan to fix this so that the parser does the right thing and
matches from `<tag>` to `</tag>` with support for nested, balanced
instances of `<tag></tag>` within -- but that's going to be
complicated enough without adding a special case for a blank line
around the outermost tags.
I think the rule is going to remain the same: Once you start an
inline HTML block, Markdown ignores the contents until you close the
block.
So if we want some way to have a div where Markdown *does* process
the contents, it's going to need special syntax, like:
<<div class="foo">>
* Item 1
* Item 2
* Item 3
<</div>>
This way, the rule for raw inline HTML stays the same, and stays
very simple. What we'd be doing is adding a new rule, with new
(non-HTML) syntax.
This is definitely worth thinking about, but it's definitely not
making the cut for 1.0.
-J.G.
More information about the Markdown-discuss
mailing list