197x #3 LT 発表資料

長時間バージョンのようなものが btronclub/20110122/presen.html にあります。

ruby 1.9 でオレオレ文字コードを使う法

 

きしもと(Internetで見かける岸本さんはひらがなの法則)

id:metanest

@metanest や @metaneet は私ではありません

gravater

 

 

ruby で新しいエンコーディングのサポート

 

公式には「サポートの要望を出してくださいね」ということになっている。

でも...

 

 

ダミーエンコーディング

以下のようなスクリプトが動く。

require "troncode"
open("sample.tad", "rb:TADTextBE") {|file|
        s = file.read
}

 

 

 

オレオレエンコーディングをつかう

Encode

構造体

static OnigEncodingType stateless_TADTextBE = {
    &stateless_TADTextBE_mbc_enc_len,
    "stateless-TADTextBE",  /* name */
    4,  /* max byte length */
    4,  /* min byte length */
    &stateless_TADTextBE_is_mbc_newline,
    &stateless_TADTextBE_mbc_to_code,
    &stateless_TADTextBE_code_to_mbclen,
    &stateless_TADTextBE_code_to_mbc,
    &stateless_TADTextBE_mbc_case_fold,
    &stateless_TADTextBE_apply_all_case_fold,
    &stateless_TADTextBE_get_case_fold_codes_by_str,
    &stateless_TADTextBE_property_name_to_ctype,
    &stateless_TADTextBE_is_code_ctype,
    &stateless_TADTextBE_get_ctype_code_range,
    &stateless_TADTextBE_left_adjust_char_head,
    &stateless_TADTextBE_is_allowed_reverse_match
};

登録

rb_enc_register("stateless-TADTextBE", &stateless_TADTextBE);

 

LT 本番では、ここでドラとなりました

 

オレオレエンコーディング(に|から)変換する

トランスコード

<%
  map = {
    "00{00-20}" => :func_so,  # Control
    "{21-7e}{21-7e}" => :func_so,  # A Zone
    "{80-fd}{21-7e}" => :func_so,  # B Zone
    "{21-7e}{80-fd}" => :func_so,  # C Zone
    "{80-fd}{80-fd}" => :func_so,  # D Zone
    "fe{21-7e,80-fd}" => :func_so,  # Script/Language Change
    "fefe" => :func_si,  # Script/Language Escape
  }
  transcode_generate_node(ActionMap.parse(map), "TADTextBE_decoder")

  map = {
    "{00,fe}{21-7e,80-fd}" => :func_so,  # Script/Language Change
  }
  transcode_generate_node(ActionMap.parse(map), "TADTextBE_decoder_lang_escape")
%>

<%= transcode_generated_code %>

static const rb_transcoder
rb_TADTextBE_decoder = {
    "TADTextBE", "stateless-TADTextBE", TADTextBE_decoder,
    TRANSCODE_TABLE_INFO,
    2, /* input_unit_length */
    4, /* max_input */
    4, /* max_output */
    incompat_converter, /* asciicompat_type */
    2, tadtext_init, tadtext_init, /* state_size, state_init, state_fini */
    NULL, &fun_si_TADTextBE_decoder, NULL, &fun_so_TADTextBE_decoder
};

まとめ