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

go開源Hugo站點(diǎn)渲染之模板詞法解析

 更新時(shí)間:2023年02月24日 15:34:55   作者:GitAction  
這篇文章主要為大家介紹了go開源Hugo站點(diǎn)渲染之模板詞法解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

Deps在準(zhǔn)備好NewPathSpec,NewSpec,NewContentSpec,NewSourceSpec后,調(diào)用onCreate正式創(chuàng)建HugoSites,并在最后一步,加載模板執(zhí)行器。

模板執(zhí)行器只是提前將模板信息轉(zhuǎn)換成了模板執(zhí)行器,如何使用并沒(méi)有涉及到。

為了讓我們對(duì)模板生命周期有更全面的了解,讓我們以robots.txt為例,來(lái)看看是如何通過(guò)模板執(zhí)行器生成最終文件的。

了然于胸 - newTemplateExec時(shí)序圖 

從時(shí)序圖中,可以了解到創(chuàng)建執(zhí)行器,主要分兩步。

先創(chuàng)建包含了各種功能函數(shù)的executor。 其中的功能函數(shù)由兩部分組成,一部分來(lái)自hugo,像htmlEscape等。 另一部分來(lái)自于golang的內(nèi)置函數(shù),如fmt.Sprint等等。 正是因?yàn)橛羞@些功能函數(shù)的支持,才得以讓模板的action塊 - ‘{{}}‘功能如此強(qiáng)大。

執(zhí)行器創(chuàng)建好后,接下來(lái)就要?jiǎng)?chuàng)建模板的handler了。 處理器提供了模板加載、查詢等相關(guān)的服務(wù),以方便使用。 因?yàn)椴樵兎?wù)依賴于加載服務(wù),所以在處理器實(shí)例后,緊接著就是加載模板了。 而模板又分兩部分,一部分是由hugo提供的默認(rèn)模板,像robot.txt等。 另一部分就是由用戶所提供的layouts文件,有來(lái)于主題的,也有來(lái)于用戶自定義的layout。

加載的是磁盤文件,得到的是解析過(guò)后的模板實(shí)例。

templ, err := prototype.New(info.name).Parse(info.template)

源碼里用的是prototype,而不是直接用的html。 這是因?yàn)槲覀兊哪0逵袃煞N后綴,一種是txt,另一種是html,需要找到相應(yīng)的原型來(lái)對(duì)模板進(jìn)行解析。

不管是什么模板,都是文本,HTML也不例外,也是文本。 HTML模板的源碼也應(yīng)證了這一點(diǎn) - 直接調(diào)用文本模板的方法。 那這種關(guān)系是如何用代碼實(shí)現(xiàn)的呢?

拿到模板字節(jié)信息后,用詞法分析器對(duì)模板字節(jié)流進(jìn)行解析,得到分析好的詞義結(jié)構(gòu)。 對(duì)于HTML模板而言,為了安全,需要對(duì)詞義結(jié)構(gòu)進(jìn)行檢查和必要地修改。 因?yàn)槲覀兛梢詮牟煌?,獲得不同的主題,這些主題中又包含了很多模板,并且主題中可以嵌套主題,為了保證安全,避免執(zhí)行惡意代碼。 最后就是執(zhí)行解析好的模板。

為了方便理解,我們來(lái)舉個(gè)例子 - robot.txt模板使用流程:

  • 查找:通過(guò)名字查找,調(diào)用templateExec中的handler查詢方法LookupLayout進(jìn)行查詢。
  • 執(zhí)行:準(zhǔn)備執(zhí)行模板所需要的信息,調(diào)用templateExec中的executor執(zhí)行方法ExecuteWithContext開始執(zhí)行。 這里的執(zhí)行方法實(shí)際上也是由text template提供的,前面咱們也提到了,不管是什么類型的模板,都是以text為基礎(chǔ)的。

知道了工作流程后,讓我們從源碼層面,更深入的對(duì)Template進(jìn)行理解。

我們先來(lái)看第一步: 模板解析。

詞法解析 - parse 

創(chuàng)建Deps的最后一步是loadResources,其中主要指的是Template資源。 在創(chuàng)建templateExec實(shí)例的過(guò)程中,就需要加載hugo默認(rèn)和用戶創(chuàng)建的模板。 加載模板后,獲取了模板的字節(jié)信息,要想為我們所有,首先要讀懂這些字節(jié),這時(shí),我們就用到了解析Parse,而且是由text模板提供的。 Parse為什么可以讀懂這些字符信息呢,她依靠的是內(nèi)部了詞法分析器lex - lexer,分析器需要對(duì)action block的語(yǔ)義有充分的理解。 讀懂后轉(zhuǎn)換為方便后續(xù)操作的數(shù)據(jù)結(jié)構(gòu)tree,在hugo中實(shí)際載體是listNode類型。

我們拿一段模板舉個(gè)例子:

從上例中,我們可以看到,左上方是輸入的信息。 包含一篇博客 - post.md,和一個(gè)模板 - single.html。 通過(guò)轉(zhuǎn)換會(huì)得到最右邊的輸出網(wǎng)頁(yè)內(nèi)容。 其中,包含在模板中第一行的信息,剩下的是由博客提供的信息,其中的特殊字符,還被進(jìn)行了轉(zhuǎn)義。

在左下方第一步中,創(chuàng)建templateExec過(guò)程中,讀取到了模板single.html。 通過(guò)解析,利用詞法分析器,會(huì)得到如下狀態(tài):

[“<p><!-- HT…”, “{{”, “ “, ”.Content”, ” “, ”}}”, EOF]

為了理解其中的工作原理,讓我們?cè)谙乱徽鹿?jié)中一起來(lái)看一下action block的詞法分析器是如何工作的。

以上就是go開源Hugo站點(diǎn)渲染之模板詞法解析的詳細(xì)內(nèi)容,更多關(guān)于Hugo站點(diǎn)渲染模板詞法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang使用map支持高并發(fā)的方法(1000萬(wàn)次操作14ms)

    golang使用map支持高并發(fā)的方法(1000萬(wàn)次操作14ms)

    這篇文章主要介紹了golang使用map支持高并發(fā)的方法(1000萬(wàn)次操作14ms),本文給大家詳細(xì)講解,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • go語(yǔ)言csrf庫(kù)使用實(shí)現(xiàn)原理示例解析

    go語(yǔ)言csrf庫(kù)使用實(shí)現(xiàn)原理示例解析

    這篇文章主要為大家介紹了go語(yǔ)言csrf庫(kù)使用實(shí)現(xiàn)原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 簡(jiǎn)化Go開發(fā)提高生產(chǎn)力的強(qiáng)大工具及使用詳解

    簡(jiǎn)化Go開發(fā)提高生產(chǎn)力的強(qiáng)大工具及使用詳解

    作為?Go?開發(fā)人員,應(yīng)該都知道維持簡(jiǎn)潔高效開發(fā)工作流程的重要性,為了提高工作效率和代碼質(zhì)量,簡(jiǎn)化開發(fā)流程并自動(dòng)執(zhí)行重復(fù)性任務(wù)至關(guān)重要,在本文中,我們將探討一些強(qiáng)大的工具和技術(shù),它們將簡(jiǎn)化?Go?開發(fā)過(guò)程,助力您的編碼之旅
    2023-10-10
  • golang常用庫(kù)之配置文件解析庫(kù)-viper使用詳解

    golang常用庫(kù)之配置文件解析庫(kù)-viper使用詳解

    viper 配置管理解析庫(kù),是由大神 Steve Francia 開發(fā),他在google領(lǐng)導(dǎo)著 golang 的產(chǎn)品開發(fā),他也是 gohugo.io 的創(chuàng)始人之一,命令行解析庫(kù) cobra 開發(fā)者,這篇文章主要介紹了golang常用庫(kù)之配置文件解析庫(kù)-viper使用詳解,需要的朋友可以參考下
    2020-10-10
  • Go?interface?接口的最佳實(shí)踐經(jīng)驗(yàn)分享

    Go?interface?接口的最佳實(shí)踐經(jīng)驗(yàn)分享

    go?的接口在go的編程里面用的十分頻繁,尤其是空接口的使用,因?yàn)橛辛私涌?,才使得Go語(yǔ)言變得異常的強(qiáng)大,今天給大家介紹下Go?interface?接口的最佳實(shí)踐經(jīng)驗(yàn)分享,感興趣的朋友一起看看吧
    2022-04-04
  • Golang Type關(guān)鍵字的使用

    Golang Type關(guān)鍵字的使用

    Type關(guān)鍵字在Go語(yǔ)言中作用很重要,比如定義結(jié)構(gòu)體,接口,還可以自定義類型,定義類型別名等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • 破解IDEA(Goland)注冊(cè)碼設(shè)置 license server一直有效不過(guò)期的過(guò)程詳解

    破解IDEA(Goland)注冊(cè)碼設(shè)置 license server一直有效不過(guò)期的過(guò)程詳解

    這篇文章主要介紹了破解IDEA(Goland)注冊(cè)碼設(shè)置 license server一直有效不過(guò)期,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • CSP communicating sequential processes并發(fā)模型

    CSP communicating sequential processes并發(fā)模型

    這篇文章主要為大家介紹了CSP communicating sequential processes并發(fā)模型,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Golang實(shí)現(xiàn)按比例切分流量的示例詳解

    Golang實(shí)現(xiàn)按比例切分流量的示例詳解

    我們?cè)谶M(jìn)行灰度發(fā)布時(shí),往往需要轉(zhuǎn)發(fā)一部分流量到新上線的服務(wù)上,進(jìn)行小規(guī)模的驗(yàn)證,隨著功能的不斷完善,我們也會(huì)逐漸增加轉(zhuǎn)發(fā)的流量,這就需要按比例去切分流量,那么如何實(shí)現(xiàn)流量切分呢,接下來(lái)小編就給大家詳細(xì)的介紹一下實(shí)現(xiàn)方法,需要的朋友可以參考下
    2023-09-09
  • Go語(yǔ)言提升開發(fā)效率的語(yǔ)法糖技巧分享

    Go語(yǔ)言提升開發(fā)效率的語(yǔ)法糖技巧分享

    每門語(yǔ)言都有自己的語(yǔ)法糖,像java的語(yǔ)法糖就有方法變長(zhǎng)參數(shù)、拆箱與裝箱、枚舉、for-each等等,Go語(yǔ)言也不例外。本文就來(lái)介紹一些Go語(yǔ)言的語(yǔ)法糖,需要的可以參考一下
    2022-07-07

最新評(píng)論

广宗县| 玛纳斯县| 沧源| 都江堰市| 榆林市| 青冈县| 登封市| 罗甸县| 黑龙江省| 汕头市| 汕尾市| 鄯善县| 铜鼓县| 池州市| 阿拉善左旗| 阿拉善盟| 扎赉特旗| 绥德县| 田林县| 南京市| 浑源县| 唐海县| 深州市| 明星| 环江| 平江县| 临朐县| 迭部县| 贵德县| 固镇县| 锡林郭勒盟| 军事| 墨竹工卡县| 福海县| 岳普湖县| 淄博市| 景宁| 郴州市| 噶尔县| 洞口县| 新源县|