墨问非名-汉化教程6——自动填字脚本

被糟糕透顶的家伙纠缠已经一年半了。

那时本打算尽快放出的译稿断行脚本在灰心之下搁置了。

连同汉化几乎也是。

唉。

刚才把JavaScript入门教程看了一会,将之前的自动填字脚本里主函数优化了一下,并完善了注释和说明(主要是将Switch语句改成For循环),以及注明Credit。

此脚本fork自@梁进刚 【给汉化者们分享几个小工具】 [发布于2014-05-03 20:09]

当前版本加入了由@暗_阿尔兹海默症早发中 增加的部分自定义选项。

在2015~2016年我做了以下几点工作:
1、配合AHK及Word,一次自动填完一期。
2、依靠Word宏,通过markdown将文本格式转换为标记,可以方便加粗斜。
3、分离对话框,再用自动居中动作调整文本框位置。
4、大力推广用自动识别修图及处理对话框。
5、用结巴分词自动断行。(大概九成多的可靠性,未使用算法,单纯读取历史数据建立模型。)

前3项早就发布了。现在有一些优化的思路。因为Word宏修改起来太烦了,可能换成纯python实现。
第5项……大概我还是会发布的吧。

新版脚本
Text to psd.jsx
下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*****************************************************************
*
* 此脚本fork自@梁进刚 【给汉化者们分享几个小工具】
* https://tieba.baidu.com/p/3020902369
* [发布于2014-05-03 20:09]
* 注意:对文本有要求,正文必须以一个空行开始,一个空行结束,两个段落之间由空行隔开。
*
*****************************************************************
*
* 我的修改:
* 1、将选项写死在脚本内免得乱弹对话框
* 2、改进函数
* 3、增加注释
* 4、写了一堆配套脚本,包括AHK和VBA
* 5、确认了Photoshop脚本体系bug很多这个事实
* 6、经IntelliJ IDEA提醒,改用"===",即全等于,进行判断
* ————墨问非名
* [大致从2016年写到2018年]
*
*****************************************************************
*
* 暗的修改:
* 1、增加自定义选项
* [2017年]
*
*****************************************************************
*
* 备注:
* 1、建议放置在"C:\Program Files\Adobe\Adobe Photoshop CC 2018\Presets\Scripts"
* 2、有些变量不能通过函数传递
* 3、PS脚本不认let关键字定义变量
* 4、不懂再问
* ————墨问非名
*
*****************************************************************/

//================初始化标尺、字体单位设置================
var originalUnit = preferences.rulerUnits;
preferences.rulerUnits = Units.PIXELS;
var originalTypeUnit = preferences.typeUnits;
preferences.typeUnits = TypeUnits.POINTS;

//================将文本写入数组的函数================
function text2array(readMethod) {
//================输入文本文档================
if (readMethod === '对话框选取') {
var myTextFile = File.openDialog("打开文件...");
}
else if (readMethod === '读取特定文档') {
//在Windows下,路径也必须都用“/”
//虚拟机:"//psf/Host/Volumes/Mack/-.txt"
//Win:"//Mac/Dropbox/Test.txt"
//Mac:"/Users/alicewish/Dropbox/Test.txt"
var text_path = "//Mac/Dropbox/Test.txt";
var myTextFile = new File(text_path);
}
//================读取文本文档到数组================
myTextFile.open("r");
var myLineArray = [];
while (!myTextFile.eof) {
myLineArray.push(myTextFile.readln());
}
myTextFile.close();
return myLineArray
}

//================将文本写入图层的函数================
function writeOnLayer(n, rowLen, myLineArray, emptrow) {
var contents = '';
if (rowLen === 1) {
contents = myLineArray[emptrow[n] + 1];
}
else if (rowLen > 1) {
contents = myLineArray[emptrow[n] + 1];
for (var j = 1; j < rowLen; j++) {
contents += '\r' + myLineArray[emptrow[n] + j + 1]//'\r'是return,相当于换行
}
}
return contents
}

function mainProcess(readMethod) {
myLineArray = text2array(readMethod);//myLineArray是包含每行文本的数组

//================读取所有空行所在行数================
//================尝试写为单独函数但未通过调试================
var emptrow = [];
var i = 0;
for (var lineIndex = 0; lineIndex < myLineArray.length; lineIndex++) {
if (myLineArray[lineIndex] === "") {
emptrow[i] = lineIndex;
i++;
}
}
emptrow[i] = myLineArray.length;//最后加上总行数

//================文本图层变量设置================
var docRef = app.activeDocument;//当前打开的文档
var fontName = "MicrosoftYaHei";// 定义字体:微软雅黑
var textColor = new SolidColor();//定义字体颜色:美漫黑=R33 G33 B33
textColor.rgb.red = 33;
textColor.rgb.green = 33;
textColor.rgb.blue = 33;
//读取文档宽度与高度
var width = docRef.width;
var height = docRef.height;

var rowLen = 0;
for (var n = 0; n < i; n++) {
rowLen = emptrow[n + 1] - emptrow[n] - 1;//计算每个段落包含的行数

var artLayerRef = docRef.artLayers.add();//添加图层
artLayerRef.kind = LayerKind.TEXT;//转为文本图层
var textItemRef = artLayerRef.textItem;

/********************
* 左对齐=LEFT
* 右对齐=RIGHT
* 居中对齐=CENTER
********************/
textItemRef.justification = Justification.CENTER; //对齐方式
/********************
* 犀利=CRISP
* 无=NONE
* 锐利=SHARP
* 平滑=SMOOTH
* 浑厚=STRONG
********************/
textItemRef.antiAliasMethod = AntiAlias.STRONG; //消除锯齿方式
/********************
* 手动指定=MANUAL
* 度量标准=METRICS
* 视觉=OPTICAL(推荐这个,字距更为紧凑)
********************/
textItemRef.autoKerning = AutoKernType.OPTICAL; //字符间距微调
textItemRef.color = textColor;//字体颜色
textItemRef.size = 30; //字号
textItemRef.font = fontName;
textItemRef.position = Array(width * 0.1 + n * (width / (i + 1)), height * 0.1 + n * (height / (i + 1)));//位置
textItemRef.contents = writeOnLayer(n, rowLen, myLineArray, emptrow);//写入图层
}
//================清空变量================
myLineArray = null;
i = null;
n = null;
rowLen = null;
emptrow = null;
docRef = null;
textColor = null;
newTextLayer = null;
}

//================设置区域================
// var readMethod = '对话框选取';
var readMethod = '读取特定文档';

//================启动程序================
mainProcess(readMethod);
墨问非名 wechat
订阅我的公众号
听说,你想请我喝杯咖啡?☕️
0%