summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Smith <chris.eureka@jalakai.co.uk>2008-03-12 01:02:48 +0100
committerChris Smith <chris.eureka@jalakai.co.uk>2008-03-12 01:02:48 +0100
commit41624b31db8cad77ed1ee250631162613a1ca22b (patch)
tree1e6dc1b203282a0adffe4a3415e82d874158ba65
parent630e442cc677b713c16df6060adfe9107160ff6b (diff)
downloadrpg-41624b31db8cad77ed1ee250631162613a1ca22b.tar.gz
rpg-41624b31db8cad77ed1ee250631162613a1ca22b.tar.bz2
Update handler to merge consecutive 'cdata' instructions (incl. test case updates)
This patch is the second in the series designed to make it easier for DW to allow plugins to modify the standard handling of line-breaks. Like the first this patch doesn't alter line-break behaviour at all, but introduces improvements that reduce to a minimum the number of 'cdata' instructions generated by the handler. darcs-hash:20080312000248-f07c6-f6ce1b5aac43a52cbe31215c517b048679ae20a7.gz
-rw-r--r--_test/cases/inc/parser/parser_eol.test.php18
-rw-r--r--_test/cases/inc/parser/parser_footnote.test.php23
-rw-r--r--_test/cases/inc/parser/parser_headers.test.php6
-rw-r--r--_test/cases/inc/parser/parser_lists.test.php3
-rw-r--r--_test/cases/inc/parser/parser_quote.test.php3
-rw-r--r--_test/cases/inc/parser/parser_table.test.php6
-rw-r--r--inc/parser/handler.php32
7 files changed, 43 insertions, 48 deletions
diff --git a/_test/cases/inc/parser/parser_eol.test.php b/_test/cases/inc/parser/parser_eol.test.php
index dcfcb1e60..1beeef952 100644
--- a/_test/cases/inc/parser/parser_eol.test.php
+++ b/_test/cases/inc/parser/parser_eol.test.php
@@ -13,10 +13,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("Foo")),
- array('cdata',array(DOKU_PARSER_EOL)),
- array('cdata',array("Bar")),
- array('cdata',array(DOKU_PARSER_EOL)),
+ array('cdata',array("Foo".DOKU_PARSER_EOL."Bar".DOKU_PARSER_EOL)),
array('p_close',array()),
array('document_end',array()),
);
@@ -32,10 +29,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
array('cdata',array("Foo")),
array('p_close',array()),
array('p_open',array()),
- array('cdata',array("bar")),
- array('cdata',array(DOKU_PARSER_EOL)),
- array('cdata',array("Foo")),
- array('cdata',array(DOKU_PARSER_EOL)),
+ array('cdata',array("bar".DOKU_PARSER_EOL."Foo".DOKU_PARSER_EOL)),
array('p_close',array()),
array('document_end',array()),
);
@@ -48,10 +42,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("Foo")),
- array('cdata',array(DOKU_PARSER_EOL)),
- array('cdata',array("Bar")),
- array('cdata',array(DOKU_PARSER_EOL)),
+ array('cdata',array("Foo".DOKU_PARSER_EOL."Bar".DOKU_PARSER_EOL)),
array('p_close',array()),
array('document_end',array()),
);
@@ -85,8 +76,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
array('linebreak',array()),
array('p_close',array()),
array('p_open',array()),
- array('cdata',array("Bar")),
- array('cdata',array(DOKU_PARSER_EOL)),
+ array('cdata',array("Bar".DOKU_PARSER_EOL)),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/parser_footnote.test.php b/_test/cases/inc/parser/parser_footnote.test.php
index dc729e861..6f0789106 100644
--- a/_test/cases/inc/parser/parser_footnote.test.php
+++ b/_test/cases/inc/parser/parser_footnote.test.php
@@ -54,8 +54,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(" testing\ntesting ")),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar')),
- array('cdata',array(DOKU_PARSER_EOL)),
+ array('cdata',array(' Bar'.DOKU_PARSER_EOL)),
array('p_close',array()),
array('document_end',array()),
);
@@ -86,18 +85,13 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array('Foo ')),
- array('cdata',array(DOKU_PARSER_EOL)),
- array('cdata',array('X')),
+ array('cdata',array('Foo '.DOKU_PARSER_EOL.'X')),
array('nest', array ( array (
array('footnote_open',array()),
array('cdata',array(" test\ning ")),
array('footnote_close',array()),
))),
- array('cdata',array('Y')),
- array('cdata',array(DOKU_PARSER_EOL)),
- array('cdata',array(' Bar')),
- array('cdata',array(DOKU_PARSER_EOL)),
+ array('cdata',array('Y'.DOKU_PARSER_EOL.' Bar'.DOKU_PARSER_EOL)),
array('p_close',array()),
array('document_end',array()),
);
@@ -205,8 +199,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(' ')),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar')),
- array('cdata',array(DOKU_PARSER_EOL)),
+ array('cdata',array(' Bar'.DOKU_PARSER_EOL)),
array('p_close',array()),
array('document_end',array()),
);
@@ -384,16 +377,12 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('footnote_open',array()),
array('cdata',array(' a ')),
array('strong_open',array()),
- array('cdata',array(' ')),
- array('cdata',array('((')),
- array('cdata',array(' b ')),
+ array('cdata',array(' (( b ')),
array('footnote_close',array()),
))),
array('cdata',array(" ")),
array('strong_close',array()),
- array('cdata',array(" c ")),
- array('cdata',array("))")),
- array('cdata',array("\n")),
+ array('cdata',array(" c ))\n")),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/parser_headers.test.php b/_test/cases/inc/parser/parser_headers.test.php
index 9162d0fdc..8e6517123 100644
--- a/_test/cases/inc/parser/parser_headers.test.php
+++ b/_test/cases/inc/parser/parser_headers.test.php
@@ -259,15 +259,13 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array('abc ')),
- array('cdata',array(DOKU_PARSER_EOL)),
+ array('cdata',array('abc '.DOKU_PARSER_EOL)),
array('p_close',array()),
array('section_edit',array(-1,5,1,'')),
array('header',array('Header',1, 6)),
array('section_open',array(1)),
array('p_open',array()),
- array('cdata',array(' def')),
- array('cdata',array(DOKU_PARSER_EOL)),
+ array('cdata',array(' def'.DOKU_PARSER_EOL)),
array('p_close',array()),
array('section_close',array()),
array('section_edit',array(6,0,1,'Header')),
diff --git a/_test/cases/inc/parser/parser_lists.test.php b/_test/cases/inc/parser/parser_lists.test.php
index 4fe3f6f34..751e7e1af 100644
--- a/_test/cases/inc/parser/parser_lists.test.php
+++ b/_test/cases/inc/parser/parser_lists.test.php
@@ -211,8 +211,7 @@ Bar');
array('listitem_close',array()),
array('listu_close',array()),
array('p_open',array()),
- array('cdata',array("Bar")),
- array('cdata',array(DOKU_PARSER_EOL)),
+ array('cdata',array("Bar".DOKU_PARSER_EOL)),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/parser_quote.test.php b/_test/cases/inc/parser/parser_quote.test.php
index e216604fc..5d5a7e2a5 100644
--- a/_test/cases/inc/parser/parser_quote.test.php
+++ b/_test/cases/inc/parser/parser_quote.test.php
@@ -86,8 +86,7 @@ class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
array('quote_close',array()),
array('quote_close',array()),
array('p_open',array()),
- array('cdata',array("klm")),
- array('cdata',array(DOKU_PARSER_EOL)),
+ array('cdata',array("klm".DOKU_PARSER_EOL)),
array('p_close',array()),
array('document_end',array()),
diff --git a/_test/cases/inc/parser/parser_table.test.php b/_test/cases/inc/parser/parser_table.test.php
index 155909b0c..9ec7dab4f 100644
--- a/_test/cases/inc/parser/parser_table.test.php
+++ b/_test/cases/inc/parser/parser_table.test.php
@@ -278,8 +278,7 @@ def');
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array(DOKU_PARSER_EOL)),
- array('cdata',array("abc")),
+ array('cdata',array(DOKU_PARSER_EOL."abc")),
array('p_close',array()),
array('table_open',array(3,2)),
array('tablerow_open',array()),
@@ -306,8 +305,7 @@ def');
array('tablerow_close',array()),
array('table_close',array()),
array('p_open',array()),
- array('cdata',array('def')),
- array('cdata',array(DOKU_PARSER_EOL)),
+ array('cdata',array('def'.DOKU_PARSER_EOL)),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/inc/parser/handler.php b/inc/parser/handler.php
index 9011554bc..61c143bae 100644
--- a/inc/parser/handler.php
+++ b/inc/parser/handler.php
@@ -789,9 +789,24 @@ class Doku_Handler_Nest {
}
function process() {
+ // merge consecutive cdata
+ $unmerged_calls = $this->calls;
+ $this->calls = array();
+
+ foreach ($unmerged_calls as $call) $this->addCall($call);
+
$first_call = reset($this->calls);
$this->CallWriter->writeCall(array("nest", array($this->calls), $first_call[2]));
}
+
+ function addCall($call) {
+ $key = count($this->calls);
+ if ($key and ($call[0] == 'cdata') and ($this->calls[$key-1][0] == 'cdata')) {
+ $this->calls[$key-1][1][0] .= $call[1][0];
+ } else {
+ $this->calls[] = $call;
+ }
+ }
}
class Doku_Handler_List {
@@ -1060,7 +1075,6 @@ class Doku_Handler_Quote {
// Probably not needed but just in case...
function writeCalls($calls) {
$this->calls = array_merge($this->calls, $calls);
-# $this->CallWriter->writeCalls($this->calls);
}
function finalise() {
@@ -1156,7 +1170,6 @@ class Doku_Handler_Table {
// Probably not needed but just in case...
function writeCalls($calls) {
$this->calls = array_merge($this->calls, $calls);
-# $this->CallWriter->writeCalls($this->calls);
}
function finalise() {
@@ -1577,7 +1590,7 @@ class Doku_Handler_Block {
}else{
//if this is just a single eol make a space from it
- $this->calls[] = array('cdata',array(DOKU_PARSER_EOL), $call[2]);
+ $this->addCall(array('cdata',array(DOKU_PARSER_EOL), $call[2]));
}
}
@@ -1623,7 +1636,7 @@ class Doku_Handler_Block {
}
if ( $storeCall ) {
- $this->calls[] = $call;
+ $this->addCall($call);
}
}
@@ -1640,7 +1653,7 @@ class Doku_Handler_Block {
$this->atStart = false;
$this->inParagraph = true;
} else {
- $this->calls[] = $call;
+ $this->addCall($call);
$this->atStart = false;
}
@@ -1677,6 +1690,15 @@ class Doku_Handler_Block {
$this->atStart = $state[0];
$this->inParagraph = $state[1];
}
+
+ function addCall($call) {
+ $key = count($this->calls);
+ if ($key and ($call[0] == 'cdata') and ($this->calls[$key-1][0] == 'cdata')) {
+ $this->calls[$key-1][1][0] .= $call[1][0];
+ } else {
+ $this->calls[] = $call;
+ }
+ }
}
//Setup VIM: ex: et ts=4 enc=utf-8 :