wikimovia 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/wikimovia/formatters/date_formatter.rb +26 -0
- data/lib/wikimovia/formatters/link_formatter.rb +29 -0
- data/lib/wikimovia/formatters/plainlist_formatter.rb +21 -0
- data/lib/wikimovia/formatters/time_formatter.rb +19 -0
- data/lib/wikimovia/template_extractor.rb +53 -0
- data/lib/wikimovia/utilities.rb +16 -0
- metadata +7 -1
@@ -0,0 +1,26 @@
|
|
1
|
+
module Wikimovia
|
2
|
+
module Formatters
|
3
|
+
class DateFormatter
|
4
|
+
include Wikimovia::Utilities
|
5
|
+
|
6
|
+
FILM_DATE_PATTERN = /\{\{film date\|(.*)\}\}/m
|
7
|
+
YEAR_PATTERN = /^\d{4}$/
|
8
|
+
|
9
|
+
# Formats a date string based on the following conditions:
|
10
|
+
# * If it is of the format {film date|year|month|day}, it will return a
|
11
|
+
# {Date} matching those values.
|
12
|
+
# * If it is a year, it will return the year.
|
13
|
+
# * Otherwise it returns the string as it was.
|
14
|
+
def format(string)
|
15
|
+
case string
|
16
|
+
when YEAR_PATTERN then string.to_i
|
17
|
+
when FILM_DATE_PATTERN
|
18
|
+
string = extract_pattern(FILM_DATE_PATTERN, string)
|
19
|
+
numbers = string.split('|').map(&:to_i)
|
20
|
+
Date.new(numbers[0], numbers[1], numbers[2])
|
21
|
+
else string
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Wikimovia
|
2
|
+
module Formatters
|
3
|
+
class LinkFormatter
|
4
|
+
include Wikimovia::Utilities
|
5
|
+
|
6
|
+
PATTERN = /\[\[(.*)\]\]/
|
7
|
+
LINK_PATTERN = /^.*\|(.*)$/
|
8
|
+
|
9
|
+
class <<self
|
10
|
+
def match?(string)
|
11
|
+
string.match(PATTERN) ? true : false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# If the string provided is wrapped in '[[' and ']]', returns the
|
16
|
+
# contents of those wrappers. If it is of the format
|
17
|
+
# [linked article|link name] it will return the link name.
|
18
|
+
def format(string)
|
19
|
+
contents = extract_pattern(PATTERN, string)
|
20
|
+
|
21
|
+
if contents.match(LINK_PATTERN)
|
22
|
+
extract_pattern(LINK_PATTERN, contents)
|
23
|
+
else
|
24
|
+
contents
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Wikimovia
|
2
|
+
module Formatters
|
3
|
+
class PlainlistFormatter
|
4
|
+
include Wikimovia::Utilities
|
5
|
+
|
6
|
+
PATTERN = Wikimovia::Utilities.template_regex('plainlist')
|
7
|
+
|
8
|
+
def self.match?(string)
|
9
|
+
string.match(PATTERN) ? true : false
|
10
|
+
end
|
11
|
+
|
12
|
+
# Returns plainlist items as an array.
|
13
|
+
def format(string)
|
14
|
+
string = extract_pattern(PATTERN, string)
|
15
|
+
string.strip!
|
16
|
+
link_formatter = LinkFormatter.new
|
17
|
+
string.split('*').reject(&:empty?).map(&:strip)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Wikimovia
|
2
|
+
module Formatters
|
3
|
+
class TimeFormatter
|
4
|
+
include Wikimovia::Utilities
|
5
|
+
|
6
|
+
MINUTES_PATTERN = /^(\d+) minutes$/
|
7
|
+
|
8
|
+
# If the string matches the pattern of 'NUMBER minutes', returns NUMBER.
|
9
|
+
# otherwise returns the string.
|
10
|
+
def format(string)
|
11
|
+
case string
|
12
|
+
when MINUTES_PATTERN
|
13
|
+
extract_pattern(MINUTES_PATTERN, string).to_i * 60
|
14
|
+
else string
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Wikimovia
|
2
|
+
class TemplateExtractor
|
3
|
+
include Wikimovia::Utilities
|
4
|
+
|
5
|
+
# Given some wikitext syntax, and a :template_name, extracts the first
|
6
|
+
# template with that name it can find and converts it to a {Hash}.
|
7
|
+
def extract_first(string, options = {})
|
8
|
+
pattern = Wikimovia::Utilities.template_regex options[:template_name],
|
9
|
+
use_vertical_bar: false
|
10
|
+
|
11
|
+
wikitext = WikiCloth::Parser.new(data: string).to_wikitext
|
12
|
+
template = extract_pattern(pattern, wikitext)
|
13
|
+
|
14
|
+
if template
|
15
|
+
info_lines = extract_info_lines(template)
|
16
|
+
split_lines = split_infolines(info_lines)
|
17
|
+
cleaned_lines = clean_infolines(split_lines)
|
18
|
+
filtered_lines = filter_infolines(cleaned_lines)
|
19
|
+
hash = Hash[*filtered_lines.flatten]
|
20
|
+
hash.keys.each do |key|
|
21
|
+
hash[(key.to_sym rescue key) || key] = hash.delete(key)
|
22
|
+
end
|
23
|
+
hash
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# Get all info lines and reject any empty ones.
|
30
|
+
def extract_info_lines(string)
|
31
|
+
string.split(/\n^\|/).reject(&:empty?)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Take each infoline and split it into an array of [key, value]
|
35
|
+
def split_infolines(info_lines)
|
36
|
+
info_lines.map { |info_line| info_line.split("=") }
|
37
|
+
end
|
38
|
+
|
39
|
+
# Take each info line array and strip each of its values
|
40
|
+
def clean_infolines(info_lines)
|
41
|
+
info_lines.map do |info_line|
|
42
|
+
info_line.map(&:strip)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Remove any infolines that don't have both a key and a value.
|
47
|
+
def filter_infolines(info_lines)
|
48
|
+
info_lines.
|
49
|
+
reject { |line| line.any?(&:empty?) }.
|
50
|
+
reject { |line| line.size != 2 }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Wikimovia
|
2
|
+
module Utilities
|
3
|
+
def self.template_regex(template_name, options = {})
|
4
|
+
options[:use_vertical_bar] = true if options[:use_vertical_bar].nil?
|
5
|
+
if options[:use_vertical_bar]
|
6
|
+
/\{\{#{template_name}.*\|(.*)\n\}\}/m
|
7
|
+
else
|
8
|
+
/\{\{#{template_name}(.*)\n\}\}/m
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def extract_pattern(pattern, string)
|
13
|
+
string.scan(pattern).flatten.compact.first
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wikimovia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -49,6 +49,12 @@ executables: []
|
|
49
49
|
extensions: []
|
50
50
|
extra_rdoc_files: []
|
51
51
|
files:
|
52
|
+
- lib/wikimovia/formatters/date_formatter.rb
|
53
|
+
- lib/wikimovia/formatters/link_formatter.rb
|
54
|
+
- lib/wikimovia/formatters/plainlist_formatter.rb
|
55
|
+
- lib/wikimovia/formatters/time_formatter.rb
|
56
|
+
- lib/wikimovia/template_extractor.rb
|
57
|
+
- lib/wikimovia/utilities.rb
|
52
58
|
- lib/wikimovia.rb
|
53
59
|
homepage: https://github.com/alex-tan/wikimovia
|
54
60
|
licenses: []
|