Browse Source

update markup builder api

CPP-GTK4
yggverse 3 months ago
parent
commit
849bc2459b
  1. 149
      src/app/browser/main/tab/page/content/text/gemini.cpp
  2. 37
      src/app/browser/main/tab/page/content/text/gemini.hpp

149
src/app/browser/main/tab/page/content/text/gemini.cpp

@ -13,7 +13,7 @@ Gemini::Gemini(
); );
auto label = Gtk::make_managed<Gtk::Label>( // @TODO separated file? auto label = Gtk::make_managed<Gtk::Label>( // @TODO separated file?
to_pango_markup( Markup::make(
GEMTEXT GEMTEXT
) )
); );
@ -51,10 +51,38 @@ Gemini::Gemini(
); );
} }
Glib::ustring Gemini::to_pango_markup( // Match tools
bool Gemini::Line::Match::link(
const Glib::ustring & GEMTEXT,
Glib::ustring & address,
Glib::ustring & date,
Glib::ustring & alt
) {
auto match = Glib::Regex::split_simple(
R"regex(^=>\s*([^\s]+)(\s(\d{4}-\d{2}-\d{2}))?(\s(.+))?$)regex",
GEMTEXT
);
int index = 0; for (const Glib::ustring & MATCH : match)
{
switch (index)
{
case 1: address = MATCH; break;
case 3: date = MATCH; break;
case 5: alt = MATCH; break;
}
index++;
}
return !address.empty();
}
// Markup tools
Glib::ustring Gemini::Markup::make(
const Glib::ustring & GEMTEXT const Glib::ustring & GEMTEXT
) { ) {
Glib::ustring markup; Glib::ustring pango;
std::istringstream stream( std::istringstream stream(
GEMTEXT GEMTEXT
@ -64,81 +92,70 @@ Glib::ustring Gemini::to_pango_markup(
while (std::getline(stream, line)) while (std::getline(stream, line))
{ {
// Convert links // Links
auto match = Glib::Regex::split_simple( Glib::ustring address;
R"regex(^=>\s*([^\s]+)(\s(\d{4}-\d{2}-\d{2}))?(\s(.+))?$)regex", Glib::ustring date;
line.c_str() Glib::ustring alt;
);
Glib::ustring address = "";
Glib::ustring date = "";
Glib::ustring alt = "";
int index = 0;
for (const Glib::ustring & VALUE : match)
{
switch (index)
{
case 1: address = VALUE; break;
case 3: date = VALUE; break;
case 5: alt = VALUE; break;
}
index++; if (Line::Match::link(line, address, date, alt))
}
// Keep original on address not found in line
if (address.empty())
{ {
markup.append( pango.append(
line Markup::Make::link(
address,
date,
alt
)
); );
} }
// Make pango link
else else
{ {
// Crate link name pango.append(
Glib::ustring name; GEMTEXT
if (!date.empty())
{
name.append(
date
);
}
if (!alt.empty())
{
name.append(
name.empty() ? alt
: name + " " + alt // append (to date)
);
}
// Create pango markup
markup.append(
Glib::ustring::sprintf(
"<a href=\"%s\" title=\"%s\">%s</a>",
Glib::Markup::escape_text(
address // @TODO to absolute
),
Glib::Markup::escape_text(
address
),
Glib::Markup::escape_text(
name
)
)
); );
} }
markup.append( // @TODO other tags..
pango.append(
"\n" // @TODO "\n" // @TODO
); );
} }
// Return original gemtext on failure or pango markup on success return pango;
return markup.empty() ? GEMTEXT : markup; }
Glib::ustring Gemini::Markup::Make::link(
const Glib::ustring & ADDRESS,
const Glib::ustring & DATE,
const Glib::ustring & ALT
) {
Glib::ustring description;
if (!DATE.empty())
{
description.append(
DATE
);
}
if (!ALT.empty())
{
description.append(
description.empty() ? ALT : description + " " + ALT // append (to date)
);
}
return Glib::ustring::sprintf(
"<a href=\"%s\" title=\"%s\">%s</a>",
Glib::Markup::escape_text(
ADDRESS // @TODO to absolute
),
Glib::Markup::escape_text(
ADDRESS
),
Glib::Markup::escape_text(
description
)
);
} }

37
src/app/browser/main/tab/page/content/text/gemini.hpp

@ -12,13 +12,44 @@ namespace app::browser::main::tab::page::content::text
{ {
class Gemini : public Gtk::Viewport class Gemini : public Gtk::Viewport
{ {
public: /*
* Tools (currently is private)
*/
struct Line
{
struct Match
{
static bool link(
const Glib::ustring & GEMTEXT,
Glib::ustring & address,
Glib::ustring & date,
Glib::ustring & alt
);
};
};
Gemini( struct Markup
{
struct Make
{
static Glib::ustring link(
const Glib::ustring & ADDRESS,
const Glib::ustring & DATE,
const Glib::ustring & ALT
);
};
static Glib::ustring make(
const Glib::ustring & GEMTEXT const Glib::ustring & GEMTEXT
); );
};
static Glib::ustring to_pango_markup( /*
* Gemini class API
*/
public:
Gemini(
const Glib::ustring & GEMTEXT const Glib::ustring & GEMTEXT
); );
}; };

Loading…
Cancel
Save