PukiWiki改造/blockdiagの導入
をテンプレートにして作成
[
凌宮
|
初基
|
一覧
|
検索
|
最新
] [
ソース
]
開始行:
*【編集中】 [#ref92ed9]
#contents
* 方針 [#d8342a00]
- コードで画像を出力したい。
- 特定用途なら専用言語で良い。
- 汎用用途ならコーディングし易さを考慮した汎用言語が良い...
* 仕様 [#j59f5d78]
- [[blockdiag>http://blockdiag.com/ja/index.html]]という...
-- http://blockdiag.com/ja/index.html
- Python で実装されているため、プラグイン扱いで拡張する。
- blockdiag、seqdiag、actdiag、nwdiag、packetdiag とコマ...
- 出力は HTML と親和性の高い SVG 直埋め込みとする。ただ、...
* 実装 [#gb40f8e7]
- plugin/diag.inc.php を新規作成。
###
<?php
function plugin_diag_convert()
{
$arg = rtrim(join(func_get_args(), ','), ','); // ...
return '<div class="diag">'.plugin_diag_core($arg, 'c...
}
function plugin_diag_inline()
{
$arg = rtrim(join(func_get_args(), ','), ','); // ...
return '<span class="diag">'.plugin_diag_core($arg, '...
}
function plugin_diag_core($arg, $mode)
{
$diag_dir = './diag/'; ...
$err_msg_end_phrase = 'No pages of output.'.PHP_EOL; ...
$prefix_convert = 'diag-nc-'; // ブロッ...
$prefix_inline = 'diag-ni-'; // インライ...
$key = ($mode=='inline') ? $prefix_inline.md5($arg) :...
$diag_euc = $key.'.euc.diag'; // 照合用引数出力...
$diag_utf = $key.'.utf.diag'; // コンパイル出力...
$img = $key.'.svg'; // 数式の画像出力...
$old_dir = getcwd();
chdir($diag_dir);
if (!file_exists($img) || $arg != file_get_contents($...
{
$std = $key.'.std.log'; // Tex の標準出力、エ...
$euc = $key.'.std.log'; // Tex の標準出力、エ...
flush(); // Timeout 対策
//$arg = "diag {\n" . $arg . "\n}"; // コー...
//$arg = mb_convert_encoding($arg, 'utf8-win');
$command = "blockdiag ";
//$command = str_replace(";", ";\n", $command);
if (preg_match( '/^\s*seqdiag\b/', $arg)) {$com...
if (preg_match( '/^\s*actdiag\b/', $arg)) {$com...
if (preg_match( '/^\s*nwdiag\b/', $arg)) {$com...
if (preg_match( '/^\s*rackdiag\b/', $arg)) {$com...
if (preg_match('/^\s*packetdiag\b/', $arg)) {$com...
//$arg = mb_convert_encoding($arg, 'SJIS-WIN', '...
//$arg = mb_convert_encoding(mb_convert_encoding(...
file_put_contents($diag_euc, $arg);
exec('nkf -w '.$diag_euc.' > '.$diag_utf);
exec($command . $diag_utf.' -f %windir%\fonts\ms...
exec('nkf -e --overwrite '.$img);
flush(); // Timeout 対策
if (!file_exists($img)) // Tex Error
{
$err_flag = false;
$err_code = "diag Error:\n\n";
if ($log_code = fopen($std, 'r'))
{
while (!feof($log_code))
{
$msg = fgets($log_code);
$err_code .= $msg;
}
fclose($log_code);
}
chdir($old_dir);
return '<pre class=diag_error_title>'.$arg.'<...
}
flush(); // Timeout 対策
}
$xml = file($img);
array_shift($xml);
array_shift($xml);
$match = array();
preg_match('/^<svg[^>]+viewBox\s*=\s*\"\s*\d+\s*\d+\s...
$width = $matches[1];
$height = $matches[2];
$svg = implode($xml);
$agent = getenv('HTTP_USER_AGENT');
chdir($old_dir);
// return '<img style="width:'.$width.'em; height:'.$hei...
// return '<img src="'.$diag_dir.$img.'" alt="'.htmlspec...
// return '<object type="image/svg+xml" data="'.$diag_di...
// return $svg.'<pre>'.htmlspecialchars(print_r($matches...
return '<div style="width: '.$width.'px;" >'.$svg.'</...
}
?>
###
* 開発メモ [#n362f009]
*** 文字コード変換 [#z22d52cc]
- 日本語を扱うため、EUC ⇒ UTF8 ⇒ EUC と変換する必要がある
-- 流用した PukiWiki が EUC ベースなため、プラグイン引数...
-- diag 達の標準エンコーディングは UTF8なため、コンパイル...
-- PukiWiki で出力される HTML に直埋め込みするため、再度 ...
- 訳分からんが、PHP の mb 関数は変換してくれない。
-- http://www.asp-edita.jp/doda/one/doda5728_15.html
- とりあえず、nkf というツールがあったので、それで仮実装。
-- Tex にあった。
*** svg 非対応ブラウザ [#u0259b28]
- ブラウザ情報を解析して、png で出すべし。
- 技術的に実現可能と分かっているが、検証できそうにないの...
-- ブラウザ情報を表示するページでも用意し、他力本願で報告...
終了行:
*【編集中】 [#ref92ed9]
#contents
* 方針 [#d8342a00]
- コードで画像を出力したい。
- 特定用途なら専用言語で良い。
- 汎用用途ならコーディングし易さを考慮した汎用言語が良い...
* 仕様 [#j59f5d78]
- [[blockdiag>http://blockdiag.com/ja/index.html]]という...
-- http://blockdiag.com/ja/index.html
- Python で実装されているため、プラグイン扱いで拡張する。
- blockdiag、seqdiag、actdiag、nwdiag、packetdiag とコマ...
- 出力は HTML と親和性の高い SVG 直埋め込みとする。ただ、...
* 実装 [#gb40f8e7]
- plugin/diag.inc.php を新規作成。
###
<?php
function plugin_diag_convert()
{
$arg = rtrim(join(func_get_args(), ','), ','); // ...
return '<div class="diag">'.plugin_diag_core($arg, 'c...
}
function plugin_diag_inline()
{
$arg = rtrim(join(func_get_args(), ','), ','); // ...
return '<span class="diag">'.plugin_diag_core($arg, '...
}
function plugin_diag_core($arg, $mode)
{
$diag_dir = './diag/'; ...
$err_msg_end_phrase = 'No pages of output.'.PHP_EOL; ...
$prefix_convert = 'diag-nc-'; // ブロッ...
$prefix_inline = 'diag-ni-'; // インライ...
$key = ($mode=='inline') ? $prefix_inline.md5($arg) :...
$diag_euc = $key.'.euc.diag'; // 照合用引数出力...
$diag_utf = $key.'.utf.diag'; // コンパイル出力...
$img = $key.'.svg'; // 数式の画像出力...
$old_dir = getcwd();
chdir($diag_dir);
if (!file_exists($img) || $arg != file_get_contents($...
{
$std = $key.'.std.log'; // Tex の標準出力、エ...
$euc = $key.'.std.log'; // Tex の標準出力、エ...
flush(); // Timeout 対策
//$arg = "diag {\n" . $arg . "\n}"; // コー...
//$arg = mb_convert_encoding($arg, 'utf8-win');
$command = "blockdiag ";
//$command = str_replace(";", ";\n", $command);
if (preg_match( '/^\s*seqdiag\b/', $arg)) {$com...
if (preg_match( '/^\s*actdiag\b/', $arg)) {$com...
if (preg_match( '/^\s*nwdiag\b/', $arg)) {$com...
if (preg_match( '/^\s*rackdiag\b/', $arg)) {$com...
if (preg_match('/^\s*packetdiag\b/', $arg)) {$com...
//$arg = mb_convert_encoding($arg, 'SJIS-WIN', '...
//$arg = mb_convert_encoding(mb_convert_encoding(...
file_put_contents($diag_euc, $arg);
exec('nkf -w '.$diag_euc.' > '.$diag_utf);
exec($command . $diag_utf.' -f %windir%\fonts\ms...
exec('nkf -e --overwrite '.$img);
flush(); // Timeout 対策
if (!file_exists($img)) // Tex Error
{
$err_flag = false;
$err_code = "diag Error:\n\n";
if ($log_code = fopen($std, 'r'))
{
while (!feof($log_code))
{
$msg = fgets($log_code);
$err_code .= $msg;
}
fclose($log_code);
}
chdir($old_dir);
return '<pre class=diag_error_title>'.$arg.'<...
}
flush(); // Timeout 対策
}
$xml = file($img);
array_shift($xml);
array_shift($xml);
$match = array();
preg_match('/^<svg[^>]+viewBox\s*=\s*\"\s*\d+\s*\d+\s...
$width = $matches[1];
$height = $matches[2];
$svg = implode($xml);
$agent = getenv('HTTP_USER_AGENT');
chdir($old_dir);
// return '<img style="width:'.$width.'em; height:'.$hei...
// return '<img src="'.$diag_dir.$img.'" alt="'.htmlspec...
// return '<object type="image/svg+xml" data="'.$diag_di...
// return $svg.'<pre>'.htmlspecialchars(print_r($matches...
return '<div style="width: '.$width.'px;" >'.$svg.'</...
}
?>
###
* 開発メモ [#n362f009]
*** 文字コード変換 [#z22d52cc]
- 日本語を扱うため、EUC ⇒ UTF8 ⇒ EUC と変換する必要がある
-- 流用した PukiWiki が EUC ベースなため、プラグイン引数...
-- diag 達の標準エンコーディングは UTF8なため、コンパイル...
-- PukiWiki で出力される HTML に直埋め込みするため、再度 ...
- 訳分からんが、PHP の mb 関数は変換してくれない。
-- http://www.asp-edita.jp/doda/one/doda5728_15.html
- とりあえず、nkf というツールがあったので、それで仮実装。
-- Tex にあった。
*** svg 非対応ブラウザ [#u0259b28]
- ブラウザ情報を解析して、png で出すべし。
- 技術的に実現可能と分かっているが、検証できそうにないの...
-- ブラウザ情報を表示するページでも用意し、他力本願で報告...
ページ名:
Anatomy_of_the_Human_Ear_ja.svg
365件
[
詳細
]
line.pukiwiki.php
460件
[
詳細
]
line.diff.php
449件
[
詳細
]
inline.tex
439件
[
詳細
]
convert_html.php
472件
[
詳細
]
eq.inc.php
508件
[
詳細
]
convert.tex
423件
[
詳細
]
codehighlight.php
438件
[
詳細
]
code.inc.php
475件
[
詳細
]
ToHeader.png
234件
[
詳細
]
ToFooter_0.png
202件
[
詳細
]
ToFooter.png
239件
[
詳細
]
ParaEdit.png
245件
[
詳細
]
TexEqMiddleAlign.png
485件
[
詳細
]
[
凌宮
|
初基
|
一覧
|
検索
|
最新
] [
ソース
]