forked from publify/publify
-
Notifications
You must be signed in to change notification settings - Fork 0
/
transforms.rb
106 lines (89 loc) · 3.69 KB
/
transforms.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# coding: utf-8
class String
Accents = { ['á','à','â','ä','ã','Ã','Ä','Â','À'] => 'a',
['é','è','ê','ë','Ë','É','È','Ê'] => 'e',
['í','ì','î','ï','I','Î','Ì'] => 'i',
['ó','ò','ô','ö','õ','Õ','Ö','Ô','Ò'] => 'o',
['œ'] => 'oe',
['ß'] => 'ss',
['ú','ù','û','ü','U','Û','Ù'] => 'u',
['ç','Ç'] => 'c'
}
def to_permalink
string = self
Accents.keys.each do |key|
string = string.tr(key.join, Accents[key])
end
string = string.tr("'", "-")
string.gsub(/<[^>]*>/, '').to_url
end
# Returns a-string-with-dashes when passed 'a string with dashes'.
# All special chars are stripped in the process
def to_url
return if self.nil?
s = self.downcase.tr("\"'", '')
s = s.gsub(/\P{Word}/, ' ')
s.strip.tr_s(' ', '-').tr(' ', '-').sub(/^$/, "-")
end
# A quick and dirty fix to add 'nofollow' to any urls in a string.
# Decidedly unsafe, but will have to do for now.
def nofollowify
return self if Blog.default.dofollowify
self.gsub(/<a(.*?)>/i, '<a\1 rel="nofollow">')
end
# I pass settings as a parametre to avoid calling Blog.default (and another
# database call) everytime I want to use to_title
# Not sure on this one though.
def to_title(item, settings, params)
s = self
# Tags for params
s = s.gsub('%date%', parse_date(s, params)) if s =~ /%date%/
s = s.gsub('%search%', params[:q]) if params[:q]
s = s.gsub('%page%', parse_page(s, params)) if s=~ /%page%/
# Tags for settings
s = s.gsub('%blog_name%', settings.blog_name)
s = s.gsub('%blog_subtitle%', settings.blog_subtitle)
s = s.gsub('%meta_keywords%', settings.meta_keywords)
# Tags for item
s = s.gsub('%title%', item.title) if s =~ /%title/ and item.respond_to? :title
s = s.gsub('%excerpt%', item.excerpt_text) if s =~ /%excerpt%/ and item.respond_to? :excerpt_text
s = s.gsub('%description%', item.description) if s =~ /%description%/ and item.respond_to? :description
s = s.gsub('%name%', item.name) if s =~ /%name%/ and item.respond_to? :name
s = s.gsub('%author%', item.name) if s =~ /%author%/ and item.respond_to? :name
s = s.gsub('%body%', item.body) if s =~ /%body%/ and item.respond_to? :body
if s =~ /%categories%/ and item.respond_to? :categories
s = s.gsub('%categories%', item.categories.map { |c| c.name }.join(", "))
end
if s =~ /%tags%/ and item.respond_to? :tags
s = s.gsub('%tags%', item.tags.map { |t| t.display_name }.join(", "))
end
# Other
s = s.gsub('%currentdate%', Time.now.strftime(settings.date_format))
s = s.gsub('%currenttime%', Time.now.strftime(settings.time_format))
s = s.gsub('%currentmonth%', Time.now.strftime("%B"))
s = s.gsub('%currentyear%', Time.now.year.to_s)
return s
end
# Strips any html markup from a string
TYPO_TAG_KEY = TYPO_ATTRIBUTE_KEY = /[\w:_-]+/
TYPO_ATTRIBUTE_VALUE = /(?:[A-Za-z0-9]+|(?:'[^']*?'|"[^"]*?"))/
TYPO_ATTRIBUTE = /(?:#{TYPO_ATTRIBUTE_KEY}(?:\s*=\s*#{TYPO_ATTRIBUTE_VALUE})?)/
TYPO_ATTRIBUTES = /(?:#{TYPO_ATTRIBUTE}(?:\s+#{TYPO_ATTRIBUTE})*)/
TAG = %r{<[!/?\[]?(?:#{TYPO_TAG_KEY}|--)(?:\s+#{TYPO_ATTRIBUTES})?\s*(?:[!/?\]]+|--)?>}
def strip_html
self.gsub(TAG, '').gsub(/\s+/, ' ').strip
end
private
def parse_date(string, params)
return '' unless params[:year]
format = ''
format << '%A %d ' if params[:day]
format << '%B ' if params[:month]
format << '%Y' if params[:year]
string.gsub('%date%', Time.mktime(*params.values_at(:year, :month, :day)).strftime(format))
end
def parse_page(string, params)
return '' unless params[:page]
"#{_('page')} #{params[:page]}"
end
end