mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-04-01 17:15:28 +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
|
|
@ -9,8 +9,6 @@ use \GtkLabel;
|
||||||
|
|
||||||
use \Yggverse\Yoda\Entity\Browser\Container\Page\Content;
|
use \Yggverse\Yoda\Entity\Browser\Container\Page\Content;
|
||||||
|
|
||||||
use \Yggverse\Net\Address;
|
|
||||||
|
|
||||||
abstract class Markup
|
abstract class Markup
|
||||||
{
|
{
|
||||||
public GtkLabel $gtk;
|
public GtkLabel $gtk;
|
||||||
|
|
@ -126,25 +124,4 @@ abstract class Markup
|
||||||
abstract public function set(
|
abstract public function set(
|
||||||
string $value
|
string $value
|
||||||
): void;
|
): void;
|
||||||
|
|
||||||
// Tools
|
|
||||||
protected function _url(
|
|
||||||
string $link
|
|
||||||
): ?string
|
|
||||||
{
|
|
||||||
$address = new Address(
|
|
||||||
$link
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($address->isRelative())
|
|
||||||
{
|
|
||||||
$address->toAbsolute(
|
|
||||||
new Address(
|
|
||||||
$this->content->page->navbar->request->getValue()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $address->get();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,15 +10,7 @@ use \GdkEvent;
|
||||||
use \GtkLabel;
|
use \GtkLabel;
|
||||||
use \Pango;
|
use \Pango;
|
||||||
|
|
||||||
use \Yggverse\Yoda\Model\Gtk\Pango\Markup;
|
use \Yggverse\Yoda\Model\Gtk\Pango\Markup\Gemtext as 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\Gemtext\Parser\Link as LinkParser;
|
# use \Yggverse\Gemtext\Parser\Link as LinkParser;
|
||||||
|
|
||||||
|
|
@ -26,177 +18,15 @@ class Gemtext extends \Yggverse\Yoda\Abstract\Entity\Browser\Container\Page\Cont
|
||||||
{
|
{
|
||||||
public function set(
|
public function set(
|
||||||
string $source,
|
string $source,
|
||||||
string | null &$title = null,
|
string | null &$title = null
|
||||||
bool $preformatted = false
|
|
||||||
): void
|
): void
|
||||||
{
|
{
|
||||||
$document = new Document(
|
|
||||||
$this->_source = $source
|
|
||||||
);
|
|
||||||
|
|
||||||
$line = [];
|
|
||||||
|
|
||||||
foreach ($document->getEntities() as $entity)
|
|
||||||
{
|
|
||||||
switch (true)
|
|
||||||
{
|
|
||||||
case $entity instanceof Code:
|
|
||||||
|
|
||||||
if ($entity->isInline())
|
|
||||||
{
|
|
||||||
$line[] = Markup::code(
|
|
||||||
$entity->getAlt()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$line[] = $preformatted ? Markup::tag(Markup::TAG_CODE, true)
|
|
||||||
: Markup::tag(Markup::TAG_CODE, false);
|
|
||||||
|
|
||||||
$preformatted = !($preformatted); // toggle
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case $entity instanceof Header:
|
|
||||||
|
|
||||||
if ($preformatted)
|
|
||||||
{
|
|
||||||
$line[] = Markup::pre(
|
|
||||||
$entity->toString()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch ($entity->getLevel())
|
|
||||||
{
|
|
||||||
case 1: // #
|
|
||||||
|
|
||||||
$line[] = Markup::h1(
|
|
||||||
$entity->getText()
|
|
||||||
);
|
|
||||||
|
|
||||||
// Find and return document title by first # tag
|
|
||||||
if (empty($title))
|
|
||||||
{
|
|
||||||
$title = $entity->getText();
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2: // ##
|
|
||||||
|
|
||||||
$line[] = Markup::h2(
|
|
||||||
$entity->getText()
|
|
||||||
);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3: // ###
|
|
||||||
|
|
||||||
$line[] = Markup::h3(
|
|
||||||
$entity->getText()
|
|
||||||
);
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
|
|
||||||
throw new Exception;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case $entity instanceof Link:
|
|
||||||
|
|
||||||
if ($preformatted)
|
|
||||||
{
|
|
||||||
$line[] = Markup::pre(
|
|
||||||
$entity->toString()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$line[] = Markup::h3(
|
|
||||||
$this->_url(
|
|
||||||
$entity->getAddress()
|
|
||||||
),
|
|
||||||
$entity->getAddress(),
|
|
||||||
$entity->getAlt() ? $entity->getAlt()
|
|
||||||
: $entity->getAddress() // @TODO date
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case $entity instanceof Listing:
|
|
||||||
|
|
||||||
if ($preformatted)
|
|
||||||
{
|
|
||||||
$line[] = Markup::pre(
|
|
||||||
$entity->toString()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$line[] = Markup::list(
|
|
||||||
$entity->getItem()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case $entity instanceof Quote:
|
|
||||||
|
|
||||||
if ($preformatted)
|
|
||||||
{
|
|
||||||
$line[] = Markup::pre(
|
|
||||||
$entity->toString()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$line[] = Markup::quote(
|
|
||||||
$entity->getText()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case $entity instanceof Text:
|
|
||||||
|
|
||||||
if ($preformatted)
|
|
||||||
{
|
|
||||||
$line[] = Markup::pre(
|
|
||||||
$entity->toString()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$line[] = Markup::text(
|
|
||||||
$entity->getData(),
|
|
||||||
$this->content->page->gtk->get_allocated_width()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
|
|
||||||
throw new Exception;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->gtk->set_markup(
|
$this->gtk->set_markup(
|
||||||
implode(
|
Markup::format(
|
||||||
PHP_EOL,
|
$this->_source = $source,
|
||||||
$line
|
$this->content->page->navbar->request->getValue(),
|
||||||
|
$this->content->page->gtk->get_allocated_width(),
|
||||||
|
$title
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,7 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace Yggverse\Yoda\Entity\Browser\Container\Page\Content;
|
namespace Yggverse\Yoda\Entity\Browser\Container\Page\Content;
|
||||||
|
|
||||||
use \GdkEvent;
|
use \Yggverse\Yoda\Model\Gtk\Pango\Markup\Plain as Markup;
|
||||||
use \GtkLabel;
|
|
||||||
|
|
||||||
use \Yggverse\Yoda\Model\Gtk\Pango\Markup;
|
|
||||||
|
|
||||||
class Plain extends \Yggverse\Yoda\Abstract\Entity\Browser\Container\Page\Content\Markup
|
class Plain extends \Yggverse\Yoda\Abstract\Entity\Browser\Container\Page\Content\Markup
|
||||||
{
|
{
|
||||||
|
|
@ -16,7 +13,7 @@ class Plain extends \Yggverse\Yoda\Abstract\Entity\Browser\Container\Page\Conten
|
||||||
): void
|
): void
|
||||||
{
|
{
|
||||||
$this->gtk->set_markup(
|
$this->gtk->set_markup(
|
||||||
Markup::code( // @TODO
|
Markup::format(
|
||||||
$this->_source = $source
|
$this->_source = $source
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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