mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-04-01 09:05:27 +00:00
implement markup models for different formats
This commit is contained in:
parent
805af30d5b
commit
83a5fc9d6e
6 changed files with 242 additions and 213 deletions
|
|
@ -1,8 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Yggverse\Yoda\Model\Gtk\Pango;
|
||||
|
||||
class Markup extends \Yggverse\Yoda\Abstract\Model\Gtk\Pango\Markup
|
||||
{}
|
||||
216
src/Model/Gtk/Pango/Markup/Gemtext.php
Normal file
216
src/Model/Gtk/Pango/Markup/Gemtext.php
Normal file
|
|
@ -0,0 +1,216 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Yggverse\Yoda\Model\Gtk\Pango\Markup;
|
||||
|
||||
use \Yggverse\Gemtext\Document;
|
||||
use \Yggverse\Gemtext\Entity\Code;
|
||||
use \Yggverse\Gemtext\Entity\Header;
|
||||
use \Yggverse\Gemtext\Entity\Link;
|
||||
use \Yggverse\Gemtext\Entity\Listing;
|
||||
use \Yggverse\Gemtext\Entity\Quote;
|
||||
use \Yggverse\Gemtext\Entity\Text;
|
||||
use \Yggverse\Net\Address;
|
||||
|
||||
class Gemtext extends \Yggverse\Yoda\Abstract\Model\Gtk\Pango\Markup
|
||||
{
|
||||
public static function format(
|
||||
string $gemtext,
|
||||
string $request,
|
||||
int $width = self::WRAP_WIDTH,
|
||||
?string &$title = null,
|
||||
bool $preformatted = false
|
||||
): string
|
||||
{
|
||||
$document = new Document(
|
||||
$gemtext
|
||||
);
|
||||
|
||||
$line = [];
|
||||
|
||||
foreach ($document->getEntities() as $entity)
|
||||
{
|
||||
switch (true)
|
||||
{
|
||||
case $entity instanceof Code:
|
||||
|
||||
if ($entity->isInline())
|
||||
{
|
||||
$line[] = self::code(
|
||||
$entity->getAlt()
|
||||
);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
$line[] = $preformatted ? self::tag(self::TAG_CODE, true)
|
||||
: self::tag(self::TAG_CODE, false);
|
||||
|
||||
$preformatted = !($preformatted); // toggle
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case $entity instanceof Header:
|
||||
|
||||
if ($preformatted)
|
||||
{
|
||||
$line[] = self::pre(
|
||||
$entity->toString()
|
||||
);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
switch ($entity->getLevel())
|
||||
{
|
||||
case 1: // #
|
||||
|
||||
$line[] = self::h1(
|
||||
$entity->getText()
|
||||
);
|
||||
|
||||
// Find title by first # tag
|
||||
if (is_null($title))
|
||||
{
|
||||
$title = $entity->getText();
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 2: // ##
|
||||
|
||||
$line[] = self::h2(
|
||||
$entity->getText()
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
case 3: // ###
|
||||
|
||||
$line[] = self::h3(
|
||||
$entity->getText()
|
||||
);
|
||||
|
||||
break;
|
||||
default:
|
||||
|
||||
throw new Exception;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case $entity instanceof Link:
|
||||
|
||||
if ($preformatted)
|
||||
{
|
||||
$line[] = self::pre(
|
||||
$entity->toString()
|
||||
);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
$line[] = self::h3(
|
||||
self::_url(
|
||||
$entity->getAddress(),
|
||||
$request
|
||||
),
|
||||
$entity->getAddress(),
|
||||
$entity->getAlt() ? $entity->getAlt()
|
||||
: $entity->getAddress() // @TODO date
|
||||
);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case $entity instanceof Listing:
|
||||
|
||||
if ($preformatted)
|
||||
{
|
||||
$line[] = self::pre(
|
||||
$entity->toString()
|
||||
);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
$line[] = self::list(
|
||||
$entity->getItem()
|
||||
);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case $entity instanceof Quote:
|
||||
|
||||
if ($preformatted)
|
||||
{
|
||||
$line[] = self::pre(
|
||||
$entity->toString()
|
||||
);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
$line[] = self::quote(
|
||||
$entity->getText()
|
||||
);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case $entity instanceof Text:
|
||||
|
||||
if ($preformatted)
|
||||
{
|
||||
$line[] = self::pre(
|
||||
$entity->toString()
|
||||
);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
$line[] = self::text(
|
||||
$entity->getData(),
|
||||
$width
|
||||
);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
throw new Exception;
|
||||
}
|
||||
}
|
||||
|
||||
return implode(
|
||||
PHP_EOL,
|
||||
$line
|
||||
);
|
||||
}
|
||||
|
||||
private static function _url(
|
||||
string $link,
|
||||
string $base
|
||||
): ?string
|
||||
{
|
||||
$address = new Address(
|
||||
$link
|
||||
);
|
||||
|
||||
if ($address->isRelative())
|
||||
{
|
||||
$address->toAbsolute(
|
||||
new Address(
|
||||
$base
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return $address->get();
|
||||
}
|
||||
}
|
||||
17
src/Model/Gtk/Pango/Markup/Plain.php
Normal file
17
src/Model/Gtk/Pango/Markup/Plain.php
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Yggverse\Yoda\Model\Gtk\Pango\Markup;
|
||||
|
||||
class Plain extends \Yggverse\Yoda\Abstract\Model\Gtk\Pango\Markup
|
||||
{
|
||||
public static function format(
|
||||
string $plain
|
||||
): string
|
||||
{
|
||||
return self::code(
|
||||
$plain
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue