查看: 644|回复: 1

[教程] HP卷章分行转卷章一行脚本

[复制链接]

1

听众

0

收听

0

好友

伴读

Rank: 2

UID
9360
积分
8
回帖
11
主题
2
铜币
29
威望
1
银币
0
贡献
0
发书数
0
注册时间
2015-9-10
最后登录
2023-9-24
在线时间
11 小时
发表于 2015-9-10 17:17 | 显示全部楼层 |阅读模式
  以前做过一个HP卷章分行排版转卷章一行排版的脚本,不过不算通用,最近重新整理成通用版分享出来。
  先闲扯几句,用HP制作电子书,有两种排版方式,一种是卷章一行,一种是卷章分行。我个人更喜欢用卷章一行,因为这样排版用手机看txt文本的时候,不至于疑惑看到哪一卷了,卷数多的时候,这是个烦恼的问题。而且,HP用卷章分行的文本制作电子书,会有个很奇怪的问题,pages.js里的章节名称中的全角符号会变成半角,对于我等强迫症,不能忍。
  但是卷章一行的排版很耗人力,因为下载到的文本大部分章节名前都不带卷名,当卷数多的时候,就是件痛苦的事。下面分享一个卷章分行排版转卷章一行排版的脚本。
  使用前,请先规范文本,满足以下要求:
   1、规范行首,统一为两个全角空格,这样做是为了排除文中“第一部电影”,“课文第一章”等的干扰。
  2、每卷除开头有卷名外,章节名前不能再有卷名,否则排版后的文本会删除该行,且后面的排版全部会出错。
  3、章节编号和章节名中间一定要有半角空格,若没有章节名,则章节编号后不能再有别的内容。

  排版后的格式如下:
  第一卷 卷名
  第一章 章名
  ……
  第二章 章名
  ……
  第二卷 卷名
  第一章 章名
  ……

  有没有空行无所谓。
  接下来介绍下脚本的原理,本脚本会将文本按卷分割成多个txt文本,以数字为编号保存,在每个分割文本中自动将每卷的内容,从卷章分行的排版转换成卷章一行,然后再将处理完的文件合并成一个文件。
  运行脚本后,有三个需要输入的地方:
  1、 匹配卷名的的正则表达式:默认为:"  (第[0-9一二三四五六七八九十两百零〇]{1,3}[册集部卷]$|第[0-9一二三四五六七八九十两百零〇]{1,3}[册集部卷] .+)"
  由于有些书的卷名会出现:最终卷,第XX卷(最后一卷),番外篇等特殊卷名,请自行在表达式里添加:最终卷.+,第XX卷(最后一卷).+,番外篇.+,以“|”分隔。
  2、 需要添加卷名的章节的正则表达式:默认为:"  (第[0-9一二三四五六七八九十两百零〇]{1,3}[章节回]$|第[0-9一二三四五六七八九十两百零〇]{1,5}[章节回] .+)"
  3、 输出文件夹地址:默认地址在桌面wfolder文件夹,分割文本以及合并文本都在该文件夹,可以自行更改地址。
  接下来,等着脚本运行结束就好,会自动打开合并后的文件,够简单吧?

代码在下面,怎么用就不用问了,不会的自己百度。
  1. var sFindSplitFlag = prompt("请输入匹配卷名的的正则表达式:","  (第[0-9一二三四五六七八九十两百零〇]{1,3}[册集部卷]$|第[0-9一二三四五六七八九十两百零〇]{1,3}[册集部卷] .+)");

  2. var chapterstr = prompt("请输入需要添加卷名的章节的正则表达式:","  (第[0-9一二三四五六七八九十两百零〇]{1,3}[章节回]$|第[0-9一二三四五六七八九十两百零〇]{1,5}[章节回] .+)");


  3. var GetSpecialPath = function(sFolderName) {
  4.         var WshShell = new ActiveXObject("WScript.Shell");
  5.         var ss = WshShell.SpecialFolders(sFolderName);
  6.         return(ss);
  7.                 }

  8. var CreatePath = function(sNewPath) {
  9.         var WshShell = new ActiveXObject("WScript.Shell");
  10.         var sCD = WshShell.CurrentDirectory;
  11.         if(sNewPath.match("^.:") != null) {
  12.                 var aPathName = sNewPath.split("\");
  13.                 WshShell.CurrentDirectory = aPathName[0] + "\";
  14.         }
  15.         WshShell.Run("cmd /k md "" + sNewPath + "" & exit", 0, true);
  16.         var nn = WshShell.Run("cmd /k dir "" + sNewPath + "" & exit", 0, true);
  17.         WshShell.CurrentDirectory = sCD;
  18.         return(nn);
  19.                 }

  20. var sOutDocPath = prompt("请指定输出文件夹地址:",GetSpecialPath("Desktop") + "\\wfolder\");
  21. if(sOutDocPath.charAt(sOutDocPath.length) != "\") sOutDocPath += "\";
  22. var sBookpath =document.FullName;
  23. var sBookName = sBookpath.split("\");

  24. document.selection.StartOfDocument();
  25. document.selection.Replace( sFindSplitFlag ,"【mark】\\0", eeFindNext | eeReplaceAll | eeFindReplaceRegExp);
  26. document.selection.SelectAll();
  27. var sText = document.selection.Text;
  28. var aSplitedText = sText.split("【mark】");
  29. var nEncoding = document.Encoding;
  30. document.Undo();
  31. CreatePath(sOutDocPath);

  32. for(var i = 0; i < aSplitedText.length; i++)
  33. {
  34.         editor.NewFile();
  35.         document.Encoding = nEncoding;
  36.         var sTemp = document.selection.Text = aSplitedText[i];
  37.         document.selection.StartOfDocument();
  38.         document.selection.SelectLine();
  39.         sTemp = document.selection.Text.replace(/\s*\r\n/g, "");
  40.         var regex=new RegExp(sFindSplitFlag,"gim");
  41.         if( regex.test( sTemp ) ) document.selection.Delete();
  42.         document.selection.Replace(chapterstr, sTemp + " \\1", eeFindNext | eeReplaceAll | eeFindReplaceRegExp);
  43.         document.Save(sOutDocPath + (i+1) + ".txt");
  44.         document.close();
  45. }


  46. WshShell = new ActiveXObject( "WScript.Shell" );
  47. var sCD = WshShell.CurrentDirectory;
  48. WshShell.CurrentDirectory = sOutDocPath;
  49. WshShell.Run("cmd /k dir /b *.txt > output.tmp & exit", 0, true);
  50. editor.OpenFile(sOutDocPath + "output.tmp", eeEncodingSystemDefault, eeOpenAllowNewWindow);
  51. if(document.selection.Text == "") document.selection.SelectAll();
  52. var s = document.selection.Text;
  53. var ss = s.split("\r\n");
  54. document.selection.Delete();
  55. editor.ExecuteCommandByID(4099);

  56. function sortNumber(a, b)
  57. {
  58.         var a2d = a.match(/\d+/g);
  59.         var b2d = b.match(/\d+/g);
  60.         if (a2d == null || b2d == null)
  61.                 if (a == b) return 0;
  62.                 else return a > b ? 1 : -1;
  63.         var nFlag = a2d.slice(0,1) - b2d.slice(0,1);
  64.         if (nFlag == 0) nFlag = a2d.slice(1,2) - b2d.slice(1,2);
  65.         return nFlag;
  66. }
  67. ss.sort(sortNumber);
  68. var out = ss.join("\r\n");

  69. for(var i = 0; i < ss.length; i++)
  70. {
  71.         if(ss[i] == "") continue;
  72.         document.selection.InsertFromFile(sOutDocPath + ss[i], eeEncodingSystemDefault, eeOpenAllowNewWindow);
  73. }
  74. editor.ExecuteCommandByID(4116);        
  75. WshShell.Run("cmd /k ren output.tmp \x22"+sBookName[sBookName.length-1]+"\x22 & exit", 0, true);
  76. WshShell.CurrentDirectory = sCD;
  77. editor.OpenFile(sOutDocPath + sBookName[sBookName.length-1], eeEncodingSystemDefault, eeOpenAllowNewWindow);
复制代码
回复

使用道具 举报

7

听众

5

收听

10

好友

阡陌书组

Rank: 13Rank: 13Rank: 13Rank: 13

UID
246
积分
3085
回帖
90
主题
64
铜币
27283
威望
2872
银币
0
贡献
65
发书数
56
注册时间
2015-5-6
最后登录
2024-4-30
在线时间
742 小时
发表于 2015-12-12 19:07 | 显示全部楼层
脚本不是这样的吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|阡陌居

GMT+8, 2024-5-4 15:59 , Processed in 0.036274 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表