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.