블로그

[MovableType] 프로그램 소스코드 출력하기

결과부터 말하면 블로그 글 내부에서 프로그램 소스 코드를 하일라이트해서 출력하는 것에 성공했다. 그리고 한글도 처리가 되도록 코드를 추가했다.

1. Beautifier 모듈 사용하기

html에서 php를 실행할 수 있도록 하거나 아예 생성되는 블로그 파일을 html대신에 php를 썼다든가 하는 설정을 해놓은 블로그 사용자라면 누구나 다음의 방법을 사용할 수 있다.

프로그램코드를 블로그 페이지에서 출력하기 위해 처음에는 MTCodeBeautifier 플러그인을 설치했다. 그러나 내가 새로 작성하는 글의 Entry Body에 적어넣는 MTCodeBeatufier 태그는 HTML 태그로 변환되지 않았다. 내 추측으로는 내가 MT를 잘못 설정하여 생긴 문제든가 아니면 MT가 Entry Body내부의 MT어쩌구 태그를 변환시키지 못하는 문제가 있어서 그런 현상이 발생하는 것 같다.

HTML 소스코드에 MTCodeBeautifier 태그가 그냥 남아있으니 플러그인을 설치해서 웹페이지에 프로그램 코드를 멋지게 보여주겠다는 애초의 의도는 물건너 간 셈…

고민 끝에 Beautifier 사이트에 가서 php용 Beautifier 모듈을 받았다. 직접 받을 사람은 여기에서 받으면 된다.

이 파일을 자신의 홈 디렉토리에서 풀고 php 디렉토리의 위치를 기억해둔다. 이 경로명을 php/Beautifier/Init.php의 BEAUT_PATH 변수에 넣어준다.

$BEAUT_PATH = "/home/terzeron/public_html/php";

php파일로 생성될 블로그 글을 하나 작성한다. Entry Body에서 출력할 코드의 내용이 다음과 같다고 하면…

public class Test {
public static void main( String [] args ) {
java.util.Properties p = System.getProperties();
java.util.Enumeration keys = p.keys();
while( keys.hasMoreElements() ) {
System.out.println( keys.nextElement() );
}
}
}

이 자바 프로그램 코드를 하일라이트하기 위해서는 이 코드 앞뒤로 다음과 같이 적어주면 된다.

<?php
require_once "/home/terzeron/public_html/php/Beautifier/Init.php";
global $BEAUT_PATH;
require_once "$BEAUT_PATH/HFile/HFile_java122.php";
require_once "$BEAUT_PATH/Output/Output_HTML.php";
$highlighter = new Core(new HFile_java122(), new Output_HTML());
print $highlighter->highlight_text("위에 보이는 자바 프로그램 코드 내용");
?>

주의할 점은 highlight_text라는 함수가 출력할 문자열을 겹따옴표로 묶기 때문에 출력할 문자열 내부에는 겹따옴표가 사용되어서는 안 된다. 이 문제는 겹따옴표를 포함한 문자열은 highlight_text('겹따옴표가 포함된 문자열')로 해결한다. 개인적으로는 홑따옴표로 묶는 것이 복잡한 프로그램 코드가 바뀌지 않고 정상적으로 출력되므로 홑따옴표로 묶는 것을 선호한다. 두 가지 모두가 섞여 있고 길이가 상당히 긴 텍스트의 경우에는 다음의 예제처럼 해당 텍스트를 파일로 저장하고 load_file 함수를 이용한다.

print $highlighter->highlight_text($highlighter->load_file("../counter-example.php");

출력할 코드가 어떤 프로그래밍 언어의 코드인가에 따라 위에서 사용할 코드가 약간씩 바뀔 필요가 있다. php/HFile 디렉토리에 있는 HFile_xxx.php 파일들이 각각의 언어를 담당하고 있는데 xxx에 해당하는 언어를 찾아서 사용하면 된다. 위 예제에서 java122를 해당 프로그래밍 언어에 따라 c나 cpp, php3 등으로 치환해서 사용할 수 있는 것이다.

2. Beautifier 모듈을 한글화하기

Beautifier 모듈은 한글화가 제대로 되어 있지 않아서 2바이트 한글 코드가 각각의 바이트로 분리되고 그 각각의 바이트가 특수기호로 인식되어 이상한 코드로 출력되는 문제점을 안고 있다.

한글이 비정상적으로 출력되는 문제점을 해결하기 위해 php/Beautifier/Core.php를 수정해야한다. Core.php 파일을 편집기로 열어서 461행 쯤에 있는

$lineout .= htmlentities($currchar);

라는 코드를 다음의 코드로 치환한다.

//
// modified by terzeron
// processing of 2 byte hangul code
//$lineout .= htmlentities($currchar);
if (ord($currchar) > 127 and ord($currchar) < 256) {
$lineout .= $currchar;
$nextchar = $lineorig[$j+1];
$lineout .= $nextchar;
$j++;
next;
} else {
$lineout .= htmlentities($currchar);
}

그리고 641행 쯤의

$line = htmlentities($line);

을 주석 처리한다.

//$line = htmlentities($line);

위 코드의 안정성에 대해서는 보장하지 못하지만 일단 프로그램 코드에서 문자열이나 주석문으로 사용되는 것을 테스트해 본 결과 무리없이 제대로 출력이 되는 것을 확인할 수 있었다. (ASCII 코드에 속하지 않는 비영어권 언어의 문자가 제대로 출력되지 않을 지도 모른다.) 어제 작성한 "블로그에 카운터달고 팝송가사 검색창을 달다."에서 한글 코드가 잘 출력되는 것을 직접 볼 수 있다.

답글 남기기