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.

Parameters:

  • input (String)

    The paragraph which will be converted.

Returns:

  • (String)

    Paragraph with correct spaces around 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.

Parameters:

  • input (String)

    The paragraph which will be converted.

Returns:

  • (String)

    Paragraph with ellipses.



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.

Parameters:

  • input (String)

    The paragraph which will be converted.

Returns:

  • (String)

    Paragraph with corrected emdashes.



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.

Parameters:

  • input (String)

    The paragraph which will be converted.

Returns:

  • (String)

    Paragraph with corrected endashes.



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.

Parameters:

  • input (String)

    The text which will be converted.

  • lang (Symbol) (defaults to: :general)

    Sets the language (english name like “czech”, “german”, etc.)

Returns:

  • (String)

    Text with improved typography.



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.

Parameters:

  • input (String)

    The paragraph which will be converted.

  • convert (Array) (defaults to: [:all])

    Array of symbols with features that should be improved (possibilities: all, hyphens, quotes, ellipsis, dashes, abbreviations, prepositions, numbers, dates, characters, brackets, multiplication, units, widows)

Returns:

  • (String)

    Paragraph with improved 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.

Parameters:

  • input (String)

    The paragraph which will be converted.

Returns:

  • (String)

    Paragraph with converted characters.



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.

Parameters:

  • input (String)

    The paragraph which will be converted.

Returns:

  • (String)

    Paragraph with correct multiplication signs.



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.)

Parameters:

  • input (String)

    The paragraph which will be converted.

Returns:

  • (String)

    Paragraph with non-breaking spaces after name abbreviations.



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.

Parameters:

  • input (String)

    The paragraph which will be converted.

Returns:

  • (String)

    Paragraph with correct 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.

Parameters:

  • input (String)

    The paragraph which will be converted.

  • type (String) (defaults to: '"“”„')

    Character which will be substited for correct quotes.

  • start_quotes (String) (defaults to: "“")

    The character used for starting quotes.

  • end_quotes (String) (defaults to: "”")

    The character used for ending quotes.

Returns:

  • (String)

    Paragraph with correct double quotes.



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.

Parameters:

  • input (String)

    The paragraph which will be converted.

  • lang (String) (defaults to: "en_us")

    Sets the language of hyphenation. One of the languages a / text-hyphen gem can use.

  • left (Integer) (defaults to: 2)

    Number of characters on the beginning of the words which cannnot be hyphenated.

  • right (Integer) (defaults to: 2)

    Number of characters on the beginning of the words which cannnot be hyphenated.

  • char (Integer) (defaults to: "­")

    The character which will be added to hyphenation places.

Returns:

  • (String)

    Paragraph with added hyphenation characters.



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+\-.]+@[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.

Parameters:

  • input (String)

    The paragraph which will be converted.

Returns:

  • (String)

    Paragraph with correct spaces 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.

Parameters:

  • input (String)

    The paragraph which will be converted.

Returns:

  • (String)

    Paragraph without trailing spaces.



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.

Parameters:

  • input (String)

    The paragraph which will be converted.

Returns:

  • (String)

    Paragraph with correct spaces between number and unit.



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.

Parameters:

  • input (String)

    The paragraph which will be converted.

Returns:

  • (String)

    Paragraph with removed widows.



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

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