最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一鍵將Word文檔轉(zhuǎn)成Vue組件mammoth的應(yīng)用詳解

 更新時(shí)間:2023年02月01日 11:30:07   作者:貨拉拉技術(shù)  
這篇文章主要為大家介紹了一鍵將Word文檔轉(zhuǎn)成Vue組件mammoth的應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

在開(kāi)發(fā)后臺(tái)管理系統(tǒng)的過(guò)程中,經(jīng)常有這樣的需求:將 Word 文檔(比如用戶協(xié)議文檔)轉(zhuǎn)換為 HTML 頁(yè)面(Vue 組件)。轉(zhuǎn)換 Word 文檔過(guò)程通常是枯燥的。開(kāi)源社區(qū)的 mammoth.js 正好可以解壓 .docx,并解析 XML 結(jié)構(gòu),最終將 Word 轉(zhuǎn)成 HTML 文件。因此可以基于該開(kāi)源庫(kù)開(kāi)發(fā)「Word 文檔轉(zhuǎn) Vue 組件」工具,讓轉(zhuǎn)換流程自動(dòng)化,從而有效提升了工作效率。本文介紹該工具的實(shí)現(xiàn)原理。

mammoth.js 的不足

mammoth.js 雖然可以直接生成 HTML 文件,但是使用過(guò)程還是遇到不少問(wèn)題。比如下圖所示的 Word 文檔:

經(jīng)過(guò) mammoth.js 轉(zhuǎn)換后的頁(yè)面卻是這個(gè)樣子:

從上圖我們可以發(fā)現(xiàn)以下幾個(gè)問(wèn)題:

  • 標(biāo)題欄不居中
  • 本來(lái)是 Word 中的排序,卻只是<li></li>默認(rèn)樣式 1 2 3
  • 跟現(xiàn)有的協(xié)議規(guī)范樣式不匹配
  • 超鏈接沒(méi)有交互
  • Table 表單不符合預(yù)期

改造

因此有必要通過(guò)對(duì) mammoth 進(jìn)行定制來(lái)滿足當(dāng)前項(xiàng)目的需求。mammoth 提供了方法可以獲取轉(zhuǎn)換后的 AST 節(jié)點(diǎn),那我們就利用這個(gè)方法,對(duì) AST 進(jìn)行轉(zhuǎn)換,最后生成一份可用的 Vue 文件。整個(gè)流程如下圖所示:

解析 AST

首先先獲取 AST。

var options = {
  transformDocument: transformElement,
};
mammoth.convertToHtml({ path }, options).done(async () => {
  // Word處理完畢
});

AST 節(jié)點(diǎn)

每個(gè)節(jié)點(diǎn)都會(huì)標(biāo)明 type 類型、是否居中、字號(hào)大小、是否粗體、是否斜體、是否有下劃線等。

type 類型如下所示:

Document 根節(jié)點(diǎn)

Paragraph 段落

  • Text
  • Run (這種情況,表示 mammoth 把一段話分成幾小部分,所以需要拼接 children 內(nèi)的 text 節(jié)點(diǎn)。)
  • hyperlink

Table 表單

  • tableRow
  • tableCell

處理 AST 節(jié)點(diǎn)

在處理節(jié)點(diǎn)的過(guò)程中,有以下幾個(gè)注意事項(xiàng):

  • Q: 何時(shí)換行?

A: 經(jīng)觀察,type: 'paragraph', children: [] 的時(shí)候表示需要換行。

  • Q: 哪些是正標(biāo)題、副標(biāo)題

A: 在我們項(xiàng)目中,把居中且字號(hào) 16 的文本定義為正標(biāo)題,居中且字號(hào) 14 的文本定義為副標(biāo)題。

  • Q: 段落首行縮進(jìn)

A: 這點(diǎn)需要手動(dòng)處理,默認(rèn)增加 4 個(gè)縮進(jìn)&nbsp;&nbsp;&nbsp;&nbsp;。

  • Q: 如何處理粗體、字號(hào)、空格、超鏈接?

A: 粗體、字號(hào)生成公共的 class,比如'bold' 'font-size-14' 'font-size-16';空格需要將\s替換為 &nbsp;;對(duì)于 type === 'hyperlink'的超鏈接,轉(zhuǎn)成<a target="_blank" class="blue" href="${txt.href}">${txt.children[0].value}</a>

  • Q: Word 文檔中排序是如何轉(zhuǎn)換的?

A: 用 node 節(jié)點(diǎn)中的numbering字段來(lái)判斷,需要排序則numbering有值;不需要排序則numbering: null; 維護(hù)一個(gè)公共變量保存排序數(shù)值,再將英文數(shù)字 1 2 3 等 轉(zhuǎn)換為中文一、二、三等。

  • Q: Table 樣式如何處理?

A: 在該節(jié)點(diǎn)中,第一個(gè)元素為thead標(biāo)簽,后續(xù)元素為tbody標(biāo)簽;tbody 中的children節(jié)點(diǎn)是由type: paragraph節(jié)點(diǎn)構(gòu)成,可以handleParagraph遞歸處理。

下面的代碼展示了處理段落、表單的邏輯。

function transformElement(element) {
  // 根節(jié)點(diǎn)
  const document = element.children;
  if (Array.isArray(document)) {
    document.forEach((ele) => {
      switch (ele.type) {
        case 'paragraph':
          str += handleParagraph(ele);
          break;
        case 'table':
          handleTable(ele);
          break;
        default:
          break;
      }
    });
  }
  return element;
}

代碼格式化與生成

首先將字符串拼接成為 Vue 組件源碼。

const originalStr = `<template>
  ...
</template>
<script>
 // ...
</script>
<style lang="less" scoped>
  // ...
</style>\n`;

每次給組件起名字也挺煩的,所以可以使用 translate-shell 就根據(jù)協(xié)議文檔的中文名稱,進(jìn)行翻譯得出。

// 讀取word路徑名,并進(jìn)行翻譯,自動(dòng)生成template name和文件名
function getTranslatedNames(path) {
  return new Promise((resolve) => {
    const chArr = path.replace('.docx', '').split('/');
    exec(
      `trans -t english '${chArr[chArr.length - 1]}'`,
      (error, stdout, stderr) => {
        const arr = stdout.split('\n');
        // ...
        resolve(target.replace(/[^a-zA-Z-]/gi, ''));
      },
    );
  });
}

至此我們已經(jīng)得到符合項(xiàng)目需求的代碼,文件名稱也有了,現(xiàn)在只需要將代碼內(nèi)容格式化寫(xiě)入文件就完成了。

// 格式化
const finalStr = prettier.format(originalStr, config);
fs.writeFileSync(`${templateName}.vue`, finalStr, 'utf-8');

最終的效果如下圖所示:

總結(jié)

簡(jiǎn)而言之,這個(gè)工具站在了 mammoth 的肩膀上,利用 AST 節(jié)點(diǎn),再根據(jù) UI 稿相應(yīng)地做不同轉(zhuǎn)換。生成符合規(guī)范的代碼后,再拼接成 vue 組件,寫(xiě)入項(xiàng)目中。mammoth 處理 Word 文檔還是非常方便的,推薦使用。

以上就是一鍵將Word文檔轉(zhuǎn)成Vue組件mammoth的應(yīng)用詳解的詳細(xì)內(nèi)容,更多關(guān)于Word轉(zhuǎn)成Vue組件mammoth的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue實(shí)現(xiàn)無(wú)限消息無(wú)縫滾動(dòng)

    vue實(shí)現(xiàn)無(wú)限消息無(wú)縫滾動(dòng)

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)無(wú)限消息無(wú)縫滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue-cli3全面配置詳解

    vue-cli3全面配置詳解

    這篇文章主要介紹了vue-cli3全面配置詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Vue 自定義組件 v-model 使用詳解

    Vue 自定義組件 v-model 使用詳解

    這篇文章主要介紹了Vue 自定義組件 v-model 使用介紹,包括vue2中使用和vue3中使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Vue如何解決兄弟組件之間傳值問(wèn)題

    Vue如何解決兄弟組件之間傳值問(wèn)題

    這篇文章主要介紹了Vue如何解決兄弟組件之間傳值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue+elementUI實(shí)現(xiàn)右擊指定表格列的單元格顯示選擇框功能

    vue+elementUI實(shí)現(xiàn)右擊指定表格列的單元格顯示選擇框功能

    這篇文章主要介紹了vue+elementUI實(shí)現(xiàn)右擊指定表格列的單元格顯示選擇框功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-03-03
  • Vue和SpringBoot之間傳遞時(shí)間的方法實(shí)現(xiàn)

    Vue和SpringBoot之間傳遞時(shí)間的方法實(shí)現(xiàn)

    本文主要介紹了Vue和SpringBoot之間傳遞時(shí)間的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • vue前端獲取/切換麥克風(fēng)、播放采集音頻和采集音量大小完整代碼

    vue前端獲取/切換麥克風(fēng)、播放采集音頻和采集音量大小完整代碼

    這篇文章主要給大家介紹了關(guān)于vue前端獲取/切換麥克風(fēng)、播放采集音頻和采集音量大小的相關(guān)資料,文中通過(guò)圖文以及代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-12-12
  • element-ui 中的table的列隱藏問(wèn)題解決

    element-ui 中的table的列隱藏問(wèn)題解決

    這篇文章主要介紹了element-ui 中的table的列隱藏問(wèn)題解決,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • vue默認(rèn)插槽的理解與實(shí)例代碼

    vue默認(rèn)插槽的理解與實(shí)例代碼

    對(duì)于插槽的概念和使用,這是vue的一個(gè)難點(diǎn),這需要我們靜下心來(lái),慢慢研究,下面這篇文章主要給大家介紹了關(guān)于vue默認(rèn)插槽的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Vue3 構(gòu)建 Web Components使用詳解

    Vue3 構(gòu)建 Web Components使用詳解

    這篇文章主要為大家介紹了Vue3 構(gòu)建 Web Components使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評(píng)論

洞口县| 邳州市| 和田县| 琼结县| 米林县| 扶沟县| 白河县| 牡丹江市| 沧源| 北票市| 蛟河市| 郧西县| 新化县| 彝良县| 仪陇县| 隆德县| 文水县| 泰安市| 湘潭市| 宾阳县| 巩义市| 郴州市| 饶平县| 达孜县| 丁青县| 恩施市| 新沂市| 景谷| 会宁县| 巴里| 齐齐哈尔市| 肥西县| 定远县| 平凉市| 思南县| 罗田县| 淳安县| 阿巴嘎旗| 台中市| 黄平县| 南丰县|