oulipo 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/README.md +15 -7
- data/lib/oulipo.rb +1 -1
- data/lib/oulipo/string_extensions.rb +12 -4
- data/oulipo.gemspec +1 -1
- data/spec/lipograms_spec.rb +16 -1
- metadata +1 -1
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -14,7 +14,7 @@ Install with `gem install oulipo` and `require 'oulipo'` as needed.
|
|
14
14
|
|
15
15
|
Oulipo can detect lipograms and pangrams.
|
16
16
|
|
17
|
-
A lipogram willfully shuns one or more letters of the alphabet.
|
17
|
+
A **lipogram** willfully shuns one or more letters of the alphabet.
|
18
18
|
|
19
19
|
In the following snippet of a poem, every letter of the alphabet except 'e' is used:
|
20
20
|
|
@@ -32,7 +32,7 @@ Oulipo.lipogram?(stanza) # => true
|
|
32
32
|
Oulipo.absent_letters(stanza) # => ['e']
|
33
33
|
```
|
34
34
|
|
35
|
-
In contrast, a pangram uses all the letters of the alphabet (often seen jumping lazy dogs):
|
35
|
+
In contrast, a **pangram** uses all the letters of the alphabet (often seen jumping lazy dogs):
|
36
36
|
|
37
37
|
```ruby
|
38
38
|
sentence = 'Big fjords vex quick waltz nymph.'
|
@@ -40,9 +40,17 @@ sentence = 'Big fjords vex quick waltz nymph.'
|
|
40
40
|
Oulipo.pangram?(sentence) # => true
|
41
41
|
```
|
42
42
|
|
43
|
+
The **prisoner's constraint**, also known as the **Macao constraint**, is a type of lipogram in which no letters can be ascenders (b, d, f, g, h, j, k, l) or descenders (p, q, t, y).
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
line = "rain's music runs in rivers"
|
47
|
+
|
48
|
+
Oulipo.prisoner?(line) # => true
|
49
|
+
```
|
50
|
+
|
43
51
|
## Univocalims
|
44
52
|
|
45
|
-
A univocalism is a poem written using only one type of vowel.
|
53
|
+
A **univocalism** is a poem written using only one type of vowel.
|
46
54
|
|
47
55
|
```ruby
|
48
56
|
poem = <<-POEM
|
@@ -57,7 +65,7 @@ Oulipo.univocalism?(poem) # => true
|
|
57
65
|
|
58
66
|
## Palindromes
|
59
67
|
|
60
|
-
Palindromes read the same way, backwards or forwards:
|
68
|
+
**Palindromes** read the same way, backwards or forwards:
|
61
69
|
|
62
70
|
```ruby
|
63
71
|
Oulipo.palindrome?('Eva, can I stab bats in a cave?') # => true
|
@@ -65,7 +73,7 @@ Oulipo.palindrome?('Eva, can I stab bats in a cave?') # => true
|
|
65
73
|
|
66
74
|
## Chaterisms
|
67
75
|
|
68
|
-
A chaterism is a poem where either each successive word in the poem grows by one letter (also known as "snowball poem") or shrinks by one letter.
|
76
|
+
A **chaterism** is a poem where either each successive word in the poem grows by one letter (also known as "snowball poem") or shrinks by one letter.
|
69
77
|
|
70
78
|
```ruby
|
71
79
|
Oulipo.chaterism? 'Ruby loves poetry!' # => true
|
@@ -107,7 +115,7 @@ Oulipo.alliteration?(phrase, :threshold => 0.9) # => false
|
|
107
115
|
|
108
116
|
## N+7
|
109
117
|
|
110
|
-
In N+7 (sometimes known as S+7), each noun in a text is replaced with the noun seven entries after it in a dictionary.
|
118
|
+
In **N+7** (sometimes known as **S+7**), each noun in a text is replaced with the noun seven entries after it in a dictionary.
|
111
119
|
|
112
120
|
```ruby
|
113
121
|
dictionary = Oulipo::WordList.load('big_list_of_nouns.txt')
|
@@ -134,7 +142,7 @@ king_john = 'To gild refined gold, to paint the lily'
|
|
134
142
|
Oulipo.n_plus(1, king_john, dictionary) # => 'To mine refined ore, to cast the iron'
|
135
143
|
```
|
136
144
|
|
137
|
-
##
|
145
|
+
## String Extensions
|
138
146
|
|
139
147
|
You can optionally extend `String`, if you need to.
|
140
148
|
|
data/lib/oulipo.rb
CHANGED
@@ -8,7 +8,7 @@ module Oulipo
|
|
8
8
|
|
9
9
|
[:absent_letters, :pangram?, :lipogram?, :chaterism?,
|
10
10
|
:univocalism?, :snowball?, :palindrome?, :alliteration?,
|
11
|
-
:alliterativity].each do |method|
|
11
|
+
:alliterativity, :present_letters, :prisoner?].each do |method|
|
12
12
|
define_singleton_method(method.to_sym) do |*args|
|
13
13
|
EnhancedString.new(args.shift).send(method.to_sym, *args)
|
14
14
|
end
|
@@ -2,6 +2,7 @@ module Oulipo
|
|
2
2
|
module StringExtensions
|
3
3
|
ALPHABET = 'a'..'z'
|
4
4
|
VOWELS = %w{ a e i o u }
|
5
|
+
ASCENDERS_AND_DESCENDERS = %w{ b d f g h j k l p q t y }
|
5
6
|
|
6
7
|
# Whether the string uses alliteration or not.
|
7
8
|
# Accepts a :threshold option for determining whether the string
|
@@ -48,7 +49,6 @@ module Oulipo
|
|
48
49
|
|
49
50
|
# Returns true if only one vowel is used
|
50
51
|
def univocalism?
|
51
|
-
present_letters = self.downcase.split('').uniq
|
52
52
|
(VOWELS - present_letters).length == 4
|
53
53
|
end
|
54
54
|
|
@@ -67,9 +67,12 @@ module Oulipo
|
|
67
67
|
|
68
68
|
# Returns an array of letters that are absent
|
69
69
|
def absent_letters
|
70
|
-
|
71
|
-
|
72
|
-
|
70
|
+
remaining = ALPHABET.to_a - present_letters
|
71
|
+
remaining.empty? ? nil : remaining
|
72
|
+
end
|
73
|
+
|
74
|
+
def present_letters
|
75
|
+
self.downcase.gsub(/[^a-z]/, '').split('').uniq.sort
|
73
76
|
end
|
74
77
|
|
75
78
|
# Returns true if all letters of the alphabet are used
|
@@ -82,5 +85,10 @@ module Oulipo
|
|
82
85
|
!self.pangram?
|
83
86
|
end
|
84
87
|
|
88
|
+
# Returns true if no letters are ascenders (b, d, f, g, h, j, k, l) or descenders (p, q, t, y)
|
89
|
+
def prisoner?
|
90
|
+
(ASCENDERS_AND_DESCENDERS & present_letters).empty?
|
91
|
+
end
|
92
|
+
|
85
93
|
end
|
86
94
|
end
|
data/oulipo.gemspec
CHANGED
data/spec/lipograms_spec.rb
CHANGED
@@ -5,12 +5,19 @@ describe "lipograms and pangrams" do
|
|
5
5
|
|
6
6
|
let(:pangram) { 'The quick brown fox jumps over a lazy god' }
|
7
7
|
let(:lipogram) { 'The quick grey fox jumps over lazy gods' }
|
8
|
+
let(:prisoner) { "rain's music runs in rivers" }
|
9
|
+
let(:bradley_manning) { 'bradley e. manning' }
|
8
10
|
|
9
11
|
it "shows absent letters" do
|
10
12
|
pangram.absent_letters.should be_nil
|
11
13
|
lipogram.absent_letters.should == %w{ b n w }
|
12
14
|
end
|
13
15
|
|
16
|
+
it "shows present letters" do
|
17
|
+
pangram.present_letters.should == ('a'..'z').to_a
|
18
|
+
lipogram.present_letters.should == ('a'..'z').to_a - %w{ b n w }
|
19
|
+
end
|
20
|
+
|
14
21
|
it "can tell a pangram from a lipogram" do
|
15
22
|
lipogram.should be_lipogram
|
16
23
|
pangram.should_not be_lipogram
|
@@ -19,8 +26,16 @@ describe "lipograms and pangrams" do
|
|
19
26
|
pangram.should be_pangram
|
20
27
|
end
|
21
28
|
|
29
|
+
it "can tell a prisoner's constraint" do
|
30
|
+
prisoner.should be_prisoner
|
31
|
+
lipogram.should_not be_prisoner
|
32
|
+
pangram.should_not be_prisoner
|
33
|
+
bradley_manning.should_not be_prisoner
|
34
|
+
end
|
35
|
+
|
22
36
|
it "is accessible via Oulipo" do
|
23
|
-
Oulipo.should forward_to_enhanced_string(:
|
37
|
+
Oulipo.should forward_to_enhanced_string(:absent_letters, :present_letters,
|
38
|
+
:lipogram?, :pangram?, :prisoner?)
|
24
39
|
end
|
25
40
|
|
26
41
|
end
|