CodePressプラグインを作る

Daisukeh 2009/02/26 11:44 初稿
Daisukeh 2009/02/27 10:30 修正
Daisukeh 2009/03/02 11:29 追稿
Daisukeh 2009/08/05 14:13 移設

記事一覧

 なんとなくですが、オンラインでコード編集する時に便利な、CodePressをプラグイン化してみました。実際の使用方法は、Javascriptを使ってDOMエンティティから内容を取得して、AjaxなりCGIなりで編集テキストの操作をする必要があります。”CodePress“で検索するとたくさんの解説サイトが見つかりますが、本家サイトのアドレスがどれもhttp://codepress.org/とかhttp://www.codepress.org/になっています。そのどれもがリンク切れです。8-O いつの頃なのかわかりませんが、http://sourceforge.net/に開発拠点を移したようで、http://codepress.sourceforge.net/CodePressに関する情報がありました。

 以下、プラグインのソースです。

/lib/plugins/codepress/syntax.php

<?php
 
/*
 * Codepress Plugin : Edit code and text by Codepress (version 1.01)
 *
 * CodePress :
 *    Online Real Time Syntax Highlighting Editor
 *    http://codepress.org/
 *
 * Usage :
 *    <codepress [options]> [default data] </codepress>
 * 
 * Options :
 *   language="(language)"   Specify editting language
 *   id="(ID)"               Apply tag ID to the context
 *   class="(class)"         Apply tag class to the context
 *   style="(style)"         Apply stylesheet to the context
 *   linenumbers             Show line numbers
 *   autocomplete            Enable AutoComplete
 *   readonly                Read only
 *
 * Languages :
 *    ASP, AutoIt, CSharp, CSS, HTML, Java, Javascript,
 *    Perl, PHP, Ruby, SQL, Text, VBscript, XSL and Generic
 *
 * Operations (CodePress class methods) :
 *   id.edit('(id)','(language)')
 *   id.getCode()
 *   id.toggleEditor()
 *   id.toggleLineNumbers()
 *   id.toggleReadOnly()
 *   id.toggleAutoComplete()
 * 
 * @author    Daisukeh <cqn04630@nifty.com> (http://daisukeh.ddo.jp/)
 * @license   LGPL (http://www.opensource.org/licenses/lgpl-license.php)
 * 
 */
 
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'syntax.php');
 
class syntax_plugin_codepress extends DokuWiki_Syntax_Plugin
{
  function getInfo()
  {
    return array(
      'author' => 'Daisukeh',
      'email'  => 'cqn04630@nifty.com',
      'date'   => '2009-02-26',
      'name'   => 'Codepress Plugin',
      'desc'   => 'Edit code and text by Codepress '.
                  '(usage: <codepress [options]>[default data]</codepress> )',
      'url'    => 'http://daisukeh.ddo.jp/',
    );
  }
 
  function getType()
  {
    return 'protected';
  }
 
  function connectTo($mode)
  {
    $this->Lexer->addEntryPattern('<codepress.*>(?=.*?</codepress>)', $mode, 'plugin_codepress');
  }
 
  function postConnect()
  {
    $this->Lexer->addExitPattern('</codepress>', 'plugin_codepress');
  }
 
  function handle($match, $state, $pos, &$handler)
  {
    switch($state)
    {
    case DOKU_LEXER_ENTER :
      $param = array(
        'id'    => "p{$pos}",
        'class' => '',
        'lang'  => 'text',
        'style' => 'width:640px;height:480px;',
        'line'  => false,
        'auto'  => false,
        'read'  => false,
      );
      if(preg_match('/id="([^"]+)"/i',       $match, $pmch)) $param['id'   ] = $pmch[1];
      if(preg_match('/class="([^"]+)"/i',    $match, $pmch)) $param['class'] = $pmch[1];
      if(preg_match('/language="([^"]+)"/i', $match, $pmch)) $param['lang' ] = $pmch[1];
      if(preg_match('/style="([^"]+)"/i',    $match, $pmch)) $param['style'] = $pmch[1];
      if(preg_match('/linenumber/i',         $match))        $param['line' ] = true;
      if(preg_match('/autocomplete/i',       $match))        $param['auto' ] = true;
      if(preg_match('/readonly/i',           $match))        $param['read' ] = true;
      if(preg_match('/default/i',            $match))
      {
        $param['line'] = true;
        $param['auto'] = true;
      }
      return array($state, $param);
    case DOKU_LEXER_UNMATCHED : return array($state, $match);
    case DOKU_LEXER_EXIT :      return array($state, '');
    }
    return array();
  }
 
  function render($mode, &$renderer, $data)
  {
    if($mode != 'xhtml') return false;
    list($state, $match) = $data;
    switch($state)
    {
    case DOKU_LEXER_ENTER :
      global $conf;
      $src = '<script type="text/javascript" src="/lib/plugins/codepress/codepress.js"></script>';
      $txt = '<textarea id="'.$match['id'].'" class="codepress '.$match['lang'];
      if($match['line'] == false) $txt .= ' linenumbers-off';
      if($match['auto'] == false) $txt .= ' autocomplete-off';
      if($match['read'] == true ) $txt .= ' readonly-on';
      $txt .= ' '.$match['class'].'" style="'.$match['style'].'" wrap="off">';
      $renderer->doc .= $src.$txt;
      break;
    case DOKU_LEXER_UNMATCHED :
      $renderer->doc .= $match;
      break;
    case DOKU_LEXER_EXIT :
      $renderer->doc .= '</textarea>';
      break;
    }
    return true;
  }
}
 
?>

ダウンロードdokuwiki-plugin-codepress-090227.zip

 プラグイン化にあたり、いくつかのパラメータを追加しました。

  1. language=”(language)“
    編集する言語を指定します。
  2. id=”(ID)“
    識別子を指定します。
  3. class=”(class)“
    追加クラス情報を指定します。
  4. style=”(style)“
    スタイルを指定します。実際にはCodePressが<iframe>を展開するので、サイズくらいしか指定できません。
  5. linenumbers
    行番号を表示します。
  6. autocomplete
    オートコンプリート機能を有効にします。
  7. readonly
    読込専用でドキュメントを開きます。
  8. default
    linenumbersautocompleteを設定します。

 対応している言語は以下のとおりです。

 以下、利用サンプルです。各言語共通で使用されているCSScodepress.cssを少しいじって、フォントサイズなどを変更しました。

CodePressプラグインを使った例

<codepress id="cpsample" language="php" default style="width:480px;height:320px;">
<?php
	$info = array(
		'name'  => 'Daisukeh',
		'birth' => 1971,
		'sex'   => 'male',
		'job'   => 'programmer',
	);
	foreach($info as $key => $value)
		echo "{$key} : {$value}\n";
?>
</codepress>


 作ったのはいいのだけれど、何に使うか考えていませんでした。CodeIgniterのオンライン編集に使えたらいいなぁと考えてはいるんですが…。

掲示板

, 2009/03/02 11:43
【追記】ここでダウンロードできるプラグインの中には、CodePressの最新リリース(?)である2006年版が収録されています。更に、FireFoxでタブ入力ができないバグ(/engines/gecko.js)も修正済みです。コードを書くのにタブが入力できないのは致命的ですから…。
, 2012/01/24 23:33
This forum neeedd shaking up and you've just done that. Great post!
, 2013/10/08 08:30
This post concerning SEO gives clear picture for new SEO users that how to do SEO, therefore keep it up. Good work
, 2013/10/19 17:53
Hello, all right brother there are obviously various blogging web sites, however I advise you to use Google without charge blogging services.
, 2013/10/20 10:35
Very energetic post, I liked that a lot. Will there be a part 2?
モンクレール激安通販店‐‐新品登場

弊社は世界最高級コピーブランドダウン専門店です。
主にファッションの外観があるモンクレールと
実用性が抜群なザノースフェイスを通販しております。
業界に最高品質のモンクレール ダウン レディースを提供しております。
本物と見分けがつかないぐらい、完璧なモンクレール激安を経営しております。
モンクレール ダウンの品質は保証しております。
Enter your comment
 
 
programming/dokuwiki/codepressプラグインを作る.txt · 最終更新: 2009/08/05 14:14 by daisukeh
 

Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS
Driven by DokuWiki Powered by Google do yourself a favour and use a real browser - get firefox ! GIMP is the GNU Image Manipulation Program. Adobe Flex smarty : Template Engine