ページ作成
ソースリスト
php
CSS
|
WEB文書作成 ソースリスト: PHPPHP を使いWEBページにプログラムのソースリストを載せる方法を示します.あくまで,私なりの方法なので,エレガントとは言えないと思いますが,何かの参考になるでしょう. 目次はじめにWEB サイトにプログラムのソースを載せることは多々あります.直に HTML に書き込むのはかなり面倒です.そこで,プログラムのソースを表示するプログラムを使うことにしました.最も単純なのは,PHPを使う方法です.かつては,そうしていました.しかし,現在はシンタックスハイライターを使うのが常套手段です. 単純なプログラムPHPを使って自動的に,PHPやHTMLのソースファイルを表示させる方法です.ソースファイルを読み込んで,それを表示させています.けっこう便利です.
<div style="margin:10px 30px 20px 120px; padding: 5px 20px 10px; border:1px solid; background:white; line-height:120%; font-size:10pt; font-family:monospace; width:600px;height:400px; overflow:scroll">
<?php
print '<pre>'."\n";
$source=fopen("ファイル名","r");
while(!feof($source)){
$line = fgets($source, 1024);
$line = str_replace("&", "&", $line);
$line = str_replace("<", "<", $line);
$line = str_replace(">", ">", $line);
print "$line";
}
print '</pre>'."\n";
fclose($source);
?>
</div>
最初の行のdivで,リストを表示する枠を決めています.マージンや高さ,幅,色,スクロール等を決めています.この部分を適当に書き直して使うと良いでしょう.スクロールの指定は,ここが詳しいです. 例えば,このテクニックを使って,このページのソースリストを表示させると,次のようになります.スタイルをほとんど指定していませんので,見た目は美しくありません.CSS で工夫すると良いでしょう. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content = "text/html; charset=EUC-JP"> <meta http-equiv="Pragma" content = "no-cache"> <meta http-equiv="Cache-Control" content = "no-cache"> <meta http-equiv="Expires" content = "0"> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <script type="text/javascript" src="../../../js/jquery-1.11.1.min.js"></script> <script type="text/javascript" src="../../../jQuery/easyListSplitter/jquery.easyListSplitter.js"></script> <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=sunburst"></script> <script type="text/javascript" src="../../../js/My_script.js"></script> <link rel="stylesheet" href="../../../stylesheet.css" type="text/css"> <link rev="made" href="mailto:ymm10m34@khaki.plala.or.jp"> <meta name="Keywords" content="web, html, php, program, source list, プログラム, ソース, リスト, ソースリスト"> <meta name="Description" content="web ページにプログラムのソースリストを記述する方法を紹介します."> <title>WEBの文書作成: ソースリスト (PHP)</title> </head> <body class="frame"> <?php mb_http_output("EUC_JP"); mb_internal_encoding("EUC_JP"); ob_start("mb_output_handler"); $side_source_php=TRUE; include "../../../www_func/mk_html.php"; include "../../../head_menu.php"; include "../begin_side_menu_WEB.php"; ob_end_flush(); ?> <div class="page_top"> <div class="path"> <span class="parent"><a href="../../index.html">インターネット</a></span> <span class="parent"><a href="../index.html">WEB</a></span> <span class="self">文書作成(ソースリスト: PHP)</span> </div> <h1 class="title"><span style="color:limegreen">WEB文書作成</span> ソースリスト: PHP</h1> <p class="about">PHP を使いWEBページにプログラムのソースリストを載せる方法を示します.あくまで,私なりの方法なので,エレガントとは言えないと思いますが,何かの参考になるでしょう.</p> <h2 class="table_of_contents">目次</h2> <ul class="table_of_contents2" id="contents_list"> <li><a href="#INTRO">はじめに</a></li> <li><a href="#SIMPLE">単純なプログラム</a></li> <li><a href="#BETTER">もう少しまともなプログラム</a></li> <li><a href="#PAGE_INFO">ページ作成情報</a> <ul> <li><a href="#REFERENCE">参考資料</a></li> <li><a href="#UPDATE_HISTORY">更新履歴</a></li> </ul></li> </ul> <div style="clear: both"></div> </div> <hr> <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <h2 class="body" id="INTRO">はじめに</h2> <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <p>WEB サイトにプログラムのソースを載せることは多々あります.直に HTML に書き込むのはかなり面倒です.そこで,プログラムのソースを表示するプログラムを使うことにしました.最も単純なのは,PHPを使う方法です.かつては,そうしていました.しかし,現在はシンタックスハイライターを使うのが常套手段です.</p> <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <h2 class="body" id="SIMPLE">単純なプログラム</h2> <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <P>PHPを使って自動的に,PHPやHTMLのソースファイルを表示させる方法です.ソースファイルを読み込んで,それを表示させています.けっこう便利です.</p> <p class="source_caption">PHPを使ってソースコードをHTMLに直す方法.</p> <pre class="html_source" style="width:600px"> <div style="margin:10px 30px 20px 120px; padding: 5px 20px 10px; border:1px solid; background:white; line-height:120%; font-size:10pt; font-family:monospace; width:600px;height:400px; overflow:scroll"> <?php print '<pre>'."\n"; $source=fopen("<span style="color:crimson">ファイル名</span>","r"); while(!feof($source)){ $line = fgets($source, 1024); $line = str_replace("&", "&amp;", $line); $line = str_replace("<", "&lt;", $line); $line = str_replace(">", "&gt;", $line); print "$line"; } print '</pre>'."\n"; fclose($source); ?> </div></pre> <p>最初の行のdivで,リストを表示する枠を決めています.マージンや高さ,幅,色,スクロール等を決めています.この部分を適当に書き直して使うと良いでしょう.スクロールの指定は,<a href="http://www.tagindex.com/stylesheet/box/overflow.html">ここ</a>が詳しいです.</p> <p>例えば,このテクニックを使って,このページのソースリストを表示させると,次のようになります.スタイルをほとんど指定していませんので,見た目は美しくありません.CSS で工夫すると良いでしょう.</p> <p class="source_caption" id="this_page_source">このページのソースリスト</p> <div style="margin:10px 30px 20px 60px; padding: 5px 20px 10px; border:1px solid; background:white; line-height:120%; font-size:10pt; font-family:monospace; width:600px;height:400px; overflow:scroll"> <?php print '<pre>'."\n"; $source=fopen("index.php","r"); while(!feof($source)){ $line = fgets($source, 1024); $line = str_replace("&", "&", $line); $line = str_replace("<", "<", $line); $line = str_replace(">", ">", $line); print "$line"; } print '</pre>'."\n"; fclose($source); ?> </div> <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <h2 class="body" id="BETTER">もう少しまともなプログラム</h2> <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <p>先に示した web ページのソースにそのまま PHP を埋め込む方法は,エレガントではありません.そのうえ,行番号を表示させたりコメント文の色を変えたりする場合の対応が困難です.そこで,私はリスト3のような PHP のプログラムを使いこれらの問題に対応しています.この中の source2html() 関数で処理をし,表示します.これを web ページで使うために,これを適当なところに保存しページの先頭で include します,そして,必要な場所で呼び出しています.<a href="#this_page_source">リスト2</a>を見れば,使い方が分かるでしょう.また,別のページの「<a href="../regulation/prog_source/index.php">ソースコードの書き方</a>」も参考になるでしょう.</p> <p class="source_caption">ソースコードをHTMLに直す PHP プログラム</p> <pre class="html_source" style="width:600; height:400"><?php source2html("../../../www_func/my_func.php", "//", 1, 3, 0, -1); ?></pre> <p>このプログラムには,コメント文の処理に問題が残っています.たまに問題を起こしますが,ほとんどの場合大丈夫でしょう.</p> <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <h2 class="body" id="PAGE_INFO">ページ作成情報</h2> <!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --> <!-- ========================================================= --> <h3 class="body" id="REFERENCE">参考資料</h3> <!-- ========================================================= --> <div class="references"> <ol> <li><a href="http://www.webdesignleaves.com/wp/htmlcss/1457/">google-code-prettify を使ってシンタックスハイライト</a></li> </ol> </div> <!-- ========================================================= --> <h3 class="body" id="UPDATE_HISTORY">更新履歴</h3> <!-- ========================================================= --> <div class="update_history"> <table summary="更新履歴(update history)"> <tr> <td class="date">だいぶ昔</td> <td class="explanation">ページの新規作成</td> </tr> <tr> <td class="date">2021年09月04日</td> <td class="explanation">Google Code Prettify とページの分離</td> </tr> </table> </div> <!-- ===================== ここで本文は終わり ======================= --> <?php $show_counter = FALSE; $show_update = TRUE; $isuse_side_main = TRUE; include "../../../end_process.php"; ?> </body> </html> もう少しまともなプログラム先に示した web ページのソースにそのまま PHP を埋め込む方法は,エレガントではありません.そのうえ,行番号を表示させたりコメント文の色を変えたりする場合の対応が困難です.そこで,私はリスト3のような PHP のプログラムを使いこれらの問題に対応しています.この中の source2html() 関数で処理をし,表示します.これを web ページで使うために,これを適当なところに保存しページの先頭で include します,そして,必要な場所で呼び出しています.リスト2を見れば,使い方が分かるでしょう.また,別のページの「ソースコードの書き方」も参考になるでしょう. 001 <?php 002 003 //============================================================ 004 // this program could convert to html from text 005 // text2html($file, $ntab) 006 // $file: file name 007 // $ntab: convert tab to n space( ) 008 // if < 0 do not convert tab 009 //============================================================ 010 function text2html($file, $ntab=4){ 011 012 //---------- ready to precessing ---------------------- 013 $source = fopen($file,"r"); 014 015 //--------- make html strings ---------------------- 016 017 while(!feof($source)){ 018 $line = fgets($source, 1024); 019 if($line === false){break;} 020 021 //--- for processing html special charactors --- x07 022 $line = str_replace("&", "&", $line); 023 $line = str_replace("<", "<", $line); 024 $line = str_replace(">", ">", $line); 025 $line = str_replace(" ", " ", $line); 026 $line = str_replace("\n", "<br>", $line); 027 $line = str_replace('"', """, $line); 028 $line = str_replace("'", "'", $line); 029 030 //--- for processing tab charactor --- x07 031 while(0 < $ntab and preg_match('/\t/', $line)){ 032 $nws = $ntab - strpos($line, "\t") % $ntab; //needed white space 033 $tab = nbsp($nws); 034 $line = preg_replace('/\t/', $tab, $line, 1, $count); // replace /t to white space 035 } 036 037 print "$line"; 038 039 } 040 041 fclose($source); 042 } 043 044 045 //============================================================ 046 // source2html($file, $comment, $line_num, $digit, $pre, $ntab) 047 // $file: file name 048 // $comment: comment mark(text) 049 // $line_num: line number 0: off 1: on 050 // $digit: number of digit 051 // $pre: <pre>output 0:off 1:on 052 // $ntab: convert tab to n space( ) 053 // if < 0 do not convert tab 054 //============================================================ 055 function source2html($file, $comment='', $line_num=1, $digit=3, $pre=0, $ntab=4){ 056 057 //---------- check char encoding ----- 058 $cmd = sprintf("nkf -g %s", $file); 059 $enc = shell_exec($cmd); 060 $enc = trim($enc); 061 if ((strcasecmp($enc, "euc-jp") == 0) or (strcasecmp($enc, "ascii") == 0)){ 062 $enc_sw = FALSE; 063 }else{ 064 $enc_sw = TRUE; 065 } 066 067 //---------- ready to precessing ---------------------- 068 $source = fopen($file,"r"); 069 $ln = 0; 070 071 if($comment == ""){ 072 $comment_process = 0; 073 }else{ 074 $comment_process = 1; 075 } 076 077 //--------- make html strings ---------------------- 078 079 //--- for processing commet charactor (1/3) ---------------------------------- 080 //--- the following lines for pressing "x07" type comments. ------------------- 081 if(preg_match('/.*\/.*/', $comment)){ // ex: if $comment include '/' 082 $cmt_tmp = str_replace('/', '\/',$comment); // ex: convert '/' to "\/" in $comment 083 $cmt_match = sprintf("/.*%s.*/", $cmt_tmp); // ex: $cmt_match = "/.*\/\/*./" 084 }else{ 085 $cmt_match = sprintf("/.*%s.*/", $comment); // ex: $cmt_match = "/.*#.*/" 086 } 087 088 if($pre){ 089 print '<pre>'."\n"; 090 } 091 092 while(!feof($source)){ 093 $ln++; 094 $line = fgets($source, 1024); 095 if($line === false){break;} 096 097 //--- for processing commet charactor (2/3) ---------------------------------- 098 //--- shoud be devided three process (1/3), (2/3) and (3/3). 099 //--- because for assembly ';' is comment which includes special chacter in html --- 100 if($comment_process and preg_match($cmt_match, $line)){ 101 if(!($ln == 1 and preg_match("/^#!/",$line))){ // ignnore shebang line 102 //--- single quote and double quote processing --------- 103 $quote_test = strstr($line, $comment, true); 104 $sq = substr_count($quote_test, "'"); 105 $dq = substr_count($quote_test, '"'); 106 if($sq%2 == 0 and $dq%2 == 0){ 107 $line = str_replace($comment, '//', $line); x07 convert comment char to BEL(0x07) 108 } 109 } 110 } 111 112 //--- for processing html special charactors --- x07 113 $line = str_replace("&", "&", $line); 114 $line = str_replace("<", "<", $line); 115 $line = str_replace(">", ">", $line); 116 117 //--- for processing tab charactor --- x07 118 while(0 < $ntab and preg_match('/\t/', $line)){ 119 $nws = $ntab - strpos($line, "\t") % $ntab; //needed white space 120 $tab = white_space($nws); 121 $line = preg_replace('/\t/', $tab, $line, 1, $count); // replace /t to white space 122 } 123 124 //--- for processing commet charactor (3/3) --- x07 125 if($comment_process and preg_match('////', $line)){ 126 $line = rtrim($line); // delete return char at end of line 127 $line = preg_replace("////", "<span style=\"color:green\">".$comment, $line, 1, $count); 128 $line = $line."</span>\n"; 129 } 130 131 //--- add line number --- x07 132 if($line_num){ 133 $fmt = sprintf("<span class=\"line_num\">%%0%dd </span>%%s", $digit); 134 $line = sprintf($fmt, $ln, $line); 135 } 136 137 if($enc_sw){ 138 $line = mb_convert_encoding($line, "EUC-JP", $enc); 139 } 140 141 print "$line"; 142 } 143 144 if($pre){ 145 print '</pre>'."\n"; 146 } 147 fclose($source); 148 } 149 150 //============================================================ 151 // white_space($num=1) 152 // $num: number of white space output 153 //============================================================ 154 function white_space($num=1){ 155 156 $ws = ""; 157 for($i=0; $i<$num; $i++){ 158 $ws = $ws." "; //do not use spcial charctor 159 } 160 161 return $ws; 162 } 163 164 //============================================================ 165 // nbsp($num=1) 166 // $num: number of output 167 //============================================================ 168 function nbsp($num=1){ 169 170 $ws = " "; 171 for($i=0; $i<$num; $i++){ 172 $ws = $ws." "; //do not use spcial charctor 173 } 174 175 return $ws; 176 } 177 178 ?> このプログラムには,コメント文の処理に問題が残っています.たまに問題を起こしますが,ほとんどの場合大丈夫でしょう. ページ作成情報参考資料更新履歴
|