stevenfm 发表于 2020-11-24 12:48:52

关于ID提取字符样式的脚本插件求会编写的修改更新

//0ne or two level TOC contents CharacterStyle.js
//one level: only need select ** CharacterStyle in the 2nd dialogs.
myDocument = app.documents;
myAllCharaStyleNames = myDocument.characterStyles.everyItem().name;
//Create 1st dialog.
var myDialog = app.dialogs.add({name:"TOC 1st Level CharacterStyle",canCancel:true});
with(myDialog){
        with(dialogColumns.add()){
                staticTexts.add({staticLabel:"TOC 1st Level CharacterStyle"});
                staticTexts.add({staticLabel:"Select OneOfAll"});
                my1stCharaStyleDropdown = dropdowns.add({stringList:myAllCharaStyleNames, selectedIndex:1, minWidth:150});
        }
}
if(myDialog.show() == true){
        my1stCharaStyle = myAllCharaStyleNames;
        for(s =0; s<=myDocument.stories.length-1; s++){
                myStory = myDocument.stories;
                if(myStory.characters.length !=0){
                        myStory.insertionPoints[-1].contents = SpecialCharacters.emSpace; //" "
                        myStory.characters[-1].appliedCharacterStyle = myDocument.characterStyles.item(my1stCharaStyle);
                }
        }
        app.findPreferences = NothingEnum.nothing;
        app.changePreferences = NothingEnum.nothing;
        app.findPreferences.appliedCharacterStyle = myDocument.characterStyles.item(my1stCharaStyle);
        myCharaFound = myDocument.search("", false, false,undefined);
        ////Create 2nd dialog.
        try{
                myDocument.characterStyles.item("").name;
        }
        catch(e){
                myNoneCharaStyle = myDocument.characterStyles.add({name:""});
        }
        myAllCharaStyleNames = myDocument.characterStyles.everyItem().name;
        //myNoneCharaStyle.name = "";
        var myDialog1 = app.dialogs.add({name:"TOC 2nd Level CharacterStyle",canCancel:true});
        with(myDialog1){
                with(dialogColumns.add()){
                        staticTexts.add({staticLabel:"TOC 2nd Level CharacterStyle"});
                        staticTexts.add({staticLabel:"Select OneOfAll"});
                        my2ndCharaStyleDropdown = dropdowns.add({stringList:myAllCharaStyleNames, selectedIndex:1, minWidth:150});
                }
        }
        if(myDialog1.show() == true){
                my2ndCharaStyle = myAllCharaStyleNames;
                app.findPreferences = NothingEnum.nothing;
                app.changePreferences = NothingEnum.nothing;
                app.findPreferences.appliedCharacterStyle = myDocument.characterStyles.item(my2ndCharaStyle);
        }
        else{
                myDialog1.destroy();
        }               
        //
        myTocLine = new Array;
        myTocLine_ = new Array;
        myParseInt = new Array;
        var myCharaContent, myCharaPageNumber, myLine;
        for(chara=myCharaFound.length-1; chara>=0; chara--){
                myChara = myCharaFound;
                myCharaContentX = myChara.contents;
                try{
                        A = /\r/gm;
                        myCharaContent = myCharaContentX.replace(A, "");
                }
                catch(e){}
                try{
                        myCharaPageNumber = getPageFromAnyObject(myChara.parentTextFrame).name;//.parent.name;
                }
                catch(e){}
                try{
                        var myCharaContent_, myCharaPageNumber_, myLine_, myStart, myEnd, myText, myCharaFound_;
                        myStart = myCharaFound.index - 1;
                        myEnd = myCharaFound.index + myCharaFound.length;
                        myText = myChara.parent.characters.itemByRange(myStart, myEnd);
                        //alert(myText.contents);
                        myCharaFound_ = myText.search("", false, false,undefined);
                        var myCharaContent_, myCharaPageNumber_, myLine_;
                        for(chara_=myCharaFound_.length-1; chara_>=0; chara_--){
                                myChara_ = myCharaFound_
                                myCharaContentX_ = myChara_.contents;
                                try{
                                        A_ = /\r/gm;
                                        myCharaContent_ = myCharaContentX_.replace(A_, "");
                                }
                                catch(e){}
                                try{
                                        myCharaPageNumber_ = getPageFromAnyObject(myChara_.parentTextFrame).name;//.parent.name;
                                }
                                catch(e){}
                                if(myCharaContent_ != undefined){
                                        myLine_ = "   " + myCharaContent_ + "\t"+ myCharaPageNumber_;
                                        myParseInt.push(chara);
                                        myTocLine_.push(myLine_);
                                }
                        }
                        myLine = myCharaContent + "\t"+ myCharaPageNumber;
                        myTocLine.push(myLine);
                }
                catch(e){
                        myLine = myCharaContent + "\t"+ myCharaPageNumber;
                        myTocLine.push(myLine);
                }
        }
        myTocLine.shift();
        myTocLine.reverse();
        try{
                for(mysplice = 0; mysplice<=myParseInt.length-1; mysplice++){
                        myTocLine.splice(myParseInt, 0, myTocLine_);
                }
                myToc = String(myTocLine).split(",").join("\r");
        }
        catch(e){
                myToc = String(myTocLine).split(",").join("\r");
        }
        //
        myDocument.characterStyles.item("").remove();
        //
        for(d=myDocument.stories.length-1; d>=0; d--){
                myStory = myDocument.stories;
                try{
                        if((myStory.characters[-1].contents == String(SpecialCharacters.emSpace))&&(myStory.characters[-1].appliedCharacterStyle == myDocument.characterStyles.item(my1stCharaStyle))){ //" "
                                myStory.characters[-1].remove();
                        }
                }
                catch(e){}
        }
        //
        myTocDocument = app.documents.add();
        myTocPage = myTocDocument.pages;
        myTocTextFrame = myTocPage.textFrames.add();
        myTocTextFrame.geometricBounds = myGetBounds(myTocDocument, myTocPage);
        myTocTextFrame.contents = myToc;

}
else{
        myDialog.destroy();
}

//--------------------------------------------------------------------------------------
function getPageFromAnyObject(myPageObject){
        var myPage;
        if(myPageObject.constructor.name == "Page"){
                myPage = myPageObject;
        }
        else{
                myPage = getPageFromAnyObject(myPageObject.parent);
        }
        return(myPage);
}

//Utility function for getting the bounds of the "live area" of a page.
function myGetBounds(myDocument, myPage){
        with(myDocument.documentPreferences){
                var myPageHeight = pageHeight;
                var myPageWidth = pageWidth;
        }
        with(myPage.marginPreferences){
               var myTop = top;
                var myLeft = left;
                var myRight = right;
                var myBottom = bottom;
        }
        myRight = myPageWidth - myRight;
        myBottom = myPageHeight- myBottom;
        return ;
}

上面的代码是可以在Indesign CS3中执行的,但现在普遍更新了新的版本,所以在高版本ID里执行会报错。



不知道有大神会不会修改这个脚本,感觉很有用的样子。

大神周 发表于 2020-11-24 14:47:11

这种得需要专业人士才行,哈哈

stevenfm 发表于 2020-11-24 16:27:27

大神周 发表于 2020-11-24 14:47
这种得需要专业人士才行,哈哈

所以你看哪种功能很复杂安装还要说明的插件,是不是坑人的。这种早就写出来了,国外网上肯定有,只是英文不好,外加有一些网站让墙了。我是好久不碰代码了,不想花这个时间去研究,专业的要交给专业的人。

大神周 发表于 2020-11-25 12:34:53

stevenfm 发表于 2020-11-24 16:27
所以你看哪种功能很复杂安装还要说明的插件,是不是坑人的。这种早就写出来了,国外网上肯定有,只是英文 ...

说的没错,其实国内的插件普遍都比国外的LOW多了,墙外却实很多高级插件,就像你说的,需要专业的人去干了才行。

stevenfm 发表于 2021-1-29 14:38:29

这个高级插件我找到了,全英文的,在脚本改成英文的鸟~~~比这个好用,已经很久不用这种脚本了!设计师就是要慢,要这么高效率让人嫌弃地,觉得你不值!

sxmy 发表于 2021-2-7 16:02:07

      原脚本通过提取字符样式创建目录样式。它通过提取两个字符样式来创建二级目录。经过修改,目前可以通过提取一个字符样式来创建一级目录。二级目录样式的脚本正在修改中。

qg192 发表于 2021-2-7 17:23:22

在脚本文件夹下 建一个 Version 3.0 Scripts文件夹 ,脚本放入其中,就行了。一级,二级都没问题。

sxmy 发表于 2021-2-19 09:37:03

app.scriptPreferences.version = 2.0;
可以在代码的首行,增加一行该代码即可运行,不会报上述的错误。
但注意虽然脚本可以运行,也可生成目录,但其创建的目录并不完全正确,在几种情况下是不完整其错误的。
1.当出现两个以上的文章时;
2.不同文章中,二级字符样式出现在一级字符样式之前时;
因此,考虑到实际排版中的复杂情况,该脚本若只是经过这样简单的修改是不能在生产中使用的。
必须要经过更为深入的修改才行。
修改后的脚本地址:https://www.52cnp.com/thread-13643-1-1.html
页: [1]
查看完整版本: 关于ID提取字符样式的脚本插件求会编写的修改更新