쓸 일이 많이 없을 거라 생각하면서 다운로드 했던 걸 은근히 자주 사용하는 경우가 있다. 문단을 위로 올리거나 아래로 내리는 스크립트도 ‘문단 위치를 바꿀 일이 많지는 않겠지만, 일단 저장을 하자’는 생각이었으나, 곧잘 단축키를 누르게 된다. 제작자는 피터 카렐(Peter Kahrel)이라는 네덜란드 유저인데, 크리에이티브프로에 자신의 스크립트 리스트로만 구성된 독자적인 웹페이지가 있다.1 인디자인 스크립트계에 구루(guru)라고 할만한 사람을 꼽아야 한다면, 빼놓을 수 없는 분이라고 생각한다.
피터 카렐은 ‘move_par_up’, ‘move_par_down’라는 이름으로 이 스크립트를 업로드했는데(링크), 각각 ‘한단락_위로’, ‘한단락_아래로’라는 이름으로 번역했다. 스크립트의 모든 부분은 같고, 이름과 주석으로 들어가는 설명만 번역해서 고쳤다. 참고문헌, 찾아보기 목록의 순서를 바꾸거나, 여타의 문단 순서를 바꿀 일이 있을 때 사용하면 편리하다. 사실 문단을 복사해서 붙여넣는 걸 한두번 하는 게 아니고, 수차례 반복해야 된다면 꽤나 성가신 일이 된다. 이 스크립트의 장점은 문단에 어느 구석이든 커서만 놓여있으면 위 아래로 문단을 바꿀 수 있다는 점이다. 단축키와 함께 사용하면 문단 순서가 적잖이 바뀔 경우 상당히 유용하다.
코드 해설
1) 한단락_위로.jsx(move_par_up.jsx)
(function () {
if (app.selection.length === 0 || !app.selection[0].hasOwnProperty('baseline')) {
return;
}
var story = app.selection[0].parentStory;
var p = app.selection[0].paragraphs[0];
if (p == story.paragraphs[0]) {
return;
}
if (app.selection[0].paragraphs[-1].characters[-1].contents !== '\r') {
app.selection[0].paragraphs[-1].insertionPoints[-1].contents = '\r';
}
var previous = story.insertionPoints[p.index-1].paragraphs[0];
previous.move (LocationOptions.AFTER, app.selection[0].paragraphs[-1].insertionPoints[-1]);
}());
함수(function ())로 시작하는 스크립트다. 자바스크립트에서 함수는 특정한 목적을 갖고 작성한 코드를 모아 둔 블록문이다. 그래서 함수 안의 여러 줄의 코드를 한 번에 실행할 수 있다. 함수 안의 있는 코드 중 첫 번째 줄은 조건문(if)이다. 인디자인 내에서 선택된 것이 아무 것도 없는 경우(app.selection.length === 0)이거나(||) 인디자인 내에서 첫 번째로 선택된 것의 속성으로 ‘기준선(baseline)’이 없는 경우(!app.selection[0].hasOwnProperty('baseline’)) 함수를 종료(return;)한다.
다음 줄에는 변수들이 선언되는 데, 첫 번째는 ‘story’라는 이름의 변수를 현재 선택한 것의 부모 관계에 있는 스토리로 선언하는 것이고(var story = app.selection[0].parentStory;), 두 번째는 ‘p’라는 이름의 변수를 현재 선택한 것의 첫 번째 문단으로 선언한 것이다(var p = app.selection[0].paragraphs[0];) 그리고 p가 story의 첫 번째 문단일 경우(if (p == story.paragraphs[0])), 함수를 종료(return;)한다. 이 스크립트가 현재 단락을 위의 단락과 맞바꾸는 것임을 기억하자. 그렇다면 맞바꿀 단락이 없는 스토리의 첫 번째 단락이라면 스크립트를 실행할 수 없는 것이다.
다음 줄에 다시 조건문이 나온다. 인디자인 현재 선택한 것의 바로 이전 단락, 마지막 문자 내용이 ‘줄바꿈’이 아닌 경우(if (app.selection[0].paragraphs[-1].characters[-1].contents !== ‘\r’), 인디자인 선택한 것의 바로 이전 단락, 맨 끝의 삽입점 내용을 ‘줄바꿈’으로 바꾸라는 것(app.selection[0].paragraphs[-1].insertionPoints[-1].contents = ‘\r’;)이다. 그래서 ‘페이지 나누기’ 등의 다른 줄바꿈 기호가 이전 단락 끝에 있을 때 이 스크립트를 실행하면 줄바꿈 기호가 삽입되는 것을 볼 수 있다.
함수의 끝 부분에는 추가 변수 선언과 함께 마침내 최종 실행 코드가 나온다. 우선 ‘previous’라는 이름의 변수를 ‘story’(현재 선택한 스토리) 안에서 p(현재 선택한 단락)의 인덱스에서 1을 뺀 값을 기준으로 삽입점을 삼되(첫 번째 그 이전 삽입점이므로 이전 단락 마지막 삽입점이 된다), 그 삽입점이 있는 단락을 특정하여 선언한다(var previous = story.insertionPoints[p.index-1].paragraphs[0]; 말이 길었지만, 한마디로 현재 삽입점 이전 단락을 정의하는 것이다). 그렇게 정의한 previous를 그 이전 단락 마지막 삽입점을 기준으로 그 뒤에 옮기는 것(previous.move (LocationOptions.AFTER, app.selection[0].paragraphs[-1].insertionPoints[-1]);)으로 스크립트는 마무리된다.
2) 한단락_아래로.jsx(move_par_down.jsx)
(function () {
if (app.selection.length === 0 || !app.selection[0].hasOwnProperty('baseline')) {
return;
}
var story = app.selection[0].parentStory;
var p = app.selection[0].paragraphs[0];
if (p == story.paragraphs[-1]) {
return;
}
var next = app.selection[0].paragraphs[-1].insertionPoints[-1].paragraphs[0];
if (next.characters[-1].contents !== '\r') {
next.insertionPoints[-1].contents = '\r';
}
next.move (LocationOptions.BEFORE, app.selection[0].paragraphs[0].insertionPoints[0]);
}());
‘한단락_위로’ 스크립트와 변수 p를 선언하는 것까지는 똑같다. 다만 여기서는 현재 스토리에서 마지막 단락인 경우(if (p == story.paragraphs[-1])) 함수를 종료(return;)하고 있다. ‘한단락_아래로’ 스크립트의 목적은 단락을 아랫단락과 맞바꾸는 건데, 현재 단락이 마지막 단락이라서 맞바꿀 단락이 없다면 실행할 수가 없는 것이다.
그리고 ‘next’ 변수 선언으로 이어진다. next는 현재 선택된 것의 이전 단락의 마지막 삽입점을 기준으로 한 현재 단락, 즉 이전 단락을 특정하여 선언한다(var next = app.selection[0].paragraphs[-1].insertionPoints[-1].paragraphs[0];). 그리고 이어지는 조건문은 next(이전 단락)의 마지막 문자 내용이 줄바꿈 문자가 아닌 경우(if (next.characters[-1].contents !== ‘\r’)), next의 마지막 삽입점 내용을 줄바꿈 문자로 바꾼다는 것(next.insertionPoints[-1].contents = ‘\r’;)이다.
그리고 최종 실행 코드가 나온다. next(이전 단락)을 현재 선택된 단락의 첫 번째 삽입점을 기준으로 그 앞에 옮기는 것(next.move (LocationOptions.BEFORE, app.selection[0].paragraphs[0].insertionPoints[0]);)으로 스크립트는 마무리된다.
1 이곳에는 정말 훌륭한 스크립트가 많다, 그래서 기회가 된다면 차례차례 소개해볼 생각이다.