update formatters

This commit is contained in:
wxzhang 2022-08-16 21:23:03 +08:00
parent 8ae7b68083
commit 73794587c3
2 changed files with 32 additions and 28 deletions

View File

@ -319,12 +319,10 @@ function executeChecker(checker,value){
function executeFormatter(value,formatters,scope,template){
if(formatters.length===0) return value
let result = value
const emptyChecker = formatters.find(func=>func.$name==='empty')
const errorChecker = formatters.find(func=>func.$name==='error')
// 1. 空值检查
if(emptyChecker){
const emptyCheckerIndex = formatters.findIndex(func=>func.$name==='empty')
if(emptyCheckerIndex!=-1){
const emptyChecker = formatters.splice(emptyCheckerIndex,1)[0]
const { value,next } = executeChecker(emptyChecker,result)
if(next == 'break') {
return value
@ -333,15 +331,21 @@ function executeFormatter(value,formatters,scope,template){
}
}
// 2. 错误检查
if((result instanceof Error) && errorChecker){
result.formatter = formatter.$name
const { value,next } = executeChecker(emptyChecker,result)
if(next == 'break') {
return value
}else{
result = value
}
const errorCheckerIndex = formatters.findIndex(func=>func.$name==='error')
let errorChecker
if(errorCheckerIndex!=-1){
errorChecker = formatters.splice(errorCheckerIndex,1)[0]
if(result instanceof Error){
result.formatter = formatter.$name
const { value,next } = executeChecker(errorChecker,result)
if(next == 'break') {
return value
}else{
result = value
}
}
}
// 3. 分别执行格式化器函数
for(let formatter of formatters){
try{
@ -349,12 +353,14 @@ function executeFormatter(value,formatters,scope,template){
}catch(e){
e.formatter = formatter.$name
if(scope.debug) console.error(`Error while execute i18n formatter<${formatter.$name}> for ${template}: ${e.message} ` )
const { value,next } = executeChecker(errorChecker,result)
if(next=="break"){
if(value!==undefined) result = value
break
}else if(next=="skip"){
continue
if(isFunction(errorChecker)){
const { value,next } = executeChecker(errorChecker,result)
if(next=="break"){
if(value!==undefined) result = value
break
}else if(next=="skip"){
continue
}
}
}
}
@ -406,7 +412,7 @@ function wrapperFormatters(scope,activeLanguage,formatters){
// 格式化器无效或者没有定义时,查看当前值是否具有同名的原型方法,如果有则执行调用
// 比如padStart格式化器是String的原型方法不需要配置就可以直接作为格式化器调用
if(!isFunction(fn)){
fn = (value,...args) =>{
fn = (value) =>{
if(isFunction(value[name])){
return value[name](...args)
}else{

View File

@ -179,12 +179,12 @@ test("位置插值翻译文本内容",async ()=>{
expect(t("1")).toBe("你好");
expect(t("2",now)).toBe(`现在是${dayjs(now).format('YYYY年MM月DD日 HH点mm分ss秒')}`);
await scope.change("en")
.eixt
await scope.change("en")
expect(t("你好")).toBe("hello");
expect(t("现在是{}",now)).toBe(`Now is ${dayjs(now).format('YYYY-MM-DD HH:mm:ss')}`);
expect(t("现在是{}",now)).toBe(`Now is ${dayjs(now).format('YYYY/MM/DD HH:mm:ss')}`);
expect(t("1")).toBe("hello");
expect(t("2",now)).toBe(`Now is ${dayjs(now).format('YYYY-MM-DD HH:mm:ss')}`);
expect(t("2",now)).toBe(`Now is ${dayjs(now).format('YYYY/MM/DD HH:mm:ss')}`);
})
test("命名插值翻译文本内容",async ()=>{
@ -194,10 +194,9 @@ test("命名插值翻译文本内容",async ()=>{
await scope.change("en")
expect(t("你好")).toBe("hello");
expect(t("现在是{}",now)).toBe(`Now is ${dayjs(now).format('YYYY-MM-DD HH:mm:ss')}`);
expect(t("现在是{}",now)).toBe(`Now is ${dayjs(now).format('YYYY/MM/DD HH:mm:ss')}`);
expect(t("1")).toBe("hello");
expect(t("2",now)).toBe(`Now is ${dayjs(now).format('YYYY-MM-DD HH:mm:ss')}`);
done()
expect(t("2",now)).toBe(`Now is ${dayjs(now).format('YYYY/MM/DD HH:mm:ss')}`);
})
@ -222,6 +221,5 @@ test("翻译复数支持",async ()=>{
expect(t("我有{}个朋友",2)).toBe("I have two friends");
expect(t("我有{}个朋友",3)).toBe("I have 3 friends");
expect(t("我有{}个朋友",4)).toBe("I have 4 friends");
done()
})