rosavox/lib/alveolata/markdown/functions.php
2025-05-23 07:33:29 +00:00

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('![%s](%s)', $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;
}
?>