File: score.rb

package info (click to toggle)
mikutter 4.1.3%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 9,260 kB
  • sloc: ruby: 20,126; sh: 183; makefile: 19
file content (83 lines) | stat: -rw-r--r-- 2,750 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# -*- coding: utf-8 -*-
require_relative 'model/emoji_note'
require_relative 'model/hyper_link_note'
require_relative 'model/text_note'
require_relative 'select'

Plugin.create(:score) do
  # _model_ のdescriptionの値を score_filter に渡して得られるScoreのうち、最も利用に適したものを返す。
  # score_filterの結果を使うのはしんどいので、このメソッドを通して使ったほうが良いよ。
  # ==== Args
  # [model] descriptionメソッドが定義されているオブジェクト (Diva::Model)
  # ==== Return
  # [Enumerable] 内容をModelの配列にしたもの
  defdsl :score_of do |model|
    Plugin::Score.score_by_score(model)
  end

  intent Plugin::Score::HyperLinkNote, label: 'Link Text' do |intent_token|
    forward_to = intent_token.model.reference
    if forward_to
      Plugin.call(:open, forward_to)
    else
      intent_token.forward
    end
  end

  # generic URL
  filter_score_filter do |target_model, note, yielder|
    if target_model != note
      text = note.description
      matched = URI.regexp(%w<http https>).match(text)
      if matched
        score = Array.new
        if matched.begin(0) != 0
          score << Plugin::Score::TextNote.new(
            description: text[0...matched.begin(0)])
        end
        score << Diva::Model(:web).new(perma_link: matched.to_s)
        if matched.end(0) != text.size
          score << Plugin::Score::TextNote.new(
            description: text[matched.end(0)..text.size])
        end
        yielder << score
      end
    end
    [target_model, note, yielder]
  end

  # Entity compat
  filter_score_filter do |target_model, note, yielder|
    if target_model == note && target_model.class.respond_to?(:entity_class) && target_model.class.entity_class && !target_model.links.to_a.empty?
      score = Array.new
      text = target_model.description
      cur = 0
      target_model.links.each do |link|
        range = link[:range]
        if range.first != cur
          score << Plugin::Score::TextNote.new(
            description: text[cur...range.first])
        end
        if link[:open].is_a?(Diva::Model)
          related_model = link[:open]
          uri = link[:open].uri
        else
          related_model = nil
          uri = link[:open] || link[:url]
        end
        score << Plugin::Score::HyperLinkNote.new(
          description: link[:face] || text[range],
          model: related_model,
          uri: uri
        )
        cur = range.last + (range.exclude_end? ? 0 : 1)
      end
      if cur != text.size
        score << Plugin::Score::TextNote.new(
          description: text[cur..text.size])
      end
      yielder << score
    end
    [target_model, note, yielder]
  end
end