给英语注音标的方案,word打印版 利用tophonetics.com

先上效果图。

//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 \\* &quot;Font:Arial Unicode MS&quot; \\* 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 \* &quot;Font:宋体&quot; \* 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 \* &quot;Font:宋体&quot; \* 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 \\* &quot;Font:Arial Unicode MS&quot; \\* 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;//不要修改,这里就是反馈函数的值给外面

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值