Skip to content
This repository has been archived by the owner on Sep 18, 2023. It is now read-only.

Commit

Permalink
Paragraph support
Browse files Browse the repository at this point in the history
* Added support for paragraphs
  • Loading branch information
deanblackborough committed Jun 6, 2017
1 parent 2681958 commit ca81960
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 10 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ Image | `<img>`
* Markdown support
* Lists (Bullets and Ordered)
* Formatting options (justification etc.)
* Improved newline and paragraph support
* Remaining toolbar options
* Missing tests (options)

Expand Down
14 changes: 13 additions & 1 deletion example/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,23 @@
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');
echo $quill->render();
} 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();*/
49 changes: 42 additions & 7 deletions src/Parser/Html.php
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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;

Expand Down Expand Up @@ -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'] === '</' . $this->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'] = '</' . $this->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()
Expand All @@ -344,6 +377,8 @@ public function parse()

$this->lastItemClosed();

$this->convertBreaks();

return true;
} else {
return false;
Expand Down
2 changes: 1 addition & 1 deletion tests/MultipleAttributesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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()
{
Expand Down

0 comments on commit ca81960

Please sign in to comment.