2011년 11월 21일 월요일

blogger.com에 syntax highlight 적용하기


1. 일단 원하는 템플릿을 적용해보자
2. 관리 페이지로 가서 템플릿 > 사용중인 템플릿 > html 편집 > 경고가 뜨면 씹고 계속 버튼 눌러준다.
3. </head> 바로 앞에 다음과 같은 내용을 넣는다.

<style type='text/css'>
.dp-highlighter
{
    font-family: &quot;Consolas&quot;, &quot;Monaco&quot;, &quot;Courier New&quot;, Courier, monospace;
    font-size: 12px;
    background-color: #E7E5DC;
    width: 99%;
    overflow: auto;
    margin: 18px 0 18px 0 !important;
    padding-top: 1px; /* adds a little border on top when controls are hidden */
}

/* clear styles */
.dp-highlighter ol,
.dp-highlighter ol li,
.dp-highlighter ol li span 
{
    margin: 0;
    padding: 0;
    border: none;
}

.dp-highlighter a,
.dp-highlighter a:hover
{
    background: none;
    border: none;
    padding: 0;
    margin: 0;
}

.dp-highlighter .bar
{
    padding-left: 45px;
}

.dp-highlighter.collapsed .bar,
.dp-highlighter.nogutter .bar
{
    padding-left: 0px;
}

.dp-highlighter ol
{
    list-style: decimal; /* for ie */
    background-color: #fff;
    margin: 0px 0px 1px 45px !important; /* 1px bottom margin seems to fix occasional Firefox scrolling */
    padding: 0px;
    color: #5C5C5C;
}

.dp-highlighter.nogutter ol,
.dp-highlighter.nogutter ol li
{
    list-style: none !important;
    margin-left: 0px !important;
}

.dp-highlighter ol li,
.dp-highlighter .columns div
{
    list-style: decimal-leading-zero; /* better look for others, override cascade from OL */
    list-style-position: outside !important;
    border-left: 3px solid #6CE26C;
    background-color: #F8F8F8;
    color: #5C5C5C;
    padding: 0 3px 0 10px !important;
    margin: 0 !important;
    line-height: 14px;
}

.dp-highlighter.nogutter ol li,
.dp-highlighter.nogutter .columns div
{
    border: 0;
}

.dp-highlighter .columns
{
    background-color: #F8F8F8;
    color: gray;
    overflow: hidden;
    width: 100%;
}

.dp-highlighter .columns div
{
    padding-bottom: 5px;
}

.dp-highlighter ol li.alt
{
    background-color: #FFF;
    color: inherit;
}

.dp-highlighter ol li span
{
    color: black;
    background-color: inherit;
}

/* Adjust some properties when collapsed */

.dp-highlighter.collapsed ol
{
    margin: 0px;
}

.dp-highlighter.collapsed ol li
{
    display: none;
}

/* Additional modifications when in print-view */

.dp-highlighter.printing
{
    border: none;
}

.dp-highlighter.printing .tools
{
    display: none !important;
}

.dp-highlighter.printing li
{
    display: list-item !important;
}

/* Styles for the tools */

.dp-highlighter .tools
{
    padding: 3px 8px 3px 10px;
    font: 9px Verdana, Geneva, Arial, Helvetica, sans-serif;
    color: silver;
    background-color: #f8f8f8;
    padding-bottom: 10px;
    border-left: 3px solid #6CE26C;
}

.dp-highlighter.nogutter .tools
{
    border-left: 0;
}

.dp-highlighter.collapsed .tools
{
    border-bottom: 0;
}

.dp-highlighter .tools a
{
    font-size: 9px;
    color: #a0a0a0;
    background-color: inherit;
    text-decoration: none;
    margin-right: 10px;
}

.dp-highlighter .tools a:hover
{
    color: red;
    background-color: inherit;
    text-decoration: underline;
}

/* About dialog styles */

.dp-about { background-color: #fff; color: #333; margin: 0px; padding: 0px; }
.dp-about table { width: 100%; height: 100%; font-size: 11px; font-family: Tahoma, Verdana, Arial, sans-serif !important; }
.dp-about td { padding: 10px; vertical-align: top; }
.dp-about .copy { border-bottom: 1px solid #ACA899; height: 95%; }
.dp-about .title { color: red; background-color: inherit; font-weight: bold; }
.dp-about .para { margin: 0 0 4px 0; }
.dp-about .footer { background-color: #ECEADB; color: #333; border-top: 1px solid #fff; text-align: right; }
.dp-about .close { font-size: 11px; font-family: Tahoma, Verdana, Arial, sans-serif !important; background-color: #ECEADB; color: #333; width: 60px; height: 22px; }

/* Language specific styles */

.dp-highlighter .comment, .dp-highlighter .comments { color: #008200; background-color: inherit; }
.dp-highlighter .string { color: blue; background-color: inherit; }
.dp-highlighter .keyword { color: #069; font-weight: bold; background-color: inherit; }
.dp-highlighter .preprocessor { color: gray; background-color: inherit; }
</style>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shCore.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushBash.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushCpp.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushCSharp.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushCss.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushDelphi.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushGroovy.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushJava.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushJScript.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushPhp.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushPython.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushRuby.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushSql.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushVb.js' type='text/javascript'/>
    <script src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushXml.js' type='text/javascript'/>
4. </body> 바로 앞에 다음과 같은 내용을 넣는다.

<script language='javascript'>
//<![CDATA[
dp.SyntaxHighlighter.BloggerMode();
dp.SyntaxHighlighter.HighlightAll('code');
//]]>
</script>
5. 코드 부분은 다음과 같이 html 모드에서 작성하자.

<pre class="javascript" name="code">
alert('hello, world!');
</pre>

pre 태그 안의 내용이 제대로 나오지 않는다면 encode uri 해놓은 걸로 넣으면 아주 잘 된다.

유한 상태 기계 (Finite state machine) with JavaScript

구현

function FSM() {
    this.stateList = [];
    this.transitionSet = {};
    this.currentState = false;
    this.initialState = false;
    this.isValidTransitionInfo = function(transitionInfo) {
        if (typeof transitionInfo != 'object' || transitionInfo == null) return false;
        var needAttribute = ['process', 'fromState', 'toState'];
        for(var i = 0, j = needAttribute.length; i < j; i++) {
            if (typeof transitionInfo[needAttribute[i]] != 'string' || transitionInfo[needAttribute[i]].length < 1) {
                return false;
            }
        }
        return true;
    };
    this.setTransition = function(transition) {
        this.transitionSet[transition['process']] = this.transitionSet[transition['process']] || {};
        if (this.transitionSet[transition['process']][transition['fromState']])
            throw new Exception('FSM # don`t overwrite transition @  process : ' + transition['process'] + ' / from state : ' + transition['fromState']);
        this.transitionSet[transition['process']][transition['fromState']] = {};
        this.transitionSet[transition['process']][transition['fromState']]['state'] = transition['toState'];
        this.transitionSet[transition['process']][transition['fromState']]['before'] = transition['before'] || false;
        this.transitionSet[transition['process']][transition['fromState']]['callback'] = transition['callback'] || transition['after'] || false;
    };
    this.addTransition = function(transition) {
        if (!(transition instanceof Array)) {
            transition = [transition];
        }
        for (var i = 0, j = transition.length; i < j; i++) {
            if (this.isValidTransitionInfo(transition[i])) {
                var elm = transition[i];
                this.addState(elm['fromState']);
                this.addState(elm['toState']);
                this.setTransition(elm);
            } else {
                throw new Exception('FSM # invalid transition info');
            }
        }
    };
    this.addState = function(state) {
        if (!this.stateList.isExistValue(state, true)) {
            this.stateList[this.stateList.length] = state;
            return true;
        }
        return false;
    };
    this.getStateList = function() {
        return this.stateList;
    };
    this.getCurrentState = function() {
        if (!this.currentState)
            throw new Exception('FSM # not initialized @ get current state fail');
        return this.currentState;
    };
    this.setInitalState = function(state) {
        if (!this.stateList.isExistValue(state, true))
            throw new Exception('FSM # unknown state appointed : ' + String(state) + ' @ FSM.stateList : [ ' + this.stateList.join(', ') + ' ]');
        this.currentState = state;
        this.initialState = state;
    };
    this.resetState = function() {
        if (!this.initialState)
            throw new Exception('FSM # not initialized @ reset fail');
        this.currentState = this.initialState;
    };
    this.availableTransition = function(process) {
        var isAvailable = true && typeof process == 'string';
        isAvailable = isAvailable && this.transitionSet;
        isAvailable = isAvailable && this.transitionSet[process];
        return isAvailable && this.transitionSet[process][this.currentState];
    };
    this.transition = function(process) {
        if (this.availableTransition(process)) {
            var transition = this.transitionSet[process][this.currentState];
            if (transition['before'] && transition['before'] instanceof Function)
                transition['before']();
 
            this.currentState = this.transitionSet[process][this.currentState]['state'];
 
            if (transition['callback'] && transition['callback'] instanceof Function)
                transition['callback']();
        } else {
            throw new Exception('FSM # cannot transition @ process : ' + process + ' / from state : ' + this.currentState);
        }
    };
};