From 26819586aa0e0ae8a6e1fb9a84bd38b8a63d52a7 Mon Sep 17 00:00:00 2001 From: Dean Blackborough Date: Tue, 6 Jun 2017 20:07:38 +0100 Subject: [PATCH 1/2] New test * New test for content breaks --- tests/BlockTest.php | 9 +++++++++ tests/MultipleAttributesTest.php | 2 +- tests/SingleAttributesTest.php | 6 +++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/tests/BlockTest.php b/tests/BlockTest.php index d1f606b..c3008f1 100644 --- a/tests/BlockTest.php +++ b/tests/BlockTest.php @@ -9,6 +9,7 @@ final class BlockTest extends \PHPUnit\Framework\TestCase { private $deltas_simple_string = '{"ops":[{"insert":"Lorem ipsum dolor sit amet"}]}'; + private $deltas_paragraph_split = '{"ops":[{"insert":"Lorem ipsum dolor sit amet.\n\nLorem ipsum dolor sit amet."}]}'; private $deltas_missing_quote = '{"ops":[{"insert":"Lorem ipsum dolor sit amet}]}'; public function testValidDeltasSimpleString() @@ -38,4 +39,12 @@ public function testOutputSimpleString() $quill = new \DBlackborough\Quill\Render($this->deltas_simple_string); $this->assertEquals($expected, $quill->render()); } + + public function testOutputParagraphSplit() + { + $expected = '

Lorem ipsum dolor sit amet.

Lorem ipsum dolor sit amet.

'; + + $quill = new \DBlackborough\Quill\Render($this->deltas_paragraph_split); + $this->assertEquals($expected, $quill->render()); + } } diff --git a/tests/MultipleAttributesTest.php b/tests/MultipleAttributesTest.php index a7692bd..233c44d 100644 --- a/tests/MultipleAttributesTest.php +++ b/tests/MultipleAttributesTest.php @@ -11,7 +11,7 @@ */ final class MultipleAttributesTest extends \PHPUnit\Framework\TestCase { - private $deltas_multiple_attributes = '{"ops":[{"insert":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed efficitur nibh tempor augue lobortis, nec eleifend velit venenatis. Nullam fringilla dui eget lectus mattis tincidunt. \nDonec sollicitudin, lacus sed luctus ultricies, "},{"attributes":{"strike":true,"italic":true},"insert":"quam sapien "},{"attributes":{"strike":true},"insert":"sollicitudin"},{"insert":" quam, nec auctor eros felis elementum quam. Fusce vel mollis enim. \n\n"},{"attributes":{"bold":true},"insert":"Sed ac augue tincidunt,"},{"insert":" cursus urna a, tempus ipsum. Donec pretium fermentum erat a "},{"attributes":{"underline":true},"insert":"elementum"},{"insert":". In est odio, mattis sed dignissim sed, porta ac nisl. Nunc et tellus imperdiet turpis placerat tristique nec quis justo. Aenean nisi libero, auctor a laoreet sed, fermentum vel massa. \n\nEtiam ultricies leo eget purus tempor dapibus. Integer ac sapien eros. Suspendisse convallis ex."}]}'; + private $deltas_multiple_attributes = '{"ops":[{"insert":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed efficitur nibh tempor augue lobortis, nec eleifend velit venenatis. Nullam fringilla dui eget lectus mattis tincidunt. \nDonec sollicitudin, lacus sed luctus ultricies, "},{"attributes":{"strike":true,"italic":true},"insert":"quam sapien "},{"attributes":{"strike":true},"insert":"sollicitudin"},{"insert":" quam, nec auctor eros felis elementum quam. Fusce vel mollis enim. "},{"attributes":{"bold":true},"insert":"Sed ac augue tincidunt,"},{"insert":" cursus urna a, tempus ipsum. Donec pretium fermentum erat a "},{"attributes":{"underline":true},"insert":"elementum"},{"insert":". In est odio, mattis sed dignissim sed, porta ac nisl. Nunc et tellus imperdiet turpis placerat tristique nec quis justo. Aenean nisi libero, auctor a laoreet sed, fermentum vel massa. \n\nEtiam ultricies leo eget purus tempor dapibus. Integer ac sapien eros. Suspendisse convallis ex."}]}'; public function testValidDeltasMultipleAttributes() { diff --git a/tests/SingleAttributesTest.php b/tests/SingleAttributesTest.php index 942e281..7e48f49 100644 --- a/tests/SingleAttributesTest.php +++ b/tests/SingleAttributesTest.php @@ -13,10 +13,10 @@ final class SingleAttributesTest extends \PHPUnit\Framework\TestCase { private $deltas_bold = '{"ops":[{"insert":"Lorem ipsum dolor sit amet "},{"attributes":{"bold":true},"insert":"sollicitudin"},{"insert":" quam, nec auctor eros felis elementum quam. Fusce vel mollis enim."}]}'; private $deltas_italic = '{"ops":[{"insert":"Lorem ipsum dolor sit amet "},{"attributes":{"italic":true},"insert":"sollicitudin"},{"insert":" quam, nec auctor eros felis elementum quam. Fusce vel mollis enim."}]}'; - private $deltas_link = '{"ops":[{"insert":"Lorem ipsum dolor sit amet, "},{"attributes":{"link":"http://www.example.com"},"insert":"consectetur"},{"insert":" adipiscing elit. In sed efficitur enim. Suspendisse mattis purus id odio varius suscipit. Nunc posuere fermentum blandit. \n\nIn vitae eros nec mauris dignissim porttitor. Morbi a tempus tellus. Mauris quis velit sapien. "},{"attributes":{"link":"http://www.example.com"},"insert":"Etiam "},{"insert":"sit amet enim venenatis, eleifend lectus ac, ultricies orci. Sed tristique laoreet mi nec imperdiet. Vivamus non dui diam. Aliquam erat eros, dignissim in quam id.\n"}]}'; + private $deltas_link = '{"ops":[{"insert":"Lorem ipsum dolor sit amet, "},{"attributes":{"link":"http://www.example.com"},"insert":"consectetur"},{"insert":" adipiscing elit. In sed efficitur enim. Suspendisse mattis purus id odio varius suscipit. Nunc posuere fermentum blandit. \nIn vitae eros nec mauris dignissim porttitor. Morbi a tempus tellus. Mauris quis velit sapien. "},{"attributes":{"link":"http://www.example.com"},"insert":"Etiam "},{"insert":"sit amet enim venenatis, eleifend lectus ac, ultricies orci. Sed tristique laoreet mi nec imperdiet. Vivamus non dui diam. Aliquam erat eros, dignissim in quam id.\n"}]}'; private $deltas_strike = '{"ops":[{"insert":"Lorem ipsum dolor sit amet "},{"attributes":{"strike":true},"insert":"sollicitudin"},{"insert":" quam, nec auctor eros felis elementum quam. Fusce vel mollis enim."}]}'; - private $deltas_subscript = '{"ops":[{"insert":"Lorem ipsum dolor sit"},{"attributes":{"script":"sub"},"insert":"x"},{"insert":" amet, consectetur adipiscing elit. Pellentesque at elit dapibus risus molestie rhoncus dapibus eu nulla. Vestibulum at eros id augue cursus egestas.\n"}]}'; - private $deltas_superscript = '{"ops":[{"insert":"Lorem ipsum dolor sit"},{"attributes":{"script":"super"},"insert":"x"},{"insert":" amet, consectetur adipiscing elit. Pellentesque at elit dapibus risus molestie rhoncus dapibus eu nulla. Vestibulum at eros id augue cursus egestas.\n"}]}'; + private $deltas_subscript = '{"ops":[{"insert":"Lorem ipsum dolor sit"},{"attributes":{"script":"sub"},"insert":"x"},{"insert":" amet, consectetur adipiscing elit. Pellentesque at elit dapibus risus molestie rhoncus dapibus eu nulla. Vestibulum at eros id augue cursus egestas."}]}'; + private $deltas_superscript = '{"ops":[{"insert":"Lorem ipsum dolor sit"},{"attributes":{"script":"super"},"insert":"x"},{"insert":" amet, consectetur adipiscing elit. Pellentesque at elit dapibus risus molestie rhoncus dapibus eu nulla. Vestibulum at eros id augue cursus egestas."}]}'; private $deltas_underline = '{"ops":[{"insert":"Lorem ipsum dolor sit amet "},{"attributes":{"underline":true},"insert":"sollicitudin"},{"insert":" quam, nec auctor eros felis elementum quam. Fusce vel mollis enim."}]}'; public function testValidDeltasBold() From ca819608adad95b91f1d14db911dd43aa6673435 Mon Sep 17 00:00:00 2001 From: Dean Blackborough Date: Tue, 6 Jun 2017 22:22:02 +0100 Subject: [PATCH 2/2] Paragraph support * Added support for paragraphs --- CHANGELOG.md | 5 ++++ README.md | 1 - example/index.php | 14 ++++++++- src/Parser/Html.php | 49 +++++++++++++++++++++++++++----- tests/MultipleAttributesTest.php | 2 +- 5 files changed, 61 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b5be38..f4f43a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ Full changelog for PHP Quill Renderer +## v0.90 - 2017-06-06 + +* Added support for paragraph breaks, converts double newlines from quill insert into a new p tag, the + feature is not yet bulletproof, I need to take another look at my parser. + ## v0.80.1 - 2017-04-26 * Composer autoload definition updated. diff --git a/README.md b/README.md index 0c648ad..f3b6690 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,6 @@ Image | `` * Markdown support * Lists (Bullets and Ordered) * Formatting options (justification etc.) -* Improved newline and paragraph support * Remaining toolbar options * Missing tests (options) diff --git a/example/index.php b/example/index.php index 7adc6f7..743ebea 100644 --- a/example/index.php +++ b/example/index.php @@ -6,7 +6,9 @@ require_once '../src/Parser/Parse.php'; require_once '../src/Parser/Html.php'; -$deltas = '{"ops":[{"insert":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed efficitur nibh tempor augue lobortis, nec eleifend velit venenatis. Nullam fringilla dui eget lectus mattis tincidunt. \nDonec sollicitudin, lacus sed luctus ultricies, "},{"attributes":{"strike":true,"italic":true},"insert":"quam sapien "},{"attributes":{"strike":true},"insert":"sollicitudin"},{"insert":" quam, nec auctor eros felis elementum quam. Fusce vel mollis enim. \n\n"},{"attributes":{"bold":true},"insert":"Sed ac augue tincidunt,"},{"insert":" cursus urna a, tempus ipsum. Donec pretium fermentum erat a "},{"attributes":{"underline":true},"insert":"elementum"},{"insert":". In est odio, mattis sed dignissim sed, porta ac nisl. Nunc et tellus imperdiet turpis placerat tristique nec quis justo. Aenean nisi libero, auctor a laoreet sed, fermentum vel massa.\n\nEtiam ultricies leo eget purus tempor dapibus. Integer ac sapien eros. Suspendisse convallis ex."}]}'; +$deltas = '{"ops":[{"insert":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed efficitur nibh tempor augue lobortis, nec eleifend velit venenatis. Nullam fringilla dui eget lectus mattis tincidunt. \nDonec sollicitudin, lacus sed luctus ultricies, "},{"attributes":{"strike":true,"italic":true},"insert":"quam sapien "},{"attributes":{"strike":true},"insert":"sollicitudin"},{"insert":" quam, nec auctor eros felis elementum quam. Fusce vel mollis enim. "},{"attributes":{"bold":true},"insert":"Sed ac augue tincidunt,"},{"insert":" cursus urna a, tempus ipsum. Donec pretium fermentum erat a "},{"attributes":{"underline":true},"insert":"elementum"},{"insert":". In est odio, mattis sed dignissim sed, porta ac nisl. Nunc et tellus imperdiet turpis placerat tristique nec quis justo. Aenean nisi libero, auctor a laoreet sed, fermentum vel massa. \n\nEtiam ultricies leo eget purus tempor dapibus. Integer ac sapien eros. Suspendisse convallis ex."}]}'; +$deltas = '{"ops":[{"insert":"This is a heading"},{"attributes":{"header":2},"insert":"\n"},{"insert":"\nNow some normal text.\n\nNow another heading"},{"attributes":{"header":1},"insert":"\n"}]}'; +$deltas = '{"ops":[{"insert":"Lorem ipsum dolor sit amet.\n\nLorem ipsum dolor sit amet."}]}'; try { $quill = new \DBlackborough\Quill\Render($deltas, 'HTML'); @@ -14,3 +16,13 @@ } catch (\Exception $e) { echo $e->getMessage(); } + + +/*$parser = new \DBlackborough\Quill\Parser\Html(); +$parser->load($deltas); +$parser->parse(); + +var_dump($parser->content()); + +$renderer = new \DBlackborough\Quill\Renderer\Html($parser->content()); +echo $renderer->render();*/ diff --git a/src/Parser/Html.php b/src/Parser/Html.php index eea7333..3f4236f 100644 --- a/src/Parser/Html.php +++ b/src/Parser/Html.php @@ -199,14 +199,17 @@ private function splitDeltas() foreach ($deltas as $delta) { if (array_key_exists('insert', $delta) === true && - array_key_exists('attributes', $delta) === false && + //array_key_exists('attributes', $delta) === false && @todo Why did I add this? is_array($delta['insert']) === false && - preg_match("/[\n]{2}/", $delta['insert']) !== 0) { + preg_match("/[\n]{2,}/", $delta['insert']) !== 0) { - foreach (explode("\n\n", $delta['insert']) as $match) { - if (strlen(trim($match)) > 0) { - $this->deltas[] = array('insert' => str_replace("\n", '', $match)); - } + foreach (explode("\n\n", $delta['insert']) as $k => $match) { + $new_delta = [ + 'insert' => str_replace("\n", '', $match), + 'break' => true + ]; + + $this->deltas[] = $new_delta; } } else { if (array_key_exists('insert', $delta) === true) { @@ -230,9 +233,13 @@ private function assignTags() $this->content[$i] = array( 'content' => null, - 'tags' => array() + 'tags' => array(), ); + if (array_key_exists('break', $insert) === true) { + $this->content[$i]['break'] = true; + } + $tags = array(); $has_tags = false; @@ -323,9 +330,35 @@ private function openParagraphs() } } + /** + * Convert breaks into new paragraphs + * + * @return void + */ + private function convertBreaks() + { + foreach ($this->content as $i => $content) { + if (array_key_exists('break', $content) === true) { + foreach ($content['tags'] as $tag) { + + if (count($content['tags']) === 1) { + if ($tag['open'] === null && $tag['close'] === 'options['block']['tag'] . '>') { + $this->content[$i]['tags'][0]['open'] = '<' . $this->options['block']['tag'] . '>'; + } + if ($tag['open'] === '<' . $this->options['block']['tag'] . '>' && $tag['close'] === null) { + $this->content[$i]['tags'][0]['close'] = 'options['block']['tag'] . '>'; + } + } + } + } + } + } + /** * Loops through the deltas object and generate the contents array * + * @todo Not keen on the close and remove methods, need to go through logic and try to remove need for them + * * @return boolean */ public function parse() @@ -344,6 +377,8 @@ public function parse() $this->lastItemClosed(); + $this->convertBreaks(); + return true; } else { return false; diff --git a/tests/MultipleAttributesTest.php b/tests/MultipleAttributesTest.php index 233c44d..5b98b1f 100644 --- a/tests/MultipleAttributesTest.php +++ b/tests/MultipleAttributesTest.php @@ -11,7 +11,7 @@ */ final class MultipleAttributesTest extends \PHPUnit\Framework\TestCase { - private $deltas_multiple_attributes = '{"ops":[{"insert":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed efficitur nibh tempor augue lobortis, nec eleifend velit venenatis. Nullam fringilla dui eget lectus mattis tincidunt. \nDonec sollicitudin, lacus sed luctus ultricies, "},{"attributes":{"strike":true,"italic":true},"insert":"quam sapien "},{"attributes":{"strike":true},"insert":"sollicitudin"},{"insert":" quam, nec auctor eros felis elementum quam. Fusce vel mollis enim. "},{"attributes":{"bold":true},"insert":"Sed ac augue tincidunt,"},{"insert":" cursus urna a, tempus ipsum. Donec pretium fermentum erat a "},{"attributes":{"underline":true},"insert":"elementum"},{"insert":". In est odio, mattis sed dignissim sed, porta ac nisl. Nunc et tellus imperdiet turpis placerat tristique nec quis justo. Aenean nisi libero, auctor a laoreet sed, fermentum vel massa. \n\nEtiam ultricies leo eget purus tempor dapibus. Integer ac sapien eros. Suspendisse convallis ex."}]}'; + private $deltas_multiple_attributes = '{"ops":[{"insert":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed efficitur nibh tempor augue lobortis, nec eleifend velit venenatis. Nullam fringilla dui eget lectus mattis tincidunt. \nDonec sollicitudin, lacus sed luctus ultricies, "},{"attributes":{"strike":true,"italic":true},"insert":"quam sapien "},{"attributes":{"strike":true},"insert":"sollicitudin"},{"insert":" quam, nec auctor eros felis elementum quam. Fusce vel mollis enim. "},{"attributes":{"bold":true},"insert":"Sed ac augue tincidunt,"},{"insert":" cursus urna a, tempus ipsum. Donec pretium fermentum erat a "},{"attributes":{"underline":true},"insert":"elementum"},{"insert":". In est odio, mattis sed dignissim sed, porta ac nisl. Nunc et tellus imperdiet turpis placerat tristique nec quis justo. Aenean nisi libero, auctor a laoreet sed, fermentum vel massa. Etiam ultricies leo eget purus tempor dapibus. Integer ac sapien eros. Suspendisse convallis ex."}]}'; public function testValidDeltasMultipleAttributes() {