'syntax highlighter'에 해당되는 글 3건

  1. 2011.04.14 Syntax Highlighter 버그 해결
  2. 2011.04.12 Syntax Highlighter : re-collapse 기능 추가하기
  3. 2011.04.12 Syntax Highlighter - 티스토리에 설치
  4. .
web2011. 4. 14. 00:32
#177
크롬에서 세로 스크롤이 나타나요.
https://bitbucket.org/alexg/syntaxhighlighter/issue/177/superfluous-vertical-scrollbars-in-chrome
패치 자체 적용 완료.

#251
https://bitbucket.org/alexg/syntaxhighlighter/issue/251/major-bug-found-and-fixed-solves-many
흥미로운 버그인데, C 언어에서는 또 문제가 안 된다. 자바스크립트 brush의 경우 string을 찾은 뒤, comment를 찾지만, C brush는 그 반대이기 때문인 것 같다.
// http://jmrware.com/articles/2011/sh-bug/SyntaxHighlighterBug.html
// Commenting won't get you anywhere
'single' line with more 'single' line with more 'single' line with more
"double" line with more "double" line with more "double" line with more

#?
#define asdf sdfsdf\
                   adfsdfas
int main()
{
return 0;
}
정규식으로 패턴을 찾는 방식이라, 정규식이 완벽하지 않으면 문제가 발생한다. 바로 위의 예제 같은 경우 <와 > 사이에 \가 들어가는 건 또 제외해야 하는 것으로 알고 있다. 이처럼 하지만 완벽하게 만드는 것은 쉬운일이 아니다.

참고로 vim에서는 syntax/c.vim이 300 lines가 넘고, shBrushCpp.js는 100 lines 정도이다. 흠, vim의 synstax를 조금만 수정해서 가져다 쓰는 것이 가능하면 좋을 것 같은데...

########################################
비록 버그가 조금 있지만, 자바스크립트로 이 정도라도 만든 것이 어딘가! 버그를 고칠 실력이나 시간이 부족하다면, 그냥 "제작자님 감사요"하고 가져다 쓰자.
Posted by asdfzxcv
web2011. 4. 12. 20:40

Syntax Highlighter re-collapse addon


Syntax Highlighter의 설치 방법에 대해서는 http://noexists.tistory.com/172를 참고하면 된다.

Syntax Highlighter는 collapse 기능을 제공하는데, 기본적으로 한 번 expand 해버리면 다시 collapse가 안 된다. (Version 3.0.83 기준.) 인터넷을 뒤져봐도 version 3.0에 맞는 해결 방법이 나오지 않았고, ver. 2.0에 맞는 방법만 찾을 수 있었지만, ver. 2.0은 ver. 3.0과 구조적으로 너무 많이 달라서 적용이 불가능 했다. 그래서 직접 뜯어 고쳐서 re-collapse가 되도록 만들었다.

사실 shCore.js를 뜯어 고치면 더 쉽게 고칠 수 있는데, 가급적 원본에는 손을 대지 않고, 추가적인 코드만 적어서 뜯어 고치는 방법을 선택했다. (그렇게 하는 것이 관리가 편하다.) 그러나 몇몇 함수는 scope의 문제로 내가 원본의 함수를 call할 수가 없었다. 그래서 일부 함수는 어쩔 수 없이 copy and paste해야 했다.

그리고 collapse 기능이 활성화 된 경우에만, 수정된 코드가 작동하게 만들었다. 그렇지 않으면 collapse한 뒤, re-expand가 불가능해지는 사태가 발생할 수도 있기 때문이다. 그리고 expand의 기본 메시지도 제목만 나오는 것이 이상해서 조금 고쳤다.

결론적으로, shCustom.js와 shCustom.css를 만들어 업로드하고, 적절히 불러오면 된다. 당연한 얘기지만 shCustom를 나중에 불러와야 제대로 동작한다.

아무튼 완성(?)된 코드는 다음과 같다.
/* Copied from source of Syntax Highlighter 3.0.83
   by Alex Gorbatchev */
function hasClass(target, className)
{
        return target.className.indexOf(className) != -1;
};
function addClass(target, className)
{
        if (!hasClass(target, className))
                target.className += ' ' + className;
};
function removeClass(target, className)
{
        target.className = target.className.replace(className, '');
};
function getHighlighterId(id)
{
        var prefix = 'highlighter_';
        return id.indexOf(prefix) == 0 ? id : prefix + id;
};
function getHighlighterById(id)
{
        return sh.vars.highlighters[getHighlighterId(id)];
};
function getHighlighterDivById(id)
{
        return document.getElementById(getHighlighterId(id));
};
/* Customized by me */
SyntaxHighlighter.toolbar.items.list.push('collapseSource');
SyntaxHighlighter.toolbar.items.collapseSource = {
        getHtml: function(highlighter)
        {
                if (highlighter.getParam('collapse') != true)
                        return '';
                return SyntaxHighlighter.toolbar.getButtonHtml(highlighter,
                                                'collapseSource',
						'Collapse');
        },
        execute: function(highlighter)
        {
                if (highlighter.getParam('collapse') != true)
                        return;
                var div = getHighlighterDivById(highlighter.id);
                 addClass(div, 'collapsed');
        }                
};
SyntaxHighlighter.toolbar.items.expandSource.getHtml = function(highlighter)
{
	if (highlighter.getParam('collapse') != true)
		return '';
	var title = highlighter.getParam('title');
	return SyntaxHighlighter.toolbar.getButtonHtml(highlighter,
						       'expandSource',
						       (title ? title : '')
						       + ' ('
						       + SyntaxHighlighter.config.strings.expandSource
						       + ')');
};
SyntaxHighlighter.config.strings.expandSource = 'Expand';
SyntaxHighlighter.config.strings.aboutDialog = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>About SyntaxHighlighter</title></head><body style="font-family:Geneva,Arial,Helvetica,sans-serif;background-color:#fff;color:#000;font-size:1em;text-align:center;"><div style="text-align:center;margin-top:1.5em;"><div style="font-size:xx-large;">SyntaxHighlighter</div><div style="font-size:.75em;margin-bottom:0.0em;"><div>version 3.0.83 (July 02 2010)</div><div><a href="http://alexgorbatchev.com/SyntaxHighlighter" target="_blank" style="color:#005896">http://alexgorbatchev.com/SyntaxHighlighter</a></div><div>JavaScript code syntax highlighter.</div><div>Copyright 2004-2010 Alex Gorbatchev.</div><hr/><div>Syntax Highlighter re-collapse addon</div><div>version 1.0 (April 12 2011)</div><div><a href="http://noexists.tistory.com/174" target="_blank" style="color:#005896">http://noexists.tistory.com/174</a></div><hr/></div><div>If you like this script, please <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=2930402" style="color:#005896">donate</a> to <br/>keep development active!</div></div></body></html>';
SyntaxHighlighter.defaults['smart-tabs'] = false;
SyntaxHighlighter.defaults['tab-size'] = 8;
SyntaxHighlighter.all();
.syntaxhighlighter .toolbar {
	padding: 0.1em 0.8em 0em 0.8em !important;
	font-size: 1em !important;
	position: static !important;
	width: auto !important;
	height: auto !important;
}
.syntaxhighlighter .toolbar span {
	display: inline !important;
	margin-right: 1em !important;
}
.syntaxhighlighter .toolbar a {
	display: inline !important;
}
.syntaxhighlighter {
	padding-bottom: 1px;
}
<link href="./images/shCore.css" rel="stylesheet" type="text/css" /> 
<link href="./images/shThemeDefault.css" rel="stylesheet" type="text/css" /> 
<link href="./images/shCustom.css" rel="stylesheet" type="text/css" /> 
<script src="./images/shCore.js" type="text/javascript"></script> 
<script src="./images/shAutoloader.js" type="text/javascript"></script> 
<script src="./images/shCustom.js" type="text/javascript"></script> 
<script type="text/javascript">
//<![CDATA[
function path()
{
  var args = arguments,
      result = []
      ;
       
  for(var i = 0; i < args.length; i++)
      result.push(args[i].replace('@', './images/'));
       
  return result
};
SyntaxHighlighter.autoloader.apply(null, path(
  'applescript            @shBrushAppleScript.js',
  'actionscript3 as3      @shBrushAS3.js',
  'bash shell             @shBrushBash.js',
  'coldfusion cf          @shBrushColdFusion.js',
  'cpp c                  @shBrushCpp.js',
  'c# c-sharp csharp      @shBrushCSharp.js',
  'css                    @shBrushCss.js',
  'delphi pascal          @shBrushDelphi.js',
  'diff patch pas         @shBrushDiff.js',
  'erl erlang             @shBrushErlang.js',
  'groovy                 @shBrushGroovy.js',
  'java                   @shBrushJava.js',
  'jfx javafx             @shBrushJavaFX.js',
  'js jscript javascript  @shBrushJScript.js',
  'perl pl                @shBrushPerl.js',
  'php                    @shBrushPhp.js',
  'text plain             @shBrushPlain.js',
  'py python              @shBrushPython.js',
  'ruby rails ror rb      @shBrushRuby.js',
  'sass scss              @shBrushSass.js',
  'scala                  @shBrushScala.js',
  'sql                    @shBrushSql.js',
  'vb vbnet               @shBrushVb.js',
  'xml xhtml xslt html    @shBrushXml.js'
));
//]]>
</script>
Posted by asdfzxcv
web2011. 4. 12. 16:11

설치 방법

파일 업로드

아래 웹 사이트에서 download 항목으로 간 뒤, 최신 버전을 받는다. 압축을 풀면, 폴더가 여러 개 있는데, 여기서 scripts 폴더와 styles 폴더의 내용을 업로드해야 한다. 스킨 편집의 파일 업로드 기능을 이용하면 전부 images 라는 경로로 업로드 된다. http://alexgorbatchev.com/SyntaxHighlighter/

스킨 편집에서 skin.html을 편집

경로만 주의하면 된다. 경로를 적을 때 "./images/"로 시작하는 경로를 넣어야 제대로 인식된다.
<head>와 </head> 사이 적당한 곳에 다음 코드를 넣는다.
<link href="./images/shCore.css" rel="stylesheet" type="text/css" />
<link href="./images/shThemeDefault.css" rel="stylesheet" type="text/css" />
<script src="./images/shCore.js" type="text/javascript"></script>
<script src="./images/shAutoloader.js" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
SyntaxHighlighter.defaults['smart-tabs'] = false; /* optional */
SyntaxHighlighter.defaults['tab-size'] = 8; /* optional */
SyntaxHighlighter.all();
//]]>
</script>

</body> 바로 위에 다음 코드를 넣는다. 잘은 모르겠지만 autoloader의 코드가 먼저 나오고, 나중에 처리되어야 할 코드가 나오면 제대로 작동하지 않는다. head가 아닌 곳에 스크립트가 들어가는 것이 마음에 안 들면, autoloader를 쓰지 말든가, 아니면 autoloader의 동작 원리를 분석해서 코드를 고쳐야 할 것 같다. 아니면 head에는 스크립트를 전혀 안 넣고, 전부 뒤에 넣어도 좋다.
<script type="text/javascript">
//<![CDATA[
function path()
{
  var args = arguments,
      result = []
      ;
       
  for(var i = 0; i < args.length; i++)
      result.push(args[i].replace('@', './images/'));
       
  return result
};
SyntaxHighlighter.autoloader.apply(null, path(
  'applescript            @shBrushAppleScript.js',
  'actionscript3 as3      @shBrushAS3.js',
  'bash shell             @shBrushBash.js',
  'coldfusion cf          @shBrushColdFusion.js',
  'cpp c                  @shBrushCpp.js',
  'c# c-sharp csharp      @shBrushCSharp.js',
  'css                    @shBrushCss.js',
  'delphi pascal          @shBrushDelphi.js',
  'diff patch pas         @shBrushDiff.js',
  'erl erlang             @shBrushErlang.js',
  'groovy                 @shBrushGroovy.js',
  'java                   @shBrushJava.js',
  'jfx javafx             @shBrushJavaFX.js',
  'js jscript javascript  @shBrushJScript.js',
  'perl pl                @shBrushPerl.js',
  'php                    @shBrushPhp.js',
  'text plain             @shBrushPlain.js',
  'py python              @shBrushPython.js',
  'ruby rails ror rb      @shBrushRuby.js',
  'sass scss              @shBrushSass.js',
  'scala                  @shBrushScala.js',
  'sql                    @shBrushSql.js',
  'vb vbnet               @shBrushVb.js',
  'xml xhtml xslt html    @shBrushXml.js'
));
//]]>
</script>

사용방법

방법 1
<pre class="brush: c">
//코드를 적고
</pre>
방법 2
<script
type="syntaxhighlighter"
class="brush: c; collapse: true"
title="title"><![CDATA[
// 코드를 적고
]]></script>
여기서 brush는 언어에 따라 선택하면 된다.
그리고 class="brush: c; collapse: true"처럼 적으면 처음에 코드가 collapse된 상태로 나타나게 된다.

주의사항

<pre> 태그 내부에 있는 "<"나 ">"를 "&lt;"와 "&gt;"로 치환해야, 다양한 웹브라우저에서 제대로 보인다. 이 문제를 해결하기 위해 <script>를 쓰는 법도 있는데, 이건 코드 내부에 </script>가 있으면 오작동하는 경우가 있다. 그리고 script를 사용한 경우 syntax highlighter가 오류로 작동하지 않으면 화면에 코드가 전혀 안 나타나는 것도 문제다. Escape하는 것이 귀찮더라도 pre를 사용하는 것이 좋은 것일까?

테스트

#include <stdio.h>
int main()
{
	printf("Hello, World!\n");
	return 0;
}

기타

이글을 보면 알겠지만, 여기서는 re-collapse 기능을 사용하고 있다.
이것은 필자가 소스를 고쳐서 추가한 기능이다.
자세히 알아보려면 다음 글을 읽어보면 된다.
2011/04/12 - [web] - Syntax Highlighter : re-collapse 기능 추가하기
Posted by asdfzxcv