Skip to content

Commit

Permalink
MDL-49807 mod_wiki: minimum heading level should always be <h3>
Browse files Browse the repository at this point in the history
  • Loading branch information
marinaglancy committed Feb 9, 2016
1 parent 9d5d9c6 commit 3d89ccb
Show file tree
Hide file tree
Showing 16 changed files with 138 additions and 66 deletions.
23 changes: 20 additions & 3 deletions mod/wiki/parser/markups/html.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,37 @@ class html_parser extends nwiki_parser {

protected $section_editing = true;

/** @var int Minimum level of the headers on the page (usually tinymce uses <h1> and atto <h3>) */
protected $minheaderlevel = null;

public function __construct() {
parent::__construct();
// The order is important, headers should be parsed before links.
$this->tagrules = array(
// Headers are considered tags here.
'header' => array(
'expression' => "/<\s*h([1-$this->maxheaderdepth])\s*>(.+?)<\/h[1-$this->maxheaderdepth]>/is"
'expression' => "/<\s*h([1-6])\s*>(.+?)<\/h[1-6]>/is"
),
'link' => $this->tagrules['link'],
'url' => $this->tagrules['url']
);
}

/**
* Find minimum header level used on the page (<h1>, <h3>, ...)
*
* @param string $text
* @return int
*/
protected function find_min_header_level($text) {
preg_match_all($this->tagrules['header']['expression'], $text, $matches);
return !empty($matches[1]) ? min($matches[1]) : 1;
}

protected function before_parsing() {
parent::before_parsing();

$this->minheaderlevel = $this->find_min_header_level($this->string);
$this->rules($this->string);
}

Expand All @@ -40,7 +55,7 @@ protected function before_parsing() {
* @return string
*/
protected function header_tag_rule($match) {
return $this->generate_header($match[2], $match[1]);
return $this->generate_header($match[2], (int)$match[1] - $this->minheaderlevel + 1);
}

/**
Expand All @@ -54,7 +69,9 @@ public function get_section($header, $text, $clean = false) {
$text .= "\n\n";
}

$h1 = array("<\s*h1\s*>", "<\/h1>");
$minheaderlevel = $this->find_min_header_level($text);

$h1 = array("<\s*h{$minheaderlevel}\s*>", "<\/h{$minheaderlevel}>");

$regex = "/(.*?)({$h1[0]}\s*".preg_quote($header, '/')."\s*{$h1[1]}.*?)((?:\n{$h1[0]}.*)|$)/is";
preg_match($regex, $text, $match);
Expand Down
5 changes: 3 additions & 2 deletions mod/wiki/parser/markups/wikimarkup.php
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,8 @@ protected function generate_header($text, $level) {
$text = parser_utils::h('a', "", array('name' => "toc-$num")) . $text;
}

return parser_utils::h('h' . $level, $text) . "\n\n";
// Display headers as <h3> and lower for accessibility.
return parser_utils::h('h' . min(6, $level + 2), $text) . "\n\n";
}

/**
Expand Down Expand Up @@ -228,7 +229,7 @@ protected function process_toc() {
}
break;
default:
continue;
continue 2;
}
$number = "$currentsection[0]";
if (!empty($currentsection[1])) {
Expand Down
20 changes: 20 additions & 0 deletions mod/wiki/tests/fixtures/input/html/3
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<h3>Header1</h3>
<p>
Etiam eget nibh leo. In luctus orci quis tellus sagittis egestas. Praesent et turpis augue, ac accumsan orci? Pellentesque porttitor sodales tortor; vitae faucibus dui auctor vel. Phasellus sit amet sem leo; eu adipiscing ipsum. Aliquam vehicula ipsum at diam imperdiet a condimentum urna commodo? Nunc ac lacus non lorem porttitor malesuada et sit amet diam! Aenean pulvinar lectus et dolor dignissim viverra placerat nisl mattis! Nunc non leo a massa imperdiet porta vel eu tellus. Sed ac est quis orci viverra cursus. Nam tellus mauris, facilisis nec faucibus sit amet, consequat in felis. Ut volutpat lacinia est ut fringilla. Pellentesque augue dui, aliquet et ornare euismod, egestas nec arcu! Vivamus gravida, lorem vitae suscipit condimentum, turpis arcu iaculis tortor; vel ullamcorper lorem ante id nisi. Ut sit amet sem tempor quam dignissim interdum. Nam aliquam, odio vitae volutpat semper; sapien turpis feugiat neque, ac ullamcorper felis enim vitae arcu. Morbi viverra feugiat justo, at ullamcorper ipsum posuere non.
</p>
<p>
Proin ultricies gravida dui a mattis. Integer nec nisl ante. Mauris euismod, tortor et fermentum semper; est mi adipiscing erat, non pellentesque orci dui ac arcu. Nam vitae metus augue. Integer magna nibh, elementum nec molestie eget; commodo sed turpis. Duis neque mi, vehicula sed aliquet id, ultricies sed tortor. Aliquam pharetra ante sapien. Etiam accumsan ipsum sed dolor bibendum congue sollicitudin enim fringilla. Nulla eros risus, auctor placerat vestibulum eget, tincidunt ac eros. Duis ut turpis leo, sit amet ornare arcu. Aliquam eu lorem in arcu accumsan iaculis. Integer placerat lacus in nibh sollicitudin euismod? Sed a urna vel dui sagittis varius cursus sit amet dolor. Nulla ut sem at magna fringilla hendrerit sed nec sapien. Aenean nisi elit, feugiat vel euismod non, laoreet sit amet ligula. Aenean a dui quam.
</p>
<p>
Curabitur dolor ligula, suscipit et eleifend nec, faucibus varius sapien. Quisque ornare felis ac leo tincidunt quis malesuada elit lobortis? Suspendisse potenti. Vestibulum tempus porta dui, at ullamcorper mauris sollicitudin vel? In convallis risus id elit ultrices pellentesque. Sed id quam lectus. Duis tincidunt egestas urna, in tempor tortor rhoncus ac. Sed commodo, nunc sit amet sodales vulputate, purus nisi malesuada urna, ut cursus nisl nunc vel enim. Mauris ut imperdiet risus. Integer sagittis; odio at laoreet venenatis, purus neque fermentum nisi, non elementum urna libero sed ipsum.
</p>
<h3>Header2</h3>
<p>
Etiam eget nibh leo. In luctus orci quis tellus sagittis egestas. Praesent et turpis augue, ac accumsan orci? Pellentesque porttitor sodales tortor; vitae faucibus dui auctor vel. Phasellus sit amet sem leo; eu adipiscing ipsum. Aliquam vehicula ipsum at diam imperdiet a condimentum urna commodo? Nunc ac lacus non lorem porttitor malesuada et sit amet diam! Aenean pulvinar lectus et dolor dignissim viverra placerat nisl mattis! Nunc non leo a massa imperdiet porta vel eu tellus. Sed ac est quis orci viverra cursus. Nam tellus mauris, facilisis nec faucibus sit amet, consequat in felis. Ut volutpat lacinia est ut fringilla. Pellentesque augue dui, aliquet et ornare euismod, egestas nec arcu! Vivamus gravida, lorem vitae suscipit condimentum, turpis arcu iaculis tortor; vel ullamcorper lorem ante id nisi. Ut sit amet sem tempor quam dignissim interdum. Nam aliquam, odio vitae volutpat semper; sapien turpis feugiat neque, ac ullamcorper felis enim vitae arcu. Morbi viverra feugiat justo, at ullamcorper ipsum posuere non.
</p>
<p>
Proin ultricies gravida dui a mattis. Integer nec nisl ante. Mauris euismod, tortor et fermentum semper; est mi adipiscing erat, non pellentesque orci dui ac arcu. Nam vitae metus augue. Integer magna nibh, elementum nec molestie eget; commodo sed turpis. Duis neque mi, vehicula sed aliquet id, ultricies sed tortor. Aliquam pharetra ante sapien. Etiam accumsan ipsum sed dolor bibendum congue sollicitudin enim fringilla. Nulla eros risus, auctor placerat vestibulum eget, tincidunt ac eros. Duis ut turpis leo, sit amet ornare arcu. Aliquam eu lorem in arcu accumsan iaculis. Integer placerat lacus in nibh sollicitudin euismod? Sed a urna vel dui sagittis varius cursus sit amet dolor. Nulla ut sem at magna fringilla hendrerit sed nec sapien. Aenean nisi elit, feugiat vel euismod non, laoreet sit amet ligula. Aenean a dui quam.
</p>
<p>
Curabitur dolor ligula, suscipit et eleifend nec, faucibus varius sapien. Quisque ornare felis ac leo tincidunt quis malesuada elit lobortis? Suspendisse potenti. Vestibulum tempus porta dui, at ullamcorper mauris sollicitudin vel? In convallis risus id elit ultrices pellentesque. Sed id quam lectus. Duis tincidunt egestas urna, in tempor tortor rhoncus ac. Sed commodo, nunc sit amet sodales vulputate, purus nisi malesuada urna, ut cursus nisl nunc vel enim. Mauris ut imperdiet risus. Integer sagittis; odio at laoreet venenatis, purus neque fermentum nisi, non elementum urna libero sed ipsum.
</p>
12 changes: 6 additions & 6 deletions mod/wiki/tests/fixtures/output/creole/2
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
<h1><a name="toc-1"></a>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</h1>
<h3><a name="toc-1"></a>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</h3>
<p>Phasellus odio? Ut ac leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus enim justo, porttitor at, lacinia vitae; consectetuer et, ante? Maecenas eget libero. Duis est. Curabitur tincidunt dictum ligula. Nunc euismod lectus quis mi. Proin et enim sed nunc scelerisque posuere. Suspendisse enim purus, sodales non, tristique vel, sollicitudin ullamcorper, nulla. Aliquam condimentum; tellus eu vulputate facilisis, ante pede rhoncus elit, vel euismod nulla sapien et metus?</p>
<h2><a name="toc-2"></a>Praesent tristique facilisis metus.</h2>
<h4><a name="toc-2"></a>Praesent tristique facilisis metus.</h4>
<p>Quisque lectus? Morbi ultrices ultricies neque. In ligula sem; pretium eget, iaculis laoreet, pulvinar sed, dui. Proin mattis luctus diam. Aenean eget risus in mauris sagittis vehicula. Vivamus dapibus enim ac dolor. Pellentesque leo. Praesent tristique facilisis metus. Nulla imperdiet ante et urna? Maecenas leo nisi, lacinia sollicitudin, viverra at, aliquet et, justo. Quisque congue dolor.</p>
<h3><a name="toc-3"></a>Phasellus ut augue ut felis porttitor condimentum.</h3>
<h5><a name="toc-3"></a>Phasellus ut augue ut felis porttitor condimentum.</h5>
<p>Aliquam erat volutpat. Phasellus ut augue ut felis porttitor condimentum. Nam sapien tellus, tempus sed; mattis quis, viverra quis, mauris. Suspendisse venenatis sollicitudin massa. Pellentesque lobortis dolor vitae nisl. Nulla interdum aliquet neque. Duis nisl pede, vestibulum in, tristique eget, viverra vitae, erat. Maecenas justo turpis, convallis sit amet, tristique eu, laoreet et, augue. Fusce sem. Pellentesque ut turpis? Morbi suscipit sollicitudin metus? Morbi pharetra, sem eget ornare tempor, neque erat dapibus lacus, ut tincidunt nisi leo sed nunc. Sed sodales dignissim eros. Duis vitae risus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed lobortis consequat sem. Nunc posuere vulputate velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Duis vestibulum pellentesque neque.</p>
<h4>Sed adipiscing dui at massa. Nulla consectetuer tristique lacus?</h4>
<h6>Sed adipiscing dui at massa. Nulla consectetuer tristique lacus?</h6>
<p>Maecenas lacus justo, pellentesque vitae, mattis vitae, rutrum sit amet, metus! Etiam aliquam odio vel nulla. Suspendisse ante. Pellentesque viverra leo at lorem! Ut pharetra egestas ante. Aliquam erat volutpat. Sed adipiscing dui at massa. Nulla consectetuer tristique lacus? Donec ante leo, condimentum non, consectetuer vel, sodales placerat, tortor. Etiam at diam at elit adipiscing ultrices. Etiam lectus sapien, congue sed, sodales quis, ultricies a, libero. Pellentesque tincidunt!</p>
<h2><a name="toc-4"></a>Curabitur euismod sollicitudin nibh</h2>
<h4><a name="toc-4"></a>Curabitur euismod sollicitudin nibh</h4>
<p>Curabitur euismod sollicitudin nibh. Duis nec diam. Sed nunc quam, lobortis nec; tristique et, dignissim eget, massa. Suspendisse sagittis malesuada tortor. Nullam lectus diam, mollis id, malesuada at, gravida ut, nisl. In hac habitasse platea dictumst. Sed a purus. Etiam velit urna, lacinia et, imperdiet quis, varius quis, orci! Sed dolor ante, mollis in, ultrices in, vestibulum vitae; justo. Vestibulum accumsan vehicula risus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus sit amet diam lobortis urna tristique pretium. Quisque erat.</p>
<h4>Duis nec diam.</h4>
<h6>Duis nec diam.</h6>
<p>Pellentesque lobortis dolor vitae nisl. Nulla interdum aliquet neque. Duis nisl pede, vestibulum in, tristique eget, viverra vitae, erat. Maecenas justo turpis, convallis sit amet, tristique eu, laoreet et, augue. Fusce sem. Pellentesque ut turpis? Morbi suscipit sollicitudin metus? Morbi pharetra, sem eget ornare tempor, neque erat dapibus lacus, ut tincidunt nisi leo sed nunc. Sed sodales dignissim eros. Duis vitae risus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed lobortis consequat sem. Nunc posuere vulputate velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Duis vestibulum pellentesque neque.</p>
4 changes: 2 additions & 2 deletions mod/wiki/tests/fixtures/output/creole/3
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<h1><a name="toc-1"></a>In nisi purus, varius in, mollis eget, interdum in, ipsum.</h1>
<h3><a name="toc-1"></a>In nisi purus, varius in, mollis eget, interdum in, ipsum.</h3>
<p>Vivamus lobortis. <strong>Mauris dui dui, rutrum in, egestas nec, porttitor vehicula, risus!</strong> Vivamus aliquam ultrices metus. <em>Donec ultricies, metus eget volutpat condimentum;</em> neque orci mattis dolor, non posuere eros dui et orci. Duis aliquam. Fusce sit amet nisl. Duis tempor dapibus diam? In venenatis congue mi? Aliquam metus erat; facilisis a, suscipit a, pretium vitae; ligula? Ut id metus a pede adipiscing commodo! <strong>Praesent ultricies urna et sapien.</strong> <em>Donec adipiscing.</em> Donec sit amet lacus.</p>
<h2><a name="toc-2"></a>**In nisi purus**, //varius in,// mollis eget, interdum in, ipsum.</h2>
<h4><a name="toc-2"></a>**In nisi purus**, //varius in,// mollis eget, interdum in, ipsum.</h4>
<p>Duis feugiat ligula ac elit. %!34%!Nulla sed arcu a risus sodales mattis. Etiam magna arcu, accumsan vitae, sodales non, faucibus quis, nunc. Aenean ut elit. Pellentesque malesuada lacus a orci. Suspendisse in erat sed mi porta faucibus. Nullam a nibh. Suspendisse potenti. Nam malesuada lobortis nibh. Ut venenatis, nibh ac convallis iaculis, justo pede tristique sapien, vel ultricies massa diam id leo. Pellentesque ullamcorper condimentum urna. //Proin dui lacus; scelerisque nec, condimentum non, <strong>lobortis ac, felis.</strong></p>
<p>//Nullam ac neque. %!4%!<strong>Praesent quis tellus. </strong>Maecenas<strong> et felis vitae lectus porttitor dignissim. Etiam at dui id nibh molestie semper. Sed vulputate nunc et neque. Fusce consectetur elit id leo. <em>Nulla facilisi. </em>Donec vitae nulla ac nisl mollis blandit. //Nulla adipiscing.</strong> Phasellus quis odio sed eros viverra sodales. Suspendisse eget mauris id urna convallis fringilla. Aliquam dolor. Sed commodo. Quisque vestibulum, eros in mollis rutrum, odio risus aliquam turpis; nec convallis ante justo in dui? Pellentesque pharetra venenatis odio. Nulla placerat, libero at lacinia pellentesque; nisi massa sodales risus, at tincidunt orci pede sed ipsum. Etiam massa! Nullam aliquet justo at erat placerat convallis.</p>
2 changes: 1 addition & 1 deletion mod/wiki/tests/fixtures/output/creole/4
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<h2><a name="toc-1"></a>Donec ultricies neque eu libero scelerisque feugiat.</h2>
<h4><a name="toc-1"></a>Donec ultricies neque eu libero scelerisque feugiat.</h4>
<p><strong>Donec ultricies <em>neque eu <a href="http://libero">libero</a> scelerisque </em>feugiat. <em>Cras sed ante.</em> Sed volutpat urna eu diam. Curabitur fringilla lacinia mi.</strong> Quisque lorem. Etiam fringilla consequat dui. Nunc est est; aliquet eu, porttitor auctor; malesuada id, massa. <a href="http://Nullam">Nullam feugiat</a>, nulla eget vulputate facilisis, erat odio vestibulum mi, eget volutpat lorem enim vitae eros. Vestibulum convallis. Maecenas posuere pellentesque mi? Donec consectetur volutpat dolor. <a href="http://%2A%2ACurabitur%2A%2A">**Curabitur**</a> non <strong><a href="http://%2F%2FTellus%2A%2A">tellus nec ligula bibendum pulvinar.</a></strong></p>
<p><a href="http://www.google.com">http://www.google.com</a>
<a href="http://www.google.com">http://www.google.com</a></p>
Expand Down
4 changes: 2 additions & 2 deletions mod/wiki/tests/fixtures/output/creole/5
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<h1><a name="toc-1"></a>Integer eu leo? \\ Quisque posuere.</h1>
<h3><a name="toc-1"></a>Integer eu leo? \\ Quisque posuere.</h3>
<p>Nunc commodo nisi vitae quam. Etiam tincidunt; lectus eu tempus molestie, elit enim auctor tortor, in varius leo mi ac risus. Sed iaculis magna vel libero. Pellentesque iaculis, tellus in ullamcorper tempus, justo sapien scelerisque enim, eu ornare dui neque sed ligula. <br />Vestibulum porta justo a dolor. Duis mollis quam vel sem. Quisque vel arcu. Pellentesque sem. Aliquam adipiscing neque quis turpis. Mauris placerat, elit quis iaculis vehicula, sem nulla imperdiet nunc, in elementum felis lectus non magna. Mauris cursus; odio eu sagittis sodales, nisi nibh pellentesque tortor, ut ultricies lacus tellus non odio. In semper, ligula eu condimentum posuere, sapien tellus blandit quam, dapibus iaculis lacus erat eget ipsum. Duis pulvinar molestie magna. Aliquam bibendum quam ac nulla!</p>
<h2><a name="toc-2"></a>Fusce justo. Aliquam felis tellus, tempor vel, congue quis, tempus eu, ipsum. \\</h2>
<h4><a name="toc-2"></a>Fusce justo. Aliquam felis tellus, tempor vel, congue quis, tempus eu, ipsum. \\</h4>
<p><br />Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Morbi sed erat! Vivamus condimentum. Praesent euismod; nibh sed mollis feugiat, erat lorem commodo lectus, vitae tristique erat massa semper diam. Morbi vitae elit. <br />Quisque sagittis leo non odio auctor faucibus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque mi pede, lacinia id, commodo faucibus, rhoncus in, nibh. Praesent vestibulum aliquet quam!</p>
2 changes: 1 addition & 1 deletion mod/wiki/tests/fixtures/output/creole/7
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
<h1><a name="toc-1"></a>In nisi purus, varius in, mollis eget, interdum in, ipsum.</h1>
<h3><a name="toc-1"></a>In nisi purus, varius in, mollis eget, interdum in, ipsum.</h3>
<p>Vivamus lobortis. <strong>Mauris dui dui, rutrum in, egestas nec, porttitor vehicula, risus!</strong> Vivamus aliquam ultrices metus. <em>Donec ultricies, metus eget volutpat condimentum;</em> neque orci mattis dolor, non posuere eros dui et orci. Duis aliquam. Fusce sit amet nisl. Duis tempor dapibus diam? In venenatis congue mi? Aliquam metus erat; facilisis a, suscipit a, pretium vitae; ligula? Ut id metus a pede adipiscing commodo! <tt>**Praesent ultricies urna et sapien.** //Donec adipiscing.//</tt> Donec sit amet lacus.</p>
<pre> lkdsjflsdjflsdkjflskdjlfk </pre>
2 changes: 1 addition & 1 deletion mod/wiki/tests/fixtures/output/creole/8
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<h2><a name="toc-1"></a>Testing some tables</h2>
<h4><a name="toc-1"></a>Testing some tables</h4>
<p>Phasellus urna erat; venenatis ac, iaculis sed, pretium ut, pede. Suspendisse mauris tellus, rhoncus a, tempor id, mattis non, nibh. Aliquam magna odio; hendrerit at, eleifend sed, dignissim quis, orci. Donec mollis, ante sit amet convallis porta, augue nibh viverra magna, ac scelerisque dui ligula eu felis. Sed eget magna. Proin eget ligula. Vestibulum ornare; sem molestie congue sollicitudin, mi velit porta est, pellentesque dignissim libero est at velit. Donec congue adipiscing massa? Nunc eget nisi eget elit facilisis ornare. Vestibulum et felis id leo feugiat sagittis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed tellus velit, luctus et, tempor non, tempor vitae, magna. Aliquam viverra tortor sit amet tellus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque nibh risus, dictum eu, tempor sit amet, posuere et, nulla.</p>
<p>Well formed table...</p>
<table>
Expand Down
Loading

0 comments on commit 3d89ccb

Please sign in to comment.