Module: Truty::General

Included in:
Truty
Defined in:
lib/truty/general.rb

Overview

Module with general typography fixes for all the languages. The fixes in here should not be language specific.

Author:

  • Matěj Kašpar Jirásek

Instance Method Summary collapse

Instance Method Details

#brackets_whitespace(input) ⇒ String

Fixes spaces around various brackets.


118
119
120
121
122
123
# File 'lib/truty/general.rb', line 118

def brackets_whitespace(input)
  output = input.gsub(/([\(\[\{])\s*/, '\1')
  output = output.gsub(/\s*([\]\)\}])/, '\1')
  output = output.gsub(/\s+([\(\[\{])\s*/, ' \1')
  output = output.gsub(/\s*([\]\)\}])\s+/, '\1 ')
end

#ellipsis(input) ⇒ String

Converts three or more periods (dots, points) into ellipsis.


44
45
46
# File 'lib/truty/general.rb', line 44

def ellipsis(input)
  input.gsub(/\.{3,}/, "…")
end

#emdash(input) ⇒ String

Adds thin spaces to emdash from both sides. Also converts two or three hyphens to emdash.


52
53
54
# File 'lib/truty/general.rb', line 52

def emdash(input)
  input.gsub(/\s+(—|-{2,3})\s+/, " — ")
end

#endash(input) ⇒ String

Adds non-breaking space before endash.


60
61
62
# File 'lib/truty/general.rb', line 60

def endash(input)
  input.gsub(/\s+(–|-)\s+/, " – ")
end

#fix(input, lang = :general, convert = [:all]) ⇒ String

Improves the typography of the large plain text with paragraphs. Adds non-breaking spaces, hyphenation, fixes dashes, etc.


13
14
15
16
17
18
# File 'lib/truty/general.rb', line 13

def fix(input, lang = :general, convert = [:all])
  if not Truty.respond_to? lang then
    lang = :general
  end
  input.split("\n").collect { |p| Truty.send lang, p, convert }.join("\n")
end

#general(input, convert = [:all]) ⇒ String

Improves basic non-language specific issues in typography.


25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/truty/general.rb', line 25

def general(input, convert = [:all])
  output = input
  output = ellipsis(output) if (convert.include?(:all) || convert.include?(:ellipsis))
  output = multicharacters(output) if (convert.include? (:all) || convert.include?(:characters))
  output = brackets_whitespace(output) if (convert.include?(:all) || convert.include?(:brackets))
  output = emdash(output) if (convert.include?(:all) || convert.include?(:dashes))
  output = endash(output) if (convert.include?(:all) || convert.include?(:dashes))
  output = name_abbreviations(output) if (convert.include?(:all) || convert.include?(:abbreviations))
  output = multiplication_sign(output) if (convert.include?(:all) || convert.include?(:multiplication))
  output = space_between_numbers(output) if (convert.include?(:all) || convert.include?(:numbers))
  output = units(output) if (convert.include?(:all) || convert.include?(:units))
  output = widows(output) if (convert.include?(:all) || convert.include?(:widows))
  output
end

#multicharacters(input) ⇒ String

Tries to substitute more characters which should be one, like “©”, “™”, etc.


129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/truty/general.rb', line 129

def multicharacters(input)
  output = input.gsub(/\([Cc]\)/, "©")
  output = output.gsub(/\([Pp]\)/, "℗")
  output = output.gsub(/\([Rr]\)/, "®")
  output = output.gsub(/\((SM|sm|Sm)\)/, "℠")
  output = output.gsub(/\((TM|tm|Tm)\)/, "™")
  output = output.gsub(/\+-/, "±")
  output = output.gsub(/-\+/, "∓")
  output = output.gsub(/N[oO]\.?\s*(\d+)/, '№\1')
  output = output.gsub(/°C/, '℃')
  output = output.gsub(/°F/, '℉')
end

#multiplication_sign(input) ⇒ String

Adds multiplication sign between numbers instead of X.


101
102
103
104
# File 'lib/truty/general.rb', line 101

def multiplication_sign(input)
  output = input.gsub(/(\d+)\s{0,1}[Xx]\s{0,1}(\d+)/, '\1 × \2')
  output = output.gsub(/(\d+)[Xx]/, '\1×')
end

#name_abbreviations(input) ⇒ String

Adds non-breaking space after one-character name abbreviation (“A.”, “J.”, etc.)


179
180
181
# File 'lib/truty/general.rb', line 179

def name_abbreviations(input)
  input.gsub(/(\s|^)(([A-Z]\.\s+)+)/) { $1 + $2.gsub(/ +/, " ")}
end

#punctuation_whitespace(input) ⇒ String

Fixes spaces around punctuation.


146
147
148
# File 'lib/truty/general.rb', line 146

def punctuation_whitespace(input)
  input.gsub(/\s*([\!\?\.,;:…]+)\s*/, '\1 ')
end

#quotes(input, type = '"“”„', start_quotes = "“", end_quotes = "”") ⇒ String

Converts quotes to the typograhic ones.


92
93
94
95
# File 'lib/truty/general.rb', line 92

def quotes(input, type = '"“”„', start_quotes = "“", end_quotes = "”")
  regexp = Regexp.new('[' + type + '][^' + type + ']*[' + type + ']')
  input.gsub(regexp) { |s| start_quotes + s[1..-2].gsub(/(^[\s ]+|[\s ]+$)/, "") + end_quotes }
end

#soft_hyphens(input, lang = "en_us", left = 2, right = 2, char = "­") ⇒ String

Adds soft hyphens to the input.


72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/truty/general.rb', line 72

def soft_hyphens(input, lang = "en_us", left = 2, right = 2, char = "­")
  l = Text::Hyphen.new(:language => lang, :left => left, :right => right)
  words = input.split(/[ ]+/m)
  result = []
  words.each_with_index do |w, n|
    if !(w.length < 6 || n == words.size - 1 || w =~ URI::REGEXP || w =~ /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i)
      w = l.visualise(w, char)
    end
    result << w
  end
  result.join(" ")
end

#space_between_numbers(input) ⇒ String

Adds thin non-breaking space between numbers.


110
111
112
# File 'lib/truty/general.rb', line 110

def space_between_numbers(input)
  input.gsub(/(\d)\s+(\d)/, '\1 \2')
end

#trailing_spaces(input) ⇒ String

Removes whitespace after the end of the paragraph.


171
172
173
# File 'lib/truty/general.rb', line 171

def trailing_spaces(input)
  input.gsub(/\s*($|\z)/, '')
end

#units(input) ⇒ String

Fixes non-breaking spaces between number and unit, mainly SI.


154
155
156
157
# File 'lib/truty/general.rb', line 154

def units(input)
  output = input.gsub(/(\d+)\s+(%|‰|‱|℃|℉|°|€|Kč|(Y|Z|E|P|T|G|M|k|h|da|d|m|µ|n|p|f|a|z|y)?(m(²|³)?|g|s|h|A|K|cd|mol|Ω|℃|℉))/, '\1 \2')
  output.gsub(/(\*|§|#|†)\s+(\d+)/, '\1 \2')
end

#widows(input) ⇒ String

Adds non-breaking space before the last word in the paragraph.


163
164
165
# File 'lib/truty/general.rb', line 163

def widows(input)
  input.gsub(/(\s)(\S+(\$|\z))/, ' \2')
end