Copy link to clipboard
Copied
Is it not possible to export a script with a JSXBIN extension if there is more than one engine in it?
Copy link to clipboard
Copied
Hi @shikul-daat for a start, I've never written a script targeting more than one engine. Could you explain how your script is set up to do that? Maybe you could post a very brief script just showing the relevant parts?
After that maybe we can address your question about jsxbin.
- Mark
Copy link to clipboard
Copied
I will share with you some of the script. As much as I tried to download the second engine, it caused the script not to open.
#target "InDesign"
#targetengine "searchIndex"
var gWin;
// --- שמות קבועים ---
var INDEX_FRAME_NAME = "GeneratedIndexIndexFrame";
var OBJECT_STYLE_NAME = "IndexFrameStyle";
var PARA_STYLE_INDEX_HEADING = "IndexHeading";
var PARA_STYLE_INDEX_SUBHEADING = "IndexSubheading";
var PARA_STYLE_INDEX_ENTRY = "IndexEntryLine";
var CHAR_STYLE_INDEX_TERM = "IndexTerm";
var CHAR_STYLE_INDEX_PAGE = "IndexPageNumber";
var CHAR_STYLE_PAGE_REF_IN_LISTBOX = "IndexPage";
// --- פונקציית רישום לקובץ ---
function logMessage(message) {
try {
var logFile = File(Folder.desktop + "/indesign_script_log.txt");
logFile.encoding = "UTF-8";
logFile.open("a");
var timestamp = new Date().toTimeString().split(' ')[0];
logFile.writeln(timestamp + " - " + message);
logFile.close();
} catch(e) { /* לא להפריע לסקריפט */ }
}
// --- פונקציה למיפוי שמות תווים מיוחדים ---
function mapSpecialCharString(contentString) {
if (contentString === null || contentString === undefined) return "";
var s = String(contentString); // ודא שזו מחרוזת
switch (s) {
case "SINGLE_RIGHT_QUOTE": case "SINGLE_LEFT_QUOTE": case "SINGLE_STRAIGHT_QUOTE":
return "'"; // \u0027 (גרש ASCII)
case "DOUBLE_RIGHT_QUOTE": case "DOUBLE_LEFT_QUOTE": case "DOUBLE_STRAIGHT_QUOTE":
return '"'; // \u0022 (מרכאות ASCII)
case "EM_SPACE": return "\u2003";
case "EN_SPACE": return "\u2002";
case "NONBREAKING_SPACE": return "\u00A0";
case "THIN_SPACE": return "\u2009";
case "HAIR_SPACE": return "\u200A";
case "PUNCTUATION_SPACE": return "\u2008";
case "FIGURE_SPACE": return "\u2007";
case "SIXTH_SPACE": return "\u2006";
case "QUARTER_SPACE": return "\u2005";
case "THIRD_SPACE": return "\u2004";
case "FLUSH_SPACE": return SpecialCharacters.FLUSH_SPACE; // InDesign specific
case "RIGHT_INDENT_TAB": return "\u0008";
case "INDENT_HERE_TAB": return "\u0007";
case "FRAME_BREAK": case "COLUMN_BREAK": case "PAGE_BREAK":
return "\r"; // המרה למעבר פסקה פשוט, ייתכן שצריך טיפול אחר
default:
if (/^\d{9,10}$/.test(s)) {
logMessage(" mapSpecialCharString: Detected and removing long number string: [" + s + "]");
return ""; // הסרה מוחלטת
}
// logMessage(" mapSpecialCharString: Unhandled/default content: [" + s + "] (type: " + typeof s + ")");
return s;
}
}
try {
logMessage("--- Script Started (v068.9) ---");
if(app.documents.length===0){ alert("אין מסמך פתוח."); exit(); }
var doc = app.activeDocument;
ensureStyles(doc);
if(gWin && gWin.visible){ gWin.active = true; exit(); }
gWin = new Window("palette","אינדקס משוכלל – גרסה 068.9");
buildUI(gWin, doc);
gWin.show();
// Request 2: Set focus to search field
if (gWin.txtSearchTerm) { // Check if txtSearchTerm exists (it's set as a property of gWin now)
gWin.txtSearchTerm.active = true;
}
} catch(e){
var errorMsg = "שגיאה בבלוק הראשי:\n" + e.message + "\nשורה " + (e.line||'?') + (e.fileName ? "\nקובץ: " + e.fileName : "");
logMessage("ERROR: " + errorMsg.replace(/\n/g, " | "));
alert(errorMsg);
}
function buildUI(win,doc){
win.orientation="column"; win.alignChildren="fill"; win.spacing=6; win.margins=10;
var pFind = win.add("panel",undefined,"פרטי חיפוש");
pFind.orientation="row"; pFind.alignChildren="fill"; pFind.spacing=6;
var c = pFind.add("group"); c.orientation="column"; c.alignChildren="fill"; c.spacing=4;
function row(label,fn, labelWidth){
var lWidth = labelWidth || 170; // Default label width
var g = c.add("group"); g.orientation="row"; g.alignChildren="fill";
g.add("statictext",undefined,label).preferredSize.width=lWidth;
var ctl = fn(g); ctl.alignment="fill"; return ctl;
}
// Assign the EditText to a property of 'win' so it can be accessed later for focus
win.txtSearchTerm = row("מחרוזת לחיפוש:", function(g){
var e = g.add("edittext",undefined,"",{characters:40});
e.preferredSize.width = 260; return e;
});
// Request 1: Checkbox for partial word search
var chkPartialWord = c.add("checkbox", undefined, "חפש גם חלק ממילה");
chkPartialWord.value = false; // Default to not searching partial words
chkPartialWord.alignment = "left"; // Align checkbox to the left under the search term
// Request 5: Change labels for context words
var gWords = c.add("group"); gWords.orientation="row"; gWords.alignment = "left";
gWords.add("statictext",undefined,"לפני המילה:");
var bef = gWords.add("edittext",undefined,"5"); bef.preferredSize.width=30;
gWords.add("statictext",undefined,"אחרי המילה:");
var aft = gWords.add("edittext",undefined,"10"); aft.preferredSize.width=30;
var ddlPara = row("סגנון פיסקה (במקור לחיפוש):", function(g){
var d = g.add("dropdownlist",undefined,doc.paragraphStyles.everyItem().name);
d.preferredSize.width = 180; d.selection = 0; return d;
});
var ddlObj = row("סגנון אובייקט (במקור לחיפוש):", function(g){
var d = g.add("dropdownlist",undefined,doc.objectStyles.everyItem().name);
d.preferredSize.width = 180; d.selection = 0; return d;
});
var colB = pFind.add("group"); colB.orientation="column"; colB.alignChildren="right";
var btnSearch = colB.add("button",undefined,"חפש");
var btnClear = colB.add("button",undefined,"נקה");
// Request 3: Enter key triggers search
if (win.txtSearchTerm) {
win.txtSearchTerm.onEnterKey = function() {
if (btnSearch.onClick) {
btnSearch.onClick();
}
};
}
var pRes = win.add("panel",undefined,"תוצאות");
pRes.orientation="column"; pRes.alignChildren="fill";
// Request 4: Wider columns for context (adjust as needed)
var list = pRes.add("listbox",undefined,[],{
numberOfColumns:5, showHeaders:true,
columnTitles:["#", "הקשר לפני", "מופע", "הקשר אחרי", "עמוד"],
columnWidths:[30, 220, 150, 220, 50], multiselect:true // Increased context columns
});
list.minimumSize.height = 220;
// Request 6: Side-by-side Select All / Deselect All buttons
var gSelectionButtons = pRes.add("group");
gSelectionButtons.orientation = "row";
gSelectionButtons.alignment = "center"; // Center the group in the panel
gSelectionButtons.spacing = 10;
var selAll = gSelectionButtons.add("button",undefined,"בחר הכל");
var desAll = gSelectionButtons.add("button",undefined,"בטל הכל");
var pSty = win.add("panel",undefined,"סגנונות להחלה באינדקס");
pSty.orientation="column"; pSty.alignChildren="fill"; pSty.spacing=4;
var gEntryParaStyle = pSty.add("group"); gEntryParaStyle.orientation="row"; gEntryParaStyle.alignChildren="right";
gEntryParaStyle.add("statictext", undefined, "סגנון פסקה (לשורה באינדקס):");
var ddlEntryPara = gEntryParaStyle.add("dropdownlist", undefined, doc.paragraphStyles.everyItem().name);
ddlEntryPara.preferredSize.width = 180;
try { ddlEntryPara.selection = doc.paragraphStyles.itemByName(PARA_STYLE_INDEX_ENTRY).index; } catch (e) { if (doc.paragraphStyles.length > 0) ddlEntryPara.selection = 0; }
var gTermCharStyle = pSty.add("group"); gTermCharStyle.orientation="row"; gTermCharStyle.alignChildren="right";
gTermCharStyle.add("statictext", undefined, "סגנון תו (למופע בתוך השורה):");
var ddlTermChar = gTermCharStyle.add("dropdownlist", undefined, doc.characterStyles.everyItem().name);
ddlTermChar.preferredSize.width = 180;
try { ddlTermChar.selection = doc.characterStyles.itemByName(CHAR_STYLE_INDEX_TERM).index; } catch (e) { if (doc.characterStyles.length > 0) ddlTermChar.selection = 0; }
var gPageCharStyle = pSty.add("group"); gPageCharStyle.orientation="row"; gPageCharStyle.alignChildren="right";
gPageCharStyle.add("statictext", undefined, "סגנון תו (למספר עמוד באינדקס):");
var ddlPageChar = gPageCharStyle.add("dropdownlist", undefined, doc.characterStyles.everyItem().name);
ddlPageChar.preferredSize.width = 180;
try { ddlPageChar.selection = doc.characterStyles.itemByName(CHAR_STYLE_INDEX_PAGE).index; } catch (e) { if (doc.characterStyles.length > 0) ddlPageChar.selection = 0; }
var gBot = win.add("group"); gBot.orientation="row"; gBot.alignment="right";
var insertBtn = gBot.add("button",undefined,"הכנס למסמך");
var closeBtn = gBot.add("button",undefined,"סגור");
btnSearch.onClick = function(){
try {
var term = trimStr(win.txtSearchTerm.text); // Use win.txtSearchTerm
if(!term){ alert("יש להזין מחרוזת."); return; }
win.activeSearchTerm = term;
var params = {
term: term,
before: parseInt(bef.text,10)||0,
after: parseInt(aft.text,10)||0,
paraFilter: doc.paragraphStyles[ddlPara.selection.index],
objFilter: doc.objectStyles[ddlObj.selection.index],
isPartial: chkPartialWord.value // Pass the checkbox value
};
logMessage("Starting new search for term: '" + term + "' with before=" + params.before + ", after=" + params.after + ", partial=" + params.isPartial);
var hits = runQuery(params,doc);
list.removeAll();
if(!hits) { logMessage("No hits found."); return; }
logMessage("Found " + hits.length + " hits. Populating ListBox...");
for(var i=0;i<hits.length;i++){
var h = hits[i];
logMessage(" Hit #" + (i+1) + ":");
logMessage(" Raw h.before: [" + h.before + "] (length: " + String(h.before).length + ")");
logMessage(" Raw h.word: [" + h.word + "] (length: " + String(h.word).length + ")");
logMessage(" Raw h.after: [" + h.after + "] (length: " + String(h.after).length + ")");
var cleanedBefore = cleanForListBoxDisplay(h.before);
var cleanedWord = cleanForListBoxDisplay(h.word);
var cleanedAfter = cleanForListBoxDisplay(h.after);
logMessage(" Cleaned h.before: [" + cleanedBefore + "]");
logMessage(" Cleaned h.word: [" + cleanedWord + "]");
logMessage(" Cleaned h.after: [" + cleanedAfter + "]");
logMessage(" Page: " + h.page);
var it = list.add("item",(i+1).toString());
it.subItems[0].text = cleanedBefore;
it.subItems[1].text = cleanedWord;
it.subItems[2].text = cleanedAfter;
it.subItems[3].text = h.page;
it._hit = h;
}
logMessage("Finished populating ListBox.");
} catch(e) {
var errorMsg = "שגיאה בחיפוש:\n" + e.message + "\nשורה " + (e.line||'?') + (e.fileName ? "\nקובץ: " + e.fileName : "");
logMessage("ERROR during search: " + errorMsg.replace(/\n/g, " | "));
alert(errorMsg);
}
};
btnClear.onClick = function(){ list.removeAll(); win.activeSearchTerm = ""; logMessage("Results cleared."); };
selAll.onClick = function(){ for(var i=0;i<list.items.length;i++) list.items[i].selected=true; };
desAll.onClick = function(){ for(var i=0;i<list.items.length;i++) list.items[i].selected=false; };
insertBtn.onClick = function(){
try {
if(!list.selection || list.selection.length===0){ alert("בחר תוצאות."); return; }
var entryParaStyle = doc.paragraphStyles[ddlEntryPara.selection.index];
var termCharStyle = doc.characterStyles[ddlTermChar.selection.index];
var pageCharStyle = doc.characterStyles[ddlPageChar.selection.index];
var mainSearchTermForHeading = win.activeSearchTerm || "";
logMessage("Inserting " + list.selection.length + " selected hits for term: '" + mainSearchTermForHeading + "'");
insertHits(doc, list.selection, entryParaStyle, termCharStyle, pageCharStyle, mainSearchTermForHeading);
} catch(e) {
var errorMsg = "שגיאה בהכנסת ערכים:\n" + e.message + "\nשורה " + (e.line||'?') + (e.fileName ? "\nקובץ: " + e.fileName : "");
logMessage("ERROR during insert: " + errorMsg.replace(/\n/g, " | "));
alert(errorMsg);
}
};
closeBtn.onClick = function(){ logMessage("--- Script Closed ---"); win.close(); gWin=null; };
}
function trimStr(s){
if (s === null || s === undefined) return "";
return String(s).replace(/^[\s\u00A0]+|[\s\u00A0]+$/g,"");
}
function cleanForListBoxDisplay(str) {
if (str === null || str === undefined) return "";
var s = String(str);
s = s.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, "");
s = s.replace(/\u00AD/g, "");
s = s.replace(/\u200B/g, "");
s = s.replace(/[\s\r\n]+/g, " ");
return trimStr(s);
}
function ensureStyles(doc){
logMessage("Ensuring styles...");
if(!doc.characterStyles.itemByName(CHAR_STYLE_PAGE_REF_IN_LISTBOX).isValid) {
doc.characterStyles.add({name:CHAR_STYLE_PAGE_REF_IN_LISTBOX});
}
if(!doc.paragraphStyles.itemByName(PARA_STYLE_INDEX_HEADING).isValid) {
doc.paragraphStyles.add({name:PARA_STYLE_INDEX_HEADING, fontStyle:"Bold", pointSize:15, justification:Justification.RIGHT_ALIGN, composer: "Adobe World-Ready Paragraph Composer"});
}
if(!doc.paragraphStyles.itemByName(PARA_STYLE_INDEX_SUBHEADING).isValid) {
doc.paragraphStyles.add({name:PARA_STYLE_INDEX_SUBHEADING, fontStyle:"Bold", pointSize:11, spaceBefore:"3mm", spaceAfter:"1mm", justification:Justification.RIGHT_ALIGN, composer: "Adobe World-Ready Paragraph Composer"});
}
if(!doc.objectStyles.itemByName(OBJECT_STYLE_NAME).isValid) {
var objStyle = doc.objectStyles.add({name:OBJECT_STYLE_NAME});
objStyle.properties = { enableStroke: false, enableTextFrameTextFrameOptions: true, textFramePreferences: { firstBaselineOffset: FirstBaseline.ASCENT_OFFSET, textColumnCount: 1, insetSpacing: [ "2mm", "2mm", "2mm", "2mm" ] } };
}
if(!doc.paragraphStyles.itemByName(PARA_STYLE_INDEX_ENTRY).isValid) {
var paraStyle = doc.paragraphStyles.add({name:PARA_STYLE_INDEX_ENTRY});
paraStyle.properties = { pointSize:9, justification:Justification.RIGHT_ALIGN, composer: "Adobe World-Ready Paragraph Composer" };
}
if(!doc.characterStyles.itemByName(CHAR_STYLE_INDEX_TERM).isValid) {
doc.characterStyles.add({name:CHAR_STYLE_INDEX_TERM, fontStyle:"Bold"});
}
if(!doc.characterStyles.itemByName(CHAR_STYLE_INDEX_PAGE).isValid) {
doc.characterStyles.add({name:CHAR_STYLE_INDEX_PAGE});
}
logMessage("Styles ensured.");
}
function escapeRE(s){ return String(s).replace(/([\\^$.*+?()[\]{}|])/g,"\\$&"); }
function buildExact(str){
var between="['\"׳״“”]?"; var out="";
var s = String(str);
for(var i=0;i<s.length;i++){
out += escapeRE(s.charAt(i));
if(i<s.length-1) out += between;
}
return out;
}
function runQuery(p,doc){ // p now includes p.isPartial
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
if (p.isPartial) {
// Request 1: For partial word search, use a simpler pattern
app.findGrepPreferences.findWhat = escapeRE(p.term);
logMessage("GREP pattern (partial): " + app.findGrepPreferences.findWhat);
} else {
// Original whole word search
var allowed="\\w\\u0590-\\u05FF\\-–—\\.\\,;:!?\\(\\)\\[\\]{}“”\"׳״…·";
var pattern = "(?<!["+allowed+"])"+ buildExact(p.term) +"(?!["+allowed+"])";
app.findGrepPreferences.findWhat = pattern;
logMessage("GREP pattern (whole word): " + pattern);
}
var foundItems;
try { foundItems = doc.findGrep(); } catch(e) { logMessage("ERROR during GREP search: " + e.message); alert("שגיאה בחיפוש GREP: " + e.message); app.findGrepPreferences = NothingEnum.nothing; return null; }
app.findGrepPreferences = NothingEnum.nothing;
if(!foundItems.length){ return null; }
var out=[];
for(var i=0;i<foundItems.length;i++){
var h=foundItems[i];
try{
if (h.parentTextFrames.length === 0 || !h.parentTextFrames[0].isValid) continue;
if(p.objFilter.name !== doc.objectStyles[0].name && h.parentTextFrames[0].appliedObjectStyle.name != p.objFilter.name) continue;
}catch(e){ continue; }
if (h.paragraphs.length === 0 || !h.paragraphs[0].isValid) continue;
if(p.paraFilter.name !== doc.paragraphStyles[0].name && h.paragraphs[0].appliedParagraphStyle.name != p.paraFilter.name) continue;
var ctx = contextAround(h, p.before, p.after);
out.push({ before: ctx.before, word: String(h.contents), after: ctx.after, page: (function(){try{return h.parentTextFrames[0].parentPage.name;}catch(e){return "-";}})() });
}
return out;
}
function contextAround(textObject, numWordsBefore, numWordsAfter){
logMessage(" contextAround: Getting context for word: [" + String(textObject.contents) + "]");
var story = textObject.parentStory;
var foundIndexStart = textObject.insertionPoints[0].index;
var foundIndexEnd = textObject.insertionPoints[-1].index;
var beforeText = "";
var wordsCountedBefore = 0;
if (numWordsBefore > 0) {
var searchStartIndex = foundIndexStart - 1;
var currentWord = "";
logMessage(" contextAround (before loop) - searchStartIndex: " + searchStartIndex);
while(searchStartIndex >= 0 && wordsCountedBefore < numWordsBefore) {
var charObj = story.characters[searchStartIndex];
var chContent = "";
var chDisplayForLog = "";
if (charObj.isValid) {
chContent = charObj.contents;
chDisplayForLog = String(chContent);
chContent = mapSpecialCharString(chContent);
}
var charCode = -1, hexCode = "N/A";
if (chDisplayForLog.length > 0) {
charCode = chDisplayForLog.charCodeAt(0);
hexCode = charCode.toString(16).toUpperCase();
}
logMessage(" contextAround (before) - index: " + searchStartIndex + ", charText: [" + chDisplayForLog + "], mappedTo: ["+chContent+"], charCode: " + charCode + " (0x" + hexCode + "), wordsCounted: " + wordsCountedBefore);
if (chContent === "\r" || chContent === "\n") { if (currentWord.length > 0 && currentWord.replace(/\s/g, "").length > 0) wordsCountedBefore++; break; }
beforeText = chContent + beforeText;
if (/\s/.test(chContent)) { if (currentWord.length > 0 && currentWord.replace(/\s/g, "").length > 0) { wordsCountedBefore++; currentWord = ""; }}
else { currentWord = chContent + currentWord; }
searchStartIndex--;
}
if (searchStartIndex < 0 && currentWord.length > 0 && currentWord.replace(/\s/g, "").length > 0) wordsCountedBefore++;
logMessage(" contextAround (before text collected): [" + beforeText + "]");
}
var afterText = "";
var wordsCountedAfter = 0;
if (numWordsAfter > 0) {
var searchEndIndex = foundIndexEnd;
var currentWordAfter = "";
logMessage(" contextAround (after loop) - searchEndIndex: " + searchEndIndex + ", story.characters.length: " + story.characters.length);
while(searchEndIndex < story.characters.length && wordsCountedAfter < numWordsAfter) {
var charObj = story.characters[searchEndIndex];
var chContent = "";
var chDisplayForLog = "";
if (charObj.isValid) {
chContent = charObj.contents;
chDisplayForLog = String(chContent);
chContent = mapSpecialCharString(chContent);
}
var charCode = -1, hexCode = "N/A";
if (chDisplayForLog.length > 0) {
charCode = chDisplayForLog.charCodeAt(0);
hexCode = charCode.toString(16).toUpperCase();
}
logMessage(" contextAround (after) - index: " + searchEndIndex + ", charText: [" + chDisplayForLog + "], mappedTo: ["+chContent+"], charCode: " + charCode + " (0x" + hexCode + "), wordsCounted: " + wordsCountedAfter);
if (chContent === "\r" || chContent === "\n") { if (currentWordAfter.length > 0 && currentWordAfter.replace(/\s/g, "").length > 0) wordsCountedAfter++; break; }
afterText += chContent;
if (/\s/.test(chContent)) { if (currentWordAfter.length > 0 && currentWordAfter.replace(/\s/g, "").length > 0) { wordsCountedAfter++; currentWordAfter = ""; }}
else { currentWordAfter += chContent; }
searchEndIndex++;
}
if (searchEndIndex === story.characters.length && currentWordAfter.length > 0 && currentWordAfter.replace(/\s/g, "").length > 0) wordsCountedAfter++;
logMessage(" contextAround (after text collected): [" + afterText + "]");
}
return {before: beforeText, after: afterText};
}
function findOrCreateTextFrame(doc, frameName, objStyleName) {
var frame = null;
try {
var pageItem = doc.pageItems.itemByName(frameName);
if (pageItem.isValid && pageItem instanceof TextFrame) {
frame = pageItem;
logMessage("Found existing index frame: '" + frameName + "' on page " + frame.parentPage.name);
if (frame.parentStory.storyPreferences.storyDirection !== StoryDirectionOptions.RIGHT_TO_LEFT_DIRECTION) {
frame.parentStory.storyPreferences.storyDirection = StoryDirectionOptions.RIGHT_TO_LEFT_DIRECTION;
logMessage("Set story direction to RTL for existing frame.");
}
return frame;
} else if (pageItem.isValid) {
logMessage("Found PageItem with name '" + frameName + "' but it is not a TextFrame. Will create a new one.");
}
} catch (e) { /* לא נמצא */ }
logMessage("Index frame '" + frameName + "' not found or not a TextFrame. Creating new frame...");
var newPage = doc.pages.add(LocationOptions.AT_END);
logMessage("Added new page: " + newPage.name);
var pm = newPage.marginPreferences;
var bounds = [pm.top, pm.left, newPage.bounds[2] - pm.bottom, newPage.bounds[3] - pm.right];
frame = newPage.textFrames.add({ geometricBounds: bounds, name: frameName });
logMessage("Created new text frame on page " + newPage.name);
try {
var objStyleToApply = doc.objectStyles.itemByName(objStyleName);
if (objStyleToApply.isValid) {
frame.appliedObjectStyle = objStyleToApply;
logMessage("Applied object style '" + objStyleName + "' to new frame.");
} else {
logMessage("Object style '" + objStyleName + "' not found or invalid.");
}
} catch (e) { logMessage("ERROR applying object style: " + e.message); }
frame.parentStory.storyPreferences.storyDirection = StoryDirectionOptions.RIGHT_TO_LEFT_DIRECTION;
logMessage("Set story direction to RTL for new frame.");
var storyIsEffectivelyEmpty = true;
if (frame.parentStory.texts.length > 0) {
if (frame.parentStory.texts[0].contents.replace(/[\r\n\s]/g,"") !== "") {
storyIsEffectivelyEmpty = false;
}
}
if (storyIsEffectivelyEmpty) {
frame.parentStory.insertionPoints[0].contents = "אינדקס\r";
logMessage("Added 'אינדקס' heading to new frame's story.");
try { frame.parentStory.paragraphs[0].appliedParagraphStyle = doc.paragraphStyles.itemByName(PARA_STYLE_INDEX_HEADING); } catch(e) {}
}
return frame;
}
function insertHits(doc, selectedHits, entryParaStyle, termCharStyle, pageCharStyle, mainSearchTerm){
var indexFrame = findOrCreateTextFrame(doc, INDEX_FRAME_NAME, OBJECT_STYLE_NAME);
if (!indexFrame || !indexFrame.isValid) { alert("לא ניתן היה למצוא או ליצור תיבת טקסט לאינדקס."); return; }
var storyToInsertIn = indexFrame.parentStory;
if (storyToInsertIn.length > 0) {
var lastChar = storyToInsertIn.characters[-1].contents;
if (lastChar !== "\r" && lastChar !== "\n") {
storyToInsertIn.insertionPoints[-1].contents = "\r";
}
}
if (mainSearchTerm && mainSearchTerm.length > 0) {
storyToInsertIn.insertionPoints[-1].contents = mainSearchTerm + "\r";
logMessage("Added subheading for term: '" + mainSearchTerm + "'");
try {
var subheadingPara = storyToInsertIn.paragraphs.item(-2); // Should be the one before the final CR we might have just added.
// If the story was empty or ended with CR, this might be -1 or -2 relative to the "new" content.
// Let's find the paragraph containing the mainSearchTerm
var paras = storyToInsertIn.paragraphs;
for(var pIdx = paras.length -1; pIdx >=0; pIdx--){
if(paras[pIdx].contents.indexOf(mainSearchTerm + "\r") === 0 || paras[pIdx].contents === mainSearchTerm + "\r" || paras[pIdx].contents === mainSearchTerm){
subheadingPara = paras[pIdx];
break;
}
}
if(subheadingPara && subheadingPara.isValid) {
subheadingPara.appliedParagraphStyle = doc.paragraphStyles.itemByName(PARA_STYLE_INDEX_SUBHEADING);
} else {
logMessage("Could not reliably find subheading paragraph for styling.");
}
} catch (e) { logMessage("ERROR applying subheading style: " + e.message); }
if (storyToInsertIn.characters.length > 0 && storyToInsertIn.characters[-1].contents !== "\r" && storyToInsertIn.characters[-1].contents !== "\n") {
storyToInsertIn.insertionPoints[-1].contents = "\r";
}
}
for(var i=0; i < selectedHits.length; i++){
var h = selectedHits[i]._hit;
var hitBefore = String(h.before);
var hitWord = String(h.word);
var hitAfter = String(h.after);
var pageNumStr = String(h.page).replace(/\s/g,'');
var fullEntryText = hitBefore + hitWord + hitAfter;
var lineContent = trimStr(fullEntryText) + "\u0008" + pageNumStr;
var currentIp = storyToInsertIn.insertionPoints[-1];
currentIp.contents = lineContent;
var currentPara = storyToInsertIn.paragraphs.lastItem();
try { currentPara.appliedParagraphStyle = entryParaStyle; } catch(e) { logMessage("ERROR applying entry paragraph style: " + e.message + " to: " + currentPara.contents.replace(/\r/g,"[CR]")); }
try {
var paraObjForStyle = currentPara;
var ritIndex = -1;
// Find RIT from end of paragraph for safety, though it should be unique
for(var k = paraObjForStyle.characters.length -1; k >=0; k--) {
if (paraObjForStyle.characters[k].contents === "\u0008") {
ritIndex = paraObjForStyle.characters[k].index - paraObjForStyle.characters[0].index; // Relative index
break;
}
}
if (ritIndex !== -1) {
if (hitWord.length > 0) {
var textBeforeRIT = paraObjForStyle.texts.itemByRange(paraObjForStyle.characters[0], paraObjForStyle.characters[ritIndex-1]).contents;
var wordActualStart = textBeforeRIT.indexOf(hitWord);
if (wordActualStart !== -1) {
if ((wordActualStart + hitWord.length -1) < ritIndex) {
paraObjForStyle.characters.itemByRange(wordActualStart, wordActualStart + hitWord.length - 1).appliedCharacterStyle = termCharStyle;
} else {
logMessage("Could not apply term style, range issue: term '" + hitWord + "' in '" + textBeforeRIT + "'");
}
} else {
var tempCleanedWord = hitWord.replace(/['"]/g, "");
if (tempCleanedWord.length > 0) {
wordActualStart = textBeforeRIT.indexOf(tempCleanedWord);
if (wordActualStart !== -1 && (wordActualStart + tempCleanedWord.length -1) < ritIndex) {
paraObjForStyle.characters.itemByRange(wordActualStart, wordActualStart + tempCleanedWord.length - 1).appliedCharacterStyle = termCharStyle;
} else {
logMessage("Could not accurately apply char style (fallback) to term '" + hitWord + "' in entry: " + trimStr(fullEntryText));
}
} else {
logMessage("Could not accurately apply char style (empty after clean) to term '" + hitWord + "' in entry: " + trimStr(fullEntryText));
}
}
}
if (pageNumStr.length > 0) {
var pageNumStartIndexInPara = ritIndex + 1;
var pageNumEndIndexInPara = ritIndex + pageNumStr.length;
if (pageNumEndIndexInPara < paraObjForStyle.characters.length && pageNumStartIndexInPara <= pageNumEndIndexInPara) {
paraObjForStyle.characters.itemByRange(pageNumStartIndexInPara, pageNumEndIndexInPara).appliedCharacterStyle = pageCharStyle;
} else {
logMessage("Could not apply page number style. Calculated end index " + pageNumEndIndexInPara + " is out of bounds for paragraph length " + paraObjForStyle.characters.length + " or start index " + pageNumStartIndexInPara + " invalid for page: " + pageNumStr);
}
}
} else {
logMessage("Right Indent Tab not found in paragraph: " + currentPara.contents.replace(/\r/g,"[CR]"));
}
} catch(e) { logMessage("ERROR applying character styles (v068.9 logic): " + e.message + " for para content: " + currentPara.contents.replace(/\r/g, "[CR]")); }
if (storyToInsertIn.characters.length > 0 && storyToInsertIn.characters[-1].contents !== "\r" && storyToInsertIn.characters[-1].contents !== "\n") {
storyToInsertIn.insertionPoints[-1].contents = "\r";
}
} // סוף לולאת selectedHits
// --- טיפול בגלישת טקסט ---
var currentFrameForOverflow = indexFrame;
var overflowCounter = 0;
var MAX_OVERFLOW_PAGES = 25;
while (currentFrameForOverflow.overflows && overflowCounter < MAX_OVERFLOW_PAGES) {
logMessage("Handling overflow for frame on page " + currentFrameForOverflow.parentPage.name);
var lastPageInDoc = doc.pages.lastItem();
var newOverflowPage = doc.pages.add(LocationOptions.AFTER, lastPageInDoc);
logMessage("Added new page for overflow: " + newOverflowPage.name);
var pmOverflow = newOverflowPage.marginPreferences;
var boundsOverflow = [pmOverflow.top, pmOverflow.left, newOverflowPage.bounds[2] - pmOverflow.bottom, newOverflowPage.bounds[3] - pmOverflow.right];
var nextFrame = newOverflowPage.textFrames.add({ geometricBounds: boundsOverflow });
try {
var objStyleToApply = doc.objectStyles.itemByName(OBJECT_STYLE_NAME);
if (objStyleToApply.isValid) nextFrame.appliedObjectStyle = objStyleToApply;
} catch (e) { logMessage("Error applying object style to overflow frame: " + e.message); }
currentFrameForOverflow.nextTextFrame = nextFrame;
currentFrameForOverflow = nextFrame;
overflowCounter++;
logMessage("Linked to new frame on page " + currentFrameForOverflow.parentPage.name + ". Overflow pages created so far: " + overflowCounter);
}
if (overflowCounter >= MAX_OVERFLOW_PAGES) {
logMessage("WARNING: Reached maximum overflow page limit (" + MAX_OVERFLOW_PAGES + "). Index might still be overflowing.");
alert("האינדקס ארוך מאוד והגיע למגבלת יצירת הדפים האוטומטית ("+MAX_OVERFLOW_PAGES+"). ייתכן שעדיין יש תוכן גולש.");
}
try {
app.select(indexFrame);
if (app.activeWindow && app.activeWindow.isValid) {
app.activeWindow.activePage = indexFrame.parentPage;
app.activeWindow.zoom(ZoomOptions.FIT_PAGE);
}
} catch(e) { /* שגיאה */ }
var startPageName = indexFrame.parentPage.name;
var endPageName = currentFrameForOverflow.parentPage.name;
var pageInfo = (startPageName === endPageName && overflowCounter === 0) ? startPageName : startPageName + " עד " + endPageName;
logMessage("Finished inserting hits. " + selectedHits.length + " entries added. Content spans page(s): " + pageInfo);
alert(selectedHits.length + " ערכים נבחרים הוספו לאינדקס. התוכן נמצא בעמוד(ים): " + pageInfo + ".");
}
Copy link to clipboard
Copied
Has no one had experience with this kind of problem?
Find more inspiration, events, and resources on the new Adobe Community
Explore Now