cardname 0.1 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/cardname/contextual.rb +75 -62
- data/lib/cardname/variants.rb +1 -1
- data/lib/cardname.rb +15 -11
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5cc3696416bb4628e7059042f1e6761cf61f49a9
|
4
|
+
data.tar.gz: ade3ca4f9d5d2a312723442ebc6c16d6ffdd569b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3abca29801123d048d89189fbf9079ee70d6f14a24c63732a77fdcaa8c833c9481732f50a40248c8aad72b65438806eae7a23f930432f36a1575af7d6216b992
|
7
|
+
data.tar.gz: e44752dd9ba9670e5082d8cbe45b169d7d54d7e8b8497e18b61c7309e096884898fc78bbb0d4eba2ad152d46c1ba2fa1f13d5504c97ce8a2b1e629487408188f
|
data/lib/cardname/contextual.rb
CHANGED
@@ -2,14 +2,6 @@ class Cardname
|
|
2
2
|
module Contextual
|
3
3
|
RELATIVE_REGEXP = /\b_(left|right|whole|self|user|main|\d+|L*R?)\b/
|
4
4
|
|
5
|
-
def relative_name context_name
|
6
|
-
to_show(*context_name.to_name.parts).to_name
|
7
|
-
end
|
8
|
-
|
9
|
-
def absolute_name context_name
|
10
|
-
to_absolute_name(context_name)
|
11
|
-
end
|
12
|
-
|
13
5
|
# @return true if name is left or right of context
|
14
6
|
def child_of? context
|
15
7
|
return false unless junction?
|
@@ -18,11 +10,11 @@ class Cardname
|
|
18
10
|
end
|
19
11
|
|
20
12
|
def relative?
|
21
|
-
s =~ RELATIVE_REGEXP
|
13
|
+
starts_with_joint? || (s =~ RELATIVE_REGEXP).present?
|
22
14
|
end
|
23
15
|
|
24
16
|
def simple_relative?
|
25
|
-
|
17
|
+
starts_with_joint? && (s =~ RELATIVE_REGEXP).nil?
|
26
18
|
end
|
27
19
|
|
28
20
|
def absolute?
|
@@ -34,43 +26,52 @@ class Cardname
|
|
34
26
|
end
|
35
27
|
|
36
28
|
def starts_with_joint?
|
37
|
-
|
29
|
+
junction? && parts.first.empty?
|
38
30
|
end
|
39
31
|
|
40
|
-
def
|
41
|
-
|
32
|
+
def from *from
|
33
|
+
name_from(*from).s
|
34
|
+
end
|
42
35
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
36
|
+
# if possible, relativize name into one beginning with a "+". To do so, it must absolutize back to the correct
|
37
|
+
# original name in the context of "from"
|
38
|
+
def name_from *from
|
39
|
+
remaining = parts_excluding *from
|
40
|
+
return self unless context_relevant?(remaining)
|
41
|
+
compressed = remaining.compact.unshift(nil).to_name # exactly one nil at beginning
|
42
|
+
key == compressed.absolute_name(from).key ? compressed : self
|
43
|
+
end
|
47
44
|
|
48
|
-
|
45
|
+
def context_relevant? remaining
|
46
|
+
remaining.compact.any? && # not all name parts in context
|
47
|
+
remaining != parts # some name parts in context (could be faster test!)
|
48
|
+
end
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
50
|
+
def parts_excluding *string
|
51
|
+
exclude_name = string.to_name
|
52
|
+
exclude_keys = exclude_name ? exclude_name.part_names.map(&:key) : []
|
53
|
+
parts_minus exclude_keys
|
55
54
|
end
|
56
55
|
|
57
|
-
def
|
58
|
-
|
56
|
+
def parts_minus keys_to_ignore
|
57
|
+
parts.map do |part|
|
58
|
+
next if part.empty?
|
59
|
+
next if part =~ /^_/ # this removes relative parts. why?
|
60
|
+
next if keys_to_ignore.member? part.to_name.key
|
61
|
+
part
|
62
|
+
end
|
63
|
+
end
|
59
64
|
|
60
|
-
|
65
|
+
def absolute context, args={}
|
66
|
+
context = (context || "").to_name
|
67
|
+
new_parts = absolutize_contextual_parts context
|
61
68
|
return "" if new_parts.empty?
|
62
|
-
|
63
|
-
if new_parts.first.empty? && !new_parts.to_name.starts_with?(context)
|
64
|
-
new_parts[0] = context.to_s
|
65
|
-
end
|
66
|
-
if new_parts.last.empty? && !new_parts.to_name.ends_with?(context)
|
67
|
-
new_parts[-1] = context.to_s
|
68
|
-
end
|
69
|
+
absolutize_extremes new_parts, context.s
|
69
70
|
new_parts.join self.class.joint
|
70
71
|
end
|
71
72
|
|
72
|
-
def
|
73
|
-
|
73
|
+
def absolute_name *args
|
74
|
+
absolute(*args).to_name
|
74
75
|
end
|
75
76
|
|
76
77
|
def nth_left n
|
@@ -80,35 +81,47 @@ class Cardname
|
|
80
81
|
|
81
82
|
private
|
82
83
|
|
83
|
-
def
|
84
|
+
def absolutize_contextual_parts context
|
84
85
|
parts.map do |part|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
86
|
+
case part
|
87
|
+
when /^_user$/i then user_part part
|
88
|
+
when /^_main$/i then self.class.params[:main_name]
|
89
|
+
when /^(_self|_whole|_)$/i then context.s
|
90
|
+
when /^_left$/i then context.trunk
|
91
|
+
# note - inconsistent use of left v. trunk
|
92
|
+
when /^_right$/i then context.tag
|
93
|
+
when /^_(\d+)$/i then ordinal_part $~[1].to_i, context
|
94
|
+
when /^_(L*)(R?)$/i then partmap_part $~, context
|
95
|
+
else part
|
96
|
+
end.to_s.strip
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def user_part part
|
101
|
+
name_proc = self.class.session
|
102
|
+
name_proc ? name_proc.call : part
|
103
|
+
end
|
104
|
+
|
105
|
+
def ordinal_part pos, context
|
106
|
+
pos = context.length if pos > context.length
|
107
|
+
context.parts[pos - 1]
|
108
|
+
end
|
109
|
+
|
110
|
+
def partmap_part match, context
|
111
|
+
l_s, r_s = match[1].size, !match[2].empty?
|
112
|
+
l_part = context.nth_left l_s
|
113
|
+
r_s ? l_part.tag : l_part.s
|
114
|
+
end
|
115
|
+
|
116
|
+
def absolutize_extremes new_parts, context
|
117
|
+
[0, -1].each do |i|
|
118
|
+
next if new_parts[i].present?
|
119
|
+
# following avoids recontextualizing with relative contexts.
|
120
|
+
# Eg, `+A+B+.absolute('+A')` should be +A+B, not +A+A+B.
|
121
|
+
next if new_parts.to_name.send "#{[ :start, :end ][i]}s_with?", context
|
122
|
+
new_parts[i] = context
|
111
123
|
end
|
112
124
|
end
|
125
|
+
|
113
126
|
end
|
114
127
|
end
|
data/lib/cardname/variants.rb
CHANGED
data/lib/cardname.rb
CHANGED
@@ -26,24 +26,28 @@ class Cardname < Object
|
|
26
26
|
:session, :stabilize
|
27
27
|
|
28
28
|
Cardname.joint = '+'
|
29
|
-
Cardname.banned_array =
|
29
|
+
Cardname.banned_array = %w{ / }
|
30
30
|
Cardname.var_re = /\{([^\}]*\})\}/
|
31
31
|
Cardname.uninflect = :singularize
|
32
32
|
Cardname.stabilize = false
|
33
33
|
|
34
34
|
JOINT_RE = Regexp.escape joint
|
35
35
|
|
36
|
-
@@
|
36
|
+
@@cache = {}
|
37
37
|
|
38
38
|
class << self
|
39
39
|
def new obj
|
40
40
|
return obj if obj.is_a? self.class
|
41
41
|
str = stringify obj
|
42
|
-
|
42
|
+
cached_name(str) || super(str)
|
43
43
|
end
|
44
44
|
|
45
|
-
def
|
46
|
-
@@
|
45
|
+
def cached_name str
|
46
|
+
@@cache[str]
|
47
|
+
end
|
48
|
+
|
49
|
+
def reset_cache str=nil
|
50
|
+
str ? @@cache.delete(str) : @@cache = {}
|
47
51
|
end
|
48
52
|
|
49
53
|
def stringify obj
|
@@ -63,13 +67,12 @@ class Cardname < Object
|
|
63
67
|
# Usually that means the name is a proper noun and not a plural.
|
64
68
|
# You can choose between two solutions:
|
65
69
|
# 1. don't uninflect if the uninflected key is not stable (stabilize = false)
|
66
|
-
# (probably the best choice because you want Matthias not to be the same as Matthium)
|
67
70
|
# 2. uninflect until the key is stable (stabilize = true)
|
68
|
-
def
|
69
|
-
key_one = name.send(
|
70
|
-
key_two = key_one.send(
|
71
|
+
def stable_key name
|
72
|
+
key_one = name.send(uninflect)
|
73
|
+
key_two = key_one.send(uninflect)
|
71
74
|
return key_one unless key_one != key_two
|
72
|
-
|
75
|
+
stabilize ? stable_key(key_two) : name
|
73
76
|
end
|
74
77
|
end
|
75
78
|
|
@@ -77,13 +80,14 @@ class Cardname < Object
|
|
77
80
|
# ~~~~~~~~~~~~~~~~~~~~~~ INSTANCE ~~~~~~~~~~~~~~~~~~~~~~~~~
|
78
81
|
attr_reader :key, :s
|
79
82
|
alias to_s s
|
83
|
+
alias to_str s
|
80
84
|
|
81
85
|
def initialize str
|
82
86
|
@s = str.to_s.strip
|
83
87
|
@s = @s.encode('UTF-8') if RUBYENCODING
|
84
88
|
initialize_parts
|
85
89
|
@key = @part_keys.join(self.class.joint)
|
86
|
-
@@
|
90
|
+
@@cache[str] = self
|
87
91
|
end
|
88
92
|
|
89
93
|
def to_name
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cardname
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Gerry Gleason
|
8
7
|
- Ethan McCutchen
|
9
8
|
- Philipp Kühl
|
9
|
+
- Gerry Gleason
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-
|
13
|
+
date: 2017-09-27 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -83,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
83
|
version: '0'
|
84
84
|
requirements: []
|
85
85
|
rubyforge_project:
|
86
|
-
rubygems_version: 2.6.
|
86
|
+
rubygems_version: 2.6.13
|
87
87
|
signing_key:
|
88
88
|
specification_version: 4
|
89
89
|
summary: Card names without all the cards
|