mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-07 10:24:31 -04:00
Merge pull request #5863 from beganovich/v5-3105-pdf-markdown-support
(v5) Markdown support on PDFs
This commit is contained in:
commit
64830df3da
@ -346,6 +346,8 @@ class Design extends BaseDesign
|
|||||||
|
|
||||||
$items = $this->transformLineItems($this->entity->line_items, $type);
|
$items = $this->transformLineItems($this->entity->line_items, $type);
|
||||||
|
|
||||||
|
$this->processMarkdownOnLineItems($items);
|
||||||
|
|
||||||
if (count($items) == 0) {
|
if (count($items) == 0) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
@ -321,10 +321,27 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
|
|
||||||
public static function parseMarkdownToHtml(string $markdown): ?string
|
public static function parseMarkdownToHtml(string $markdown): ?string
|
||||||
{
|
{
|
||||||
|
// Use setting to determinate if parsing should be done.
|
||||||
|
// 'parse_markdown_on_pdfs'
|
||||||
|
|
||||||
$converter = new CommonMarkConverter([
|
$converter = new CommonMarkConverter([
|
||||||
'allow_unsafe_links' => false,
|
'allow_unsafe_links' => false,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return $converter->convertToHtml($markdown);
|
return $converter->convertToHtml($markdown);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function processMarkdownOnLineItems(array &$items)
|
||||||
|
{
|
||||||
|
// Use setting to determinate if parsing should be done.
|
||||||
|
// 'parse_markdown_on_pdfs'
|
||||||
|
|
||||||
|
foreach ($items as $key => $item) {
|
||||||
|
foreach ($item as $variable => $value) {
|
||||||
|
$item[$variable] = DesignHelpers::parseMarkdownToHtml($value ?? '');
|
||||||
|
}
|
||||||
|
|
||||||
|
$items[$key] = $item;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,10 @@ trait PdfMakerUtilities
|
|||||||
$contains_html = false;
|
$contains_html = false;
|
||||||
|
|
||||||
if (isset($child['content'])) {
|
if (isset($child['content'])) {
|
||||||
$child['content'] = nl2br($child['content']);
|
// Commented cause it keeps adding <br> at the end, if markdown parsing is turned on.
|
||||||
|
// Should update with 'parse_markdown_on_pdfs' setting.
|
||||||
|
|
||||||
|
// $child['content'] = nl2br($child['content']);
|
||||||
}
|
}
|
||||||
|
|
||||||
// "/\/[a-z]*>/i" -> checks for HTML-like tags:
|
// "/\/[a-z]*>/i" -> checks for HTML-like tags:
|
||||||
|
@ -17,6 +17,7 @@ use App\Models\CreditInvitation;
|
|||||||
use App\Models\InvoiceInvitation;
|
use App\Models\InvoiceInvitation;
|
||||||
use App\Models\QuoteInvitation;
|
use App\Models\QuoteInvitation;
|
||||||
use App\Models\RecurringInvoiceInvitation;
|
use App\Models\RecurringInvoiceInvitation;
|
||||||
|
use App\Services\PdfMaker\Designs\Utilities\DesignHelpers;
|
||||||
use App\Utils\Traits\MakesDates;
|
use App\Utils\Traits\MakesDates;
|
||||||
use Exception;
|
use Exception;
|
||||||
use Illuminate\Support\Facades\App;
|
use Illuminate\Support\Facades\App;
|
||||||
@ -121,7 +122,7 @@ class HtmlEngine
|
|||||||
if ($this->entity_string == 'invoice' || $this->entity_string == 'recurring_invoice') {
|
if ($this->entity_string == 'invoice' || $this->entity_string == 'recurring_invoice') {
|
||||||
$data['$entity'] = ['value' => '', 'label' => ctrans('texts.invoice')];
|
$data['$entity'] = ['value' => '', 'label' => ctrans('texts.invoice')];
|
||||||
$data['$number'] = ['value' => $this->entity->number ?: ' ', 'label' => ctrans('texts.invoice_number')];
|
$data['$number'] = ['value' => $this->entity->number ?: ' ', 'label' => ctrans('texts.invoice_number')];
|
||||||
$data['$entity.terms'] = ['value' => $this->entity->terms ?: '', 'label' => ctrans('texts.invoice_terms')];
|
$data['$entity.terms'] = ['value' => DesignHelpers::parseMarkdownToHtml($this->entity->terms ?: '') ?: '', 'label' => ctrans('texts.invoice_terms')];
|
||||||
$data['$terms'] = &$data['$entity.terms'];
|
$data['$terms'] = &$data['$entity.terms'];
|
||||||
$data['$view_link'] = ['value' => '<a class="button" href="'.$this->invitation->getLink().'">'.ctrans('texts.view_invoice').'</a>', 'label' => ctrans('texts.view_invoice')];
|
$data['$view_link'] = ['value' => '<a class="button" href="'.$this->invitation->getLink().'">'.ctrans('texts.view_invoice').'</a>', 'label' => ctrans('texts.view_invoice')];
|
||||||
$data['$view_url'] = ['value' => $this->invitation->getLink(), 'label' => ctrans('texts.view_invoice')];
|
$data['$view_url'] = ['value' => $this->invitation->getLink(), 'label' => ctrans('texts.view_invoice')];
|
||||||
@ -200,7 +201,7 @@ class HtmlEngine
|
|||||||
$data['$invoice.custom2'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'invoice2', $this->entity->custom_value2, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'invoice2')];
|
$data['$invoice.custom2'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'invoice2', $this->entity->custom_value2, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'invoice2')];
|
||||||
$data['$invoice.custom3'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'invoice3', $this->entity->custom_value3, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'invoice3')];
|
$data['$invoice.custom3'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'invoice3', $this->entity->custom_value3, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'invoice3')];
|
||||||
$data['$invoice.custom4'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'invoice4', $this->entity->custom_value4, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'invoice4')];
|
$data['$invoice.custom4'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'invoice4', $this->entity->custom_value4, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'invoice4')];
|
||||||
$data['$invoice.public_notes'] = ['value' => $this->entity->public_notes ?: '', 'label' => ctrans('texts.public_notes')];
|
$data['$invoice.public_notes'] = ['value' => DesignHelpers::parseMarkdownToHtml($this->entity->public_notes ?: '') ?: '', 'label' => ctrans('texts.public_notes')];
|
||||||
$data['$entity.public_notes'] = &$data['$invoice.public_notes'];
|
$data['$entity.public_notes'] = &$data['$invoice.public_notes'];
|
||||||
$data['$public_notes'] = &$data['$invoice.public_notes'];
|
$data['$public_notes'] = &$data['$invoice.public_notes'];
|
||||||
|
|
||||||
@ -374,7 +375,7 @@ class HtmlEngine
|
|||||||
$data['$description'] = ['value' => '', 'label' => ctrans('texts.description')];
|
$data['$description'] = ['value' => '', 'label' => ctrans('texts.description')];
|
||||||
|
|
||||||
//$data['$entity_footer'] = ['value' => $this->client->getSetting("{$this->entity_string}_footer"), 'label' => ''];
|
//$data['$entity_footer'] = ['value' => $this->client->getSetting("{$this->entity_string}_footer"), 'label' => ''];
|
||||||
$data['$entity_footer'] = ['value' => $this->entity->footer, 'label' => ''];
|
$data['$entity_footer'] = ['value' => DesignHelpers::parseMarkdownToHtml($this->entity->footer ?: ''), 'label' => ''];
|
||||||
|
|
||||||
$data['$page_size'] = ['value' => $this->settings->page_size, 'label' => ''];
|
$data['$page_size'] = ['value' => $this->settings->page_size, 'label' => ''];
|
||||||
$data['$page_layout'] = ['value' => property_exists($this->settings, 'page_layout') ? $this->settings->page_layout : 'Portrait', 'label' => ''];
|
$data['$page_layout'] = ['value' => property_exists($this->settings, 'page_layout') ? $this->settings->page_layout : 'Portrait', 'label' => ''];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user