001 : <?php
002 : // 行番号付きHTML生成サービス【PHP】
003 : // cf. TextDoclet with VisualWorks
004 : // Created by M.Miyazaki : 2012.06.20
005 : // Modified by M.Miyazaki : 2012.09.27
006 : 
007 : /**
008 :  * 1タブあたりの標準スペース数
009 :  */
010 : $DEFAULT_TABSPACE = 4;
011 : 
012 : /**
013 :  * 1タブあたりの最小スペース数
014 :  */
015 : $MINIMUM_TABSPACE = 0;
016 : 
017 : /**
018 :  * 1タブあたりの最大スペース数
019 :  */
020 : $MAXIMUM_TABSPACE = 16;
021 : 
022 : /**
023 :  * 作成者の名称
024 :  */
025 : $authorName = "NanigashiBiyori";
026 : 
027 : /**
028 :  * 作成者のURL
029 :  */
030 : $authorURL = "http://www.cc.kyoto-su.ac.jp/~g0947424/";
031 : 
032 : /**
033 :  * HTMLに出力する文字列として整形(エンティティ変換、タブ→スペース変換)を施して応答する。
034 :  * @param $aString 整形を施す文字列
035 :  */
036 : function stringEscape($aString, $tabSpace = null)
037 : {
038 :     global $DEFAULT_TABSPACE;
039 :     if ($tabSpace === null) { $tabSpace = $DEFAULT_TABSPACE; }
040 :     
041 :     $spaces = str_pad("", $tabSpace, " ");
042 :     $aString = htmlspecialchars($aString);
043 :     $aString = preg_replace("/\t/u", $spaces, $aString);
044 :     return $aString;
045 : }
046 : 
047 : /**
048 :  * 指定されたキーのPOSTデータを取得する
049 :  * @param $key POSTデータから探し出すキー
050 :  */
051 : function getPostData($key)
052 : {
053 :     $value = null;
054 :     if (array_key_exists($key, $_POST)) {
055 :         $value = $_POST[$key];
056 :     }
057 :     return $value;
058 : }
059 : 
060 : /**
061 :  * ヘッダーを生成して応答する。
062 :  * @param $titleString HTMLページのタイトル文字列
063 :  */
064 : function getHeader($titleString)
065 : {
066 :     $aBuffer  = "<!DOCTYPE html>\n";
067 :     $aBuffer .= "<html lang=\"ja\">\n";
068 :     $aBuffer .= "<head>\n";
069 :     $aBuffer .= "<meta charset=\"UTF-8\">\n";
070 :     $aBuffer .= "<title>" . stringEscape($titleString) . "</title>\n";
071 :     $aBuffer .= "<style type=\"text/css\">\n";
072 :     $aBuffer .= "<!--\n";
073 :     $aBuffer .= "body, body pre {\n";
074 :     $aBuffer .= "    background-color : #ffffff;\n";
075 :     $aBuffer .= "    margin : 20px;\n";
076 :     $aBuffer .= "    padding : 10px;\n";
077 :     $aBuffer .= "    font-family : Monaco, monospace;\n";
078 :     $aBuffer .= "    font-size : 10pt;\n";
079 :     $aBuffer .= "}\n";
080 :     $aBuffer .= "-->\n";
081 :     $aBuffer .= "</style>\n";
082 :     $aBuffer .= "</head>\n";
083 :     $aBuffer .= "<body>\n";
084 :     $aBuffer .= "<pre>\n";
085 :     return $aBuffer;
086 : }
087 : 
088 : /**
089 :  * 本体部分を生成して応答する。
090 :  * @param $zeroPadding 行番号の上位桁を「0」で埋めるか否か(真偽値)
091 :  * @param $tabSpace タブをスペースに変換する際、何文字のスペースに変換するか(数値)
092 :  * @param $inputText HTML化するテキスト
093 :  */
094 : function getContents($zeroPadding, $tabSpace, $inputText)
095 : {
096 :     $pad = ($zeroPadding) ? "0" : " ";
097 :     $lines = explode("\n", $inputText);
098 :     $digits = strlen(count($lines) . "");
099 :     $aBuffer = "";
100 :     
101 :     foreach($lines as $index => $line)
102 :     {
103 :         $lineNumber = $index + 1;
104 :         $displayLineNumber = sprintf("%" . $pad . $digits . "d", $lineNumber);
105 :         $aBuffer .= "<a id=\"line." . $lineNumber . "\">" . $displayLineNumber . "</a> : ";
106 :         $aBuffer .= stringEscape($line, $tabSpace) . "\n";
107 :     }
108 :     
109 :     return $aBuffer;
110 : }
111 : 
112 : /**
113 :  * フッターを生成して応答する。
114 :  * @param $hasAuthorInformation 生成に関する詳細情報を表示するか否か(真偽値)
115 :  */
116 : function getFooter($hasAuthorInformation)
117 : {
118 :     global $authorName, $authorURL;
119 :     
120 :     $aBuffer  = "</pre>\n";
121 :     if ($hasAuthorInformation)
122 :     {
123 :         // タイムゾーンの設定
124 :         
125 :         
126 :         $aBuffer .= "<hr>\n";
127 :         $aBuffer .= "<p>This document was generated by <a href=\"" . $authorURL . "\">" . $authorName . "</a>";
128 :         $aBuffer .=" on " . date("Y/m/d") . " at " . date("H:i:s") . ".</p>\n";
129 :     }
130 :     $aBuffer .= "</body>\n";
131 :     $aBuffer .= "</html>\n";
132 :     return $aBuffer;
133 : }
134 : 
135 : 
136 : /* モード認識と具体的な処理 */
137 : $mode = getPostData("mode");
138 : 
139 : if ($mode === "createHTML") {
140 :     // HTMLを生成するモード
141 :     
142 :     $aBuffer = "";
143 :     
144 :     if (($titleString = getPostData("titleString")) === null) { $titleString = ""; }
145 :     $aBuffer .= getHeader($titleString);   // ヘッダー生成
146 : 
147 :     $zeroPadding = (getPostData("zeroPadding") !== null) ? true : false;
148 :     if (!is_integer($tabSpace = getPostData("tabSpace")) || !($MINIMUM_TABSPACE <= $tabSpace && $tabSpace <= $MAXIMUM_TABSPACE)) {
149 :         $tabSpace = $DEFAULT_TABSPACE;
150 :     }
151 :     if (($inputText = getPostData("inputText")) === null) { $inputText = ""; }
152 :     $aBuffer .= getContents($zeroPadding, $tabSpace, $inputText);   // 本体部分生成
153 :     
154 :     $hasAuthorInformation = (getPostData("authorInformation") !== null) ? true : false;
155 :     $aBuffer .= getFooter($hasAuthorInformation);   // フッター生成
156 :     
157 :     print $aBuffer;
158 :     
159 : } else {
160 :     // 予想外の呼び出し(直接とか)
161 :     print "Sorry, This is unexpected page. Go back to '" . $authorURL . "'.";
162 : }
163 : 
164 : ?>

This document was generated by NanigashiBiyori on 2012/09/27 at 17:51:01.