Insert code, fix text filter
This commit is contained in:
parent
5267ce8a11
commit
fbaa9fb98a
58
Cargo.lock
generated
58
Cargo.lock
generated
@ -421,9 +421,9 @@ checksum = "71938f30533e4d95a6d17aa530939da3842c2ab6f4f84b9dae68447e4129f74a"
|
||||
|
||||
[[package]]
|
||||
name = "async-trait"
|
||||
version = "0.1.36"
|
||||
version = "0.1.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a265e3abeffdce30b2e26b7a11b222fe37c6067404001b434101457d0385eb92"
|
||||
checksum = "caae68055714ff28740f310927e04f2eba76ff580b16fb18ed90073ee71646f7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -680,9 +680,9 @@ checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.13"
|
||||
version = "0.4.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c74d84029116787153e02106bf53e66828452a4b325cc8652b788b5967c0a0b6"
|
||||
checksum = "942f72db697d8767c22d46a598e01f2d3b475501ea43d0db4f16d90259182d0b"
|
||||
dependencies = [
|
||||
"js-sys",
|
||||
"num-integer",
|
||||
@ -694,9 +694,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "2.33.2"
|
||||
version = "2.33.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "10040cdf04294b565d9e0319955430099ec3813a64c952b86a41200ad714ae48"
|
||||
checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
|
||||
dependencies = [
|
||||
"ansi_term",
|
||||
"atty",
|
||||
@ -727,9 +727,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "comrak"
|
||||
version = "0.8.0"
|
||||
version = "0.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b818732a109eeabbe99fee28030ff8ecbd606889fcd25509ed933e6c69b7aa69"
|
||||
checksum = "0d325e4f2ffff52ca77d995bb675494d5364aa332499d5f7c7fbb28c25e671f6"
|
||||
dependencies = [
|
||||
"clap",
|
||||
"entities",
|
||||
@ -737,9 +737,11 @@ dependencies = [
|
||||
"pest",
|
||||
"pest_derive",
|
||||
"regex",
|
||||
"shell-words",
|
||||
"twoway",
|
||||
"typed-arena",
|
||||
"unicode_categories",
|
||||
"xdg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -935,9 +937,9 @@ checksum = "134951f4028bdadb9b84baf4232681efbf277da25144b9b0ad65df75946c422b"
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.5.3"
|
||||
version = "1.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
|
||||
checksum = "cd56b59865bce947ac5958779cfa508f6c3b9497cc762b7e24a12d11ccde2c4f"
|
||||
|
||||
[[package]]
|
||||
name = "email"
|
||||
@ -1762,9 +1764,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||
|
||||
[[package]]
|
||||
name = "lazycell"
|
||||
version = "1.2.1"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f"
|
||||
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
|
||||
|
||||
[[package]]
|
||||
name = "lettre"
|
||||
@ -2855,18 +2857,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.114"
|
||||
version = "1.0.115"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5317f7588f0a5078ee60ef675ef96735a1442132dc645eb1d12c018620ed8cd3"
|
||||
checksum = "e54c9a88f2da7238af84b5101443f0c0d0a3bbdc455e34a5c9497b1903ed55d5"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.114"
|
||||
version = "1.0.115"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2a0be94b04690fbaed37cddffc5c134bf537c8e3329d53e982fe04c374978f8e"
|
||||
checksum = "609feed1d0a73cc36a0182a840a9b37b4a82f0b1150369f0536a9e3f2a31dc48"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -2926,6 +2928,12 @@ dependencies = [
|
||||
"opaque-debug",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "shell-words"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b6fa3938c99da4914afedd13bf3d79bcb6c277d1b2c398d23257a304d9e1b074"
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "0.1.1"
|
||||
@ -2950,9 +2958,9 @@ checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.4.1"
|
||||
version = "1.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3757cb9d89161a2f24e1cf78efa0c1fcff485d18e3f55e0aa3480824ddaa0f3f"
|
||||
checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252"
|
||||
|
||||
[[package]]
|
||||
name = "socket2"
|
||||
@ -3285,9 +3293,9 @@ checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860"
|
||||
|
||||
[[package]]
|
||||
name = "tracing"
|
||||
version = "0.1.18"
|
||||
version = "0.1.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f0aae59226cf195d8e74d4b34beae1859257efb4e5fed3f147d2dc2c7d372178"
|
||||
checksum = "6d79ca061b032d6ce30c660fded31189ca0b9922bf483cd70759f13a2d86786c"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"log",
|
||||
@ -3296,9 +3304,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tracing-core"
|
||||
version = "0.1.13"
|
||||
version = "0.1.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d593f98af59ebc017c0648f0117525db358745a8894a8d684e185ba3f45954f9"
|
||||
checksum = "db63662723c316b43ca36d833707cc93dff82a02ba3d7e354f342682cc8b3545"
|
||||
dependencies = [
|
||||
"lazy_static",
|
||||
]
|
||||
@ -3761,6 +3769,12 @@ dependencies = [
|
||||
"winapi-build",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "xdg"
|
||||
version = "2.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57"
|
||||
|
||||
[[package]]
|
||||
name = "xml-rs"
|
||||
version = "0.8.3"
|
||||
|
@ -78,7 +78,6 @@ pub fn define() {
|
||||
r#"
|
||||
<style>
|
||||
:host { display: block; border: 1px solid black; }
|
||||
:host { margin-left: 400px; }
|
||||
#view { background: rgba(43, 48, 59, 255); padding: 1rem; }
|
||||
#view span { white-space: pre; font-family: 'Source Code Pro', monospace; }
|
||||
</style>
|
||||
|
@ -81,7 +81,8 @@ pub enum RteMsg {
|
||||
|
||||
// code
|
||||
InsertCode(bool),
|
||||
CodeSetLang(String),
|
||||
CodeChanged(String),
|
||||
InjectCode,
|
||||
|
||||
RequestFocus(uuid::Uuid),
|
||||
}
|
||||
@ -148,7 +149,8 @@ impl RteMsg {
|
||||
RteMsg::InsertTable { .. } => None,
|
||||
// code
|
||||
RteMsg::InsertCode(_) => None,
|
||||
RteMsg::CodeSetLang(_) => None,
|
||||
RteMsg::CodeChanged(_) => None,
|
||||
RteMsg::InjectCode => None,
|
||||
|
||||
// indent
|
||||
RteMsg::ChangeIndent(RteIndentMsg::Increase) => Some(ExecCommand::new("indent")),
|
||||
@ -185,6 +187,38 @@ pub struct StyledRteTableState {
|
||||
pub struct StyledRteCodeState {
|
||||
pub visible: bool,
|
||||
pub lang: StyledSelectState,
|
||||
pub code: String,
|
||||
languages: Vec<String>,
|
||||
}
|
||||
|
||||
impl StyledRteCodeState {
|
||||
pub fn new(field_id: FieldId) -> Self {
|
||||
let mut languages: Vec<String> = crate::hi::SYNTAX_SET
|
||||
.syntaxes()
|
||||
.iter()
|
||||
.map(|s| s.name.clone())
|
||||
.collect();
|
||||
languages.sort();
|
||||
Self {
|
||||
visible: false,
|
||||
lang: StyledSelectState::new(
|
||||
FieldId::Rte(RteField::CodeLang(Box::new(field_id.clone()))),
|
||||
vec![],
|
||||
),
|
||||
code: "".to_string(),
|
||||
languages,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn languages(&self) -> &Vec<String> {
|
||||
&self.languages
|
||||
}
|
||||
|
||||
pub fn reset(&mut self) {
|
||||
self.code.clear();
|
||||
self.lang.reset();
|
||||
self.visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
@ -207,13 +241,7 @@ impl StyledRteState {
|
||||
rows: 3,
|
||||
cols: 3,
|
||||
},
|
||||
code_tooltip: StyledRteCodeState {
|
||||
visible: false,
|
||||
lang: StyledSelectState::new(
|
||||
FieldId::Rte(RteField::CodeLang(Box::new(field_id.clone()))),
|
||||
vec![],
|
||||
),
|
||||
},
|
||||
code_tooltip: StyledRteCodeState::new(field_id),
|
||||
range: None,
|
||||
identifier: uuid::Uuid::new_v4(),
|
||||
}
|
||||
@ -246,9 +274,48 @@ impl StyledRteState {
|
||||
RteMsg::InsertCode(b) => {
|
||||
if *b {
|
||||
self.store_range();
|
||||
} else {
|
||||
self.code_tooltip.reset();
|
||||
}
|
||||
self.code_tooltip.visible = *b;
|
||||
}
|
||||
RteMsg::CodeChanged(s) => {
|
||||
self.code_tooltip.code = s.to_string();
|
||||
}
|
||||
RteMsg::InjectCode => {
|
||||
let lang = match self
|
||||
.code_tooltip
|
||||
.lang
|
||||
.values
|
||||
.get(0)
|
||||
.cloned()
|
||||
.and_then(|idx| self.code_tooltip.languages.get(idx as usize))
|
||||
{
|
||||
Some(v) => v.to_string(),
|
||||
_ => return,
|
||||
};
|
||||
let doc = seed::html_document();
|
||||
let r = match self.range.as_ref() {
|
||||
Some(r) => r,
|
||||
_ => return,
|
||||
};
|
||||
let code = self.code_tooltip.code.to_string();
|
||||
let view = match doc.create_element("jirs-code-view") {
|
||||
Ok(t) => t,
|
||||
_ => return,
|
||||
};
|
||||
if let Err(err) = view.set_attribute("lang", lang.as_str()) {
|
||||
error!(err);
|
||||
}
|
||||
view.set_inner_html(code.as_str());
|
||||
if let Err(e) = r.insert_node(&view) {
|
||||
log!(e);
|
||||
}
|
||||
|
||||
self.code_tooltip.reset();
|
||||
|
||||
self.schedule_focus(orders);
|
||||
}
|
||||
// table
|
||||
RteMsg::TableSetRows(n) => {
|
||||
self.table_tooltip.rows = *n;
|
||||
@ -327,7 +394,7 @@ impl StyledRteState {
|
||||
|
||||
fn schedule_focus(&self, orders: &mut impl Orders<Msg>) {
|
||||
let field_id = self.field_id.clone();
|
||||
let identifier = self.identifier.clone();
|
||||
let identifier = self.identifier;
|
||||
orders.perform_cmd(cmds::timeout(200, move || {
|
||||
Msg::Rte(RteMsg::RequestFocus(identifier), field_id)
|
||||
}));
|
||||
@ -339,7 +406,6 @@ pub struct StyledRte {
|
||||
table_tooltip: StyledRteTableState,
|
||||
identifier: Option<uuid::Uuid>,
|
||||
code_tooltip: StyledRteCodeState,
|
||||
// value: String,
|
||||
}
|
||||
|
||||
impl StyledRte {
|
||||
@ -352,10 +418,7 @@ impl StyledRte {
|
||||
rows: 0,
|
||||
cols: 0,
|
||||
},
|
||||
code_tooltip: StyledRteCodeState {
|
||||
visible: false,
|
||||
lang: StyledSelectState::new(field_id.clone(), vec![]),
|
||||
},
|
||||
code_tooltip: StyledRteCodeState::new(field_id),
|
||||
identifier: None,
|
||||
}
|
||||
}
|
||||
@ -387,7 +450,6 @@ impl StyledRteBuilder {
|
||||
pub fn build(self) -> StyledRte {
|
||||
StyledRte {
|
||||
field_id: self.field_id,
|
||||
// value: self.value,
|
||||
table_tooltip: self.table_tooltip,
|
||||
identifier: self.identifier,
|
||||
code_tooltip: self.code_tooltip,
|
||||
@ -1008,14 +1070,9 @@ fn styled_rte_button(title: &str, icon: Icon, handler: EventHandler<Msg>) -> Nod
|
||||
}
|
||||
|
||||
fn code_tooltip(values: &StyledRte) -> Node<Msg> {
|
||||
let StyledRteCodeState { visible, lang } = &values.code_tooltip;
|
||||
let StyledRteCodeState { visible, lang, .. } = &values.code_tooltip;
|
||||
|
||||
let mut languages: Vec<&str> = crate::hi::SYNTAX_SET
|
||||
.syntaxes()
|
||||
.iter()
|
||||
.map(|s| s.name.as_str())
|
||||
.collect();
|
||||
languages.sort();
|
||||
let languages = values.code_tooltip.languages();
|
||||
|
||||
let options: Vec<(String, u32)> = languages
|
||||
.into_iter()
|
||||
@ -1052,16 +1109,44 @@ fn code_tooltip(values: &StyledRte) -> Node<Msg> {
|
||||
.into_node()
|
||||
};
|
||||
|
||||
let input = {
|
||||
let field_id = values.field_id.clone();
|
||||
let on_change = ev(Ev::Change, move |ev| {
|
||||
ev.stop_propagation();
|
||||
let target = ev.target().unwrap();
|
||||
let textarea = seed::to_textarea(&target);
|
||||
let code = textarea.value();
|
||||
Msg::Rte(RteMsg::CodeChanged(code), field_id)
|
||||
});
|
||||
seed::textarea![on_change]
|
||||
};
|
||||
|
||||
let actions = {
|
||||
let field_id = values.field_id.clone();
|
||||
let on_insert = ev(Ev::Click, move |ev| {
|
||||
ev.stop_propagation();
|
||||
ev.prevent_default();
|
||||
Msg::Rte(RteMsg::InjectCode, field_id)
|
||||
});
|
||||
let insert = StyledButton::build()
|
||||
.on_click(on_insert)
|
||||
.text("Insert")
|
||||
.build()
|
||||
.into_node();
|
||||
div![insert]
|
||||
};
|
||||
|
||||
StyledTooltip::build()
|
||||
.code_tooltip()
|
||||
.visible(*visible)
|
||||
.add_child(h2!["Insert Code", close_tooltip])
|
||||
.add_child(select_lang_node)
|
||||
.add_child(seed::textarea![])
|
||||
.add_child(input)
|
||||
.add_child(actions)
|
||||
.build()
|
||||
.into_node()
|
||||
}
|
||||
|
||||
pub fn code_to_tag(code: &str) -> Node<Msg> {
|
||||
custom!["jirs-code-view", code]
|
||||
}
|
||||
// pub fn code_to_tag(code: &str) -> Node<Msg> {
|
||||
// custom!["jirs-code-view", code]
|
||||
// }
|
||||
|
@ -89,7 +89,7 @@ impl StyledSelectChildBuilder {
|
||||
pub fn match_text(&self, text: &str) -> bool {
|
||||
self.text
|
||||
.as_ref()
|
||||
.map(|t| t.contains(text.to_lowercase().as_str()))
|
||||
.map(|t| t.to_lowercase().contains(text.to_lowercase().as_str()))
|
||||
.unwrap_or(true)
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user