mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-03-31 16:45:27 +00:00
refactor page mime routing to init multimedia support
This commit is contained in:
parent
720f9ebbae
commit
81595f0b79
6 changed files with 223 additions and 195 deletions
|
|
@ -0,0 +1,77 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Yggverse\Yoda\Abstract\Entity\Browser\Container\Page\Content;
|
||||
|
||||
use \Yggverse\Yoda\Entity\Browser\Container\Page\Content;
|
||||
|
||||
abstract class Markup
|
||||
{
|
||||
public \GtkLabel $gtk;
|
||||
|
||||
// Dependencies
|
||||
public Content $content;
|
||||
|
||||
// Defaults
|
||||
protected int $_wrap = 140;
|
||||
|
||||
public function __construct(
|
||||
Content $content
|
||||
) {
|
||||
// Init dependency
|
||||
$this->content = $content;
|
||||
|
||||
// Init markup label
|
||||
$this->gtk = new \GtkLabel;
|
||||
|
||||
$this->gtk->set_use_markup(
|
||||
true
|
||||
);
|
||||
|
||||
$this->gtk->set_selectable(
|
||||
true
|
||||
);
|
||||
|
||||
$this->gtk->set_can_focus(
|
||||
false
|
||||
);
|
||||
|
||||
$this->gtk->set_track_visited_links(
|
||||
true
|
||||
);
|
||||
|
||||
$this->gtk->set_xalign(
|
||||
0
|
||||
);
|
||||
|
||||
$this->gtk->set_yalign(
|
||||
0
|
||||
);
|
||||
|
||||
$this->gtk->show();
|
||||
|
||||
// Init events
|
||||
$this->gtk->connect(
|
||||
'activate-link',
|
||||
function(
|
||||
\GtkLabel $label,
|
||||
string $href
|
||||
) {
|
||||
$this->_onActivateLink(
|
||||
$label,
|
||||
$href
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
abstract protected function _onActivateLink(
|
||||
\GtkLabel $label,
|
||||
string $href
|
||||
);
|
||||
|
||||
abstract public function setSource(
|
||||
string $value
|
||||
): void;
|
||||
}
|
||||
|
|
@ -11,7 +11,6 @@ use \Yggverse\Yoda\Entity\Browser\Container\Page\Content;
|
|||
use \Yggverse\Yoda\Entity\Browser\Container\Page\Response;
|
||||
|
||||
use \Yggverse\Yoda\Model\Connection;
|
||||
use \Yggverse\Yoda\Model\Filesystem;
|
||||
|
||||
class Page
|
||||
{
|
||||
|
|
@ -200,57 +199,10 @@ class Page
|
|||
);
|
||||
|
||||
// Update content
|
||||
switch ($connection->getMime())
|
||||
{
|
||||
case Filesystem::MIME_TEXT_GEMINI:
|
||||
|
||||
$title = null;
|
||||
|
||||
$this->content->setGemtext(
|
||||
(string) $connection->getData(),
|
||||
$title
|
||||
);
|
||||
|
||||
if ($title)
|
||||
{
|
||||
$this->title->setValue(
|
||||
$title
|
||||
);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case Filesystem::MIME_TEXT_PLAIN:
|
||||
|
||||
$this->content->setPlain(
|
||||
(string) $connection->getData()
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
/* @TODO
|
||||
case 'image/gif':
|
||||
case 'image/jpeg':
|
||||
case 'image/png':
|
||||
case 'image/webp':
|
||||
|
||||
$this->content->setImage(
|
||||
(string) $connection->getData()
|
||||
);
|
||||
|
||||
break;
|
||||
*/
|
||||
|
||||
default:
|
||||
|
||||
$this->title->setValue(
|
||||
_('Oops!')
|
||||
);
|
||||
|
||||
$this->content->setPlain(
|
||||
_('MIME type not supported')
|
||||
);
|
||||
}
|
||||
$this->content->set(
|
||||
$connection->getData(),
|
||||
$connection->getMime()
|
||||
);
|
||||
|
||||
// Hide progressbar
|
||||
$this->progressbar->hide();
|
||||
|
|
@ -271,7 +223,7 @@ class Page
|
|||
);
|
||||
|
||||
// Update content
|
||||
$this->content->setGemtext(
|
||||
$this->content->set(
|
||||
_('Response time reached')
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -4,29 +4,37 @@ declare(strict_types=1);
|
|||
|
||||
namespace Yggverse\Yoda\Entity\Browser\Container\Page;
|
||||
|
||||
use \Yggverse\Yoda\Entity\Browser\Container\Page\Content\Data;
|
||||
use \Yggverse\Yoda\Entity\Browser\Container\Page;
|
||||
|
||||
use \Yggverse\Yoda\Entity\Browser\Container\Page\Content\Gemtext;
|
||||
use \Yggverse\Yoda\Entity\Browser\Container\Page\Content\Image;
|
||||
use \Yggverse\Yoda\Entity\Browser\Container\Page\Content\Plain;
|
||||
use \Yggverse\Yoda\Entity\Browser\Container\Page\Content\Viewport;
|
||||
|
||||
use \Yggverse\Yoda\Model\Filesystem;
|
||||
|
||||
class Content
|
||||
{
|
||||
public \GtkScrolledWindow $gtk;
|
||||
|
||||
// Dependencies
|
||||
public \Yggverse\Yoda\Entity\Browser\Container\Page $page;
|
||||
public Page $page;
|
||||
|
||||
// Requirements
|
||||
public \Yggverse\Yoda\Entity\Browser\Container\Page\Content\Data $data;
|
||||
public \Yggverse\Yoda\Entity\Browser\Container\Page\Content\Viewport $viewport;
|
||||
public Viewport $viewport;
|
||||
|
||||
// Defaults
|
||||
private int $_margin = 8;
|
||||
|
||||
// Extras
|
||||
private ?string $_source = null;
|
||||
|
||||
public function __construct(
|
||||
\Yggverse\Yoda\Entity\Browser\Container\Page $page
|
||||
Page $page
|
||||
) {
|
||||
$this->page = $page;
|
||||
|
||||
// Init container
|
||||
// Init scrolled window container
|
||||
$this->gtk = new \GtkScrolledWindow;
|
||||
|
||||
$this->gtk->set_margin_start(
|
||||
|
|
@ -41,21 +49,11 @@ class Content
|
|||
$this->_margin
|
||||
);
|
||||
|
||||
// Init viewport
|
||||
// to integrate scrolled window features for data label
|
||||
// Init scrolled window viewport
|
||||
$this->viewport = new Viewport(
|
||||
$this
|
||||
);
|
||||
|
||||
// Init data label
|
||||
$this->data = new Data(
|
||||
$this
|
||||
);
|
||||
|
||||
$this->viewport->gtk->add(
|
||||
$this->data->gtk
|
||||
);
|
||||
|
||||
$this->gtk->add(
|
||||
$this->viewport->gtk
|
||||
);
|
||||
|
|
@ -64,28 +62,73 @@ class Content
|
|||
$this->gtk->show();
|
||||
}
|
||||
|
||||
public function set(
|
||||
?string $data,
|
||||
?string $mime
|
||||
): void
|
||||
{
|
||||
$this->_source = $data;
|
||||
|
||||
switch ($mime)
|
||||
{
|
||||
case Filesystem::MIME_TEXT_GEMINI:
|
||||
|
||||
$document = new Gemtext(
|
||||
$this
|
||||
);
|
||||
|
||||
$document->setSource(
|
||||
$data
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
case Filesystem::MIME_TEXT_PLAIN:
|
||||
|
||||
$document = new Plain(
|
||||
$this
|
||||
);
|
||||
|
||||
$document->setSource(
|
||||
$data
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
/* @TODO
|
||||
case 'image/gif':
|
||||
case 'image/jpeg':
|
||||
case 'image/png':
|
||||
case 'image/webp':
|
||||
|
||||
break;
|
||||
*/
|
||||
|
||||
default:
|
||||
|
||||
$document = new Plain(
|
||||
$this
|
||||
);
|
||||
|
||||
$document->setSource(
|
||||
_('MIME type not supported')
|
||||
);
|
||||
}
|
||||
|
||||
$this->viewport->gtk->add(
|
||||
$document->gtk
|
||||
);
|
||||
|
||||
//$this->gtk->show_all();
|
||||
}
|
||||
|
||||
public function getSource(): ?string
|
||||
{
|
||||
return $this->_source;
|
||||
}
|
||||
|
||||
public function refresh()
|
||||
{
|
||||
// @TODO
|
||||
}
|
||||
|
||||
public function setGemtext(
|
||||
?string $data = null,
|
||||
?string &$title = null
|
||||
): void
|
||||
{
|
||||
$this->data->setGemtext(
|
||||
$data,
|
||||
$title
|
||||
);
|
||||
}
|
||||
|
||||
public function setPlain(
|
||||
?string $data = null
|
||||
): void
|
||||
{
|
||||
$this->data->setPlain(
|
||||
$data
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -7,115 +7,16 @@ namespace Yggverse\Yoda\Entity\Browser\Container\Page\Content;
|
|||
use \Yggverse\Gemtext\Document;
|
||||
use \Yggverse\Net\Address;
|
||||
|
||||
class Data
|
||||
class Gemtext extends \Yggverse\Yoda\Abstract\Entity\Browser\Container\Page\Content\Markup
|
||||
{
|
||||
public \GtkLabel $gtk;
|
||||
|
||||
// Extras
|
||||
public ?string $raw = null;
|
||||
|
||||
// Dependencies
|
||||
public \Yggverse\Yoda\Entity\Browser\Container\Page\Content $content;
|
||||
|
||||
// Defaults
|
||||
private int $_wrap = 140;
|
||||
|
||||
public function __construct(
|
||||
\Yggverse\Yoda\Entity\Browser\Container\Page\Content $content
|
||||
) {
|
||||
// Init dependency
|
||||
$this->content = $content;
|
||||
|
||||
// Init markup label
|
||||
$this->gtk = new \GtkLabel;
|
||||
|
||||
$this->gtk->set_use_markup(
|
||||
true
|
||||
);
|
||||
|
||||
$this->gtk->set_selectable(
|
||||
true
|
||||
);
|
||||
|
||||
$this->gtk->set_can_focus(
|
||||
false
|
||||
);
|
||||
|
||||
$this->gtk->set_track_visited_links(
|
||||
true
|
||||
);
|
||||
|
||||
$this->gtk->set_xalign(
|
||||
0
|
||||
);
|
||||
|
||||
$this->gtk->set_yalign(
|
||||
0
|
||||
);
|
||||
|
||||
// Render
|
||||
$this->gtk->show();
|
||||
|
||||
// Init events
|
||||
$this->gtk->connect(
|
||||
'activate-link',
|
||||
function(
|
||||
\GtkLabel $label,
|
||||
string $href
|
||||
) {
|
||||
// Format URL
|
||||
$url = $this->_url(
|
||||
$href
|
||||
);
|
||||
|
||||
// Update request entry
|
||||
$this->content->page->navbar->request->setValue(
|
||||
$this->_url(
|
||||
$href
|
||||
)
|
||||
);
|
||||
|
||||
// Update page
|
||||
$this->content->page->update();
|
||||
|
||||
// Prevent propagation for supported protocols
|
||||
if (in_array(
|
||||
parse_url(
|
||||
$url,
|
||||
PHP_URL_SCHEME
|
||||
),
|
||||
[
|
||||
'nex',
|
||||
'gemini',
|
||||
'file'
|
||||
])
|
||||
) return true;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
public function setPlain(
|
||||
string $value
|
||||
): void
|
||||
{
|
||||
$this->gtk->set_markup(
|
||||
sprintf(
|
||||
'<tt>%s</tt>',
|
||||
htmlspecialchars(
|
||||
$value
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
$this->raw = $value;
|
||||
}
|
||||
|
||||
public function setGemtext(
|
||||
public function setSource(
|
||||
string $value,
|
||||
string | null &$title = null,
|
||||
bool $preformatted = false
|
||||
): void
|
||||
{
|
||||
$this->_source = $value;
|
||||
|
||||
$document = new Document(
|
||||
$value
|
||||
);
|
||||
|
|
@ -330,8 +231,39 @@ class Data
|
|||
$line
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
$this->raw = $value;
|
||||
protected function _onActivateLink(
|
||||
\GtkLabel $label,
|
||||
string $href
|
||||
) {
|
||||
// Format URL
|
||||
$url = $this->_url(
|
||||
$href
|
||||
);
|
||||
|
||||
// Update request entry
|
||||
$this->content->page->navbar->request->setValue(
|
||||
$this->_url(
|
||||
$href
|
||||
)
|
||||
);
|
||||
|
||||
// Update page
|
||||
$this->content->page->update();
|
||||
|
||||
// Prevent propagation for supported protocols
|
||||
if (in_array(
|
||||
parse_url(
|
||||
$url,
|
||||
PHP_URL_SCHEME
|
||||
),
|
||||
[
|
||||
'nex',
|
||||
'gemini',
|
||||
'file'
|
||||
])
|
||||
) return true;
|
||||
}
|
||||
|
||||
private function _wrap(
|
||||
24
src/Entity/Browser/Container/Page/Content/Plain.php
Normal file
24
src/Entity/Browser/Container/Page/Content/Plain.php
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Yggverse\Yoda\Entity\Browser\Container\Page\Content;
|
||||
|
||||
class Plain extends \Yggverse\Yoda\Abstract\Entity\Browser\Container\Page\Content\Markup
|
||||
{
|
||||
public function setSource(
|
||||
string $value
|
||||
): void
|
||||
{
|
||||
$this->_source = $value;
|
||||
|
||||
$this->gtk->set_markup(
|
||||
sprintf(
|
||||
'<tt>%s</tt>',
|
||||
htmlspecialchars(
|
||||
$value
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -62,7 +62,7 @@ class Save
|
|||
{
|
||||
file_put_contents(
|
||||
$dialog->get_filename(),
|
||||
$page->content->data->raw
|
||||
$page->content->getSource()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue