use mdli::md_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  and a [link](https://i18n.com/test/zh/doc.md) mixed in
"#;
let mut mdli = md_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

```
"#;
let mut mdli = md_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 = md_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)] = &[
(
"简单链接测试",
&["https://i18n.com/"],
"[文档](https://i18n.com/zh/doc.md)",
"[文档](https://i18n.com/en/doc.md)",
),
(
"简单图片测试",
&["https://i18n.com/"],
"",
"",
),
(
"多域名替换测试",
&[
"https://i18n.com/",
"https://docs.i18n.com/",
"https://img.i18n.com/",
"//cdn.i18n.com/",
"/docs/",
],
r#"[主站点](https://i18n.com/zh/main.md)
[文档](https://docs.i18n.com/zh/api.md)

<img src="//cdn.i18n.com/zh/icon.png">
[本地文档](/docs/zh/guide.md)"#,
r#"[主站点](https://i18n.com/en/main.md)
[文档](https://docs.i18n.com/en/api.md)

<img src="//cdn.i18n.com/en/icon.png">
[本地文档](/docs/en/guide.md)"#,
),
(
"不匹配域名测试",
&["https://i18n.com/"],
r#"[其他站点](https://other.com/zh/doc.md)
[错误前缀](https://wrong.i18n.com/zh/doc.md)
[正确链接](https://i18n.com/zh/doc.md)
[无语言](https://i18n.com/doc.md)"#,
r#"[其他站点](https://other.com/zh/doc.md)
[错误前缀](https://wrong.i18n.com/zh/doc.md)
[正确链接](https://i18n.com/en/doc.md)
[无语言](https://i18n.com/doc.md)"#,
),
(
"URL边界情况测试",
&["https://i18n.com/", "/docs/"],
r#"[带空格](https://i18n.com/zh/has space.md)
[带括号](/docs/zh/has(paren).md)
[带引号](https://i18n.com/zh/has"quote".md)
[带井号](https://i18n.com/zh/has#hash.md)
[带问号](https://i18n.com/zh/has?query=1)
[未闭合](https://i18n.com/zh/unclosed.md"#,
r#"[带空格](https://i18n.com/en/has space.md)
[带括号](/docs/en/has(paren).md)
[带引号](https://i18n.com/en/has"quote".md)
[带井号](https://i18n.com/en/has#hash.md)
[带问号](https://i18n.com/en/has?query=1)
[未闭合](https://i18n.com/zh/unclosed.md"#,
),
(
"HTML属性测试",
&["https://i18n.com/"],
r#"<img src="https://i18n.com/zh/img.png">
<a href="https://i18n.com/zh/link.md">
<img src="https://i18n.com/zh/img.png" />
<a href="https://i18n.com/zh/link.md"/>"#,
r#"<img src="https://i18n.com/en/img.png">
<a href="https://i18n.com/en/link.md">
<img src="https://i18n.com/en/img.png" />
<a href="https://i18n.com/en/link.md"/>"#,
),
(
"混合内容测试",
&["https://i18n.com/", "/docs/"],
r#"# 标题
[链接](https://i18n.com/zh/doc.md)和
`代码中的[链接](https://i18n.com/zh/code.md)`
> 引用中的[链接](https://i18n.com/zh/quote.md)"#,
r#"# 标题
[链接](https://i18n.com/en/doc.md)和
`代码中的[链接](https://i18n.com/zh/code.md)`
> 引用中的[链接](https://i18n.com/en/quote.md)"#,
),
(
"代码块测试",
&["https://i18n.com/"],
"```markdown
[代码块中的链接](https://i18n.com/zh/code.md)
```
[普通链接](https://i18n.com/zh/normal.md)
[xx](https://i18n.com/zh/indent.md)
",
"```markdown
[代码块中的链接](https://i18n.com/zh/code.md)
```
[普通链接](https://i18n.com/en/normal.md)
[xx](https://i18n.com/en/indent.md)
",
),
(
"复杂文档结构测试",
&["https://i18n.com/", "/docs/", "//cdn.i18n.com/"],
"---
title: 测试文档
---
# 目录
* [章节1](/docs/zh/ch1.md)
* [子章节](https://i18n.com/zh/sub.md)
* 
```js
// 代码中的链接不替换
const url = 'https://i18n.com/zh/code.md';
```
| 表格 | 链接 |
|------|------|
| 文档 | [链接1](https://i18n.com/zh/t1.md) |
| 图片 |  |
<div class=\"note\">
<img src=\"https://i18n.com/zh/note.png\">
<a href=\"/docs/zh/note.md\">注释</a>
</div>
1. [有序列表](https://i18n.com/zh/list.md)
2. [未闭合链接](https://i18n.com/zh/unclosed.md
> 引用
> 
>> [嵌套引用](/docs/zh/nested.md)",
"---
title: 测试文档
---
# 目录
* [章节1](/docs/en/ch1.md)
* [子章节](https://i18n.com/en/sub.md)
* 
```js
// 代码中的链接不替换
const url = 'https://i18n.com/zh/code.md';
```
| 表格 | 链接 |
|------|------|
| 文档 | [链接1](https://i18n.com/en/t1.md) |
| 图片 |  |
<div class=\"note\">
<img src=\"https://i18n.com/en/note.png\">
<a href=\"/docs/en/note.md\">注释</a>
</div>
1. [有序列表](https://i18n.com/en/list.md)
2. [未闭合链接](https://i18n.com/zh/unclosed.md
> 引用
> 
>> [嵌套引用](/docs/en/nested.md)",
),
];
for (title, prefixes, input, expected) in test_cases.iter() {
test_replace(title, prefixes, input, expected);
}
}