如何通过JavaScript在InDesign中实现排除下伸字符的下划线效果
问题根因与修复方案
错误1:下伸字符未被排除的原因
- InDesign中
app.selection返回的是选区对象集合,如果你选中的是一段文本,拿到的是Text类型对象而非拆分后的单个字符数组,直接遍历只能拿到整个选区对象,无法逐个判断字符 - 你直接将InDesign的
Character实例和字符串做相等判断,实际需要访问Character.contents属性才能拿到字符的文本内容做匹配
错误2:自定义参数不生效的原因
你给下划线属性赋值时误用了双等号==,双等号是比较运算符,不会执行赋值操作,要改成单等号=才能把自定义的粗细和偏移量写入属性。
其他可优化问题
- 对话框布局层级错误,原来的代码中标签和输入框不在同一行,显示会错位
- 取消对话框的提示文案不符合功能逻辑
- 未处理选中多个对象、选中非文本内容的边界情况
修正后完整代码
// 排除下伸字符的下划线添加脚本 app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll; if (app.documents.length != 0){ try { if (parseFloat(app.version) < 6) { main(); } else { app.doScript(main, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, "Add Underline Skip Descendants"); } } catch (error) { alert( error + " (Line " + error.line + " in file " + error.fileName + ")"); } }else{ alert("请先打开一个文档再运行此脚本。"); } function main(){ if(app.selection.length != 0 && app.selection[0].constructor.name === "Text"){ myDisplayDialog(); } else { alert("请先选中需要处理的文本内容。"); } } function myDisplayDialog(){ var myDoc = app.activeDocument; var selectedText = app.selection[0]; var myDialog = app.dialogs.add({name:"下划线设置"}); var myLabelWidth = 70; with(myDialog.dialogColumns.add()){ with(borderPanels.add()){ with(dialogRows.add()){ staticTexts.add({staticLabel:"下划线粗细:", minWidth:myLabelWidth}); var myStroke = measurementEditboxes.add({editValue:1, editUnits:MeasurementUnits.points}); } with(dialogRows.add()){ staticTexts.add({staticLabel:"下划线偏移量:", minWidth:myLabelWidth}); var myOffset = measurementEditboxes.add({editValue: -2, editUnits:MeasurementUnits.points}); } } } var myResult = myDialog.show(); if(myResult == true){ var strokeVal = myStroke.editValue; var offsetVal = myOffset.editValue; myDialog.destroy(); underline(selectedText.characters, strokeVal, offsetVal); } else { myDialog.destroy(); alert("已取消操作"); } } function underline(charCollection, stroke, offset){ var len = charCollection.length; const doNotUnderline = ['g','j','p','q','y', 'G', 'J', 'P', 'Q', 'Y']; // 不需要匹配大写可删除对应字符 for (var i=0; i < len; i++){ try{ var myChar = charCollection[i]; var charContent = myChar.contents; if (!includes(charContent, doNotUnderline)){ myChar.underline = true; myChar.underlineWeight = stroke; myChar.underlineOffset = offset; } else { myChar.underline = false; } }catch(r){ alert(r.description); break; } } } function includes(elemento, array){ var len = array.length; for(var i=0; i<len ;i++){ if(array[i] == elemento){ return true; } } return false; }
内容的提问来源于stack exchange,提问作者Stefania D'Eri
相关产品推荐
相关产品推荐

