先上效果图。
//2022年6月1日开始 支持,音标和单词不一样颜色
思路:
1、获取音标,网上找了个js库,但是发现库不全,后来发现了这个网站。感谢一下!!!!
toPhonetics,进去多点点广告,https://tophonetics.com/,如果网站倒闭了,这个教程就要改了。
2、把音标和单词组合,一开始的思路是搞成两行,然后对齐。后来发现,字母i和a,宽度不一样s(宋体一样,可能他是等宽字体,但是看起来不符合英文习惯),自己计算起来还是很累的。后来借鉴了word的拼音指南。学习了xml,把word另存为xml 然后分析一下body里边的内容,可以网上找个文本对比工具和xml格式化工具,这样就能看看到底什么意思。也可以自己找个word的xml格式分析文章看看,完整就是body wp wr wt 就这4个就够了。
编程的思路
操作步骤1、复制word文稿到网站,网站上选中linebyline 加//,不加也行,这个自己决定。
2、把结果复制到word,结果是的如下结构,如果不一样,那么要自己重写jsnew这个段代码
1、2两步获取了 单词和它们的音标。
3、复制文档,主要是1,2没办法获取段落(主要是获取的英文和音标里边没有段落标志)
4、逐个字符分析,如果是字符=字符+后面字符,如果是符号或者空格,就不处理。具体看看代码就是一个个字符分析,找出单词和符号,空格等分别处理
逐个替换成xml的语言。
5、把获取的xml语言拼接成word的xml,然后复制到粘贴板。
6、把粘贴板内容复制到记事本,另存为.xml,word打开这个xml就是文档(WPS效果更好)
下面是小程序里边的js语句
testabc(){
let app=this
let isnoblank=true;//true表示如果没有翻译出来,就用空白替换,如果是false,就用原文替换
let iscutword=true;//true,2个字母或者cutword简单字母的,不标音标,比如a an the,如果是false,就用全部标注
let cutword='the+are+our+you+where+who+what+which+USA+gdp+there+but+his+she+him+hers+your+yours+for+they'//不想标注音标的
let cutarr=cutword.toLowerCase().split("+")//分割一下,要不然hey这样的单词也可能不显示
let wordFont='"Arial"'//正文字体,有引号注意
let wordFontsize='"24"'//24等于12磅字,除以2,有引号
let newwordFont='Arial Unicode MS'//正文字体,没引号
let newwordFontsize='hps20'//20等于10磅字,除以2,建议24配20,类似这样小20%,常规来说单词比音标短,而且应标还有分割符号
let newwordFonthigh='up 11'//11表示24/2-1,距离是0,这个24是word的尺寸,如果是40,那么要填写19
//console.log(cut3arr)
//wordtemplatee=` <?xml 有空格是不行的
let wordtemplate=`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml">
<w:docPr> <w:view w:val="print"/> <w:zoom w:percent="120"/> </w:docPr>
<w:body> <w:p> <w:r> </w:r> </w:p> </w:body> <w:sectPr> </w:sectPr> </w:wordDocument>`
let wpbegin='<w:p>'
let wpend='</w:p>'
let bodyend='</w:body>'
let outstr=''
let word=''
let nword=''
let bk4=' '//空4个
let str=''
let copyStr=app.data.copyArr[0]//获取剪贴板数据,第一次复制,获取音标和单词的对应关系
let inarr=copyStr.split("\r\n")
let isfirst=true// 数据必须是 单词,英标;这样的形式,不能是
let iscut=false;
for(let m=0;m<inarr.length;m++)
{
str=inarr[m]
if(str.trim()==''&&isfirst)
{}else
{isfirst=false
if(app.isaz(str)){
if(inarr[m]==inarr[m+1]&&isnoblank) {outstr=outstr+'"'+str+'":"'+''+'",'; } else { outstr=outstr+'"'+str+'":"'+inarr[m+1]+'",';}
m++;
}
}
}
outstr="{ "+outstr.slice(0,-1)+" }"
let jnew=JSON.parse(outstr)// 获取音标结束
outstr='';
//console.log(jnew)
let copyword=wordtemplate
let easyword='<w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" w:hint="fareast"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>easyword</w:t></w:r>'
easyword=app.replaceall(easyword,'"Arial"',wordFont)
easyword=app.replaceall(easyword,'"24"',wordFontsize)
let oneword=`<w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" w:hint="fareast"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" w:hint="fareast"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:instrText> EQ \\* jc0 \\* "Font:Arial Unicode MS" \\* hps22 \\o \\ad(\\s \\up 11(upword),downword)</w:instrText></w:r><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" w:hint="fareast"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" w:hint="fareast"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:fldChar w:fldCharType="end"/></w:r>`
oneword=app.replaceall(oneword,'"Arial"',wordFont)
oneword=app.replaceall(oneword,'"24"',wordFontsize)
oneword=app.replaceall(oneword,'"Arial Unicode MS"',newwordFont)
oneword=app.replaceall(oneword,'hps22',newwordFontsize)
oneword=app.replaceall(oneword,'up 11',newwordFonthigh)
let bl=copyword.indexOf(wpbegin)
let bodybegin=copyword.slice(0,bl)
let el=copyword.indexOf(bodyend)
bodyend=copyword.slice(el)
// 第二次复制,其实就是要复制出段落分割符号
let wrodarr=app.data.copyArr[1].split("\r\n")
for(let m=0;m<wrodarr.length;m++)
{
str=wrodarr[m];
outstr=outstr+wpbegin+easyword.replace('easyword',bk4);//开头加上4个空格
for(let i=0;i<str.length;i++)
{
if(app.isaz(str.charAt(i))){word=word+str.charAt(i)}
else{
if(word.trim()!=='')
{nword=jnew[word];// 如果找不到或者空格,就简单替换
if(word.length<3||cutarr.indexOf(word.toLowerCase())!==-1){iscut=true}else{iscut=false}
if(nword==undefined||nword==''||(iscut&&iscutword)){nword=easyword.replace('easyword',word)}
else{nword=oneword.replace('upword',nword).replace('downword',word)}
}
outstr=outstr+nword+easyword.replace('easyword',str.charAt(i));
word='';nword=''; }
if(i==str.length-1)//最后一个可能是标点,也可能直接是单词,如果是标点nword='',如果是单词,加上单词
{
if(word.trim()!=='')
{nword=jnew[word];// 如果找不到或者空格,就简单替换
if(word.length<3||cutarr.indexOf(word.toLowerCase())!==-1){iscut=true}else{iscut=false}
if(nword==undefined||nword==''||(iscut&&iscutword)){nword=easyword.replace('easyword',word)}
else{nword=oneword.replace('upword',nword).replace('downword',word)}
}
outstr=outstr+nword+wpend;//最后一个字符后,段落结束,把结束符号给他
word=''; nword='';
}
}
}
outstr=bodybegin+outstr+bodyend
app.data.outStr=outstr;//把数据传递出去剪贴板数据
app.setData({
result:'ok' + new Date().getTime()
});
wx.setClipboardData({
data:app.data.outStr,
success: function(res) {
},
fail: function(res) {
}
});
return
},
//判断字符函数
isaz(val){
var regPos = /[a-zA-Z]/;
if(regPos.test(val)){
return true;
}else{
return false;
}
},
//字符替换函数
replaceall(str, substr, newstr) {
var p = -1;
var s = 0;
while((p = str.indexOf(substr, s)) > -1) {
s = p + newstr.length;
str = str.replace(substr, newstr);
}
return str;
},
2022年6月1日的版本
有个网友提出了一个需求,看能否把音标颜色和单词颜色不一样
解决思路:1、通过拼音指南解决,发现只能设置音标大小、字体、居中和偏移量;
2、网上搜了一下 word+instrtext--找不用有用的信息
3、搜拼音指南使用帮助,没啥有用的
4. 搜拼音指南颜色--发现了下面这个文章
https://jingyan.baidu.com/article/36d6ed1f76fc9e5ace48837b.html
根据文章描述,就是 下面这段 --五、运用域代码处理问题
在word中,选中带拼音的文字,右键切换到域代码,可以用word2010中的“查找替换”改变拼音的字号大小,拼音距离汉字头顶的距离等。
jc0:拼音在汉字上边,jc5:拼音在汉字右边。hps右边的数字表示拼音字母的字号,up右边的数字表示拼音离开汉字头顶的距离。Font:字体。
自己设置完毕后,查询xml内容,发现规律
下面是xml的内容
<w:r><w:rPr><w:rFonts w:hint="fareast"/><w:color w:val="FF0000"/><w:sz w:val="84"/><w:sz-cs w:val="84"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r>
<w:r><w:rPr><w:rFonts w:hint="fareast"/><w:color w:val="FF0000"/><w:sz w:val="84"/><w:sz-cs w:val="84"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:instrText> EQ \* jc0 \* "Font:宋体" \* hps42 \o \ad(\s \up 41(</w:instrText></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:color w:val="FFFF00"/><w:sz w:val="84"/><w:sz-cs w:val="84"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:instrText>fēn)</w:instrText></w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:color w:val="FF0000"/><w:sz w:val="84"/><w:sz-cs w:val="84"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:instrText>,分)</w:instrText>
</w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:color w:val="FF0000"/><w:sz w:val="84"/><w:sz-cs w:val="84"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:fldChar w:fldCharType="separate"/>
</w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:color w:val="FF0000"/><w:sz w:val="84"/><w:sz-cs w:val="84"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:fldChar w:fldCharType="end"/>
// 上面是音标和单词不同颜色的 4个部门
// 下面是音标和单词相同颜色的 4个部分,对比一下,差距在第二部分
</w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:color w:val="FF0000"/><w:sz w:val="84"/><w:sz-cs w:val="84"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:fldChar w:fldCharType="begin"/>
</w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:color w:val="FF0000"/><w:sz w:val="84"/><w:sz-cs w:val="84"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:instrText> EQ \* jc0 \* "Font:宋体" \* hps42 \o \ad(\s \up 41(ā),阿)</w:instrText>
</w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:color w:val="FF0000"/><w:sz w:val="84"/><w:sz-cs w:val="84"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:fldChar w:fldCharType="separate"/>
</w:r><w:r><w:rPr><w:rFonts w:hint="fareast"/><w:color w:val="FF0000"/><w:sz w:val="84"/><w:sz-cs w:val="84"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:fldChar w:fldCharType="end"/>
根据上面的内容改了改代码
下面这个代码支持单词和音标颜色不一样,不过不是小程序直接能用的版本,自己稍微修改一下。
---具体实现可以看,微信小程序-复制就好;
var result ='ok'
//20220515,把英标ɛ 改成e;
//20220601 更新,支持‘s;只有一个语句,如果不需要就删除,因为这个有条件,就是’s后面必须是空格,或者标点;不能是‘s整个文章结束。(可以自己加个空格,代码里边没做判断)
//20220601-2修改了颜色,单词颜色=正文颜色黑色;音标颜色默认红色,注意看看有没有引号,不要改完了,也不成功
let isnoblank=true;//true表示如果没有翻译出来,就用空白替换,如果是false,就用原文替换
let iscutword=true;//true,2个字母或者cutword简单字母的,不标音标,比如a an the,如果是false,就用全部标注
let cutword='the+are+our+you+where+who+what+which+USA+gdp+there+but+his+she+him+hers+your+yours+for+they'//不想标注音标的
let cutarr=cutword.toLowerCase().split("+")//分割一下,要不然hey这样的单词也可能不显示
let wordFont='"Arial"'//正文字体,有引号注意
let wordColor='"000000"'//正文颜色,有引号注意,默认黑色
let wordFontsize='"24"'//24等于12磅字,除以2,有引号
let newwordFont='Arial Unicode MS'//音标字体,没引号
let newwordFont2='"Arial Unicode MS"'//音标字体,有引号和上面这个要配套
let newwordColor='"FF0000"'//音标颜色,有引号注意,默认红色,16进制的,网上找找
let newwordFontsize2='"20"'//20等于10磅字,除以2,建议24配20,类似这样小20%,常规来说单词比音标短,而且应标还有分割符号,有引号
let newwordFontsize='hps20'//20等于10磅字,除以2,建议24配20,类似这样小20%,常规来说单词比音标短,而且应标还有分割符号和上面这个类似
let newwordFonthigh='up 11'//11表示24/2-1,距离是0,这个24是word的尺寸,如果是40,那么要填写19
//console.log(cut3arr)
//wordtemplatee=<?xml 有空格是不行的
let wordtemplate='<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?mso-application progid="Word.Document"?> <w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"> <w:docPr> <w:view w:val="print"/> <w:zoom w:percent="120"/> </w:docPr> <w:body> <w:p> <w:r> </w:r> </w:p> </w:body> <w:sectPr> </w:sectPr> </w:wordDocument>'
let wpbegin='<w:p>'
let wpend='</w:p>'
let bodyend='</w:body>'
let outstr=''
let word=''
let nword=''
let bk4=' '//空4个
let str=''
let copyStr=app.data.copyArr[0]//获取剪贴板数据,第一次复制,获取音标和单词的对应关系
let inarr=copyStr.split("\r\n")
let isfirst=true// 数据必须是 单词,英标;这样的形式,不能是
let iscut=false;
for(let m=0;m<inarr.length;m++)
{
str=inarr[m]
if(str.trim()==''&&isfirst)
{}else
{isfirst=false
if(isaz(str)){
if(inarr[m]==inarr[m+1]&&isnoblank) {outstr=outstr+'"'+str+'":"'+''+'",'; } else {
inarr[m+1]=replaceall(inarr[m+1],'ɛ','e');outstr=outstr+'"'+str+'":"'+inarr[m+1]+'",';}
m++;
}
}
}
outstr="{ "+outstr.slice(0,-1)+" }"
let jnew=JSON.parse(outstr)// 获取音标结束
outstr='';
//console.log(jnew)
let copyword=wordtemplate
let easyword='<w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" w:hint="fareast"/><w:color w:val="FF0000"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>easyword</w:t></w:r>'
easyword=replaceall(easyword,'"Arial"',wordFont)
easyword=replaceall(easyword,'"FF0000"',wordColor)
easyword=replaceall(easyword,'"24"',wordFontsize)
let col12='</w:instrText></w:r><w:r><w:rPr><w:rFonts w:ascii="Arial Unicode MS" w:h-ansi="Arial Unicode MS" w:cs="Arial Unicode MS" w:hint="default"/><w:color w:val="0000FF"/><w:sz w:val="24x"/><w:sz-cs w:val="24x"/></w:rPr><w:instrText>upword)</w:instrText></w:r><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" w:hint="default"/><w:color w:val="00FFFF"/><w:sz w:val="24"/><w:sz-cs w:val="24"/></w:rPr><w:instrText>,downword'
let oneword='<w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" w:hint="fareast"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" w:hint="fareast"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:instrText> EQ \\* jc0 \\* "Font:Arial Unicode MS" \\* hps22 \\o \\ad(\\s \\up 11(col12)</w:instrText></w:r><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" w:hint="fareast"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial" w:hint="fareast"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:fldChar w:fldCharType="end"/></w:r>'
oneword=replaceall(oneword,'col12',col12)
oneword=replaceall(oneword,'"Arial Unicode MS"',newwordFont2)
oneword=replaceall(oneword,'Arial Unicode MS',newwordFont)
oneword=replaceall(oneword,'"Arial"',wordFont)
oneword=replaceall(oneword,'"24x"',newwordFontsize2)
oneword=replaceall(oneword,'"24"',wordFontsize)
oneword=replaceall(oneword,'hps22',newwordFontsize)
oneword=replaceall(oneword,'up 11',newwordFonthigh)
oneword=replaceall(oneword,'"0000FF"',newwordColor)
oneword=replaceall(oneword,'"00FFFF"',wordColor)
let bl=copyword.indexOf(wpbegin)
let bodybegin=copyword.slice(0,bl)
let el=copyword.indexOf(bodyend)
bodyend=copyword.slice(el)
// 第二次复制,其实就是要复制出段落分割符号
let wrodarr=app.data.copyArr[1].split("\r\n")
for(let m=0;m<wrodarr.length;m++)
{
str=wrodarr[m];
outstr=outstr+wpbegin+easyword.replace('easyword',bk4);//开头加上4个空格
for(let i=0;i<str.length;i++)
{
if(str.charAt(i)=="'"&& str.charAt(i+1).toLowerCase()=="s"){word=word+"'"+str.charAt(i+1);i=i+2}// 考虑到‘s的情况,但是不考虑abc‘cdf这种情,这种在英语中应该是违反规定的
if(isaz(str.charAt(i))){word=word+str.charAt(i)}
else{
if(word.trim()!=='')
{nword=jnew[word];// 如果找不到或者空格,就简单替换
if(word.length<3||cutarr.indexOf(word.toLowerCase())!==-1){iscut=true}else{iscut=false}
if(nword==undefined||nword==''||(iscut&&iscutword)){nword=easyword.replace('easyword',word)}
else{nword=oneword.replace('upword',nword).replace('downword',word)}
}
outstr=outstr+nword+easyword.replace('easyword',str.charAt(i));
word='';nword=''; }
if(i==str.length-1)//最后一个可能是标点,也可能直接是单词,如果是标点nword='',如果是单词,加上单词
{
if(word.trim()!=='')
{nword=jnew[word];// 如果找不到或者空格,就简单替换
if(word.length<3||cutarr.indexOf(word.toLowerCase())!==-1){iscut=true}else{iscut=false}
if(nword==undefined||nword==''||(iscut&&iscutword)){nword=easyword.replace('easyword',word)}
else{nword=oneword.replace('upword',nword).replace('downword',word)}
}
outstr=outstr+nword+wpend;//最后一个字符后,段落结束,把结束符号给他
word=''; nword='';
}
}
}
outstr=bodybegin+outstr+bodyend
//字符替换函数
function replaceall(str, substr, newstr) {
var p = -1;
var s = 0;
while((p = str.indexOf(substr, s)) > -1) {
s = p + newstr.length;
str = str.replace(substr, newstr);
}
return str;
};
function isaz(val){
var regPos = /[a-zA-Z]/;
if(regPos.test(val)){
return true;
}else{
return false;
}
};
app.data.outStr=outstr;//把数据传递出去剪贴板数据
app.setData({
result:'ok'
});
result;//不要修改,这里就是反馈函数的值给外面