aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--crates/shirabe/src/platform/runtime.rs50
1 files changed, 48 insertions, 2 deletions
diff --git a/crates/shirabe/src/platform/runtime.rs b/crates/shirabe/src/platform/runtime.rs
index 2e04453..156eebb 100644
--- a/crates/shirabe/src/platform/runtime.rs
+++ b/crates/shirabe/src/platform/runtime.rs
@@ -1,7 +1,9 @@
//! ref: composer/src/Composer/Platform/Runtime.php
use anyhow::Result;
-use shirabe_php_shim::PhpMixed;
+use indexmap::IndexMap;
+use shirabe_external_packages::composer::pcre::{CaptureKey, Preg};
+use shirabe_php_shim::{PhpMixed, html_entity_decode, implode, strip_tags, trim};
#[derive(Debug)]
pub struct Runtime;
@@ -48,6 +50,50 @@ impl Runtime {
}
pub fn parse_html_extension_info(html: &str) -> String {
- todo!()
+ let mut result: Vec<String> = vec![];
+
+ let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
+ if Preg::match3(
+ r"~<h2>\s*<a[^>]*>([^<]+)</a>\s*</h2>~i",
+ html,
+ Some(&mut matches),
+ ) {
+ result.push(trim(
+ &html_entity_decode(
+ matches
+ .get(&CaptureKey::ByIndex(1))
+ .map(|s| s.as_str())
+ .unwrap_or(""),
+ ),
+ None,
+ ));
+ result.push(String::new());
+ }
+
+ let mut matches: IndexMap<CaptureKey, Vec<String>> = IndexMap::new();
+ if Preg::match_all3(
+ r#"~<tr>\s*<td class="e">\s*(.*?)\s*</td>\s*<td class="v">\s*(.*?)\s*</td>\s*</tr>~is"#,
+ html,
+ Some(&mut matches),
+ ) > 0
+ {
+ let group1 = matches
+ .get(&CaptureKey::ByIndex(1))
+ .cloned()
+ .unwrap_or_default();
+ let group2 = matches
+ .get(&CaptureKey::ByIndex(2))
+ .cloned()
+ .unwrap_or_default();
+ let count = std::cmp::min(group1.len(), group2.len());
+
+ for i in 0..count {
+ let key = trim(&html_entity_decode(&strip_tags(&group1[i])), None);
+ let value = trim(&html_entity_decode(&strip_tags(&group2[i])), None);
+ result.push(format!("{} => {}", key, value));
+ }
+ }
+
+ implode("\n", &result)
}
}