当前位置: 首页 > news >正文

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

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

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

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

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

<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文件所需内容。为便于处理,我们首先在每个诗标题前插入一个连续型分节符,代码如下:

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

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

Sub txt2epubhtml()' 方便多数手机epub阅读器阅读,PC阅读效果也好,无需css配合Dim aSec As Section, chapter%, regStr$, i%, j%, href$, paraTxt$Dim searchRange As Range, refRange As RangeDim regEx As RegExp, match, matches As ObjectregStr = "[\u2460-\u2473]"Set regEx = CreateObject("VBScript.RegExp")With regEx.Global = True.ignoreCase = True.Pattern = regStr 'End WithFor Each aSec In ActiveDocument.Sectionschapter = chapter + 1i = 0Set searchRange = aSec.RangeSet matches = regEx.Execute(searchRange.Text) ' 在搜索范围内执行匹配操作For j = 0 To matches.Count / 2 - 1Set refRange = searchRangeWith refRange.Find.Text = matches(j).Value.Wrap = 1 ' wdFindContinue.Execute ' 找到注释引用If refRange.Find.found Theni = i + 1href = "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 = FalserefRange.SelectIf refRange.Find.found ThenparaTxt = refRange.Paragraphs(1).Range.TextrefRange.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>" & vbCrLfElseMsgBox "找不到对应的注释内容,请检查文档"Exit SubEnd IfEnd IfEnd WithNext jNext aSecDim ps As ObjectSet ps = ActiveDocument.ParagraphsFor i = 1 To ps.CountparaTxt = ps(i).Range.Text' 防止样式为标题3的分节符影响输出,并防止包裹<aside>标签If ps(i).Style = "标题 3" And Len(paraTxt) > 1 And Left(paraTxt, 6) <> "<aside" Thenps(i).Range.Text = "<h3>" & Left(paraTxt, Len(paraTxt) - 1) & "</h3>" & vbCrLfElseIf ps(i).Style = "标题 4" And Len(paraTxt) > 1 Thenps(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" Thenps(i).Range.Text = "<p class=""normaltext"">" & Left(paraTxt, Len(paraTxt) - 1) & "</p>" & vbCrLfEnd IfNext i
End Sub

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

<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 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库进行修改,使其符合标准,那又是另一个主题了。


http://www.mrgr.cn/news/81404.html

相关文章:

  • APHAL平台 一二三章
  • 鸿蒙Next之har工程依赖库接口二次导出
  • Java 日志类库
  • 25计软新增考研院校!或可捡漏上岸!
  • android 登录界面编写
  • 链原生 Web3 AI 网络 Chainbase 推出 AVS 主网, 拓展 EigenLayer AVS 场景
  • 【RAII | 设计模式】C++智能指针,内存管理与设计模式
  • 51c自动驾驶~合集42
  • Hot100刷题计划-Day3 二分查找专题【持续更新】
  • lodash常用函数
  • 路由器做WPAD、VPN、透明代理中之间一个
  • Git使用经历
  • 06 - Django 视图view
  • Avalonia实例实战五:Carousel自动轮播图
  • 【linux】 unshare -user -r /bin/bash命令详解
  • JdbcTemplate、NamedParameterJdbcTemplate 执行数据插入后返回主键写法
  • Pytorch | 利用I-FGSSM针对CIFAR10上的ResNet分类器进行对抗攻击
  • acme ssl证书自动续签 nginx
  • Android U 多任务启动分屏——system_server流程(更新中)
  • 【Linux】ChatGLM-4-9B模型之All Tools
  • 【目标跟踪综述及关键技术】
  • 重温设计模式--2、设计模式七大原则
  • 人工智能ACA(六)--计算机视觉基础
  • js版本之ES6特性简述【Proxy、Reflect、Iterator、Generator】(五)
  • 时钟芯片入门指南:从原理到实践
  • 消息队列(一)消息队列的工作流程