【问题标题】:How to underline charachters in InDesign with JavaScript?如何使用 JavaScript 为 InDesign 中的字符加下划线?
【发布时间】:2022-01-05 13:16:07
【问题描述】:

我开始为 InDesign 编写这段代码,为所有字母添加下划线,除了带有后代的字母,并添加了一个对话框窗口来选择线条的笔划和偏移量。 现在我有两个问题:

  1. 程序在所有字母下划线
  2. 笔画和偏移不会改变

我是 Javascript 的初学者,这是第一次为 InDesign 编码。有人有线索吗?谢谢!

 // UNDERLINE ALL BUT NO DESCENDANTS



//Make certain that user interaction (display of dialogs, etc.) is turned on.
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;

if (app.documents.length != 0){
    try {
      // Run script with single undo if supported
      if (parseFloat(app.version) < 6) {
        main();
      } else {
        app.doScript(main, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, "Expand State Abbreviations");
      }
      // Global error reporting
    } catch ( error ) {
      alert( error + " (Line " + error.line + " in file " + error.fileName + ")");
    }
}else{
    alert("Open a document first before running this script.");
}


///MAIN FUNCTION 
function main(){

     if(app.selection.length != 0){
        myDisplayDialog();
    }
}




//INTERFACE 
function myDisplayDialog(){
    //declare variables 
    //general 
    var myDoc = app.activeDocument;
    var mS = myDoc.selection; 
    // dialog 
    var myDialog = app.dialogs.add({name:"Underliner"});
    var myLabelWidth = 70;  
    with(myDialog.dialogColumns.add()){
        with(borderPanels.add()){
            with(dialogColumns.add()){
                with(dialogRows.add()){
                    staticTexts.add({staticLabel:"Stroke:", minWidth:myLabelWidth});
                    staticTexts.add({staticLabel:"Offset:", minWidth:myLabelWidth});
                }
            }              
                with(dialogRows.add()){
                    staticTexts.add({staticLabel:""});
                    var myStroke = measurementEditboxes.add({editValue:1, editUnits:MeasurementUnits.points});
                    var myOffset = measurementEditboxes.add({editValue: 15, editUnits:MeasurementUnits.points});
                    
                }
            
        }
    }

    var myResult = myDialog.show();
    if(myResult == true){
            var myStroke = myStroke.editValue;
            var myOffset = myOffset.editValue;
            myDialog.destroy();
            underline(mS,myStroke,myOffset);
        }
        else{
            myDialog.destroy();
            alert("Invalid page range.");
        }
 }



//REAL FUNCTION 
function underline(charList,stroke, offset){
var len = charList.length;
const doNotUnderline = ['g','j','p','q','y'];
    for (var i=0; i < len; i++){
         try{
            var myChar = charList[i];
            //console.log(typeof myText);
            if (includes(myChar, doNotUnderline) == false)
            {
                myChar.underline = true;
                myChar.underlineWeight == stroke;
                myChar.underlineOffset == offset;
                
            } else {
                myChar.underline = false;
                
            }

         }catch(r){
            alert(r.description);
            break;
        }
    }
}


//function to know if char is in array
function includes(elemento,array)
{
    var len = array.length;
    for(var i=0; i<len ;i++)
    {
        if(array[i]==elemento){return true;}
    }
    return false;
}

【问题讨论】:

  • 那么,怎么样,斯特法妮娅?您是否尝试过建议的解决方案?你能提供一些反馈吗?
  • 嗨,尤里,是的,非常感谢!我一直等到我能正确回答你。代码完美运行!我只是想问你为什么我需要使用方法.characters,代码不是已经将选择读取为一系列字符吗?你能告诉我更多关于如何在输入字段中保留最后使用的值吗?谢谢你:)
  • 坦率地说,我还没准备好回答为什么 InDesign 无法直接获取和更改选定的字符。我只是看到还有一个集合:words,并且这个集合的第一个元素(words[0])包含集合caracters。它就是这样工作的。可能是有原因的,我不知道。至于保留上次使用的值,我已经更新了我的答案。
  • 谢谢尤里,我今天就去看看。非常感谢!
  • 嗨,尤里,非常感谢!

标签: javascript adobe-indesign underline


【解决方案1】:

在函数underline()中尝试这些更改:

//REAL FUNCTION
function underline(words,stroke, offset) {  // <------ here 'words' instead of 'charList'
    var charList = words[0].characters;     // <------ here get 'characters' of the 'words'
    var len = charList.length;

    const doNotUnderline = ['g','j','p','q','y'].join(); // <------- here '.join()'
    for (var i=0; i < len; i++){
         try{
            var myChar = charList[i];
            // if (includes(myChar, doNotUnderline) == false) // <----- no need 
            if (doNotUnderline.indexOf(myChar.contents) < 0) // <------ 'indexOf()' instead of 'includes()' 
            {
                myChar.underline = true;
                myChar.underlineWeight = stroke; // <------- here '=' instead of '=='
                myChar.underlineOffset = offset; // <------- here '=' instead of '=='

            } else {
                myChar.underline = false;
            }

         }catch(r){
            alert(r.description);
            break;
        }
    }
}

可能还有其他改进。它需要额外的研究。但是,如果您更改这些行,它应该会在一定程度上起作用。

还有一件小事可以极大地改善用户体验:在输入字段中保留上次使用的值。它可以很容易地完成,让我知道你需要它。

更新

这是我用来存储和恢复脚本的任何首选项的方式。

在脚本开头的某处添加以下几行:

// get preferences
var PREFS = { stroke: 1, offset: 15 };                        // set default prefs
var PREFS_FILE = File(Folder.temp + '/underline_prefs.json'); // the file with preferences
if (PREFS_FILE.exists) PREFS = $.evalFile(PREFS_FILE);        // get the prefs from the file

现在您可以在任意位置使用全局值 PREFS.strokePREFS.offset。在你的情况下,他们去这里:

with(dialogRows.add()){
    staticTexts.add({staticLabel:""});
    var myStroke = measurementEditboxes.add({editValue:PREFS.stroke, editUnits:MeasurementUnits.points});
    var myOffset = measurementEditboxes.add({editValue:PREFS.offset, editUnits:MeasurementUnits.points});
}

这样脚本将从文件underline_prefs.json中获取strokeweight,这些文件将存储在当前用户的标准临时文件夹中。

最后一步是在脚本从对话框窗口中获取值后将它们保存回文件中。

我会把这段代码放在这里:

if (myResult == true) {
  var myStroke = myStroke.editValue;
  var myOffset = myOffset.editValue;
  myDialog.destroy();
  underline(mS, myStroke, myOffset);

  // save preferences here
  PREFS.stroke = myStroke;
  PREFS.offset = myOffset;
  PREFS_FILE.open('w');
  PREFS_FILE.write(PREFS.toSource());
  PREFS_FILE.close();

} else {
  myDialog.destroy();
  alert("Invalid page range.");
}

瞧。现在不需要每次与默认值不同时都键入值。

【讨论】:

  • 我已经添加了代码来存储和恢复对话窗口的值。
猜你喜欢
  • 1970-01-01
  • 2017-05-09
  • 2019-03-19
  • 2011-11-17
  • 1970-01-01
  • 2013-07-20
  • 2019-06-23
  • 1970-01-01
  • 2021-05-11
相关资源
最近更新 更多