Hi David,
I hope you feel better now ;)
So the only thing I can do here is : Try to explain how the parser algorithm works, so that you can see, why it behaves the way as it does.
===========================
The tiddlywiki parser knows 2 types of rules
- block rules and
- inline rules
For the whole tiddler content it always starts with "block mode" and starts to "scan" for "block rules". If a block is found it switches to "inline mode" and starts to look for "inline rules". ... I call this the "context" here in the post.
Here comes some ''bold'' text.
It detects the whole text as a paragraph "block" ... which will be rendered like this: ->
Here comes some bold text
As HTML code it looks like this:
<p>Here comes some <strong>bold</strong> text.</p>
The P element defines the "block"
The ''bold'' wikitext is an inline-rule per definition.
That make sense. right?
--------------
So the question now is, how does the parser detect different blocks of text, to create paragraph tags around them. ... We all know this rule: 2 NewLines .. will split 2 text elements into separated paragraphs.
eg:
paragraph 1
paragraph 2
That makes sense. right?
---------------------
text 1
text 2
Doesn't contain 2 new-lines but 1 ... It's inline mode and it will be translated to the following HTML code
<p>text 1
text 2</p>
You can see the new-line is still there BUT HTML ignores whitespace per specification. ... So the browser shows the text like this
text 1text 2
"""
Which creates this:
<p>text 1<br>text 2<br></p> which tells the browser to add line-breaks.
A second method to achieve a similar result is
Hard linebreaks with CSS. Which works well for wikitext. It may cause problems with macros and widgets.
================================
You may say: BUT the following macros only have 1 new-line between them.
<<macrocall>>
<<macrocall2>>
I say: Yes, you are right. ... But macros and transclusions have to be able to inherit the mode from their context. ... eg:
\define bold(text) ''$text$''
Here comes some <<bold bold>> text.
The parser starts at line 1 character 1 and detects some text. The "end marker" for text blocks is .... 2 new-lines
After the block of text is detected, it switches to inline-mode.
It detects the macro within this context, so the macro is rendered in inline mode.
The text is translated to the following HTML code:
<p>Here comes some <strong>bold</strong> text.</p>
That's what we expect. Right?
----------
As written above macros and transclusions do inherit the mode from their context.
Back to your example: Let's have a look at the "context" here. ...
\define macrocall() aaa
\define macrocall2() bbb
<<macrocall>>
<<macrocall2>>
The context is the whole tiddler body, which starts as block mode.
Then the parser detects the start << and the end >> of a macro in line 1. ... There is no other info
The mode is still block mode, that's why the macro is rendered in block mode like this: <p>aaa</p>
The parser detects macro start / end in line 2, which will be rendered like this:
<p>bbb</p>
That may not be, what you expected, but the behaviour is consistent. Humans may see the 2 macros as 1 block. ... The wiki parser does not.
Try this a)
xxxx - <<macrocall>>
<<macrocall2>>
and this b)
xxxx - <<macrocall>>
<<macrocall2>>
------------
add a) You can see that it detects some text in front of macro 1. So macro 1 and macro 2 will be part of the text block and will be rendered in inline-mode
HTML output
add b) Now the xxxx text and macro 1 belong together and macro 2 gets it's own block.
HTML output
<p>xxxx - aaa</p><p>bbb</p>
--------------------
If you compare the HTML output with my descriptions, you will see the algorithm is consistent. ... BUT it may not always be what we expect.
I hope my descriptions are good enough to show how the "block" and "inline" detection works.
have fun!
mario