'int', 'body' => 'json', 'comment_count' => 'int', 'likes_count' => 'int', 'featured' => 'bool', 'publish_date' => 'datetime', ]; protected $fillable = [ 'title', 'slug', 'cliffhanger', 'excerpt', 'author_id', 'featured_image', 'editor', 'body', 'post_format', 'comment_count', 'likes_count', 'status', 'featured', 'publish_date', ]; protected $appends = [ //'html_body', ]; public function author() { return $this->belongsTo(Author::class); } public function post_categories() { return $this->hasMany(PostCategory::class); } public function post_category() { return $this->hasOne(PostCategory::class); } public function getHtmlBodyAttribute() { if (! is_empty($this->body)) { if ($this->editor == 'editorjs') { return LaravelEditorJs::render(json_encode($this->body)); } elseif ($this->editor == 'markdown') { //dd($this->body); $html = Markdown::convert($this->body)->getContent(); //dd($html); $html = str_replace('\\n', "\n", $html); $crawler = new Crawler($html); $firstHeaderProcessed = false; $crawler->filter('h1, h2, h3, h4, h5, h6')->each(function (Crawler $node) use (&$firstHeaderProcessed) { $element = $node->getNode(0); // Create a new h3 element $newElement = $element->ownerDocument->createElement('h3'); // Copy attributes from the old header element to the new h3 element foreach ($element->attributes as $attribute) { $newElement->setAttribute($attribute->name, $attribute->value); } // Add the 'fw-bold' class to the new h3 element $existingClasses = $element->getAttribute('class'); $newClass = 'fw-bold'; $updatedClasses = ($existingClasses ? $existingClasses.' ' : '').$newClass; $newElement->setAttribute('class', $updatedClasses); // Move child nodes from the old header element to the new h3 element while ($element->firstChild) { $newElement->appendChild($element->firstChild); } // Replace the old header element with the new h3 element in the DOM $element->parentNode->replaceChild($newElement, $element); // Only for the first header if (! $firstHeaderProcessed) { $firstHeaderProcessed = true; $nextSibling = $newElement->nextSibling; while ($nextSibling) { if ($nextSibling->nodeType === XML_ELEMENT_NODE) { if ($nextSibling->nodeName === 'p' && ($nextSibling->getElementsByTagName('img')->length > 0 || $nextSibling->getElementsByTagName('figure')->length > 0)) { // Remove

if it contains an or

directly $nextSibling->parentNode->removeChild($nextSibling); break; } elseif ($nextSibling->nodeName === 'img' || $nextSibling->nodeName === 'figure') { // Direct or
without wrapping

$newElement->parentNode->removeChild($nextSibling); break; } else { break; } } else { $nextSibling = $nextSibling->nextSibling; } } } }); // Modify the DOM by wrapping the tags inside a

and adding the desired structure $crawler->filter('img')->each(function (Crawler $node) { $imgElement = $node->getNode(0); // Update the class of the $existingClasses = $imgElement->getAttribute('class'); $newClasses = 'img-fluid rounded-2 shadow-sm mb-2'; $updatedClasses = ($existingClasses ? $existingClasses.' ' : '').$newClasses; $imgElement->setAttribute('class', $updatedClasses); // Create a new
element $figureElement = new \DOMElement('figure'); $imgElement->parentNode->insertBefore($figureElement, $imgElement); // Move the inside the
$figureElement->appendChild($imgElement); $figureElement->setAttribute('class', 'image'); // Create a new