Я написал скрипт для сортировки абзацев в Adobe InDesign с сохранением их форматирования. Я использовал алгоритм пузырьковой сортировки. Хотя сценарий успешно сохраняет исходное форматирование, он выполняет только одну итерацию, требуя нескольких выполнений для завершения сортировки.
Меня совершенно не волнует сложность алгоритма или возможность программа неполная, но поскольку эта программа может получить правильный результат после многократного запуска, я пытаюсь напрямую зациклить некоторые из ее функций для достижения того же результата.
Я попытался принудительно сортировка путем многократного вызова bubbleSortParagraphs(paraArray,verseFlag) для количества абзацев, но она не сработала. Я также попробовал зациклить функцию sortParagraphs(sortMethod,verseFlag), но это тоже не удалось. Я совершенно не понимаю, почему это происходит.
var pinyinSortOrder = {
'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9, 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16, 'R': 17, 'S': 18, 'T': 19, 'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24, 'Z': 25,
'a': 26, 'b': 27, 'c': 28, 'd': 29, 'e': 30, 'f': 31, 'g': 32, 'h': 33, 'i': 34, 'j': 35, 'k': 36, 'l': 37, 'm': 38, 'n': 39, 'o': 40, 'p': 41, 'q': 42, 'r': 43, 's': 44, 't': 45, 'u': 46, 'v': 47, 'w': 48, 'x': 49, 'y': 50, 'z': 51
};//a list to store the character order
function getCharWeight(ch) {
if (pinyinSortOrder && pinyinSortOrder[ch] !== undefined) {
return pinyinSortOrder[ch];
} else {
return ch.charCodeAt(0) + 100000;
}
}
function compareString(a, b) {
var arrA = a.split("");
var arrB = b.split("");
var minLen = Math.min(arrA.length, arrB.length);
for (var i = 0; i < minLen; i++) {
var diff = getCharWeight(arrA) - getCharWeight(arrB);
if (diff !== 0) {
return diff;
}
}
return arrA.length - arrB.length;
}
function getSafeInsertionPoint(aStory, desiredIndex) {
var count = aStory.insertionPoints.length;
if (count === 0) return null;
if (desiredIndex < 0) desiredIndex = 0;
if (desiredIndex >= count) desiredIndex = count - 1;
return aStory.insertionPoints[desiredIndex];
}
showDialog()
function showDialog() {
var dlg = app.dialogs.add({ name: "Paragraph Sorting (Bubble Multiple Rounds)" });
var dropdownSortMethod, chkReverse;
with (dlg.dialogColumns.add()) {
// Sorting Method
with (dialogRows.add()) {
staticTexts.add({ staticLabel: "Sorting Method:" });
dropdownSortMethod = dropdowns.add({
stringList: ["Ignore Formatting (Plain Text)", "Preserve Formatting (Bubble Swap)"],
selectedIndex: 0
});
}
// Reverse Order
with (dialogRows.add()) {
chkReverse = checkboxControls.add({
staticLabel: "Reverse Order",
checkedState: false
});
}
}
var confirmed = dlg.show();
if (confirmed) {
var method = dropdownSortMethod.selectedIndex;
var reverseFlag = chkReverse.checkedState;
dlg.destroy();
sortParagraphs(method, reverseFlag);
} else {
dlg.destroy();
}
}
/* =========== 5. Sorting Core =========== */
function sortParagraphs(sortMethod, reverseFlag) {
var sel = app.selection[0];
var myParagraphs = sel.paragraphs;
// Collect Paragraphs
var paraArray = [];
for (var i = 0; i < myParagraphs.length; i++) {
// If you need to skip empty paragraphs, you can check contents here
paraArray.push(myParagraphs);
}
// (B) Preserve Formatting: Use bubble sort multiple rounds
bubbleSortParagraphs(paraArray, reverseFlag);
alert("Preserve Formatting (Bubble): Sorting Completed!");
}
/* =========== 6. Bubble Sort (Multiple Rounds) ===========
Each round starts from index=0 to n-2-i, comparing adjacent [j] and [j+1], swap if order is incorrect.
swapped=false indicates no swap in this round => all sorted => break.
*/
function bubbleSortParagraphs(paraArray, reverseFlag) {
var n = paraArray.length;
for (var i = 0; i < n - 1; i++) {
var swapped = false;
for (var j = 0; j < n - 1 - i; j++) {
var txtA = paraArray[j].contents;
var txtB = paraArray[j+1].contents;
var diff = compareString(txtA, txtB);
// Ascending: diff>0 => swap; Descending: diff swap
var needSwap = ((!reverseFlag && diff > 0) || (reverseFlag && diff < 0));
if (needSwap) {
paraArray[j+1].move(LocationOptions.BEFORE, paraArray[j]);
// Also swap in the array
var temp = paraArray[j];
paraArray[j] = paraArray[j+1];
paraArray[j+1] = temp;
swapped = true;
}
}
if (!swapped) {
break;
}
}
}
Я даже пробовал что-то вроде:
for (var i = 0; i < myParagraphs.length; i++)
{
var paraArray = [];
for (var i = 0; i < myParagraphs.length; i++)
{
paraArray.push(myParagraphs);
}
bubbleSortParagraphs(paraArray, reverseFlag);
}
и это просто не работает.
app.select — это функция в Indesign, позволяющая выбрать абзац с помощью мыши.
Я вставил в сценарий
Haywire(X) 237
Crippling(X) 234
Recharge 238
Toxic(X) 240
Defensive 234
RazorSharp 238
Storm 240
Tainted 240
Unwieldy 241
< /code>
и вывод IS < /p>
Crippling(X) 234
Haywire(X) 237
Recharge 238
Defensive 234
RazorSharp 238
Storm 240
Tainted 240
Toxic(X) 240
Unwieldy 241
так и должно быть (а я не могу удалить другой код, потому что если я "сократю код только до необходимого кода", то код будет работать хорошо), если я "удалю все этот код и для этого вопроса вызовите пузырьковую сортировку напрямую с инициализированными данными». все будет так, как показано ниже:
Crippling(X) 234
Defensive 234
Haywire(X) 237
RazorSharp 238
Recharge 238
Storm 240
Tainted 240
Toxic(X) 240
Unwieldy 241
Подробнее здесь: https://stackoverflow.com/questions/793 ... ng-trouble
Проблема с пузырьковой сортировкой в InDesign Script, интересная проблема ⇐ Javascript
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Google Cloud Scheduler не может найти Script Script Script Script Cloud Run aname lobname
Anonymous » » в форуме Python - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Google Cloud Scheduler не может найти Script Script Script Script Cloud Run aname lobname
Anonymous » » в форуме Python - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Google Cloud Scheduler не может найти Script Script Script Script Cloud Run aname lobname
Anonymous » » в форуме Python - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-