Build Chinese language user manual (#1219)
This commit is contained in:
parent
89c5e6adb6
commit
97fde19a93
6
.github/workflows/ci.yaml
vendored
6
.github/workflows/ci.yaml
vendored
@ -84,8 +84,10 @@ jobs:
|
|||||||
if: ${{ matrix.os == 'ubuntu-latest' }}
|
if: ${{ matrix.os == 'ubuntu-latest' }}
|
||||||
run: |
|
run: |
|
||||||
cargo run --package generate-book
|
cargo run --package generate-book
|
||||||
mdbook build book
|
mdbook build book/en
|
||||||
cp screenshot.png www/man
|
mdbook build book/zh
|
||||||
|
cp screenshot.png www/man/en
|
||||||
|
cp screenshot.png www/man/zh
|
||||||
|
|
||||||
- name: Deploy Pages
|
- name: Deploy Pages
|
||||||
uses: peaceiris/actions-gh-pages@v3
|
uses: peaceiris/actions-gh-pages@v3
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,6 +1,7 @@
|
|||||||
/.vagrant
|
/.vagrant
|
||||||
/README.html
|
/README.html
|
||||||
/book/src
|
/book/en/src
|
||||||
|
/book/zh/src
|
||||||
/fuzz/artifacts
|
/fuzz/artifacts
|
||||||
/fuzz/corpus
|
/fuzz/corpus
|
||||||
/fuzz/target
|
/fuzz/target
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
`just` is a handy way to save and run project-specific commands.
|
`just` is a handy way to save and run project-specific commands.
|
||||||
|
|
||||||
This readme is also available as a [book](https://just.systems/man/);
|
This readme is also available as a [book](https://just.systems/man/en/);
|
||||||
|
|
||||||
(中文文档在 [这里](README.中文.md), 快看过来!)
|
(中文文档在 [这里](README.中文.md), 快看过来!)
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
`just` 为您提供一种保存和运行项目特有命令的便捷方式。
|
`just` 为您提供一种保存和运行项目特有命令的便捷方式。
|
||||||
|
|
||||||
本指南同时也可以以 [书](https://just.systems/man/) 的形式提供在线阅读;
|
本指南同时也可以以 [书](https://just.systems/man/zh/) 的形式提供在线阅读;
|
||||||
|
|
||||||
命令,在此也称为配方,存储在一个名为 `justfile` 的文件中,其语法受 `make` 启发:
|
命令,在此也称为配方,存储在一个名为 `justfile` 的文件中,其语法受 `make` 启发:
|
||||||
|
|
||||||
|
@ -8,44 +8,68 @@ use {
|
|||||||
std::{error::Error, fs},
|
std::{error::Error, fs},
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
enum Language {
|
||||||
fs::remove_dir_all("book/src").ok();
|
English,
|
||||||
fs::create_dir("book/src")?;
|
Chinese,
|
||||||
|
}
|
||||||
|
|
||||||
let txt = fs::read_to_string("README.md")?;
|
impl Language {
|
||||||
|
fn code(&self) -> &'static str {
|
||||||
let mut chapters = vec![(1usize, Vec::new())];
|
match self {
|
||||||
|
Self::English => "en",
|
||||||
for event in Parser::new_ext(&txt, Options::all()) {
|
Self::Chinese => "zh",
|
||||||
if let Event::Start(Tag::Heading(level @ (H2 | H3), ..)) = event {
|
|
||||||
chapters.push((if level == H2 { 2 } else { 3 }, Vec::new()));
|
|
||||||
}
|
}
|
||||||
chapters.last_mut().unwrap().1.push(event);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut summary = String::new();
|
fn suffix(&self) -> &'static str {
|
||||||
|
match self {
|
||||||
for (i, (level, chapter)) in chapters.into_iter().enumerate() {
|
Self::English => "",
|
||||||
let mut txt = String::new();
|
Self::Chinese => ".中文",
|
||||||
cmark(chapter.iter(), &mut txt)?;
|
}
|
||||||
let title = if i == 0 {
|
|
||||||
txt = txt.split_inclusive('\n').skip(1).collect::<String>();
|
|
||||||
"Introduction"
|
|
||||||
} else {
|
|
||||||
txt.lines().next().unwrap().split_once(' ').unwrap().1
|
|
||||||
};
|
|
||||||
|
|
||||||
let path = format!("book/src/chapter_{}.md", i + 1);
|
|
||||||
fs::write(&path, &txt)?;
|
|
||||||
summary.push_str(&format!(
|
|
||||||
"{}- [{}](chapter_{}.md)\n",
|
|
||||||
" ".repeat((level.saturating_sub(1)) * 4),
|
|
||||||
title,
|
|
||||||
i + 1
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fs::write("book/src/SUMMARY.md", summary)?;
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
for language in [Language::English, Language::Chinese] {
|
||||||
|
let src = format!("book/{}/src", language.code());
|
||||||
|
fs::remove_dir_all(&src).ok();
|
||||||
|
fs::create_dir(&src)?;
|
||||||
|
|
||||||
|
let txt = fs::read_to_string(format!("README{}.md", language.suffix()))?;
|
||||||
|
|
||||||
|
let mut chapters = vec![(1usize, Vec::new())];
|
||||||
|
|
||||||
|
for event in Parser::new_ext(&txt, Options::all()) {
|
||||||
|
if let Event::Start(Tag::Heading(level @ (H2 | H3), ..)) = event {
|
||||||
|
chapters.push((if level == H2 { 2 } else { 3 }, Vec::new()));
|
||||||
|
}
|
||||||
|
chapters.last_mut().unwrap().1.push(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut summary = String::new();
|
||||||
|
|
||||||
|
for (i, (level, chapter)) in chapters.into_iter().enumerate() {
|
||||||
|
let mut txt = String::new();
|
||||||
|
cmark(chapter.iter(), &mut txt)?;
|
||||||
|
let title = if i == 0 {
|
||||||
|
txt = txt.split_inclusive('\n').skip(1).collect::<String>();
|
||||||
|
"Introduction"
|
||||||
|
} else {
|
||||||
|
txt.lines().next().unwrap().split_once(' ').unwrap().1
|
||||||
|
};
|
||||||
|
|
||||||
|
let path = format!("{}/chapter_{}.md", src, i + 1);
|
||||||
|
fs::write(&path, &txt)?;
|
||||||
|
summary.push_str(&format!(
|
||||||
|
"{}- [{}](chapter_{}.md)\n",
|
||||||
|
" ".repeat((level.saturating_sub(1)) * 4),
|
||||||
|
title,
|
||||||
|
i + 1
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
fs::write(format!("{}/SUMMARY.md", src), summary).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
[book]
|
[book]
|
||||||
authors = ["Casey Rodarmor"]
|
authors = ["Casey Rodarmor"]
|
||||||
language = "en"
|
language = "en"
|
||||||
multilingual = false
|
|
||||||
src = "src"
|
src = "src"
|
||||||
title = "Just Programmer's Manual"
|
title = "Just Programmer's Manual"
|
||||||
|
|
||||||
[build]
|
[build]
|
||||||
build-dir = "../www/man"
|
build-dir = "../../www/man/en"
|
8
book/zh/book.toml
Normal file
8
book/zh/book.toml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[book]
|
||||||
|
authors = ["Casey Rodarmor"]
|
||||||
|
language = "zh"
|
||||||
|
src = "src"
|
||||||
|
title = "Just Programmer's Manual"
|
||||||
|
|
||||||
|
[build]
|
||||||
|
build-dir = "../../www/man/zh"
|
@ -12,9 +12,13 @@
|
|||||||
<div id="s"></div>
|
<div id="s"></div>
|
||||||
<div id="t"></div>
|
<div id="t"></div>
|
||||||
<a href="https://github.com/casey/just">github</a>
|
<a href="https://github.com/casey/just">github</a>
|
||||||
<a href="man/">manual</a>
|
<a href="man/en/">manual</a>
|
||||||
<a href="https://discord.gg/ezYScXR">discord</a>
|
<a href="https://discord.gg/ezYScXR">discord</a>
|
||||||
<a href="https://crates.io/crates/just">crates.io</a>
|
<a href="https://crates.io/crates/just">crates.io</a>
|
||||||
|
<div></div>
|
||||||
|
<a href="man/zh/">手冊</a>
|
||||||
|
<div></div>
|
||||||
|
<div></div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
<!-- Love, Casey -->
|
<!-- Love, Casey -->
|
||||||
|
Loading…
Reference in New Issue
Block a user