markdown_titles_to_svg 0.1.1 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/markdown_titles_to_svg.rb +147 -79
- data/lib/markdown_titles_to_svg/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0624a1975dce5637462bc4f80c829ee684a717fea9ee09f2bcf6fcba8a14baa
|
4
|
+
data.tar.gz: 426aa2d3820655b802dbf5898fd0b5079b965c0f0aea0882cdd52a9fbe8c50cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c98302754778d80f0f3595293861cbe6050115902d41a0695204570f669f38e47b43c48e6af65dcf6582b0431ce22e1ad424c4201e34947ee10f7f15d9029c19
|
7
|
+
data.tar.gz: 16e14716757d19b86c807ab3adaad631fc8601ab3e9698c5d30989293b2b957ca7103e6dcb22d936fe6d2c3bf3f35b29ad755d83ad5d182aa87ed22c1644778e
|
data/CHANGELOG.md
CHANGED
@@ -20,37 +20,67 @@ module MarkdownTitlesToSvg
|
|
20
20
|
},
|
21
21
|
font: {
|
22
22
|
text_align: :left,
|
23
|
-
bold:
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
bold: false,
|
24
|
+
mode: {
|
25
|
+
h1: :local,
|
26
|
+
default: :google_fonts
|
27
|
+
},
|
28
|
+
local: {
|
29
|
+
h1: '/Library/Fonts/Microsoft/Corbel Bold.ttf',
|
30
|
+
default: '/Library/Fonts/Microsoft/Consolas.ttf'
|
31
|
+
},
|
32
|
+
google_fonts: {
|
33
|
+
h1: {
|
34
|
+
name: 'Oswald',
|
29
35
|
variant: 'regular',
|
30
|
-
subset: 'latin'
|
36
|
+
subset: 'latin'
|
31
37
|
},
|
32
|
-
|
38
|
+
default: {
|
39
|
+
name: 'Amatic SC',
|
40
|
+
variant: 'regular',
|
41
|
+
subset: 'latin'
|
42
|
+
}
|
43
|
+
},
|
44
|
+
current: {
|
45
|
+
h1: nil,
|
46
|
+
default: nil
|
33
47
|
}
|
34
48
|
},
|
35
49
|
view: {
|
36
50
|
offset: {
|
37
|
-
height:
|
51
|
+
height: 0,
|
38
52
|
widht: 0
|
39
53
|
}
|
40
54
|
},
|
41
55
|
style: {
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
56
|
+
h1: {
|
57
|
+
color: {
|
58
|
+
opacity: 1.0,
|
59
|
+
default: '#A5834B',
|
60
|
+
palette: []
|
61
|
+
},
|
62
|
+
stroke: {
|
63
|
+
color: 'none',
|
64
|
+
width: '0px',
|
65
|
+
opacity: 1.0,
|
66
|
+
linecap: 'butt'
|
67
|
+
}
|
46
68
|
},
|
47
|
-
|
48
|
-
color:
|
49
|
-
|
50
|
-
|
51
|
-
|
69
|
+
default: {
|
70
|
+
color: {
|
71
|
+
opacity: 1.0,
|
72
|
+
default: '#A5834B',
|
73
|
+
palette: []
|
74
|
+
},
|
75
|
+
stroke: {
|
76
|
+
color: 'none',
|
77
|
+
width: '0px',
|
78
|
+
opacity: 1.0,
|
79
|
+
linecap: 'butt'
|
80
|
+
}
|
52
81
|
}
|
53
|
-
}
|
82
|
+
},
|
83
|
+
silent: false
|
54
84
|
}
|
55
85
|
|
56
86
|
|
@@ -63,35 +93,27 @@ module MarkdownTitlesToSvg
|
|
63
93
|
if self.validate( markdowns, gh_name, options, @TEMPLATE )
|
64
94
|
obj = self.options_update( options, @TEMPLATE, 'set_options' )
|
65
95
|
obj[:github][:profile] = gh_name
|
66
|
-
|
67
|
-
if obj[:font][:source][:user].nil?
|
68
|
-
obj[:font][:source][:current] = obj[:font][:source][:default]
|
69
|
-
else
|
70
|
-
obj[:font][:source][:current] = obj[:font][:source][:user]
|
71
|
-
end
|
72
|
-
|
73
|
-
if obj[:font][:local]
|
74
|
-
obj[:font][:source][:current] = obj[:font][:source][:local_path]
|
75
|
-
else
|
76
|
-
obj[:font][:source][:current] = "./tmp-#{Time.now.getutc.to_i}.ttf"
|
77
|
-
google_font_download(
|
78
|
-
obj[:font][:source][:google_fonts][:name],
|
79
|
-
obj[:font][:source][:google_fonts][:variant],
|
80
|
-
obj[:font][:source][:google_fonts][:subset],
|
81
|
-
obj[:font][:source][:current]
|
82
|
-
)
|
83
|
-
end
|
96
|
+
obj = self.set_fonts( obj )
|
84
97
|
|
85
98
|
cmds = self.markdowns_read( markdowns, obj )
|
99
|
+
|
86
100
|
root = './'
|
87
101
|
cmds.each do | cmd |
|
88
|
-
svg = self.svg_generate( cmd
|
102
|
+
svg = self.svg_generate( cmd, obj )
|
89
103
|
FileUtils.mkdir_p ( File.dirname( cmd[:path] ) )
|
90
104
|
File.open( cmd[:path], "w" ) { | f | f.write( svg ) }
|
91
105
|
end
|
92
106
|
end
|
93
107
|
|
94
|
-
|
108
|
+
obj[:font][:mode].keys.each do | key |
|
109
|
+
if obj[:font][:mode][ key ] == :google_fonts
|
110
|
+
if ( Time.now.getutc.to_i - obj[:font][:current][ key ].split( '-' )[ 1 ].to_i ) < 30
|
111
|
+
if File.basename( obj[:font][:current][ key ] ) .start_with?( key.to_s )
|
112
|
+
File.delete( obj[:font][:current][ key ] )
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
95
117
|
|
96
118
|
return true
|
97
119
|
end
|
@@ -100,6 +122,37 @@ module MarkdownTitlesToSvg
|
|
100
122
|
private
|
101
123
|
|
102
124
|
|
125
|
+
def self.set_fonts( obj )
|
126
|
+
types = obj[:font][:mode].keys
|
127
|
+
behaviours = types.map { | key | obj[:font][:mode][ key ] }
|
128
|
+
|
129
|
+
!obj[:silent] ? puts( 'Used Fonts: ' ) : ''
|
130
|
+
behaviours.each.with_index do | behaviour, index |
|
131
|
+
t = types[ index ].to_s.length < 3 ? "\t\t" : "\t"
|
132
|
+
!obj[:silent] ? print( " :#{types[ index ].to_s}#{t}> " ) : ''
|
133
|
+
case behaviour
|
134
|
+
when :local
|
135
|
+
obj[:font][:current][ types[ index ] ] = obj[:font][:local][ types[ index ] ]
|
136
|
+
tmp = File.basename( obj[:font][:current][ types[ index ] ] )
|
137
|
+
!obj[:silent] ? print( "#{tmp} (Local)" ) : ''
|
138
|
+
when :google_fonts
|
139
|
+
obj[:font][:current][ types[ index ] ] = "./#{types[ index ].to_s}-#{Time.now.getutc.to_i}.ttf"
|
140
|
+
self.google_font_download(
|
141
|
+
obj[:font][:google_fonts][ types[ index ] ][:name],
|
142
|
+
obj[:font][:google_fonts][ types[ index ] ][:variant],
|
143
|
+
obj[:font][:google_fonts][ types[ index ] ][:subset],
|
144
|
+
obj[:font][:current][ types[ index ] ],
|
145
|
+
types[ index ],
|
146
|
+
obj[:silent]
|
147
|
+
)
|
148
|
+
end
|
149
|
+
!obj[:silent] ? puts : ''
|
150
|
+
end
|
151
|
+
|
152
|
+
return obj
|
153
|
+
end
|
154
|
+
|
155
|
+
|
103
156
|
def self.str_difference( a, b )
|
104
157
|
a = a.to_s.downcase.split( '_' ).join( '' )
|
105
158
|
b = b.to_s.downcase.split( '_' ).join( '' )
|
@@ -113,7 +166,7 @@ module MarkdownTitlesToSvg
|
|
113
166
|
end
|
114
167
|
|
115
168
|
|
116
|
-
def self.google_font_download( font, style, subset, file_name )
|
169
|
+
def self.google_font_download( font, style, subset, file_name, type, silent )
|
117
170
|
def self.unzip_file( file, destination, file_name )
|
118
171
|
Zip::ZipFile.open( file ) do | zip_file |
|
119
172
|
zip_file.each do | f |
|
@@ -144,7 +197,7 @@ module MarkdownTitlesToSvg
|
|
144
197
|
.map { | a | { name: a, score: self.str_difference( style.to_s, a.to_s ) } }
|
145
198
|
.min_by { | h | h[:score] }
|
146
199
|
|
147
|
-
|
200
|
+
!silent ? print( "#{font["id"]} #{variant[:name]} #{subset} (Google Fonts)" ) : ''
|
148
201
|
|
149
202
|
url = ''
|
150
203
|
url += server
|
@@ -170,7 +223,7 @@ module MarkdownTitlesToSvg
|
|
170
223
|
other: []
|
171
224
|
}
|
172
225
|
|
173
|
-
begin
|
226
|
+
#begin
|
174
227
|
if markdowns.class.to_s.eql? 'Array'
|
175
228
|
if markdowns.map { | a | a.start_with?( template[:github][:source] ) }.all?
|
176
229
|
if markdowns.map { | a | a.end_with?( '.md' ) }.all?
|
@@ -196,14 +249,14 @@ module MarkdownTitlesToSvg
|
|
196
249
|
end
|
197
250
|
|
198
251
|
if vars.class.to_s == 'Hash'
|
199
|
-
messages[:options] = self.options_update( vars, template, '
|
252
|
+
messages[:options] = self.options_update( vars, template, 'check_options' )
|
200
253
|
else
|
201
254
|
messages[:options].push( 'Is not Type "Hash".')
|
202
255
|
end
|
203
256
|
|
204
|
-
rescue
|
205
|
-
messages[:other].push( "Undefined error occured.")
|
206
|
-
end
|
257
|
+
#rescue
|
258
|
+
#messages[:other].push( "Undefined error occured.")
|
259
|
+
#end
|
207
260
|
|
208
261
|
valid = messages.keys.map { | key | messages[ key ].length }.sum == 0
|
209
262
|
|
@@ -225,23 +278,34 @@ module MarkdownTitlesToSvg
|
|
225
278
|
|
226
279
|
|
227
280
|
def self.options_update( vars, template, mode )
|
228
|
-
allow_list =
|
281
|
+
allow_list = [
|
282
|
+
:github__source,
|
229
283
|
:font__text_align,
|
230
284
|
:font__bold,
|
231
|
-
:
|
232
|
-
:
|
233
|
-
:
|
234
|
-
:
|
235
|
-
:
|
285
|
+
:font__mode__h1,
|
286
|
+
:font__mode__default,
|
287
|
+
:font__google_fonts__h1__name,
|
288
|
+
:font__google_fonts__h1__variant,
|
289
|
+
:font__google_fonts__h1__subset,
|
290
|
+
:font__google_fonts__default__name,
|
291
|
+
:font__google_fonts__default__variant,
|
292
|
+
:font__google_fonts__default__subset,
|
236
293
|
:view__offset__height,
|
237
294
|
:view__offset__widht,
|
238
|
-
:
|
239
|
-
:
|
240
|
-
:
|
241
|
-
:
|
242
|
-
:
|
243
|
-
:
|
244
|
-
:
|
295
|
+
:style__h1__color__opacity,
|
296
|
+
:style__h1__color__default,
|
297
|
+
:style__h1__color__palette,
|
298
|
+
:style__h1__stroke__color,
|
299
|
+
:style__h1__stroke__width,
|
300
|
+
:style__h1__stroke__opacity,
|
301
|
+
:style__h1__stroke__linecap,
|
302
|
+
:style__default__color__opacity,
|
303
|
+
:style__default__color__default,
|
304
|
+
:style__default__color__palette,
|
305
|
+
:style__default__stroke__color,
|
306
|
+
:style__default__stroke__width,
|
307
|
+
:style__default__stroke__opacity,
|
308
|
+
:style__default__stroke__linecap,
|
245
309
|
]
|
246
310
|
|
247
311
|
messages = []
|
@@ -274,7 +338,7 @@ module MarkdownTitlesToSvg
|
|
274
338
|
|
275
339
|
result = nil
|
276
340
|
case mode
|
277
|
-
when '
|
341
|
+
when 'check_options'
|
278
342
|
result = messages
|
279
343
|
when 'set_options'
|
280
344
|
result = _options
|
@@ -301,8 +365,8 @@ module MarkdownTitlesToSvg
|
|
301
365
|
end
|
302
366
|
|
303
367
|
|
304
|
-
def self.svg_items_decode(
|
305
|
-
def self.svg_item( char, color, element, obj )
|
368
|
+
def self.svg_items_decode( cmd, elements, obj )
|
369
|
+
def self.svg_item( char, color, element, obj, cmd )
|
306
370
|
item = {
|
307
371
|
"character": nil,
|
308
372
|
"fill": nil,
|
@@ -317,11 +381,11 @@ module MarkdownTitlesToSvg
|
|
317
381
|
|
318
382
|
item[:"character"] = char
|
319
383
|
item[:"fill"] = color
|
320
|
-
item[:"fill-opacity"] = obj[:style][:color][:opacity]
|
321
|
-
item[:"stroke"] = obj[:style][:stroke][:color]
|
322
|
-
item[:"stroke-width"] = obj[:style][:stroke][:width]
|
323
|
-
item[:"stroke-linecap"] = obj[:style][:stroke][:linecap]
|
324
|
-
item[:"stroke-opacity"] = obj[:style][:stroke][:opacity]
|
384
|
+
item[:"fill-opacity"] = obj[:style][ cmd[:type] ][:color][:opacity]
|
385
|
+
item[:"stroke"] = obj[:style][ cmd[:type] ][:stroke][:color]
|
386
|
+
item[:"stroke-width"] = obj[:style][ cmd[:type] ][:stroke][:width]
|
387
|
+
item[:"stroke-linecap"] = obj[:style][ cmd[:type] ][:stroke][:linecap]
|
388
|
+
item[:"stroke-opacity"] = obj[:style][ cmd[:type] ][:stroke][:opacity]
|
325
389
|
|
326
390
|
[ :"transform", :"d" ].each do | key |
|
327
391
|
search = key.to_s
|
@@ -333,16 +397,16 @@ module MarkdownTitlesToSvg
|
|
333
397
|
end
|
334
398
|
|
335
399
|
|
336
|
-
characters =
|
400
|
+
characters = cmd[:headline].gsub( ' ', '' )
|
337
401
|
items = []
|
338
402
|
elements.each.with_index do | element, index |
|
339
|
-
if obj[:style][:color][:palette].length <= index
|
340
|
-
color = obj[:style][:color][:default]
|
403
|
+
if obj[:style][ cmd[:type] ][:color][:palette].length <= index
|
404
|
+
color = obj[:style][ cmd[:type] ][:color][:default]
|
341
405
|
else
|
342
|
-
color = obj[:style][:color][:palette][ index ]
|
406
|
+
color = obj[:style][ cmd[:type] ][:color][:palette][ index ]
|
343
407
|
end
|
344
408
|
|
345
|
-
item = self.svg_item( characters[ index ], color, element, obj )
|
409
|
+
item = self.svg_item( characters[ index ], color, element, obj, cmd )
|
346
410
|
items.push( item )
|
347
411
|
end
|
348
412
|
return items
|
@@ -381,16 +445,16 @@ module MarkdownTitlesToSvg
|
|
381
445
|
end
|
382
446
|
|
383
447
|
|
384
|
-
def self.svg_generate(
|
448
|
+
def self.svg_generate( cmd, obj )
|
385
449
|
svg = Text2svg(
|
386
|
-
|
387
|
-
font: obj[:font][:
|
450
|
+
cmd[:headline],
|
451
|
+
font: obj[:font][:current][ cmd[:type] ],
|
388
452
|
text_align: obj[:font][:text_align],
|
389
453
|
bold: obj[:font][:bold]
|
390
454
|
).to_s
|
391
455
|
|
392
456
|
elements = self.svg_elements( svg )
|
393
|
-
items = self.svg_items_decode(
|
457
|
+
items = self.svg_items_decode( cmd, elements, obj )
|
394
458
|
code = self.svg_create_code( items, svg, obj )
|
395
459
|
return code
|
396
460
|
end
|
@@ -406,10 +470,11 @@ module MarkdownTitlesToSvg
|
|
406
470
|
doc = Nokogiri::HTML( response )
|
407
471
|
doc.xpath( '//img' ).each do | element |
|
408
472
|
begin
|
409
|
-
if !element.attribute( '
|
473
|
+
if !element.attribute( 'alt' ).nil?
|
410
474
|
validation = "#{obj[:github][:source]}#{obj[:github][:profile]}/"
|
411
475
|
cmd = {
|
412
476
|
headline: nil,
|
477
|
+
type: nil,
|
413
478
|
src: nil,
|
414
479
|
file: nil,
|
415
480
|
path: nil
|
@@ -421,8 +486,11 @@ module MarkdownTitlesToSvg
|
|
421
486
|
if cmd[:src].start_with?( validation )
|
422
487
|
if cmd[:src].end_with?( '.svg' )
|
423
488
|
if url =~ URI::regexp
|
424
|
-
cmd[:headline] = element.attribute( '
|
425
|
-
|
489
|
+
cmd[:headline] = element.attribute( 'alt' ).value
|
490
|
+
|
491
|
+
cmd[:type] = cmd[:headline].count( '#' ) == 0 ? :default : :h1
|
492
|
+
cmd[:headline] = cmd[:headline].gsub( '#', '' ).strip
|
493
|
+
|
426
494
|
tmp = cmd[:src][ cmd[:src].index( validation ) + validation.length, cmd[:src].length ]
|
427
495
|
tmp = tmp
|
428
496
|
.split( '/' )
|