mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-03-31 08:35:28 +00:00
remove some extra members
This commit is contained in:
parent
9e787468ac
commit
1706f14e96
5 changed files with 5 additions and 156 deletions
|
|
@ -1,7 +1,6 @@
|
||||||
mod ansi;
|
mod ansi;
|
||||||
pub mod error;
|
pub mod error;
|
||||||
mod gutter;
|
mod gutter;
|
||||||
mod icon;
|
|
||||||
mod syntax;
|
mod syntax;
|
||||||
mod tags;
|
mod tags;
|
||||||
|
|
||||||
|
|
@ -9,22 +8,19 @@ use super::{ItemAction, WindowAction};
|
||||||
use crate::app::browser::window::action::Position;
|
use crate::app::browser::window::action::Position;
|
||||||
pub use error::Error;
|
pub use error::Error;
|
||||||
use gtk::{
|
use gtk::{
|
||||||
EventControllerMotion, GestureClick, TextBuffer, TextTag, TextView, TextWindowType,
|
EventControllerMotion, GestureClick, TextBuffer, TextTag, TextTagTable, TextView,
|
||||||
UriLauncher, Window, WrapMode,
|
TextWindowType, UriLauncher, Window, WrapMode,
|
||||||
gdk::{BUTTON_MIDDLE, BUTTON_PRIMARY, BUTTON_SECONDARY, RGBA},
|
gdk::{BUTTON_MIDDLE, BUTTON_PRIMARY, BUTTON_SECONDARY, RGBA},
|
||||||
gio::{Cancellable, SimpleAction, SimpleActionGroup},
|
gio::{Cancellable, SimpleAction, SimpleActionGroup},
|
||||||
glib::{Uri, uuid_string_random},
|
glib::{Uri, uuid_string_random},
|
||||||
prelude::{PopoverExt, TextBufferExt, TextBufferExtManual, TextTagExt, TextViewExt, WidgetExt},
|
prelude::{PopoverExt, TextBufferExt, TextTagExt, TextViewExt, WidgetExt},
|
||||||
};
|
};
|
||||||
use gutter::Gutter;
|
use gutter::Gutter;
|
||||||
use icon::Icon;
|
|
||||||
use sourceview::prelude::{ActionExt, ActionMapExt, DisplayExt, ToVariant};
|
use sourceview::prelude::{ActionExt, ActionMapExt, DisplayExt, ToVariant};
|
||||||
use std::{cell::Cell, collections::HashMap, rc::Rc};
|
use std::{cell::Cell, collections::HashMap, rc::Rc};
|
||||||
use syntax::Syntax;
|
use syntax::Syntax;
|
||||||
use tags::Tags;
|
use tags::Tags;
|
||||||
|
|
||||||
pub const NEW_LINE: &str = "\n";
|
|
||||||
|
|
||||||
pub struct Markdown {
|
pub struct Markdown {
|
||||||
pub title: Option<String>,
|
pub title: Option<String>,
|
||||||
pub text_view: TextView,
|
pub text_view: TextView,
|
||||||
|
|
@ -49,9 +45,6 @@ impl Markdown {
|
||||||
// Init code features
|
// Init code features
|
||||||
//let mut code = None;
|
//let mut code = None;
|
||||||
|
|
||||||
// Init quote icon feature
|
|
||||||
let mut is_line_after_quote = false;
|
|
||||||
|
|
||||||
// Init colors
|
// Init colors
|
||||||
// @TODO use accent colors in adw 1.6 / ubuntu 24.10+
|
// @TODO use accent colors in adw 1.6 / ubuntu 24.10+
|
||||||
let link_color = (
|
let link_color = (
|
||||||
|
|
@ -62,14 +55,11 @@ impl Markdown {
|
||||||
// Init syntect highlight features
|
// Init syntect highlight features
|
||||||
let syntax = Syntax::new();
|
let syntax = Syntax::new();
|
||||||
|
|
||||||
// Init icons
|
|
||||||
let icon = Icon::new();
|
|
||||||
|
|
||||||
// Init tags
|
// Init tags
|
||||||
let tags = Tags::new();
|
let tags = Tags::new();
|
||||||
|
|
||||||
// Init new text buffer
|
// Init new text buffer
|
||||||
let buffer = TextBuffer::new(Some(&tags.text_tag_table));
|
let buffer = TextBuffer::new(Some(&TextTagTable::new()));
|
||||||
buffer.set_text(markdown);
|
buffer.set_text(markdown);
|
||||||
|
|
||||||
// Init main widget
|
// Init main widget
|
||||||
|
|
@ -194,42 +184,6 @@ impl Markdown {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is list
|
|
||||||
|
|
||||||
if let Some(value) = ggemtext::line::list::Gemtext::as_value(line) {
|
|
||||||
buffer.insert_with_tags(
|
|
||||||
&mut buffer.end_iter(),
|
|
||||||
&format!("• {value}"),
|
|
||||||
&[&tag.list],
|
|
||||||
);
|
|
||||||
buffer.insert(&mut buffer.end_iter(), NEW_LINE);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is quote
|
|
||||||
|
|
||||||
if let Some(quote) = ggemtext::line::quote::Gemtext::as_value(line) {
|
|
||||||
// Show quote indicator if last line is not quote (to prevent duplicates)
|
|
||||||
if !is_line_after_quote {
|
|
||||||
// Show only if the icons resolved for default `Display`
|
|
||||||
if let Some(ref icon) = icon {
|
|
||||||
buffer.insert_paintable(&mut buffer.end_iter(), &icon.quote);
|
|
||||||
buffer.insert(&mut buffer.end_iter(), NEW_LINE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buffer.insert_with_tags(&mut buffer.end_iter(), quote, &[&tag.quote]);
|
|
||||||
buffer.insert(&mut buffer.end_iter(), NEW_LINE);
|
|
||||||
is_line_after_quote = true;
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
is_line_after_quote = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nothing match custom tags above,
|
|
||||||
// just append plain text covered in empty tag (to handle controller events properly)
|
|
||||||
buffer.insert_with_tags(&mut buffer.end_iter(), line, &[&tag.plain]);
|
|
||||||
buffer.insert(&mut buffer.end_iter(), NEW_LINE);
|
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
// Context menu
|
// Context menu
|
||||||
|
|
@ -528,21 +482,5 @@ fn link_prefix(request: String, prefix: &str) -> String {
|
||||||
format!("{prefix}{}", request.trim_start_matches(prefix))
|
format!("{prefix}{}", request.trim_start_matches(prefix))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Header tag
|
|
||||||
fn header(buffer: &TextBuffer, tag: &TextTag, line: &str, pattern: &str) -> Option<String> {
|
|
||||||
if let Some(h) = line.trim_start().strip_prefix(pattern)
|
|
||||||
&& !h.starts_with(pattern)
|
|
||||||
{
|
|
||||||
let header = h.trim();
|
|
||||||
buffer.insert_with_tags(&mut buffer.end_iter(), header, &[tag]);
|
|
||||||
buffer.insert(&mut buffer.end_iter(), NEW_LINE);
|
|
||||||
Some(header.into())
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const LINK_PREFIX_DOWNLOAD: &str = "download:";
|
const LINK_PREFIX_DOWNLOAD: &str = "download:";
|
||||||
const LINK_PREFIX_SOURCE: &str = "source:";
|
const LINK_PREFIX_SOURCE: &str = "source:";
|
||||||
|
|
||||||
const H: &str = "#";
|
|
||||||
|
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
use gtk::{IconLookupFlags, IconPaintable, IconTheme, TextDirection, gdk::Display};
|
|
||||||
|
|
||||||
const SIZE: i32 = 16;
|
|
||||||
|
|
||||||
/// Indication icons asset (for tag blocks decoration)
|
|
||||||
pub struct Icon {
|
|
||||||
pub quote: IconPaintable,
|
|
||||||
// @TODO other tags..
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Icon {
|
|
||||||
pub fn new() -> Option<Self> {
|
|
||||||
Display::default().map(|display| {
|
|
||||||
let theme = IconTheme::for_display(&display);
|
|
||||||
Self {
|
|
||||||
quote: icon(&theme, "mail-forward-symbolic"),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn icon(theme: &IconTheme, name: &str) -> IconPaintable {
|
|
||||||
theme.lookup_icon(
|
|
||||||
name,
|
|
||||||
&[], // @TODO
|
|
||||||
SIZE,
|
|
||||||
SIZE,
|
|
||||||
TextDirection::None,
|
|
||||||
IconLookupFlags::FORCE_SYMBOLIC,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
@ -1,37 +1,24 @@
|
||||||
mod bold;
|
mod bold;
|
||||||
mod header;
|
mod header;
|
||||||
mod list;
|
|
||||||
mod quote;
|
mod quote;
|
||||||
mod reference;
|
mod reference;
|
||||||
mod strike;
|
mod strike;
|
||||||
mod title;
|
|
||||||
mod underline;
|
mod underline;
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use bold::Bold;
|
use bold::Bold;
|
||||||
use gtk::{
|
use gtk::{TextBuffer, TextTag, gdk::RGBA, glib::Uri};
|
||||||
TextBuffer, TextTag, TextTagTable,
|
|
||||||
gdk::RGBA,
|
|
||||||
glib::Uri,
|
|
||||||
prelude::{TextBufferExt, TextBufferExtManual},
|
|
||||||
};
|
|
||||||
use header::Header;
|
use header::Header;
|
||||||
use list::List;
|
|
||||||
use quote::Quote;
|
use quote::Quote;
|
||||||
use strike::Strike;
|
use strike::Strike;
|
||||||
use title::Title;
|
|
||||||
use underline::Underline;
|
use underline::Underline;
|
||||||
|
|
||||||
pub struct Tags {
|
pub struct Tags {
|
||||||
pub text_tag_table: TextTagTable,
|
|
||||||
// Tags
|
|
||||||
pub bold: Bold,
|
pub bold: Bold,
|
||||||
pub header: Header,
|
pub header: Header,
|
||||||
pub list: TextTag,
|
|
||||||
pub quote: Quote,
|
pub quote: Quote,
|
||||||
pub strike: Strike,
|
pub strike: Strike,
|
||||||
pub title: TextTag,
|
|
||||||
pub underline: Underline,
|
pub underline: Underline,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -44,24 +31,11 @@ impl Default for Tags {
|
||||||
impl Tags {
|
impl Tags {
|
||||||
// Construct
|
// Construct
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
// Init tag table
|
|
||||||
let text_tag_table = TextTagTable::new();
|
|
||||||
|
|
||||||
// Init shared tags members
|
|
||||||
let list = TextTag::list();
|
|
||||||
let title = TextTag::title();
|
|
||||||
text_tag_table.add(&title);
|
|
||||||
text_tag_table.add(&list);
|
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
text_tag_table,
|
|
||||||
// Tags
|
|
||||||
bold: Bold::new(),
|
bold: Bold::new(),
|
||||||
header: Header::new(),
|
header: Header::new(),
|
||||||
list,
|
|
||||||
quote: Quote::new(),
|
quote: Quote::new(),
|
||||||
strike: Strike::new(),
|
strike: Strike::new(),
|
||||||
title,
|
|
||||||
underline: Underline::new(),
|
underline: Underline::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
use gtk::{TextTag, WrapMode};
|
|
||||||
|
|
||||||
pub trait List {
|
|
||||||
fn list() -> Self;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl List for TextTag {
|
|
||||||
fn list() -> Self {
|
|
||||||
TextTag::builder()
|
|
||||||
.left_margin(28)
|
|
||||||
.pixels_above_lines(4)
|
|
||||||
.pixels_below_lines(4)
|
|
||||||
.wrap_mode(WrapMode::Word)
|
|
||||||
.build()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
use gtk::{TextTag, WrapMode};
|
|
||||||
|
|
||||||
pub trait Title {
|
|
||||||
fn title() -> Self;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Title for TextTag {
|
|
||||||
fn title() -> Self {
|
|
||||||
TextTag::builder()
|
|
||||||
.pixels_above_lines(4)
|
|
||||||
.pixels_below_lines(8)
|
|
||||||
.weight(500)
|
|
||||||
.wrap_mode(WrapMode::None)
|
|
||||||
.build()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue