diff options
author | Andreas Gohr <andi@splitbrain.org> | 2018-04-13 10:40:01 +0200 |
---|---|---|
committer | Andreas Gohr <andi@splitbrain.org> | 2018-04-13 10:40:01 +0200 |
commit | 54f741e8823b91c5872313ab46f59c7a1ef0be2c (patch) | |
tree | 069a1acf2d8a60f20122270f74278e8c74a92790 | |
parent | a31af5935ddee9960788752b60e50541f46882bc (diff) | |
download | dokuwiki-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.php | 56 | ||||
-rw-r--r-- | _test/tests/inc/parser/parser_code.test.php | 36 | ||||
-rw-r--r-- | inc/parser/handler.php | 16 |
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; |