diff options
Diffstat (limited to 'crates/shirabe-external-packages/src/symfony/console/formatter')
3 files changed, 21 insertions, 9 deletions
diff --git a/crates/shirabe-external-packages/src/symfony/console/formatter/output_formatter.rs b/crates/shirabe-external-packages/src/symfony/console/formatter/output_formatter.rs index 413f023..4a451d9 100644 --- a/crates/shirabe-external-packages/src/symfony/console/formatter/output_formatter.rs +++ b/crates/shirabe-external-packages/src/symfony/console/formatter/output_formatter.rs @@ -95,12 +95,8 @@ impl OutputFormatter { &self, string: &str, ) -> anyhow::Result<Option<Box<dyn OutputFormatterStyleInterface>>> { - if self.styles.contains_key(string) { - // PHP returns the shared style instance; ownership cannot be expressed without Clone - // on the trait object. - // TODO(human-review): returning a shared style here needs an Rc/Clone strategy in - // Phase C. - return Ok(Some(todo!())); + if let Some(style) = self.styles.get(string) { + return Ok(Some(style.clone_box())); } let mut matches: Vec<Vec<String>> = vec![]; @@ -281,8 +277,15 @@ impl WrappableOutputFormatterInterface for OutputFormatter { let mut offset: i64 = 0; let mut output = String::new(); - let open_tag_regex = "[a-z](?:[^\\\\<>]*+ | \\\\.)*"; - let close_tag_regex = "[a-z][^<>]*+"; + // Accurate PCRE patterns (possessive quantifiers `*+`), unsupported by the + // `regex` crate: + // let open_tag_regex = "[a-z](?:[^\\\\<>]*+ | \\\\.)*"; + // let close_tag_regex = "[a-z][^<>]*+"; + // TODO(phase-c): restore the possessive quantifiers once a PCRE-compatible + // engine is available; greedy quantifiers match the same tags here but may + // differ in pathological backtracking cases. + let open_tag_regex = "[a-z](?:[^\\\\<>]* | \\\\.)*"; + let close_tag_regex = "[a-z][^<>]*"; let mut current_line_length: i64 = 0; let mut matches: shirabe_php_shim::PregOffsetCaptureMatches = Default::default(); shirabe_php_shim::preg_match_all_offset_capture( diff --git a/crates/shirabe-external-packages/src/symfony/console/formatter/output_formatter_style.rs b/crates/shirabe-external-packages/src/symfony/console/formatter/output_formatter_style.rs index 835bcd6..a8540de 100644 --- a/crates/shirabe-external-packages/src/symfony/console/formatter/output_formatter_style.rs +++ b/crates/shirabe-external-packages/src/symfony/console/formatter/output_formatter_style.rs @@ -2,7 +2,7 @@ use crate::symfony::console::color::Color; use crate::symfony::console::formatter::output_formatter_style_interface::OutputFormatterStyleInterface; /// Formatter style class for defining styles. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct OutputFormatterStyle { color: Color, foreground: String, @@ -93,4 +93,8 @@ impl OutputFormatterStyleInterface for OutputFormatterStyle { self.color.apply(&text) } + + fn clone_box(&self) -> Box<dyn OutputFormatterStyleInterface> { + Box::new(self.clone()) + } } diff --git a/crates/shirabe-external-packages/src/symfony/console/formatter/output_formatter_style_interface.rs b/crates/shirabe-external-packages/src/symfony/console/formatter/output_formatter_style_interface.rs index c9a2648..6fe4846 100644 --- a/crates/shirabe-external-packages/src/symfony/console/formatter/output_formatter_style_interface.rs +++ b/crates/shirabe-external-packages/src/symfony/console/formatter/output_formatter_style_interface.rs @@ -17,4 +17,9 @@ pub trait OutputFormatterStyleInterface: std::fmt::Debug { /// Applies the style to a given text. fn apply(&mut self, text: &str) -> String; + + /// Clones the style into a new boxed trait object. PHP shares the style + /// instance by reference; styles are immutable once configured, so cloning + /// is behaviorally equivalent here. + fn clone_box(&self) -> Box<dyn OutputFormatterStyleInterface>; } |
