@wulechuan/text-basic-typography
Version:
此为吴乐川《文本简易分割工具与文本简朴排版工具》,不妨称甲、乙。 甲按特定要求将一个文本(“`string`”)分割成片段,形成文本列表(“`string[]`”)。 乙接受一个文本,要求此文本事先含有特别的记号供乙识别, 并据此类记号在原文本之基础上添加空格与换行符(“`\n`”)等内容,产出另一新的文本。 由是,当在纯文字环境(例如命令行形式的会话环境)中呈现该产出之新文本时, 这些文字会因具有简朴的排版而视觉效果更佳。 又,乙调用甲。
188 lines (187 loc) • 12.4 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i]
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p]
}
return t
}
return __assign.apply(this, arguments)
}
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i)
ar[i] = from[i]
}
}
return to.concat(ar || Array.prototype.slice.call(from))
}
Object.defineProperty(exports, '__esModule', { value: true })
exports.对文本列表逐项分割并将结果列表展平 = exports.将原文本改造为包含简朴排版的新文本 = void 0
function 将原文本改造为包含简朴排版的新文本(_a) {
var _b = _a === void 0 ? {} : _a, 原文本 = _b.原文本, 列表引领符 = _b.列表引领符, 单层缩进空格数或单层缩进之文本 = _b.单层缩进空格数或单层缩进之文本, 整体缩进级数 = _b.整体缩进级数, 各段落间的额外空白行数 = _b.各段落间的额外空白行数
var 单层缩进之文本 = ' '.repeat(4)
if (typeof 单层缩进空格数或单层缩进之文本 === 'string') {
if (单层缩进空格数或单层缩进之文本.trim()) {
单层缩进之文本 = 单层缩进空格数或单层缩进之文本
}
else {
var 等效的数字 = +单层缩进空格数或单层缩进之文本
if (0 < 等效的数字 && 等效的数字 < 128) {
单层缩进之文本 = ' '.repeat(等效的数字)
}
else {
单层缩进之文本 = 单层缩进空格数或单层缩进之文本
}
}
}
else if (typeof 单层缩进空格数或单层缩进之文本 === 'number') {
if (0 < 单层缩进空格数或单层缩进之文本 && 单层缩进空格数或单层缩进之文本 < 128) {
单层缩进之文本 = ' '.repeat(单层缩进空格数或单层缩进之文本)
}
}
if (typeof 列表引领符 !== 'string') {
列表引领符 = '- '
}
整体缩进级数 = +(整体缩进级数 || 0)
if (!(整体缩进级数 > 0)) {
整体缩进级数 = 0
}
各段落间的额外空白行数 = +(各段落间的额外空白行数 || -1)
if (!(各段落间的额外空白行数 >= 0)) {
各段落间的额外空白行数 = 1
}
var 整体缩进之文本 = 单层缩进之文本.repeat(整体缩进级数)
var 首层缩进之文本 = ''
var 首层缩进之文本_含列表引领符 = ''
if (列表引领符.length > 0) {
首层缩进之文本 = 单层缩进之文本.repeat(Math.ceil((列表引领符.length + 1) / 单层缩进之文本.length))
首层缩进之文本_含列表引领符 = ''.concat(首层缩进之文本.slice(0, -列表引领符.length)).concat(列表引领符)
}
var 非首层之单层缩进之文本 = 单层缩进之文本
var 首层缩进之文本_并含整体缩进 = ''.concat(整体缩进之文本).concat(首层缩进之文本)
var 首层缩进之文本_含列表引领符_并含整体缩进 = ''.concat(整体缩进之文本).concat(首层缩进之文本_含列表引领符)
var 各段落文本之列表 = [原文本];
[
{ 分割符或分割正则表达式: /。 {2,}/, 在分割符处须补回的内容: '。' },
{ 分割符或分割正则表达式: /! {2,}/, 在分割符处须补回的内容: '!' },
{ 分割符或分割正则表达式: /? {2,}/, 在分割符处须补回的内容: '?' },
{ 分割符或分割正则表达式: /” {3,}/, 在分割符处须补回的内容: '”' },
{ 分割符或分割正则表达式: /: {2,}/, 在分割符处须补回的内容: ':' },
{ 分割符或分割正则表达式: /…… {2,}/, 在分割符处须补回的内容: '……' },
{ 分割符或分割正则表达式: /\n{2,}|\n +/, 在分割符处须补回的内容: '' },
{ 分割符或分割正则表达式: /\r{2,}|\r +/, 在分割符处须补回的内容: '' },
{ 分割符或分割正则表达式: /(\r\n){2,}|\r\n +/, 在分割符处须补回的内容: '' },
].forEach(function (分割方案) {
各段落文本之列表 = (0, exports.对文本列表逐项分割并将结果列表展平)(__assign({ 原文本或原文本列表: 各段落文本之列表 }, 分割方案))
})
var 各段落文本列表之列表 = 各段落文本之列表.map(function (某段落之文本) {
var 某段落中各行文本之列表 = [某段落之文本];
[
{ 分割符或分割正则表达式: /。 /, 在分割符处须补回的内容: '。' },
{ 分割符或分割正则表达式: /! /, 在分割符处须补回的内容: '!' },
{ 分割符或分割正则表达式: /? /, 在分割符处须补回的内容: '?' },
{ 分割符或分割正则表达式: /” {2}/, 在分割符处须补回的内容: '”' },
{ 分割符或分割正则表达式: /: /, 在分割符处须补回的内容: ':' },
{ 分割符或分割正则表达式: /…… /, 在分割符处须补回的内容: '……' },
{ 分割符或分割正则表达式: /、 +/, 在分割符处须补回的内容: '、' },
{ 分割符或分割正则表达式: /, +/, 在分割符处须补回的内容: ',' },
{ 分割符或分割正则表达式: /; +/, 在分割符处须补回的内容: ';' },
{ 分割符或分割正则表达式: /\n/, 在分割符处须补回的内容: '' },
{ 分割符或分割正则表达式: /\r/, 在分割符处须补回的内容: '' },
{ 分割符或分割正则表达式: /\r\n/, 在分割符处须补回的内容: '' },
].forEach(function (分割方案) {
某段落中各行文本之列表 = (0, exports.对文本列表逐项分割并将结果列表展平)(__assign({ 原文本或原文本列表: 某段落中各行文本之列表 }, 分割方案))
})
return 某段落中各行文本之列表
})
var 排版好的内容全文 = 各段落文本列表之列表.map(function (某段落中各行文本之列表) {
return 某段落中各行文本之列表.map(function (某行之文本, 行之内部编号) {
var 行号 = 行之内部编号 + 1
var 行前缀内容 = ''.concat(整体缩进之文本).concat(行号 === 1 ? 首层缩进之文本_含列表引领符 : 首层缩进之文本)
return ''.concat(行前缀内容).concat(某行之文本)
}).join('\n')
}).join('\n'.repeat(1 + 各段落间的额外空白行数))
var 产出 = {
排版好的内容全文: 排版好的内容全文,
分割好的内容结构树: 各段落文本列表之列表,
最终采纳的排版配置: {
整体缩进级数: 整体缩进级数,
整体缩进之文本: 整体缩进之文本,
列表引领符: 列表引领符,
首层缩进之文本: 首层缩进之文本,
首层缩进之文本_并含整体缩进: 首层缩进之文本_并含整体缩进,
首层缩进之文本_含列表引领符: 首层缩进之文本_含列表引领符,
首层缩进之文本_含列表引领符_并含整体缩进: 首层缩进之文本_含列表引领符_并含整体缩进,
非首层之单层缩进之文本: 非首层之单层缩进之文本,
各段落间的额外空白行数: 各段落间的额外空白行数,
},
}
return 产出
}
exports.将原文本改造为包含简朴排版的新文本 = 将原文本改造为包含简朴排版的新文本
var 对文本列表逐项分割并将结果列表展平 = function (配置项集) {
if (!配置项集 || typeof 配置项集 !== 'object') {
配置项集 = {}
}
var 原文本或原文本列表_给出值 = 配置项集.原文本或原文本列表, 分割符或分割正则表达式_给出值 = 配置项集.分割符或分割正则表达式, 在分割符处须补回的内容_给出值 = 配置项集.在分割符处须补回的内容
var 原文本列表_采纳值1
if (typeof 原文本或原文本列表_给出值 === 'string') {
原文本列表_采纳值1 = [原文本或原文本列表_给出值]
}
else if (Array.isArray(原文本或原文本列表_给出值)) {
原文本列表_采纳值1 = 原文本或原文本列表_给出值
}
else {
原文本列表_采纳值1 = []
}
var 原文本列表_采纳值2 = 原文本列表_采纳值1.filter(function (某项内容) { return typeof 某项内容 === 'string' && !!某项内容 })
if (原文本列表_采纳值2.length < 1) {
return 原文本或原文本列表_给出值
}
var 在分割符处须补回内容未给出 = typeof 在分割符处须补回的内容_给出值 !== 'string'
var 分割符或分割正则表达式_采纳值
var 分割符等效的文本 = ''
var 在分割符处须补回的内容_采纳值
var 分割符为正则表达式时补回内容却未给出 = false
if (typeof 分割符或分割正则表达式_给出值 === 'string') {
分割符或分割正则表达式_采纳值 = 分割符或分割正则表达式_给出值
分割符等效的文本 = 分割符或分割正则表达式_给出值
}
else {
if (分割符或分割正则表达式_给出值 instanceof RegExp) {
分割符或分割正则表达式_采纳值 = 分割符或分割正则表达式_给出值
分割符等效的文本 = 分割符或分割正则表达式_给出值.toString()
分割符为正则表达式时补回内容却未给出 = 在分割符处须补回内容未给出
}
else {
分割符或分割正则表达式_采纳值 = ''
}
}
if (!在分割符处须补回内容未给出) {
在分割符处须补回的内容_采纳值 = 在分割符处须补回的内容_给出值
}
else {
在分割符处须补回的内容_采纳值 = 分割符等效的文本
if (分割符为正则表达式时补回内容却未给出) {
console.warn('\u7ED9\u51FA\u7684\u3010\u5206\u5272\u7B26\u3011\u7CFB\u6B63\u5219\u8868\u8FBE\u5F0F\uFF0C\u4F46\u3010\u5206\u5272\u7B26\u5904\u987B\u8865\u56DE\u7684\u5185\u5BB9\u3011\u5E76\u672A\u660E\u786E\u7ED9\u51FA\u3002\u6545\u8865\u56DE\u7684\u5185\u5BB9\u662F\u4E0D\u53EF\u9760\u7684\uFF01\u636E\u76EE\u524D\u7ED9\u51FA\u7684\u914D\u7F6E\uFF0C\u62DF\u5728\u5404\u5206\u5272\u5904\u8865\u56DE\u8BE5\u5185\u5BB9\uFF1A "'.concat(在分割符处须补回的内容_采纳值, '"\u3002'))
}
}
if (!分割符或分割正则表达式_采纳值) {
console.debug('【分割符】为空字符串。')
}
var 两级嵌套之列表 = 原文本列表_采纳值2.map(function (原文某项文本) {
return 原文某项文本.split(分割符或分割正则表达式_采纳值).map(function (分割后的某文本片段, 片段之内部编号, 分割得到的片段列表) {
var 不是最末的片段 = 片段之内部编号 < 分割得到的片段列表.length - 1
return 不是最末的片段 ? ''.concat(分割后的某文本片段).concat(在分割符处须补回的内容_采纳值) : 分割后的某文本片段
})
})
var 展平后的单级列表 = 两级嵌套之列表.reduce(function (展平后的文本片段列表, 某原文本分割而得的片段列表) {
return __spreadArray(__spreadArray([], 展平后的文本片段列表, true), 某原文本分割而得的片段列表, true)
}, [])
return 展平后的单级列表
}
exports.对文本列表逐项分割并将结果列表展平 = 对文本列表逐项分割并将结果列表展平