Skip to content

Commit 1928029

Browse files
committed
Add textparam interpolation support
1 parent 947f901 commit 1928029

File tree

6 files changed

+68
-11
lines changed

6 files changed

+68
-11
lines changed

src/i18n.rs

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use handlebars::{
22
Context, Handlebars, Helper, HelperDef, HelperResult, Output, RenderContext, RenderError,
3+
Renderable,
34
};
45

6+
use handlebars::template::{Parameter, TemplateElement};
57
use rocket::http::RawStr;
68
use rocket::request::FromParam;
79
use serde_json::Value as Json;
@@ -43,13 +45,25 @@ impl I18NHelper {
4345
}
4446
}
4547

48+
#[derive(Default)]
49+
struct StringOutput {
50+
pub s: String,
51+
}
52+
53+
impl Output for StringOutput {
54+
fn write(&mut self, seg: &str) -> Result<(), io::Error> {
55+
self.s.push_str(seg);
56+
Ok(())
57+
}
58+
}
59+
4660
impl HelperDef for I18NHelper {
4761
fn call<'reg: 'rc, 'rc>(
4862
&self,
4963
h: &Helper<'reg, 'rc>,
50-
_r: &'reg Handlebars,
64+
reg: &'reg Handlebars,
5165
context: &'rc Context,
52-
_rc: &mut RenderContext<'reg>,
66+
rcx: &mut RenderContext<'reg>,
5367
out: &mut dyn Output,
5468
) -> HelperResult {
5569
let id = if let Some(id) = h.param(0) {
@@ -66,11 +80,10 @@ impl HelperDef for I18NHelper {
6680
return Err(RenderError::new("{{text}} takes an identifier parameter"));
6781
};
6882

69-
let map;
70-
let args = if h.hash().is_empty() {
83+
let mut args = if h.hash().is_empty() {
7184
None
7285
} else {
73-
map = h
86+
let map = h
7487
.hash()
7588
.iter()
7689
.filter_map(|(k, v)| {
@@ -83,15 +96,48 @@ impl HelperDef for I18NHelper {
8396
Some((&**k, val))
8497
})
8598
.collect();
86-
Some(&map)
99+
Some(map)
87100
};
101+
102+
if let Some(tpl) = h.template() {
103+
if args.is_none() {
104+
args = Some(HashMap::new());
105+
}
106+
let args = args.as_mut().unwrap();
107+
for element in &tpl.elements {
108+
if let TemplateElement::HelperBlock(ref block) = element {
109+
if block.name != "textparam" {
110+
return Err(RenderError::new(format!(
111+
"{{{{text}}}} can only contain {{{{textparam}}}} elements, not {}",
112+
block.name
113+
)));
114+
}
115+
let id = if let Some(el) = block.params.get(0) {
116+
if let Parameter::Name(ref s) = *el {
117+
s
118+
} else {
119+
return Err(RenderError::new(
120+
"{{textparam}} takes an identifier parameter",
121+
));
122+
}
123+
} else {
124+
return Err(RenderError::new("{{textparam}} must have one parameter"));
125+
};
126+
if let Some(ref tpl) = block.template {
127+
let mut s = StringOutput::default();
128+
tpl.render(reg, context, rcx, &mut s)?;
129+
args.insert(&*id, FluentValue::String(s.s));
130+
}
131+
}
132+
}
133+
}
88134
let lang = context
89135
.data()
90136
.get("lang")
91137
.expect("Language not set in context")
92138
.as_str()
93139
.expect("Language must be string");
94-
let response = self.i18n_token(lang, &id, args);
140+
let response = self.i18n_token(lang, &id, args.as_ref());
95141
out.write(&response).map_err(RenderError::with)
96142
}
97143
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
rust = Rust
2+
rust-language-server = Rust Language Server
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
tools-write-ide-prose = Whether you prefer working with code from the command line, or using
2+
rich graphical editors, there’s a Rust integration available for your
3+
editor of choice. Or you can build your own using the
4+
{ $rls-link }
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
rust = ʇsnɹ
2+
rust-language-server = ɹǝʌɹǝS ǝƃɐnƃuɐ˥ ʇsnɹ
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
tools-write-ide-prose = { $rls-link } ǝɥʇ ƃuᴉsn uʍo ɹnoʎ plᴉnq uɐɔ noʎ ɹO ˙ǝɔᴉoɥɔ ɟo ɹoʇᴉpǝ
2+
ɹnoʎ ɹoɟ ǝlqɐlᴉɐʌɐ uoᴉʇɐɹƃǝʇuᴉ ʇsnɹ ɐ s’ǝɹǝɥʇ 'sɹoʇᴉpǝ lɐɔᴉɥdɐɹƃ ɥɔᴉɹ
3+
ƃuᴉsn ɹo 'ǝuᴉl puɐɯɯoɔ ǝɥʇ ɯoɹɟ ǝpoɔ ɥʇᴉʍ ƃuᴉʞɹoʍ ɹǝɟǝɹd noʎ ɹǝɥʇǝɥM

templates/tools/index.hbs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
<br>
1818
<div class="tools-row">
1919
<div id="tools-write-ide-prose">
20-
<p>Whether you prefer working with code from the command line, or using
21-
rich graphical editors, there’s a Rust integration available for your
22-
editor of choice. Or you can build your own using the
23-
<a href="https://github.com/rust-lang/rls">Rust Language Server</a>.
20+
<p>
21+
{{#text tools-write-ide-prose}}
22+
{{#textparam rls-link}}
23+
<a href="https://github.com/rust-lang/rls">{{text rust-language-server}}</a>
24+
{{/textparam}}
25+
{{/text}}
2426
</div>
2527
</div>
2628
{{> components/tools/editors }}

0 commit comments

Comments
 (0)