Skip to content

Commit d65c4c7

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

File tree

6 files changed

+63
-12
lines changed

6 files changed

+63
-12
lines changed

src/i18n.rs

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use handlebars::{
2-
Context, Handlebars, Helper, HelperDef, HelperResult, Output, RenderContext, RenderError,
2+
Context, Handlebars, Helper, HelperDef, HelperResult, Output, RenderContext, RenderError, Renderable,
33
};
44

5+
use handlebars::template::{TemplateElement, Parameter};
56
use rocket::http::RawStr;
67
use rocket::request::FromParam;
78
use serde_json::Value as Json;
@@ -43,13 +44,25 @@ impl I18NHelper {
4344
}
4445
}
4546

47+
#[derive(Default)]
48+
struct StringOutput {
49+
pub s: String
50+
}
51+
52+
impl Output for StringOutput {
53+
fn write(&mut self, seg: &str) -> Result<(), io::Error> {
54+
self.s.push_str(seg);
55+
Ok(())
56+
}
57+
}
58+
4659
impl HelperDef for I18NHelper {
4760
fn call<'reg: 'rc, 'rc>(
4861
&self,
4962
h: &Helper<'reg, 'rc>,
50-
_r: &'reg Handlebars,
63+
reg: &'reg Handlebars,
5164
context: &'rc Context,
52-
_rc: &mut RenderContext<'reg>,
65+
rcx: &mut RenderContext<'reg>,
5366
out: &mut dyn Output,
5467
) -> HelperResult {
5568
let id = if let Some(id) = h.param(0) {
@@ -66,11 +79,10 @@ impl HelperDef for I18NHelper {
6679
return Err(RenderError::new("{{text}} takes an identifier parameter"));
6780
};
6881

69-
let map;
70-
let args = if h.hash().is_empty() {
82+
let mut args = if h.hash().is_empty() {
7183
None
7284
} else {
73-
map = h
85+
let map = h
7486
.hash()
7587
.iter()
7688
.filter_map(|(k, v)| {
@@ -83,15 +95,43 @@ impl HelperDef for I18NHelper {
8395
Some((&**k, val))
8496
})
8597
.collect();
86-
Some(&map)
98+
Some(map)
8799
};
100+
101+
if let Some(tpl) = h.template() {
102+
if args.is_none() {
103+
args = Some(HashMap::new());
104+
}
105+
let args = args.as_mut().unwrap();
106+
for element in &tpl.elements {
107+
if let TemplateElement::HelperBlock(ref block) = element {
108+
if block.name != "textparam" {
109+
return Err(RenderError::new(format!("{{{{text}}}} can only contain {{{{textparam}}}} elements, not {}", block.name)));
110+
}
111+
let id = if let Some(el) = block.params.get(0) {
112+
if let Parameter::Name(ref s) = *el {
113+
s
114+
} else {
115+
return Err(RenderError::new("{{textparam}} takes an identifier parameter"));
116+
}
117+
} else {
118+
return Err(RenderError::new("{{textparam}} must have one parameter"));
119+
};
120+
if let Some(ref tpl) = block.template {
121+
let mut s = StringOutput::default();
122+
tpl.render(reg, context, rcx, &mut s)?;
123+
args.insert(&*id, FluentValue::String(s.s));
124+
}
125+
}
126+
}
127+
}
88128
let lang = context
89129
.data()
90130
.get("lang")
91131
.expect("Language not set in context")
92132
.as_str()
93133
.expect("Language must be string");
94-
let response = self.i18n_token(lang, &id, args);
134+
let response = self.i18n_token(lang, &id, args.as_ref());
95135
out.write(&response).map_err(RenderError::with)
96136
}
97137
}
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)