Yamamoto's Laboratory
ページ作成
  ソースリスト
  php
CSS
インターネット WEB 文書作成(ソースリスト: PHP)

WEB文書作成   ソースリスト: PHP

PHP を使いWEBページにプログラムのソースリストを載せる方法を示します.あくまで,私なりの方法なので,エレガントとは言えないと思いますが,何かの参考になるでしょう.

目次


はじめに

WEB サイトにプログラムのソースを載せることは多々あります.直に HTML に書き込むのはかなり面倒です.そこで,プログラムのソースを表示するプログラムを使うことにしました.最も単純なのは,PHPを使う方法です.かつては,そうしていました.しかし,現在はシンタックスハイライターを使うのが常套手段です.

単純なプログラム

PHPを使って自動的に,PHPやHTMLのソースファイルを表示させる方法です.ソースファイルを読み込んで,それを表示させています.けっこう便利です.

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("&", "&amp;", $line);
     $line = str_replace("<", "&lt;", $line);
     $line = str_replace(">", "&gt;", $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>&nbsp;&nbsp;&nbsp;ソースリスト: 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">
&lt;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"&gt;
&lt;?php
 print '&lt;pre&gt;'."\n";
 $source=fopen("<span style="color:crimson">ファイル名</span>","r");
 while(!feof($source)){
     $line = fgets($source, 1024);
     $line = str_replace("&amp;", "&amp;amp;", $line);
     $line = str_replace("&lt;", "&amp;lt;", $line);
     $line = str_replace("&gt;", "&amp;gt;", $line);
     print "$line";
  }
 print '&lt;/pre&gt;'."\n";
 fclose($source);
?&gt;
&lt;/div&gt;</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("&", "&amp;", $line);
	$line = str_replace("<", "&lt;", $line);
	$line = str_replace(">", "&gt;", $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を見れば,使い方が分かるでしょう.また,別のページの「ソースコードの書き方」も参考になるでしょう.

ソースコードをHTMLに直す PHP プログラム

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(&nbsp)
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("&",  "&amp;", $line);
023       $line = str_replace("<",  "&lt;",  $line);
024       $line = str_replace(">",  "&gt;",  $line);
025       $line = str_replace(" ", "&nbsp;", $line);
026       $line = str_replace("\n", "<br>", $line);
027       $line = str_replace('"', "&quot;", $line);
028       $line = str_replace("'", "&#39;", $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(&nbsp)
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("&", "&amp;", $line);
114       $line = str_replace("<", "&lt;", $line);
115       $line = str_replace(">", "&gt;", $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&nbsp;&nbsp;&nbsp;</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 &nbsp; output
167   //============================================================
168   function nbsp($num=1){
169   
170     $ws = "&nbsp;";
171     for($i=0; $i<$num; $i++){
172       $ws = $ws."&nbsp;";            //do not use spcial charctor
173     }
174   
175     return $ws;
176   }
177   
178   ?>

このプログラムには,コメント文の処理に問題が残っています.たまに問題を起こしますが,ほとんどの場合大丈夫でしょう.

ページ作成情報

参考資料

更新履歴

だいぶ昔 ページの新規作成
2021年09月04日 Google Code Prettify とページの分離


no counter