15 releases
0.1.26 | Nov 2, 2024 |
---|---|
0.1.25 | Oct 31, 2024 |
#33 in Internationalization (i18n)
1,339 downloads per month
40KB
569 lines
varurl
use mdli::parse;
use varurl::VarUrl;
fn create_varurl() -> VarUrl {
VarUrl::new(["https://i18n.com/"])
}
const FROM_LANG: &str = "/zh/";
const TO_LANG: &str = "/en/";
pub fn from_to(_pos: usize) -> Option<(&'static str, &'static str)> {
Some((FROM_LANG, TO_LANG))
}
#[test]
fn test() {
let input = r#"# Main Title
## Section 1\nHere's a paragraph with an ![inline image](https://i18n.com/zh/inline.png) and a [link](https://i18n.com/test/zh/doc.md) mixed in
"#;
let mut mdli = parse(input);
let varurl = create_varurl();
varurl.replace(&mut mdli, |_| Some((FROM_LANG, TO_LANG)));
let result = mdli.join();
assert_eq!(result, input.replace(FROM_LANG, TO_LANG));
let input = r#"
```markdown
![inline image](https://i18n.com/zh/inline.png)
"#; let mut mdli = parse(input); let varurl = create_varurl(); varurl.replace(&mut mdli, from_to); let result = mdli.join(); assert_eq!(result, input); }
fn test_replace(title: &str, prefixes: &[&str], input: &str, expected: &str) { let varurl = VarUrl::new(prefixes); let mut mdli = parse(input); varurl.replace(&mut mdli, from_to); let result = mdli.join();
if result != expected { assert_eq!( result, expected, "\n❌ {}\n预期 {:?}\n实际 {:?}\n", title, expected, result ); } }
#[test]
fn test_all_cases() {
let test_cases: &[(&str, &[&str], &str, &str)] = &[
// 1. 基础链接测试
(
"简单链接测试",
&["https://i18n.com/"],
"文档",
"文档",
),
(
"简单图片测试",
&["https://i18n.com/"],
"",
"",
),
// 2. 多域名测试
(
"多域名替换测试",
&[
"https://i18n.com/",
"https://docs.i18n.com/",
"https://img.i18n.com/",
"//cdn.i18n.com/",
"/docs/",
],
r#"主站点
文档
本地文档"#,
r#"主站点
文档
本地文档"#,
),
// 3. 不匹配测试
(
"不匹配域名测试",
&["https://i18n.com/"],
r#"其他站点
错误前缀
正确链接
无语言"#,
r#"其他站点
错误前缀
正确链接
无语言"#,
),
// 4. 边界情况测试
(
"URL边界情况测试",
&["https://i18n.com/", "/docs/"],
r#"[带空格](https://i18n.com/zh/has space.md)
带括号
带引号
带井号
带问号
[未闭合](https://i18n.com/zh/unclosed.md"#,
r#"[带空格](https://i18n.com/en/has space.md)
带括号
带引号
带井号
带问号
未闭合,
// 5. HTML属性测试
(
"HTML属性测试",
&["https://i18n.com/"],
r#"
"#,
r#"
"#,
),
// 6. 混合内容测试
(
"混合内容测试",
&["https://i18n.com/", "/docs/"],
r#"# 标题
链接和
代码中的[链接](https://i18n.com/zh/code.md)
引用中的链接"#, r#"# 标题 链接和
代码中的[链接](https://i18n.com/zh/code.md)
引用中的链接"#, ), // 7. 代码块测试 ( "代码块测试", &["https://i18n.com/"], "```markdown 代码块中的链接
[普通链接](https://i18n.com/zh/normal.md)
[xx](https://i18n.com/zh/indent.md)
",
"```markdown
[代码块中的链接](https://i18n.com/zh/code.md)
普通链接 xx ", ), // 8. 复杂文档结构测试 ( "复杂文档结构测试", &["https://i18n.com/", "/docs/", "//cdn.i18n.com/"], "--- title: 测试文档
目录
// 代码中的链接不替换
const url = 'https://i18n.com/zh/code.md';
表格 | 链接 |
---|---|
文档 | 链接1 |
图片 |
- 有序列表
- [未闭合链接](https://i18n.com/zh/unclosed.md
引用
嵌套引用", "--- title: 测试文档
目录
// 代码中的链接不替换
const url = 'https://i18n.com/zh/code.md';
表格 | 链接 |
---|---|
文档 | 链接1 |
图片 |
- 有序列表
- [未闭合链接](https://i18n.com/zh/unclosed.md
引用
嵌套引用", ), ]; for (title, prefixes, input, expected) in test_cases.iter() { test_replace(title, prefixes, input, expected); } }
## About
This project is an open-source component of [i18n.site ⋅ Internationalization Solution](https://i18n.site).
* [i18 : MarkDown Command Line Translation Tool](https://i18n.site/i18)
The translation perfectly maintains the Markdown format.
It recognizes file changes and only translates the modified files.
The translated Markdown content is editable; if you modify the original text and translate it again, manually edited translations will not be overwritten (as long as the original text has not been changed).
* [i18n.site : MarkDown Multi-language Static Site Generator](https://i18n.site/i18n.site)
Optimized for a better reading experience
## 关于
本项目为 [i18n.site ⋅ 国际化解决方案](https://i18n.site) 的开源组件。
* [i18 : MarkDown命令行翻译工具](https://i18n.site/i18)
翻译能够完美保持 Markdown 的格式。能识别文件的修改,仅翻译有变动的文件。
Markdown 翻译内容可编辑;如果你修改原文并再次机器翻译,手动修改过的翻译不会被覆盖(如果这段原文没有被修改)。
* [i18n.site : MarkDown多语言静态站点生成器](https://i18n.site/i18n.site) 为阅读体验而优化。
Dependencies
~720KB
~11K SLoC