aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorAndreas Gohr <andi@splitbrain.org>2018-04-13 10:40:01 +0200
committerAndreas Gohr <andi@splitbrain.org>2018-04-13 10:40:01 +0200
commit54f741e8823b91c5872313ab46f59c7a1ef0be2c (patch)
tree069a1acf2d8a60f20122270f74278e8c74a92790
parenta31af5935ddee9960788752b60e50541f46882bc (diff)
downloaddokuwiki-54f741e8823b91c5872313ab46f59c7a1ef0be2c.tar.gz
dokuwiki-54f741e8823b91c5872313ab46f59c7a1ef0be2c.zip
relax geshi options a bit more
Quotes are now optional, the options are spearated by space
-rw-r--r--_test/tests/inc/parser/handler_parse_highlight_options.test.php56
-rw-r--r--_test/tests/inc/parser/parser_code.test.php36
-rw-r--r--inc/parser/handler.php16
3 files changed, 85 insertions, 23 deletions
diff --git a/_test/tests/inc/parser/handler_parse_highlight_options.test.php b/_test/tests/inc/parser/handler_parse_highlight_options.test.php
new file mode 100644
index 000000000..6677b2ab2
--- /dev/null
+++ b/_test/tests/inc/parser/handler_parse_highlight_options.test.php
@@ -0,0 +1,56 @@
+<?php
+
+class TestOfDoku_Handler_ParseHighlightOptions extends DokuWikiTest {
+
+ public function dataProvider() {
+ return [
+ ['', null],
+ ['something weird', null],
+ ['enable_line_numbers', ['enable_line_numbers' => true]],
+ ['enable_line_numbers=1', ['enable_line_numbers' => true]],
+ ['enable_line_numbers="1"', ['enable_line_numbers' => true]],
+ ['enable_line_numbers=0', ['enable_line_numbers' => false]],
+ ['enable_line_numbers="0"', ['enable_line_numbers' => false]],
+ ['enable_line_numbers=false', ['enable_line_numbers' => false]],
+ ['enable_line_numbers="false"', ['enable_line_numbers' => false]],
+ ['highlight_lines_extra', ['highlight_lines_extra' => [1]]],
+ ['highlight_lines_extra=17', ['highlight_lines_extra' => [17]]],
+ ['highlight_lines_extra=17,19', ['highlight_lines_extra' => [17, 19]]],
+ ['highlight_lines_extra="17,19"', ['highlight_lines_extra' => [17, 19]]],
+ ['highlight_lines_extra="17,19,17"', ['highlight_lines_extra' => [17, 19]]],
+ ['start_line_numbers_at', ['start_line_numbers_at' => 1]],
+ ['start_line_numbers_at=12', ['start_line_numbers_at' => 12]],
+ ['start_line_numbers_at="12"', ['start_line_numbers_at' => 12]],
+ ['enable_keyword_links', ['enable_keyword_links' => true]],
+ ['enable_keyword_links=1', ['enable_keyword_links' => true]],
+ ['enable_keyword_links="1"', ['enable_keyword_links' => true]],
+ ['enable_keyword_links=0', ['enable_keyword_links' => false]],
+ ['enable_keyword_links="0"', ['enable_keyword_links' => false]],
+ ['enable_keyword_links=false', ['enable_keyword_links' => false]],
+ ['enable_keyword_links="false"', ['enable_keyword_links' => false]],
+ [
+ 'enable_line_numbers weird nothing highlight_lines_extra=17,19 start_line_numbers_at="12" enable_keyword_links=false',
+ [
+ 'enable_line_numbers' => true,
+ 'highlight_lines_extra' => [17, 19],
+ 'start_line_numbers_at' => 12,
+ 'enable_keyword_links' => false
+ ]
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider dataProvider
+ * @param string $input options to parse
+ * @param array|null $expect expected outcome
+ * @throws ReflectionException
+ */
+ public function testOptionParser($input, $expect) {
+ $h = new Doku_Handler();
+
+ $output = $this->callInaccessibleMethod($h, 'parse_highlight_options', [$input]);
+
+ $this->assertEquals($expect, $output);
+ }
+}
diff --git a/_test/tests/inc/parser/parser_code.test.php b/_test/tests/inc/parser/parser_code.test.php
index f4db5e184..df8225f4e 100644
--- a/_test/tests/inc/parser/parser_code.test.php
+++ b/_test/tests/inc/parser/parser_code.test.php
@@ -93,14 +93,14 @@ class TestOfDoku_Parser_Code extends TestOfDoku_Parser {
}
function testCodeOptionsArray_TwoOptions() {
- $this->P->parse('Foo <code C [enable_line_numbers, highlight_lines_extra="3"]>Test</code> Bar');
+ $this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra="3"]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
- array('enable_line_numbers' => 1,
+ array('enable_line_numbers' => true,
'highlight_lines_extra' => array(3)
))),
array('p_open',array()),
@@ -135,7 +135,7 @@ class TestOfDoku_Parser_Code extends TestOfDoku_Parser {
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
- array('enable_line_numbers' => 1)
+ array('enable_line_numbers' => true)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
@@ -153,7 +153,7 @@ class TestOfDoku_Parser_Code extends TestOfDoku_Parser {
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
- array('enable_line_numbers' => 1)
+ array('enable_line_numbers' => true)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
@@ -171,7 +171,7 @@ class TestOfDoku_Parser_Code extends TestOfDoku_Parser {
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
- array('enable_line_numbers' => 0)
+ array('enable_line_numbers' => false)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
@@ -189,7 +189,7 @@ class TestOfDoku_Parser_Code extends TestOfDoku_Parser {
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
- array('enable_line_numbers' => 1)
+ array('enable_line_numbers' => true)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
@@ -200,14 +200,14 @@ class TestOfDoku_Parser_Code extends TestOfDoku_Parser {
}
function testCodeOptionsArray_HighlightLinesExtra1() {
- $this->P->parse('Foo <code C [enable_line_numbers, highlight_lines_extra="42, 123, 456, 789"]>Test</code> Bar');
+ $this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra="42, 123, 456, 789"]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
- array('enable_line_numbers' => 1,
+ array('enable_line_numbers' => true,
'highlight_lines_extra' => array(42, 123, 456, 789)
))),
array('p_open',array()),
@@ -219,14 +219,14 @@ class TestOfDoku_Parser_Code extends TestOfDoku_Parser {
}
function testCodeOptionsArray_HighlightLinesExtra2() {
- $this->P->parse('Foo <code C [enable_line_numbers, highlight_lines_extra]>Test</code> Bar');
+ $this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
- array('enable_line_numbers' => 1,
+ array('enable_line_numbers' => true,
'highlight_lines_extra' => array(1))
)),
array('p_open',array()),
@@ -238,14 +238,14 @@ class TestOfDoku_Parser_Code extends TestOfDoku_Parser {
}
function testCodeOptionsArray_HighlightLinesExtra3() {
- $this->P->parse('Foo <code C [enable_line_numbers, highlight_lines_extra=""]>Test</code> Bar');
+ $this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra=""]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
- array('enable_line_numbers' => 1,
+ array('enable_line_numbers' => true,
'highlight_lines_extra' => array(1))
)),
array('p_open',array()),
@@ -257,14 +257,14 @@ class TestOfDoku_Parser_Code extends TestOfDoku_Parser {
}
function testCodeOptionsArray_StartLineNumbersAt1() {
- $this->P->parse('Foo <code C [enable_line_numbers, [enable_line_numbers, start_line_numbers_at="42"]]>Test</code> Bar');
+ $this->P->parse('Foo <code C [enable_line_numbers [enable_line_numbers start_line_numbers_at="42"]]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
- array('enable_line_numbers' => 1,
+ array('enable_line_numbers' => true,
'start_line_numbers_at' => 42)
)),
array('p_open',array()),
@@ -276,14 +276,14 @@ class TestOfDoku_Parser_Code extends TestOfDoku_Parser {
}
function testCodeOptionsArray_StartLineNumbersAt2() {
- $this->P->parse('Foo <code C [enable_line_numbers, [enable_line_numbers, start_line_numbers_at]]>Test</code> Bar');
+ $this->P->parse('Foo <code C [enable_line_numbers [enable_line_numbers start_line_numbers_at]]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
- array('enable_line_numbers' => 1,
+ array('enable_line_numbers' => true,
'start_line_numbers_at' => 1)
)),
array('p_open',array()),
@@ -295,14 +295,14 @@ class TestOfDoku_Parser_Code extends TestOfDoku_Parser {
}
function testCodeOptionsArray_StartLineNumbersAt3() {
- $this->P->parse('Foo <code C [enable_line_numbers, [enable_line_numbers, start_line_numbers_at=""]]>Test</code> Bar');
+ $this->P->parse('Foo <code C [enable_line_numbers [enable_line_numbers start_line_numbers_at=""]]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
- array('enable_line_numbers' => 1,
+ array('enable_line_numbers' => true,
'start_line_numbers_at' => 1)
)),
array('p_open',array()),
diff --git a/inc/parser/handler.php b/inc/parser/handler.php
index 8fa1ab614..780c6cf48 100644
--- a/inc/parser/handler.php
+++ b/inc/parser/handler.php
@@ -370,18 +370,18 @@ class Doku_Handler {
* be set to true. Commas in strings are ignored, e.g. option="4,56"
* will work as expected and will only create one entry.
*
- * @param string $options Comma separated list of key-value pairs,
+ * @param string $options space separated list of key-value pairs,
* e.g. option1=123, option2="456"
* @return array|null Array of key-value pairs $array['key'] = 'value';
* or null if no entries found
*/
protected function parse_highlight_options ($options) {
$result = array();
- preg_match_all('/(\w+(?:="[^"]*"))|(\w+[^=,\]])(?:,*)/', $options, $matches, PREG_SET_ORDER);
+ preg_match_all('/(\w+(?:="[^"]*"))|(\w+(?:=[^\s]*))|(\w+[^=\s\]])(?:\s*)/', $options, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$equal_sign = strpos($match [0], '=');
if ($equal_sign === false) {
- $key = trim($match[0],',');
+ $key = trim($match[0]);
$result [$key] = 1;
} else {
$key = substr($match[0], 0, $equal_sign);
@@ -408,18 +408,24 @@ class Doku_Handler {
// Sanitize values
if(isset($result['enable_line_numbers'])) {
+ if($result['enable_line_numbers'] === 'false') {
+ $result['enable_line_numbers'] = false;
+ }
$result['enable_line_numbers'] = (bool) $result['enable_line_numbers'];
}
if(isset($result['highlight_lines_extra'])) {
$result['highlight_lines_extra'] = array_map('intval', explode(',', $result['highlight_lines_extra']));
$result['highlight_lines_extra'] = array_filter($result['highlight_lines_extra']);
$result['highlight_lines_extra'] = array_unique($result['highlight_lines_extra']);
- }
+ }
if(isset($result['start_line_numbers_at'])) {
$result['start_line_numbers_at'] = (int) $result['start_line_numbers_at'];
}
if(isset($result['enable_keyword_links'])) {
- $result['enable_keyword_links'] = ($result['enable_keyword_links'] !== 'false');
+ if($result['enable_keyword_links'] === 'false') {
+ $result['enable_keyword_links'] = false;
+ }
+ $result['enable_keyword_links'] = (bool) $result['enable_keyword_links'];
}
if (count($result) == 0) {
return null;