用VBA将word文档处理成支持弹出式注释的epub文档可用的html内容

有一种epub文件,其中的注释以弹窗形式显示,如下图:

点击注释引用后,对应的注释内容会弹出在页面中显示,再次点击弹窗外的任意位置该弹窗即关闭,关闭后点击任意注释引用,对应的注释内容会弹窗显示。

实现弹出式注释可以用CSS伪类、JavaScript、img标签的alt属性等各种方法,例如此文将带注释的Word文档改造成点击注释引用即可弹窗显示注释的HTML文档-CSDN博客即给出了一种JavaScript实现的方式。但是这些方式往往在PC上效果不错,但在手机、平板等设备上就没法弹出了。实际上,根据epub3规范,一个epub文档中的html文件如果符合以下范式即自动支持如上图的弹出式注释:

1、html标签中引入epub命名空间,如下:

html 复制代码
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">

2、注释引用标签(一般用a标签)加入epub:type="noteref"属性,且注释引用的链接目标为对应的注释内容;

3、注释内容标签(可用div、aside等)加入epub:type="footnote"属性。

这种实现方法不依赖任何CSS或JavaScript,不但在PC上效果不错,在许多支持epub3标准的手机电子书阅读APP上(例如静读天下、汉王墨水屏自带读书APP等)也能弹出显示注释,免除页面跳转的麻烦,因此是首选方法。

现在我们将用VBA自动更正错误的注释引用序号-CSDN博客处理好注释引用与注释编号的文档改造成符合上述规范的html文件所需内容。为便于处理,我们首先在每个诗标题前插入一个连续型分节符,代码如下:

vbscript 复制代码
Sub 在符合条件的段落前插入分节符()
    Dim pos As Long, styleName$
    styleName = "标题 3"
    
    With Selection
        .HomeKey wdStory '光标回到文档开头,此时Selection.Start为0
        Do
            pos = .Start '先记录光标位置
            .GoTo wdGoToHeading, wdGoToNext, 1 '向后移动到下一个标题,以标题为对象遍历文档
            If .Start = pos Then Exit Do ' 光标位置不变则已遍历完所有标题,退出循环
            
            If .Paragraphs(1).Style = styleName Then
                .InsertBreak Type:=wdSectionBreakContinuous ' 连续型分节符
            End If
            
        Loop
    End With
 
End Sub

然后用下面的代码将处理好的word文档内容修改成html文件所需内容:

vbscript 复制代码
Sub txt2epubhtml()
    ' 方便多数手机epub阅读器阅读,PC阅读效果也好,无需css配合
    Dim aSec As Section, chapter%, regStr$, i%, j%, href$, paraTxt$
    Dim searchRange As Range, refRange As Range
    Dim regEx As RegExp, match, matches As Object
    
    regStr = "[\u2460-\u2473]"
    Set regEx = CreateObject("VBScript.RegExp")
    With regEx
        .Global = True
        .ignoreCase = True
        .Pattern = regStr '
    End With


    For Each aSec In ActiveDocument.Sections
        chapter = chapter + 1
        i = 0
        Set searchRange = aSec.Range
        Set matches = regEx.Execute(searchRange.Text) ' 在搜索范围内执行匹配操作
        For j = 0 To matches.Count / 2 - 1
            Set refRange = searchRange
            With refRange.Find
                .Text = matches(j).Value
                .Wrap = 1 ' wdFindContinue
                .Execute ' 找到注释引用

                If refRange.Find.found Then
                    i = i + 1
                    href = "c" & Format(chapter, "000") & "_" & Trim(Str(i))
                    refRange.Text = "<a id=""ref_" & href & """ epub:type=""noteref"" href=""#" & href & """><sup>" & _
                        refRange.Text & "</sup></a>"
                    refRange.SetRange refRange.End, searchRange.End
                    ' 向下找到与已找到的注释引用对应的注释编号
                    .Forward = True
                    .Execute
                    ' 改为向上查找,找到下一条注释引用
                    .Forward = False
                    refRange.Select
                    If refRange.Find.found Then
                        paraTxt = refRange.Paragraphs(1).Range.Text
                        refRange.Paragraphs(1).Range.Text = "<aside epub:type=""footnote"" id=""" & _
                            href & """><a href=""#ref_" & href & """>" & Left(paraTxt, 1) & "</a>" _
                            & Mid(paraTxt, 2, Len(paraTxt) - 2) & "</aside>" & vbCrLf
                    Else
                        MsgBox "找不到对应的注释内容,请检查文档"
                        Exit Sub
                    End If
                End If
            End With
        Next j
    Next aSec
    
    Dim ps As Object
    Set ps = ActiveDocument.Paragraphs
    For i = 1 To ps.Count
        paraTxt = ps(i).Range.Text
        ' 防止样式为标题3的分节符影响输出,并防止包裹<aside>标签
        If ps(i).Style = "标题 3" And Len(paraTxt) > 1 And Left(paraTxt, 6) <> "<aside" Then
            ps(i).Range.Text = "<h3>" & Left(paraTxt, Len(paraTxt) - 1) & "</h3>" & vbCrLf
        ElseIf ps(i).Style = "标题 4" And Len(paraTxt) > 1 Then
            ps(i).Range.Text = "<h4>" & Left(paraTxt, Len(paraTxt) - 1) & "</h4>" & vbCrLf
        ' 防止空白段落影响输出,并防止包裹<aside>标签
        ElseIf ps(i).Style = "正文" And Len(paraTxt) > 1 And Left(paraTxt, 6) <> "<aside" Then
            ps(i).Range.Text = "<p class=""normaltext"">" & Left(paraTxt, Len(paraTxt) - 1) & "</p>" & vbCrLf
        End If
    Next i
End Sub

经过上面的处理,Word文档中的文本变成了如下内容:

html 复制代码
<h3>落日前墟望贈范廣州雲</h3>
<p class="normaltext">緣溝緑草蔓,扶楥雜華舒<a id="ref_c001_1" epub:type="noteref" href="#c001_1"><sup>①</sup></a>。輕煙淡柳色,重霞映日餘<a id="ref_c001_2" epub:type="noteref" href="#c001_2"><sup>②</sup></a>。遥遥長路遠<a id="ref_c001_3" epub:type="noteref" href="#c001_3"><sup>③</sup></a>,寂寂行人疏<a id="ref_c001_4" epub:type="noteref" href="#c001_4"><sup>④</sup></a>。我心懷碩德,思欲命輕車<a id="ref_c001_5" epub:type="noteref" href="#c001_5"><sup>⑤</sup></a>。高門盛游侣,誰肯進畋漁<a id="ref_c001_6" epub:type="noteref" href="#c001_6"><sup>⑥</sup></a>?</p>
<h4>【題解】</h4>
<p class="normaltext">本篇見《詩紀》八三。《藝文類聚》三一僅載有該詩的前六句,且題作《落日贈范岫》。范廣州雲,即范雲。詳前《酬范記室雲》説明。據《南齊書·東昏侯紀》載,范雲於永元元年(四九九)六月,由始興内史任遷廣州刺史。而據《梁書》本傳,范在廣州刺史任上"坐徵還下獄,會赦免"。另據《南齊書·東昏侯紀》載,永元元年十月,以始興内史顏翻爲廣州刺史。由此可知,范雲在廣州前後不及半年。並由此推知,此詩應作於永元元年(四九九)中。</p>
<p class="normaltext">王夫之云:"寄婉於促,如笙聲之音。雖非琴瑟,正自琅然動人。(《古詩評選》)</p>
<h4>【校注】</h4>
<aside epub:type="footnote" id="c001_1"><a href="#ref_c001_1">①</a>"緣溝"二句:緣,沿。蔓。滋長。扶,沿。楥,籬笆。雜華,雜花,各種各樣的花。《文選》四三丘希範(遲)《與陳伯之書》:"暮春三月,江南草長,雜花生樹,群鶯亂飛。"舒,開放。二句言春日草緣溝生長,花傍籬笆盛開。</aside>
<aside epub:type="footnote" id="c001_2"><a href="#ref_c001_2">②</a>"輕煙"二句:輕煙,指暮靄。重霞,謂色彩濃重的晚霞。映,《類聚》作"掩"。日餘,謂落日餘暉。二句言翠碧的楊柳在暮靄中隱去,落日餘暉使晚霞更加絢麗。</aside>
<aside epub:type="footnote" id="c001_3"><a href="#ref_c001_3">③</a>遠:《類聚》作晚。</aside>
<aside epub:type="footnote" id="c001_4"><a href="#ref_c001_4">④</a>疏:稀少。</aside>
<aside epub:type="footnote" id="c001_5"><a href="#ref_c001_5">⑤</a>我心"二句:碩德,大德。碩,大。輕車,輕便之車。二句言我常感懷您知遇之德,打算前往廣,州探望。</aside>
<aside epub:type="footnote" id="c001_6"><a href="#ref_c001_6">⑥</a>"高門"二句:高門,高貴之門,對范雲住處的敬稱。盛,多。游侣,交游的友人。進,引薦。畋,通"佃"耕種。漁,捕魚。《尚書·多方》:"今爾尚爾宅,畋爾田。"孔穎達疏:"治田謂之畋,猶捕魚謂之漁。"畋漁,從事種田捕魚的人,是詩人自謙之詞。漁,張紘本作"魚"。二句承上言:但考慮到彼處高朋甚多,谁肯引進我這村野農夫呢?</aside>
 
<h3>范廣州宅聯句</h3>
<p class="normaltext">洛陽城東西,卻作經年别<a id="ref_c002_1" epub:type="noteref" href="#c002_1"><sup>①</sup></a>。昔去雪如花,今來花似雪。<a id="ref_c002_2" epub:type="noteref" href="#c002_2"><sup>②</sup></a>雲濛濛夕煙起,奄奄殘暉滅<a id="ref_c002_3" epub:type="noteref" href="#c002_3"><sup>③</sup></a>。遜非君愛滿堂,寧我安車轍<a id="ref_c002_4" epub:type="noteref" href="#c002_4"><sup>④</sup></a>。</p>
<h4>【題解】</h4>
<p class="normaltext">本篇見《詩紀》八四。《藝文類聚》二九截録前四句,即范雲詩,題作《别詩》,江本題作《范廣州聯句》。唐詩人李商隱的詩曾兩用其事,《詩話補遺》云:"何遜與范雲聯句詩云:·李商隱《送王校書分司詩》云:"多少分曹掌祕書,洛陽花雪夢隨君。定知何遜緣聯句,每到城東憶范雲。"又《漫成一絶》云:"不妨何范盡名家,未解當年重物華。遠把龍山千里雪,將來擬並洛陽花。"二詩皆用此事。"這說明此詩叙别頗有特色。此詩應爲范雲由廣州刺史任坐事徵還、赦免之後所作,時約在永元二年(五○○)任國子博士之前。</p>
<h4>【校注】</h4>
<aside epub:type="footnote" id="c002_1"><a href="#ref_c002_1">①</a>"洛陽"二句:洛陽,即今河南洛陽市。因其爲西晉都城,南朝人常借指京都建康。經年,常年。二句言咱們二人雖然住在京城的東西兩面,相距並不算遠,但卻常年不得見面。</aside>
<aside epub:type="footnote" id="c002_2"><a href="#ref_c002_2">②</a>"昔去"二句:雪如花,謂冬季;花似雪,言春日。《詩·小雅·采薇》有云:"昔我往矣,楊柳依依。今我來思,雨雪霏霏。"此處化用其意,言去年你離去時是大雪紛飛的冬天,今年再來卻是春花爛漫的季節了。</aside>
<aside epub:type="footnote" id="c002_3"><a href="#ref_c002_3">③</a>"濛濛"二句:濛濛,雲氣迷茫貌。同"蒙蒙"。《楚辭·九思·憫上》:"雲蒙蒙兮電倏爍,孤雌驚兮鳴呴呴。"註:"蒙,一作'濛'。"夕煙,暮靄。奄奄,日落昏闇貌。李密《陳情表》:"日薄西山,氣息奄奄。"殘暉,落日餘暉。二句寫來時暮靄乍起,太陽落山。</aside>
<aside epub:type="footnote" id="c002_4"><a href="#ref_c002_4">④</a>"非君"二句:用漢陳遵事,《漢書·陳遵傳》説:"遵耆(嗜酒,每大飲,賓客滿堂,輒關門,取客車轄投井中,雖有急,終不得去。"滿,原文誤作,蒲",據張紘本、薛本改。二句言如不是您如此好客,我怎能在您門外停下車子呢。</aside>
 
<h3>望廨前水竹答崔録事</h3>
<p class="normaltext">蕭蕭叢竹映,淡淡平湖靜<a id="ref_c003_1" epub:type="noteref" href="#c003_1"><sup>①</sup></a>。葉倒漣漪文,水漾檀樂影<a id="ref_c003_2" epub:type="noteref" href="#c003_2"><sup>②</sup></a>。相思不會面,相望空延頸<a id="ref_c003_3" epub:type="noteref" href="#c003_3"><sup>③</sup></a>。遠天去浮雲,長墟斜落景<a id="ref_c003_4" epub:type="noteref" href="#c003_4"><sup>④</sup></a>。幽疴與歲積,賞心隨事屏<a id="ref_c003_5" epub:type="noteref" href="#c003_5"><sup>⑤</sup></a>。鄉念一邅回<a id="ref_c003_6" epub:type="noteref" href="#c003_6"><sup>⑥</sup></a>,白髮生俄頃。</p>
<h4>【題解】</h4>
<p class="normaltext">本篇見《詩紀》八三,題下注:"《拾遺》作顧則心詩。張紘本、薛本等各本均載録此詩,説明不同意《選詩拾遺》的意見。廨,公廨,即官署。水竹,謂水邊之竹。崔録事,指崔慰祖。崔慰祖(四六五---四九九)字悦宗,清河武城(今山東武城縣)人。據《南齊書》本傳,崔慰祖齊時曾任始安王(蕭遥光)撫軍墨曹行參軍,轉刑獄,兼記室。《南齊書·百官志·四鎮將軍》:"凡公督府置佐:長史、司馬各一人.諸曹有録事、記室。録事,録事參軍的簡稱。晉置官。掌總録衆官府文簿,舉彈善惡。此爲對崔慰祖的敬稱。崔死於永元元年(四九九),則此詩不得晚於此時可知;崔任始安王記室是蕭遥光任撫軍將軍之時,即建武二年(四九五),則知此詩應作於建武二年至永元元年之間(四九五---四九九)。</p>
<h4>【校注】</h4>
<aside epub:type="footnote" id="c003_1"><a href="#ref_c003_1">①</a>"蕭蕭"二句:蕭蕭,竹影扶疏之狀。淡淡,水平滿貌。二句謂在平靜的湖面上倒映着扶疏秀美的竹影。</aside>
<aside epub:type="footnote" id="c003_2"><a href="#ref_c003_2">②</a>"葉倒"二句:漣漪文,水面被撞擊泛起的連瑣般的波紋。漪,托聲字,猶兮。文,同"紋"。《詩·魏風·伐檀》:"河水清且漣漪。"檀欒,秀美貌,多形容竹。《藝文類聚》六五枚乘《梁王兔園賦》:"修竹檀欒,夾池水旋。"檀樂影,即秀美的竹影。二句承上言風一吹,竹葉蘸着水面泛起漣漪波紋,美好的竹影便消失了。</aside>
<aside epub:type="footnote" id="c003_3"><a href="#ref_c003_3">③</a>延頸:伸長脖頸,翹盼綦切之狀。</aside>
<aside epub:type="footnote" id="c003_4"><a href="#ref_c003_4">④</a>"遠天"二句:去,離去,謂漸漸落下。長墟,謂村落。景,日光。二句寫傍晚"延頸"佇望的情景:殘霞將盡,落日餘暉,思友不至,更增惆悵。</aside>
<aside epub:type="footnote" id="c003_5"><a href="#ref_c003_5">⑤</a>"幽疴"二句:幽疴,猶沉疴。疴,病。王本作"疴"。與歲積,謂一年年加重。賞心,心意歡樂。《文選》三〇謝靈運《田南樹園激流植援》:"賞心不可忘,妙善冀能同。"屏,去。二句謂病體日漸沉重,難得有賞心樂事。</aside>
<aside epub:type="footnote" id="c003_6"><a href="#ref_c003_6">⑥</a>邅回:徘徊。《楚辭·九歎·怨思》:"寧浮沅而馳騁兮,下江湘以邅回。"鄉念邅回,謂思鄉的愁苦反復煎熬着自己。</aside>

只需要将上述内容拷贝到如下的HTML模板的body标签内部,及成为了符合epub3标准的弹出显示注释的HTML文档:

html 复制代码
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">

<head>
	<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />	

	
</head>

<body>
<!--注释引用和注释内容标签带有规定的epub:type属性且链接目标正确的HTML文本复制到此处-->
</body>

</html>

因为扫描文档在Word中校核并编辑出结构比较方便,因此以上通过VBA来处理Word中的文本,实际上,如果弄清了epub3标准的弹窗显示注释的要求,对不符合标准的Epub/HTML文件,也可以利用python的soup库进行修改,使其符合标准,那又是另一个主题了。

相关推荐
hvinsion16 小时前
Python PDF转换工具箱(PDF转图片,word,拆分,删除,提取)
python·pdf·word
taller_200021 小时前
Word窗体联动Excel实现级联组合框
word·userform·联动组合框·级联组合框·用户窗体
taller_200021 小时前
快速汇总Word表格
word·汇总·word表格·表格汇总·合并表格
大白曰梦想家21 小时前
Word表格批量添加题注代码
word
迷路爸爸1801 天前
word中对论文的尾注功能设置
word
frankz611 天前
word无法创建工作文件,检查临时环境变量。
word
Hello_WOAIAI2 天前
批量将 Word 文件转换为 HTML:Python 实现指南
python·html·word
旭东怪2 天前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
雕刻刀3 天前
Latex 转换为 Word(使用GrindEQ )(英文转中文,毕业论文)
word