サポート » バグ報告と提案 » 投稿編集時の「単語数」

  • 2.6から投稿編集時に「単語数」が表示されるようになりましたが、日本語では全く意味のない実装となっています。

    ここを「文字数」にしてしまうのは、日本語リソースの対応と、js数行のハックで済むのですが、wordpress自体の更新が頻繁なので、毎回、自分で対応するのがメンドクサくなってきました。

    日本のユーザの大半の方にとって、日本語版のデフォルトが「文字数」であることが好ましいと思うのですが、日本語版作成チームの方で取り入れることは可能でしょうか?

    対応頂ければ幸いです。

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • モデレーター IKEDA Yuriko

    (@lilyfan)

    日本のユーザの大半の方にとって、日本語版のデフォルトが「文字数」であることが好ましいと思うのですが、日本語版作成チームの方で取り入れることは可能でしょうか?

    いいですね。ぜひとも取り入れてもらいたいと思います。でも、バイト数じゃなくて文字数にできるんでしたっけ??

    トピック投稿者 mnagaku

    (@mnagaku)

    jsなので、環境に依存する可能性はありますが、64ビット版UbuntuのShiretokoでは、日本語、半角英字混じりでも、ちゃんと文字数で出ます。Windows上がどうなるかで、意味が変わってきますね。

    windowsやMacの人に試してもらって、レポートが欲しいとこではあります。下記に情報があるので、皆さんに試してもらえるとうれしいです。

    http://kgr-lab.ddo.jp:10880/wordpress/?p=271

    宜しくお願い致します。

    モデレーター jim912

    (@jim912)

    mnagakuさん

    便利そうですね。
    実体参照文字の場合とか、気になる点はいくつかありますので、私も試してみたいと思います。

    あとは、poファイルを直接編集すると、翻訳がうまくいかなかったときに、表示される文言は「Word Count」のままでありながら、数字は文字数てなことになってしまうので、元の英字の出力から変更するプラグインにするのが望ましいと思います。

    モデレーター jim912

    (@jim912)

    mnagakuさん

    実体参照ほか、カウント方法にいくつか気になった点がありましたので、改良してみました。下記にまとめておきます。
    ついでに、プラグイン化もしてみました。まだ、私のWindowsローカル2.7でしか検証していないので、他の環境で動くか多少心配なのですが。。

    コードも載せておきますので、ご助言などありましたらお聞かせいただければ幸いです。

    文字数カウントプラグイン配布ページ

    プラグイン化にあったっての改良点

    • 翻訳ファイルが正常に読み込まれない場合などでも、表記の関係が崩れないよう、英語出力時点から変更されるようにいたしました。
    • 実体参照文字を1文字としてカウントするようにいたしました。※ パターン定義であるため、実体参照以外の文字も1文字としてカウントしてしまう可能性があります。
    • 記号等も文字数であるという観点より、半角記号などはカウントするようにいたしました。カウント不要と思われる場合は、wp_char_count/js/wp_char_count.jsの
      // tx = tx.replace( /[.(),;:!?%#$¿'"_+=\\/-]*/g, '' );

      行頭部//を削除してください。

    • 全角スペースをカウントしないようにいたしました。

    wp_chars_count.php

    <?php
    /*
    Plugin Name: WP Character Count
    Plugin URI: http://www.web-strategy.jp/wp_plugin/wp_char_count/
    Description: マルチバイト環境では、ほとんど意味をなさない投稿欄の単語数表示を文字数表示に差し替えます。
    Author: Hitoshi Omagari
    Version: 0.1.0
    Author URI: http://www.web-strategy.jp/
    */
    
    $wp_char_count = new wp_char_count();
    
    class wp_char_count {
    
    	function wp_char_count() {
    		$this->__construct();
    	}
    
    	function __construct() {
    		add_filter( 'print_scripts_array', array( &$this, 'replace_word_count_script' ) );
    	}
    
    	function replace_word_count_script( $todo ) {
    		global $wp_scripts;
    
    		$user_locale = get_locale();
    		$lang_file = dirname( __file__) . '/language/wp_char_count-' . $user_locale . '.mo';
    		if ( file_exists( $lang_file ) ) {
    			load_textdomain( 'wp_char_count', $lang_file );
    		}
    
    		$wp_scripts->add( 'wp_char_count', WP_PLUGIN_URL . str_replace( str_replace( '\\', '/', WP_PLUGIN_DIR ), '', str_replace( '\\', '/', dirname( __file__ ) ) ) .'/js/wp_char_count.js', array( 'jquery' ), '20081221' );
    		$wp_scripts->localize( 'wp_char_count', 'wpCharCountL10', array(
    			'count' => __('Character count: %d', 'wp_char_count'),
    			'l10n_print_after' => 'try{convertEntities(wpCharCountL10);}catch(e){};'
    		) );
    
    		foreach ( $todo as $key => $script ) {
    			if ( $script == 'word-count' ) {
    				$todo[$key] = 'wp_char_count';
    			}
    		}
    		return $todo;
    	}
    }

    wp_char_count.js

    // Character count
    (function(JQ) {
    	wpWordCount = {
    
    		init : function() {
    			var t = this, last = 0, co = JQ('#content');
    
    			JQ('#wp-word-count').html( wpCharCountL10.count.replace( /%d/, '<span id="character-count">0</span>' ) );
    			t.block = 0;
    			t.wc(co.val());
    			co.keyup( function(e) {
    				if ( e.keyCode == last ) return true;
    				if ( 13 == e.keyCode || 8 == last || 46 == last ) t.wc(co.val());
    				last = e.keyCode;
    				return true;
    			});
    		},
    
    		wc : function(tx) {
    			var t = this, w = JQ('#character-count'), tc = 0;
    
    			if ( t.block ) return;
    			t.block = 1;
    
    			setTimeout( function() {
    				if ( tx ) {
    					tx = tx.replace( /<.[^<>]*?>/g, ' ' ).replace( /&nbsp;/gi, ' ' );
    					tx = tx.replace( /&(#[\d]{2,4}?|[a-zA-Z]{2,8}[1-9]{0,2});/g, '1' );
    //					tx = tx.replace( /[.(),;:!?%#$¿'"_+=\\/-]*/g, '' );
    					tx = tx.replace( /[ \s]/g, '' );
    					tc=tx.length;
    				}
    				w.html(tc.toString());
    
    				setTimeout( function() { t.block = 0; }, 2000 );
    			}, 1 );
    		}
    	}
    }(jQuery));
    
    jQuery(document).ready( function(){ wpWordCount.init(); } );
    モデレーター JOTAKI, Taisuke

    (@tai)

    mnagakuさん、jim912さん、すばらしいです!

    本体に組み込むべき機能だと思うので、カウントを単語数にするのか文字数にするのか管理画面で設定できるようなパッチを作ってTracに投げてもらえませんでしょうか?中国語や韓国語もたぶん同じような状態だと思うので、そのパッチが取り込まれればたくさんのユーザーが喜ぶと思います。:-)

    モデレーター Seisuke Kuraishi

    (@tenpura)

    jim912 さん、皆さんこんばんは。

    ほぼ同じタイミングで作業をしていたらしく完全なバッティングですが WP Multibyte Patch 1.1.2 に同様の文字数表示機能を組み込みました。
    http://eastcoder.com/code/wp-multibyte-patch

    両者は実装方法がまったく異なるため同時に動かしてもコンフリクトはないようです。(WP Character Count の機能が WP Multibyte Patch の同機能を上書きする)
    WP Multibyte Patch の方式は単純に word-count と $l10n の出力をのっとっているだけですので WP Character Count のような独自英文の出力機能はありません。

    あくまで目安機能なので皆さん細かい部分は気にしないかもしれませんが以下カウントのしかたです。

    • 文字実体参照、数値文字参照は 1 文字としてカウント
    • 連続する半角スペースは 1 文字としてカウント
    • &nbsp; は半角スペース扱い
    • 全角スペースは 1 文字としてカウント

    コードも載せておきますので、ご助言などありましたらお聞かせいただければ幸いです。

    現在の正規表現の書き方だと 16 進の数値文字参照がマッチしませんね。それから 10 進も一部ひっかからないのではないでしょうか。

    トピック投稿者 mnagaku

    (@mnagaku)

    おお、話が広がってるw

    jim912さん
    pluginでフィルタかまして乗っ取りとは思い付きませんでした。今まで、version upの度に、「あわせて読みたい」とかを、コピペして貼っ付けてたんですが、この手法で俺だけpluginを書けば、管理がラクにできそうです。つーか、もしかして、既にそーゆーのあるのかな。デザイン内に公式なアンカーがあれば、好きなアンカーをフィルタで上書きする俺だけpluginで、version up対応がラクになるとか。デザインとゆー関心事だけ独立に扱えるアスペクト指向的なアーキテクチャが欲しいかも。脱線しました、すいません。

    tenpuraさん
    公式配布に機能が入るので良いですね。私も、シビアに文字数が必要なのではなく、無意味な機能をなくしたかっただけなので、jsに与える正規表現の書き方は、深く考えてません。ただ、2人にフォローしてもらって、数え方の仕様に好みが出るのはハッキリしたと思うので、jsに与える正規表現文字列を、設定画面でイジれるようにすると良いのかなと思いました。反復適用は要りそうなので、区切り文字を定義して、複数並べて書けて、jsのtx変換部に動的に埋め込む感じでしょうか。

    皆さんに反応してもらって、うれしかったですw

    モデレーター jim912

    (@jim912)

    taiさん、tenpuraさん、mnagakuさん、こんばんはです。

    taiさん
    せっかくなので、もうひとがんばりして本体に組み込んでもらうべくチャレンジしてみます。
    マルチバイト圏のユーザーは、初期選択が文字数カウントになってるとよさげですよね。
    ところで、Tracに投げるパッチは、その機能を実装するために本体ファイルを編集し、変更したファイルで良いのでしょうか。

    tenpuraさん
    $l10n の出力を乗っ取るというのは、考えつきませんでした。こちらの方がスマートですね。

    現在の正規表現の書き方だと 16 進の数値文字参照がマッチしませんね。それから 10 進も一部ひっかからないのではないでしょうか。

    半角カナあたりが見事抜けておりましたね。。。

    mnagakuさん
    ブログパーツのウィジェットプラグインがあると便利かもですね。テーマの変更なんかもスムーズになりそうですし。

    余談
    「かんりしゃ」と「管理者」って、なんらか違うのですか??

    モデレーター JOTAKI, Taisuke

    (@tai)

    jim912さん、

    ころで、Tracに投げるパッチは、その機能を実装するために本体ファイルを編集し、変更したファイルで良いのでしょうか。

    .diff(.patch)ファイルです。
    例;
    http://trac.wordpress.org/ticket/7842
    http://trac.wordpress.org/attachment/ticket/7842/wp-login.php.diff
    参考:
    http://ja.wikipedia.org/wiki/Patch
    http://markjaquith.wordpress.com/2005/11/02/my-wordpress-toolbox/
    http://blog.ftwr.co.uk/archives/2005/11/03/windows-wordpress-toolbox/

    余談
    「かんりしゃ」と「管理者」って、なんらか違うのですか??

    同じです。:-)
    すいません、てっきり一般ユーザーでもプロフィールで変更できると思ってたらフォーラム管理者のみが変更可能なようです。
    紛らわしいので「管理者」に戻します。

    モデレーター jim912

    (@jim912)

    taiさん、こんばんは。

    .diff(.patch)ファイルです。

    ご教授くださり、ありがとうございます。
    差分のみ送ればよいのですね。やってみますです。

    モデレーター jim912

    (@jim912)

    taiさん、こんばんは。

    見よう見まねで投げてみました。

    Ticket #8759 Word count function doesn’t work in several languages

    おかしかったり、説明不足なところがありましたら、補足・修正いただけるとうれしいです。

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • トピック「投稿編集時の「単語数」」には新たに返信することはできません。