///|
fn is_fence(line : String) -> Bool {
line.trim().to_owned().has_prefix("```")
}
///|
fn fence_label(line : String) -> String {
let text = line.trim().to_owned()
match text.strip_prefix("```") {
Some(rest) => rest.to_owned().trim().to_owned().to_lower()
None => ""
}
}
///|
/// Scan Markdown text and count MoonBit-related code examples.
pub fn scan_markdown_text(source : String) -> MarkdownStats {
let lines = source.split("\n").map(line => line.to_owned()).collect()
let mut in_block = false
let mut code_blocks = 0
let mut mbt_check_blocks = 0
let mut mbt_nocheck_blocks = 0
let mut moonbit_blocks = 0
for line in lines {
if is_fence(line) {
if in_block {
in_block = false
} else {
in_block = true
code_blocks += 1
let label = fence_label(line)
if label == "mbt check" {
mbt_check_blocks += 1
} else if label == "mbt nocheck" {
mbt_nocheck_blocks += 1
} else if label == "moonbit" || label == "mbt" {
moonbit_blocks += 1
}
}
}
}
{
files: 1,
code_blocks,
mbt_check_blocks,
mbt_nocheck_blocks,
moonbit_blocks,
}
}
///|
/// Scan README content for common open-source project sections.
pub fn scan_readme_text(source : String) -> ReadmeStats {
let lower = source.to_lower()
{
found: true,
has_overview: lower.contains("简介") ||
lower.contains("overview") ||
lower.contains("目标") ||
lower.contains("介绍") ||
lower.contains("为什么") ||
lower.contains("why") ||
lower.contains("project"),
has_usage: lower.contains("使用") ||
lower.contains("usage") ||
lower.contains("用户指南") ||
lower.contains("user guide") ||
lower.contains("documentation") ||
lower.contains("docs/") ||
lower.contains("中文介绍") ||
lower.contains("english overview") ||
lower.contains("quick start") ||
lower.contains("quickstart") ||
lower.contains("getting started") ||
lower.contains("moon run") ||
lower.contains("install") ||
lower.contains("安装"),
has_code_example: lower.contains("```"),
has_development_commands: lower.contains("moon check") ||
lower.contains("moon test") ||
lower.contains("开发"),
has_license_mention: lower.contains("license") ||
lower.contains("许可证"),
}
}