sudachi/plugin/input_text/
mod.rs1pub mod default_input_text;
18mod ignore_yomigana;
19mod prolonged_sound_mark;
20
21use serde_json::Value;
22
23use crate::config::Config;
24use crate::dic::grammar::Grammar;
25use crate::input_text::{InputBuffer, InputEditor};
26use crate::plugin::input_text::default_input_text::DefaultInputTextPlugin;
27use crate::plugin::input_text::ignore_yomigana::IgnoreYomiganaPlugin;
28use crate::plugin::input_text::prolonged_sound_mark::ProlongedSoundMarkPlugin;
29use crate::plugin::loader::PluginCategory;
30use crate::prelude::*;
31
32pub trait InputTextPlugin: Sync + Send {
34 fn set_up(&mut self, settings: &Value, config: &Config, grammar: &Grammar)
36 -> SudachiResult<()>;
37
38 fn uses_chars(&self) -> bool {
40 false
41 }
42
43 fn rewrite(&self, input: &mut InputBuffer) -> SudachiResult<()> {
45 if self.uses_chars() {
46 input.refresh_chars()
47 }
48 input.with_editor(|b, r| {
49 #[allow(deprecated)]
51 self.rewrite_impl(b, r)
52 })
53 }
54
55 #[deprecated(note = "call rewrite instead")]
57 fn rewrite_impl<'a>(
58 &'a self,
59 input: &InputBuffer,
60 edit: InputEditor<'a>,
61 ) -> SudachiResult<InputEditor<'a>>;
62}
63
64impl PluginCategory for dyn InputTextPlugin {
65 type BoxType = Box<dyn InputTextPlugin + Sync + Send>;
66 type InitFnType = unsafe fn() -> SudachiResult<Self::BoxType>;
67 fn configurations(cfg: &Config) -> &[Value] {
68 &cfg.input_text_plugins
69 }
70
71 fn bundled_impl(name: &str) -> Option<Self::BoxType> {
72 match name {
73 "IgnoreYomiganaPlugin" => Some(Box::<IgnoreYomiganaPlugin>::default()),
74 "DefaultInputTextPlugin" => Some(Box::<DefaultInputTextPlugin>::default()),
75 "ProlongedSoundMarkPlugin" => Some(Box::<ProlongedSoundMarkPlugin>::default()),
76 _ => None,
77 }
78 }
79
80 fn do_setup(
81 ptr: &mut Self::BoxType,
82 settings: &Value,
83 config: &Config,
84 grammar: &mut Grammar,
85 ) -> SudachiResult<()> {
86 ptr.set_up(settings, config, grammar)
87 }
88}