156 lines
2.2 KiB
PHP
156 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace alveolata\markdown;
|
|
|
|
|
|
/**
|
|
* @see https://www.markdownguide.org/basic-syntax/#escaping-characters
|
|
*/
|
|
function escape(
|
|
string $string
|
|
) : string
|
|
{
|
|
$replacements = [
|
|
['pattern' => "/\n([ ]*)-/", 'replacement' => "\n$1\\-"],
|
|
['pattern' => "/_/", 'replacement' => "\\_"],
|
|
['pattern' => "/\|/", 'replacement' => "\\\|"],
|
|
['pattern' => "/\*/", 'replacement' => "\\\*"],
|
|
['pattern' => "/\[/", 'replacement' => "\\\["],
|
|
['pattern' => "/\]/", 'replacement' => "\\\]"],
|
|
];
|
|
$result = $string;
|
|
foreach ($replacements as $replacement) {
|
|
$result = \preg_replace($replacement['pattern'], $replacement['replacement'], $result);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
function bold(
|
|
string $piece
|
|
) : string
|
|
{
|
|
return sprintf('__%s__', $piece);
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
function link(
|
|
string $label,
|
|
string $url
|
|
) : string
|
|
{
|
|
return sprintf('[%s](%s)', $label, $url);
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
function image(
|
|
string $label,
|
|
string $url
|
|
) : string
|
|
{
|
|
return sprintf('', $label, $url);
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
function headline(
|
|
int $level,
|
|
string $string
|
|
) : string
|
|
{
|
|
if ($level < 1) {
|
|
throw (new \Exception(sprintf('invalid level: %d', $level)));
|
|
}
|
|
return sprintf("%s %s\n\n", str_repeat('#', $level), $string);
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
function sectionend(
|
|
) : string
|
|
{
|
|
return sprintf("\n\n");
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
function paragraph(
|
|
string $string
|
|
) : string
|
|
{
|
|
return sprintf("%s\n\n", $string);
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
function code(
|
|
string $string
|
|
) : string
|
|
{
|
|
return sprintf("```\n%s\n```", $string);
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
function item(
|
|
int $level,
|
|
string $string
|
|
) : string
|
|
{
|
|
if ($level < 1) {
|
|
throw (new \Exception(sprintf('invalid level: %d', $level)));
|
|
}
|
|
return sprintf("%s- %s\n", str_repeat(' ', $level-1), $string);
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
function rule(
|
|
) : string
|
|
{
|
|
return sprintf("---\n\n");
|
|
}
|
|
|
|
|
|
/**
|
|
* @param null|array $titles {null|list<string>}
|
|
* @param array $data {list<list<string>>}
|
|
*/
|
|
function table(
|
|
array $titles,
|
|
array $data
|
|
) : string
|
|
{
|
|
$md = '';
|
|
if (! is_null($titles)) {
|
|
$md .= sprintf(
|
|
"| %s |\n",
|
|
implode(' | ', $titles)
|
|
);
|
|
$md .= sprintf(
|
|
"| %s |\n",
|
|
implode(' | ', array_map(function (string $title) {return ':--';}, $titles))
|
|
);
|
|
}
|
|
foreach ($data as $line) {
|
|
$md .= sprintf(
|
|
"| %s |\n",
|
|
implode(' | ', $line)
|
|
);
|
|
}
|
|
return $md;
|
|
}
|
|
|
|
?>
|