<commit_before># -*- coding: utf-8 -*-
require_relative 'model/intent'
require_relative 'model/intent_token'

Plugin.create(:intent) do
  # 全てのIntentを列挙するためのフィルタ
  defevent :intent_catalog,
           prototype: [:<<]

  # _uri_ を開くことができる Model を列挙するためのフィルタ
  defevent :model_of_uri,
           prototype: [URI, :<<]

  # _model_slug_ を開くことができる Intent を列挙するためのフィルタ
  defevent :intent_select_by_model_slug,
           prototype: [Symbol, :<<]

  # 第二引数のリソースを、第一引数のIntentのうちどれで開くかを決められなかった時に発生する。
  # intent_selectorプラグインがこれを受け取ってダイアログとか出す
  defevent :intent_select,
           prototype: [Enumerable, tcor(URI, String, Retriever::Model)]

  # IntentTokenの次にあたるintentを発生させる。
  defevent :intent_forward,
           priority: :ui_response,
           prototype: [Plugin::Intent::IntentToken]

  # _model_ を開く方法を新しく登録する。
  # ==== Args
  # [model] サポートするModelのClass
  # [label:]
  #   開き方を説明する文字列。
  #   あるModelを開く手段が複数ある場合、ユーザは _label_ の内容とともに、どうやって開くか選択することになる。
  #   省略した場合はpluginの名前になる
  # [slug:]
  #   このintentのslug。他のintentと重複してはならない。
  #   通常は指定しなくてもユニークなslugが割り当てられるが、同じ _model_ に二つ以上のintentを登録する場合は、同じslugが自動生成されてしまうので、ユニークな値を設定しなければならない。
  #   省略した場合はPluginとModelから自動生成される
  # [&proc]
  #   パーマリンクを開く時に、 Plugin::Intent::IntentToken を引数に呼ばれる。
  # ==== Return
  # self
  defdsl :intent do |model, label: nil, slug: :"#{self.spec[:slug]}_#{model.slug}", &proc|
    label ||= (self.spec[:name] || self.spec[:slug])
    my_intent = Plugin::Intent::Intent.new(slug: slug, label: label, model_slug: model.slug)
    filter_intent_select_by_model_slug do |target_model_slug, intents|
      if model.slug == target_model_slug
        intents << my_intent
      end
      [target_model_slug, intents]
    end
    filter_intent_all do |intents|
      intents << my_intent
      [intents]
    end
    add_event(:"intent_open_#{slug}", &proc)
    self
  end

  command(:intent_open,
          name: _('開く'),
          condition: lambda{ |opt| opt.messages.size == 1 },
          visible: true,
          role: :timeline) do |opt|<commit_msg>intent: 第一引数はModelのslugも受け入れる<commit_after># -*- coding: utf-8 -*-
require_relative 'model/intent'
require_relative 'model/intent_token'

Plugin.create(:intent) do
  # 全てのIntentを列挙するためのフィルタ
  defevent :intent_catalog,
           prototype: [:<<]

  # _uri_ を開くことができる Model を列挙するためのフィルタ
  defevent :model_of_uri,
           prototype: [URI, :<<]

  # _model_slug_ を開くことができる Intent を列挙するためのフィルタ
  defevent :intent_select_by_model_slug,
           prototype: [Symbol, :<<]

  # 第二引数のリソースを、第一引数のIntentのうちどれで開くかを決められなかった時に発生する。
  # intent_selectorプラグインがこれを受け取ってダイアログとか出す
  defevent :intent_select,
           prototype: [Enumerable, tcor(URI, String, Retriever::Model)]

  # IntentTokenの次にあたるintentを発生させる。
  defevent :intent_forward,
           priority: :ui_response,
           prototype: [Plugin::Intent::IntentToken]

  # _model_ を開く方法を新しく登録する。
  # ==== Args
  # [model] サポートするModel(Class)又はModelのslug(Symbol)
  # [label:]
  #   開き方を説明する文字列。
  #   あるModelを開く手段が複数ある場合、ユーザは _label_ の内容とともに、どうやって開くか選択することになる。
  #   省略した場合はpluginの名前になる
  # [slug:]
  #   このintentのslug。他のintentと重複してはならない。
  #   通常は指定しなくてもユニークなslugが割り当てられるが、同じ _model_ に二つ以上のintentを登録する場合は、同じslugが自動生成されてしまうので、ユニークな値を設定しなければならない。
  #   省略した場合はPluginとModelから自動生成される
  # [&proc]
  #   パーマリンクを開く時に、 Plugin::Intent::IntentToken を引数に呼ばれる。
  # ==== Return
  # self
  defdsl :intent do |model, label: nil, slug: nil, &proc|
    model = Retriever::Model(model) unless model.is_a?(Class)
    slug ||= :"#{self.spec[:slug]}_#{model.slug}"
    label ||= (self.spec[:name] || self.spec[:slug])
    my_intent = Plugin::Intent::Intent.new(slug: slug, label: label, model_slug: model.slug)
    filter_intent_select_by_model_slug do |target_model_slug, intents|
      if model.slug == target_model_slug
        intents << my_intent
      end
      [target_model_slug, intents]
    end
    filter_intent_all do |intents|
      intents << my_intent
      [intents]
    end
    add_event(:"intent_open_#{slug}", &proc)
    self
  end

  command(:intent_open,
          name: _('開く'),
          condition: lambda{ |opt| opt.messages.size == 1 },
          visible: true,
          role: :timeline) do |opt|
{'fraction_non_alphanumeric': 0.11746411483253588, 'fraction_numerical': 0.0009569377990430622, 'mean_word_length': 3.7349943374858436, 'pattern_counts': {'":': 0, '<': 23, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2333593', 'n_tokens_mistral': 1937, 'n_tokens_neox': 1931, 'n_words': 256}