spree_essentials 0.2.3 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +14 -20
- data/Rakefile +3 -14
- data/{public → app/assets}/images/admin/icons/pages.png +0 -0
- data/{public → app/assets}/images/blog/rss.png +0 -0
- data/{public → app/assets}/images/markitup/bg-container.png +0 -0
- data/{public → app/assets}/images/markitup/bg-editor.png +0 -0
- data/{public → app/assets}/images/markitup/bg-picker.png +0 -0
- data/{public → app/assets}/images/markitup/bold.png +0 -0
- data/{public → app/assets}/images/markitup/code.png +0 -0
- data/{public → app/assets}/images/markitup/h1.png +0 -0
- data/{public → app/assets}/images/markitup/h2.png +0 -0
- data/{public → app/assets}/images/markitup/h3.png +0 -0
- data/{public → app/assets}/images/markitup/h4.png +0 -0
- data/{public → app/assets}/images/markitup/h5.png +0 -0
- data/{public → app/assets}/images/markitup/h6.png +0 -0
- data/{public → app/assets}/images/markitup/handle.png +0 -0
- data/{public → app/assets}/images/markitup/image-picker.png +0 -0
- data/{public → app/assets}/images/markitup/italic.png +0 -0
- data/{public → app/assets}/images/markitup/link.png +0 -0
- data/{public → app/assets}/images/markitup/list-bullet.png +0 -0
- data/{public → app/assets}/images/markitup/list-numeric.png +0 -0
- data/{public → app/assets}/images/markitup/menu.png +0 -0
- data/{public → app/assets}/images/markitup/more-tag.png +0 -0
- data/{public → app/assets}/images/markitup/picture.png +0 -0
- data/{public → app/assets}/images/markitup/preview.png +0 -0
- data/{public → app/assets}/images/markitup/quotes.png +0 -0
- data/{public → app/assets}/images/markitup/submenu.png +0 -0
- data/{public → app/assets}/javascripts/date.js +0 -0
- data/{public → app/assets}/javascripts/jquery.autodate.js +0 -0
- data/{public → app/assets}/javascripts/jquery.markitup.js +51 -32
- data/{public → app/assets}/javascripts/markdown.set.js +0 -0
- data/{public/stylesheets/markitup.css → app/assets/stylesheets/markitup.css.erb} +28 -28
- data/app/controllers/admin/uploads_controller.rb +1 -1
- data/app/helpers/admin/spree_essentials_helper.rb +25 -0
- data/app/models/{asset_decorator.rb → image_decorator.rb} +2 -2
- data/app/models/upload.rb +18 -4
- data/app/overrides/spree_essentials.rb +5 -0
- data/app/views/admin/shared/_contents_sub_menu.html.erb +4 -6
- data/app/views/admin/shared/_contents_tab.html.erb +1 -2
- data/app/views/admin/uploads/index.html.erb +1 -1
- data/lib/generators/essentials_base.rb +12 -3
- data/lib/spree_essentials.rb +11 -10
- data/lib/spree_essentials/test_helper.rb +10 -1
- data/lib/spree_essentials/version.rb +1 -1
- metadata +58 -79
- data/app/helpers/admin/base_helper_decorator.rb +0 -18
data/README.md
CHANGED
|
@@ -27,7 +27,7 @@ If you don't already have an existing Spree site, [click here](https://gist.gith
|
|
|
27
27
|
|
|
28
28
|
Spree Essentials can be installed by itself by adding the following to your Gemfile:
|
|
29
29
|
|
|
30
|
-
gem 'spree_essentials', '>= 0.
|
|
30
|
+
gem 'spree_essentials', '>= 0.3.1""
|
|
31
31
|
|
|
32
32
|
This isn't necessary if you're using spree_essentials based extensions. If that's the case, just include the extensions normally:
|
|
33
33
|
|
|
@@ -78,7 +78,7 @@ Setting up an essential aware extension is easy. In your `lib/[extension_name].r
|
|
|
78
78
|
module SpreeEssentialPress
|
|
79
79
|
|
|
80
80
|
def self.tab
|
|
81
|
-
|
|
81
|
+
{ :label => "Press", :route => :admin_press_index }
|
|
82
82
|
end
|
|
83
83
|
|
|
84
84
|
def self.sub_tab
|
|
@@ -92,10 +92,7 @@ Setting up an essential aware extension is easy. In your `lib/[extension_name].r
|
|
|
92
92
|
|
|
93
93
|
end
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
# your own admin tab would be here
|
|
97
|
-
require 'spree_essential_press/custom_hooks'
|
|
98
|
-
else
|
|
95
|
+
unless SpreeEssentialPress.independent?
|
|
99
96
|
# register with Spree Essentials and reside under the "Content" tab
|
|
100
97
|
SpreeEssentials.register :press, SpreeEssentialPress
|
|
101
98
|
end
|
|
@@ -114,7 +111,7 @@ Please let me know if you find any bugs or have feature requests you'd like to s
|
|
|
114
111
|
Testing
|
|
115
112
|
-------
|
|
116
113
|
|
|
117
|
-
The test suite
|
|
114
|
+
The test suite can be run like so:
|
|
118
115
|
|
|
119
116
|
git clone git://github.com/citrus/spree_essentials.git
|
|
120
117
|
cd spree_essentials
|
|
@@ -122,16 +119,6 @@ The test suite is very limited at the moment but can be run like so:
|
|
|
122
119
|
bundle exec dummier
|
|
123
120
|
rake
|
|
124
121
|
|
|
125
|
-
|
|
126
|
-
You can also boot spork to run the tests much faster
|
|
127
|
-
|
|
128
|
-
# in one window
|
|
129
|
-
cd spree_essentials
|
|
130
|
-
spork
|
|
131
|
-
|
|
132
|
-
# in another window
|
|
133
|
-
testdrb test/**/*_test.rb
|
|
134
|
-
|
|
135
122
|
|
|
136
123
|
Demo
|
|
137
124
|
----
|
|
@@ -160,9 +147,16 @@ To Do
|
|
|
160
147
|
Change Log
|
|
161
148
|
----------
|
|
162
149
|
|
|
163
|
-
**0.
|
|
150
|
+
**0.3.1 - 2011/12/13**
|
|
151
|
+
|
|
152
|
+
* Fix broken markitup editor
|
|
153
|
+
* Rework 'selected' class on content tab
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
**0.3.0 - 2011/12/13**
|
|
164
157
|
|
|
165
|
-
*
|
|
158
|
+
* Upgrade to Spree 0.70.x
|
|
159
|
+
* Remove spork dependency
|
|
166
160
|
|
|
167
161
|
|
|
168
162
|
**0.2.2 - 2011/7/22**
|
|
@@ -210,4 +204,4 @@ If you'd like to help out feel free to fork and send me pull requests!
|
|
|
210
204
|
License
|
|
211
205
|
-------
|
|
212
206
|
|
|
213
|
-
Copyright (c) 2011 Spencer Steffen, released under the New BSD License All rights reserved.
|
|
207
|
+
Copyright (c) 2011 Spencer Steffen & Citrus, released under the New BSD License All rights reserved.
|
data/Rakefile
CHANGED
|
@@ -1,21 +1,10 @@
|
|
|
1
1
|
# encoding: UTF-8
|
|
2
|
-
require
|
|
3
|
-
begin
|
|
4
|
-
require 'bundler/setup'
|
|
5
|
-
rescue LoadError
|
|
6
|
-
puts 'You must run `gem install bundler` and `bundle install` to run rake tasks'
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
require 'rake'
|
|
2
|
+
require "bundler/gem_tasks"
|
|
10
3
|
require 'rake/testtask'
|
|
11
4
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
Rake::TestTask.new(:test) do |t|
|
|
15
|
-
t.libs << 'lib'
|
|
16
|
-
t.libs << 'test'
|
|
5
|
+
Rake::TestTask.new do |t|
|
|
6
|
+
t.libs << 'lib' << 'test'
|
|
17
7
|
t.pattern = 'test/**/*_test.rb'
|
|
18
|
-
t.verbose = false
|
|
19
8
|
end
|
|
20
9
|
|
|
21
10
|
task :default => :test
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// v 1.1.x
|
|
4
4
|
// Dual licensed under the MIT and GPL licenses.
|
|
5
5
|
// ----------------------------------------------------------------------------
|
|
6
|
-
// Copyright (C) 2007-
|
|
6
|
+
// Copyright (C) 2007-2011 Jay Salvat
|
|
7
7
|
// http://markitup.jaysalvat.com/
|
|
8
8
|
// ----------------------------------------------------------------------------
|
|
9
9
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
@@ -35,7 +35,8 @@
|
|
|
35
35
|
previewInWindow: '', // 'width=800, height=600, resizable=yes, scrollbars=yes'
|
|
36
36
|
previewAutoRefresh: true,
|
|
37
37
|
previewPosition: 'after',
|
|
38
|
-
previewTemplatePath: '',
|
|
38
|
+
previewTemplatePath: '~/templates/preview.html',
|
|
39
|
+
previewParser: false,
|
|
39
40
|
previewParserPath: '',
|
|
40
41
|
previewParserVar: 'data',
|
|
41
42
|
resizeHandle: true,
|
|
@@ -164,7 +165,7 @@
|
|
|
164
165
|
return false;
|
|
165
166
|
}).bind("focusin", function(){
|
|
166
167
|
$$.focus();
|
|
167
|
-
}).
|
|
168
|
+
}).mouseup(function() {
|
|
168
169
|
if (button.call) {
|
|
169
170
|
eval(button.call)();
|
|
170
171
|
}
|
|
@@ -233,22 +234,38 @@
|
|
|
233
234
|
|
|
234
235
|
// build block to insert
|
|
235
236
|
function build(string) {
|
|
236
|
-
var openWith
|
|
237
|
-
var placeHolder
|
|
238
|
-
var replaceWith
|
|
239
|
-
var closeWith
|
|
237
|
+
var openWith = prepare(clicked.openWith);
|
|
238
|
+
var placeHolder = prepare(clicked.placeHolder);
|
|
239
|
+
var replaceWith = prepare(clicked.replaceWith);
|
|
240
|
+
var closeWith = prepare(clicked.closeWith);
|
|
241
|
+
var openBlockWith = prepare(clicked.openBlockWith);
|
|
242
|
+
var closeBlockWith = prepare(clicked.closeBlockWith);
|
|
243
|
+
var multiline = clicked.multiline;
|
|
244
|
+
|
|
240
245
|
if (replaceWith !== "") {
|
|
241
246
|
block = openWith + replaceWith + closeWith;
|
|
242
247
|
} else if (selection === '' && placeHolder !== '') {
|
|
243
248
|
block = openWith + placeHolder + closeWith;
|
|
244
249
|
} else {
|
|
245
|
-
string = string || selection;
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
+
string = string || selection;
|
|
251
|
+
|
|
252
|
+
var lines = selection.split(/\r?\n/), blocks = [];
|
|
253
|
+
|
|
254
|
+
for (var l=0; l < lines.length; l++) {
|
|
255
|
+
line = lines[l];
|
|
256
|
+
var trailingSpaces;
|
|
257
|
+
if (trailingSpaces = line.match(/ *$/)) {
|
|
258
|
+
blocks.push(openWith + line.replace(/ *$/g, '') + closeWith + trailingSpaces);
|
|
259
|
+
} else {
|
|
260
|
+
blocks.push(openWith + line + closeWith);
|
|
261
|
+
}
|
|
250
262
|
}
|
|
263
|
+
|
|
264
|
+
block = blocks.join("\n");
|
|
251
265
|
}
|
|
266
|
+
|
|
267
|
+
block = openBlockWith + block + closeBlockWith;
|
|
268
|
+
|
|
252
269
|
return { block:block,
|
|
253
270
|
openWith:openWith,
|
|
254
271
|
replaceWith:replaceWith,
|
|
@@ -262,7 +279,6 @@
|
|
|
262
279
|
var len, j, n, i;
|
|
263
280
|
hash = clicked = button;
|
|
264
281
|
get();
|
|
265
|
-
|
|
266
282
|
$.extend(hash, { line:"",
|
|
267
283
|
root:options.root,
|
|
268
284
|
textarea:textarea,
|
|
@@ -276,12 +292,12 @@
|
|
|
276
292
|
// callbacks before insertion
|
|
277
293
|
prepare(options.beforeInsert);
|
|
278
294
|
prepare(clicked.beforeInsert);
|
|
279
|
-
if (ctrlKey === true && shiftKey === true) {
|
|
295
|
+
if ((ctrlKey === true && shiftKey === true) || button.multiline === true) {
|
|
280
296
|
prepare(clicked.beforeMultiInsert);
|
|
281
297
|
}
|
|
282
298
|
$.extend(hash, { line:1 });
|
|
283
|
-
|
|
284
|
-
if (ctrlKey === true && shiftKey === true) {
|
|
299
|
+
|
|
300
|
+
if ((ctrlKey === true && shiftKey === true)) {
|
|
285
301
|
lines = selection.split(/\r?\n/);
|
|
286
302
|
for (j = 0, n = lines.length, i = 0; i < n; i++) {
|
|
287
303
|
if ($.trim(lines[i]) !== '') {
|
|
@@ -333,7 +349,7 @@
|
|
|
333
349
|
$.extend(hash, { line:'', selection:selection });
|
|
334
350
|
|
|
335
351
|
// callbacks after insertion
|
|
336
|
-
if (ctrlKey === true && shiftKey === true) {
|
|
352
|
+
if ((ctrlKey === true && shiftKey === true) || button.multiline === true) {
|
|
337
353
|
prepare(clicked.afterMultiInsert);
|
|
338
354
|
}
|
|
339
355
|
prepare(clicked.afterInsert);
|
|
@@ -358,7 +374,7 @@
|
|
|
358
374
|
// Substract linefeed in IE
|
|
359
375
|
function fixIeBug(string) {
|
|
360
376
|
if ($.browser.msie) {
|
|
361
|
-
return string.length - string.replace(/\r
|
|
377
|
+
return string.length - string.replace(/\r*/g, '').length;
|
|
362
378
|
}
|
|
363
379
|
return 0;
|
|
364
380
|
}
|
|
@@ -398,21 +414,21 @@
|
|
|
398
414
|
|
|
399
415
|
scrollPosition = textarea.scrollTop;
|
|
400
416
|
if (document.selection) {
|
|
401
|
-
selection = document.selection;
|
|
402
|
-
if ($.browser.msie) { // ie
|
|
403
|
-
var range = selection.createRange();
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
selection = range.text;
|
|
417
|
+
selection = document.selection.createRange().text;
|
|
418
|
+
if ($.browser.msie) { // ie
|
|
419
|
+
var range = document.selection.createRange(), rangeCopy = range.duplicate();
|
|
420
|
+
rangeCopy.moveToElementText(textarea);
|
|
421
|
+
caretPosition = -1;
|
|
422
|
+
while(rangeCopy.inRange(range)) {
|
|
423
|
+
rangeCopy.moveStart('character');
|
|
424
|
+
caretPosition ++;
|
|
425
|
+
}
|
|
411
426
|
} else { // opera
|
|
412
427
|
caretPosition = textarea.selectionStart;
|
|
413
428
|
}
|
|
414
429
|
} else { // gecko & webkit
|
|
415
430
|
caretPosition = textarea.selectionStart;
|
|
431
|
+
|
|
416
432
|
selection = textarea.value.substring(caretPosition, textarea.selectionEnd);
|
|
417
433
|
}
|
|
418
434
|
return selection;
|
|
@@ -458,7 +474,10 @@
|
|
|
458
474
|
|
|
459
475
|
function renderPreview() {
|
|
460
476
|
var phtml;
|
|
461
|
-
if (options.
|
|
477
|
+
if (options.previewParser && typeof options.previewParser === 'function') {
|
|
478
|
+
var data = options.previewParser( $$.val() );
|
|
479
|
+
writeInPreview( localize(data, 1) );
|
|
480
|
+
} else if (options.previewParserPath !== '') {
|
|
462
481
|
$.ajax({
|
|
463
482
|
type: 'POST',
|
|
464
483
|
dataType: 'text',
|
|
@@ -502,15 +521,15 @@
|
|
|
502
521
|
function keyPressed(e) {
|
|
503
522
|
shiftKey = e.shiftKey;
|
|
504
523
|
altKey = e.altKey;
|
|
505
|
-
ctrlKey = (!(e.altKey && e.ctrlKey)) ? e.ctrlKey : false;
|
|
524
|
+
ctrlKey = (!(e.altKey && e.ctrlKey)) ? (e.ctrlKey || e.metaKey) : false;
|
|
506
525
|
|
|
507
526
|
if (e.type === 'keydown') {
|
|
508
527
|
if (ctrlKey === true) {
|
|
509
|
-
li = $(
|
|
528
|
+
li = $('a[accesskey="'+String.fromCharCode(e.keyCode)+'"]', header).parent('li');
|
|
510
529
|
if (li.length !== 0) {
|
|
511
530
|
ctrlKey = false;
|
|
512
531
|
setTimeout(function() {
|
|
513
|
-
li.triggerHandler('
|
|
532
|
+
li.triggerHandler('mouseup');
|
|
514
533
|
},1);
|
|
515
534
|
return false;
|
|
516
535
|
}
|
|
File without changes
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
}
|
|
20
20
|
.markItUpContainer {
|
|
21
21
|
border:1px solid #3C769D;
|
|
22
|
-
background:#FFF url(
|
|
22
|
+
background:#FFF url(<%= asset_path('markitup/bg-container.png') %>) repeat-x top left;
|
|
23
23
|
padding:5px 27px 2px 5px;
|
|
24
24
|
font:11px Verdana, Arial, Helvetica, sans-serif;
|
|
25
25
|
}
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
border:1px solid #3C769D;
|
|
30
30
|
width:100%;
|
|
31
31
|
height:320px;
|
|
32
|
-
background:#FFF url(
|
|
32
|
+
background:#FFF url(<%= asset_path('markitup/bg-editor.png') %>) repeat-x top right;
|
|
33
33
|
clear:both;
|
|
34
34
|
line-height:18px;
|
|
35
35
|
overflow:auto;
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
width:22px; height:5px;
|
|
55
55
|
margin-left:auto;
|
|
56
56
|
margin-right:auto;
|
|
57
|
-
background-image:url(
|
|
57
|
+
background-image:url(<%= asset_path('markitup/handle.png') %>);
|
|
58
58
|
cursor:n-resize;
|
|
59
59
|
}
|
|
60
60
|
/***************************************************************************************/
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
display:block;
|
|
72
72
|
}
|
|
73
73
|
.markItUpHeader ul .markItUpDropMenu {
|
|
74
|
-
background:transparent url(
|
|
74
|
+
background:transparent url(<%= asset_path('markitup/menu.png') %>) no-repeat 115% 50%;
|
|
75
75
|
margin-right:5px;
|
|
76
76
|
}
|
|
77
77
|
.markItUpHeader ul .markItUpDropMenu li {
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
border-bottom:1px solid #3C769D;
|
|
103
103
|
}
|
|
104
104
|
.markItUpHeader ul ul .markItUpDropMenu {
|
|
105
|
-
background:#F5F5F5 url(
|
|
105
|
+
background:#F5F5F5 url(<%= asset_path('markitup/submenu.png') %>) no-repeat 100% 50%;
|
|
106
106
|
}
|
|
107
107
|
/* next rows of buttons */
|
|
108
108
|
.markItUpHeader ul ul ul {
|
|
@@ -134,20 +134,20 @@
|
|
|
134
134
|
}
|
|
135
135
|
/***************************************************************************************/
|
|
136
136
|
.html .markItUpEditor {
|
|
137
|
-
background-image:url(
|
|
137
|
+
background-image:url(<%= asset_path('markitup/bg-editor-html.png') %>);
|
|
138
138
|
}
|
|
139
139
|
.markdown .markItUpEditor {
|
|
140
|
-
background-image:url(
|
|
140
|
+
background-image:url(<%= asset_path('markitup/bg-editor-markdown.png') %>);
|
|
141
141
|
}
|
|
142
142
|
.textile .markItUpEditor {
|
|
143
|
-
background-image:url(
|
|
143
|
+
background-image:url(<%= asset_path('markitup/bg-editor-textile.png') %>);
|
|
144
144
|
}
|
|
145
145
|
.bbcode .markItUpEditor {
|
|
146
|
-
background-image:url(
|
|
146
|
+
background-image:url(<%= asset_path('markitup/bg-editor-bbcode.png') %>);
|
|
147
147
|
}
|
|
148
148
|
.wiki .markItUpEditor,
|
|
149
149
|
.dotclear .markItUpEditor {
|
|
150
|
-
background-image:url(
|
|
150
|
+
background-image:url(<%= asset_path('markitup/bg-editor-wiki.png') %>);
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
|
|
@@ -157,59 +157,59 @@
|
|
|
157
157
|
// By Jay Salvat - http://markitup.jaysalvat.com/
|
|
158
158
|
// ------------------------------------------------------------------*/
|
|
159
159
|
.markItUp .markItUpButton1 a {
|
|
160
|
-
background-image:url(
|
|
160
|
+
background-image:url(<%= asset_path('markitup/h1.png') %>);
|
|
161
161
|
}
|
|
162
162
|
.markItUp .markItUpButton2 a {
|
|
163
|
-
background-image:url(
|
|
163
|
+
background-image:url(<%= asset_path('markitup/h2.png') %>);
|
|
164
164
|
}
|
|
165
165
|
.markItUp .markItUpButton3 a {
|
|
166
|
-
background-image:url(
|
|
166
|
+
background-image:url(<%= asset_path('markitup/h3.png') %>);
|
|
167
167
|
}
|
|
168
168
|
.markItUp .markItUpButton4 a {
|
|
169
|
-
background-image:url(
|
|
169
|
+
background-image:url(<%= asset_path('markitup/h4.png') %>);
|
|
170
170
|
}
|
|
171
171
|
.markItUp .markItUpButton5 a {
|
|
172
|
-
background-image:url(
|
|
172
|
+
background-image:url(<%= asset_path('markitup/h5.png') %>);
|
|
173
173
|
}
|
|
174
174
|
.markItUp .markItUpButton6 a {
|
|
175
|
-
background-image:url(
|
|
175
|
+
background-image:url(<%= asset_path('markitup/h6.png') %>);
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
.markItUp .markItUpButton7 a {
|
|
179
|
-
background-image:url(
|
|
179
|
+
background-image:url(<%= asset_path('markitup/bold.png') %>);
|
|
180
180
|
}
|
|
181
181
|
.markItUp .markItUpButton8 a {
|
|
182
|
-
background-image:url(
|
|
182
|
+
background-image:url(<%= asset_path('markitup/italic.png') %>);
|
|
183
183
|
}
|
|
184
184
|
|
|
185
185
|
.markItUp .markItUpButton9 a {
|
|
186
|
-
background-image:url(
|
|
186
|
+
background-image:url(<%= asset_path('markitup/list-bullet.png') %>);
|
|
187
187
|
}
|
|
188
188
|
.markItUp .markItUpButton10 a {
|
|
189
|
-
background-image:url(
|
|
189
|
+
background-image:url(<%= asset_path('markitup/list-numeric.png') %>);
|
|
190
190
|
}
|
|
191
191
|
|
|
192
192
|
.markItUp .markItUpButton11 a {
|
|
193
|
-
background-image:url(
|
|
193
|
+
background-image:url(<%= asset_path('markitup/picture.png') %>);
|
|
194
194
|
}
|
|
195
195
|
.markItUp .markItUpButton12 a {
|
|
196
|
-
background-image:url(
|
|
196
|
+
background-image:url(<%= asset_path('markitup/link.png') %>);
|
|
197
197
|
}
|
|
198
198
|
|
|
199
199
|
.markItUp .markItUpButton13 a {
|
|
200
|
-
background-image:url(
|
|
200
|
+
background-image:url(<%= asset_path('markitup/quotes.png') %>);
|
|
201
201
|
}
|
|
202
202
|
.markItUp .markItUpButton14 a {
|
|
203
|
-
background-image:url(
|
|
203
|
+
background-image:url(<%= asset_path('markitup/code.png') %>);
|
|
204
204
|
}
|
|
205
205
|
.markItUp .markItUpButton15 a {
|
|
206
|
-
background-image:url(
|
|
206
|
+
background-image:url(<%= asset_path('markitup/more-tag.png') %>);
|
|
207
207
|
}
|
|
208
208
|
.markItUp .markItUpButton16 a {
|
|
209
|
-
background-image:url(
|
|
209
|
+
background-image:url(<%= asset_path('markitup/image-picker.png') %>);
|
|
210
210
|
}
|
|
211
211
|
.markItUp .markItUpButton17 a {
|
|
212
|
-
background-image:url(
|
|
212
|
+
background-image:url(<%= asset_path('markitup/preview.png') %>);
|
|
213
213
|
}
|
|
214
214
|
|
|
215
215
|
|
|
@@ -222,7 +222,7 @@ div.image-picker {
|
|
|
222
222
|
width: 100%;
|
|
223
223
|
height: 0;
|
|
224
224
|
overflow: hidden;
|
|
225
|
-
background: #fff url(
|
|
225
|
+
background: #fff url(<%= asset_path('markitup/bg-picker.png') %>) repeat-x bottom left;
|
|
226
226
|
border: 1px solid #ccc;
|
|
227
227
|
}
|
|
228
228
|
div.image-picker ul,
|
|
@@ -14,7 +14,7 @@ class Admin::UploadsController < Admin::ResourceController
|
|
|
14
14
|
params[:search] ||= {}
|
|
15
15
|
params[:search][:meta_sort] ||= "created_at.desc"
|
|
16
16
|
@search = Upload.metasearch(params[:search])
|
|
17
|
-
@collection = @search.
|
|
17
|
+
@collection = @search.page(params[:page]).per(Spree::Config[:orders_per_page])
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Admin::SpreeEssentialsHelper
|
|
2
|
+
|
|
3
|
+
def contents_tab
|
|
4
|
+
routes = SpreeEssentials.essentials.map do |key, cls|
|
|
5
|
+
route = cls.tab[:route] || "admin_#{key}"
|
|
6
|
+
send("#{route}_path") rescue "##{key}"
|
|
7
|
+
end
|
|
8
|
+
routes.push admin_uploads_path
|
|
9
|
+
cls = request.path.scan(Regexp.new(routes.join("|"))).empty? ? nil : 'selected'
|
|
10
|
+
content_tag :li, :class => cls do
|
|
11
|
+
link_to I18n.t('admin.shared.contents_tab.content'), routes.first
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def markdown_helper
|
|
16
|
+
content_tag('em', :class => 'small') do
|
|
17
|
+
[
|
|
18
|
+
" ",
|
|
19
|
+
t('essentials.parsed_with'),
|
|
20
|
+
link_to("Markdown", "http://daringfireball.net/projects/markdown/basics", :onclick => 'window.open(this.href); return false')
|
|
21
|
+
].join(" ").html_safe
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
data/app/models/upload.rb
CHANGED
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
class Upload < Asset
|
|
2
2
|
|
|
3
|
-
default_scope where(:type => "Upload")
|
|
3
|
+
default_scope where(:type => "Upload") if table_exists?
|
|
4
4
|
|
|
5
5
|
validate :no_attachement_errors
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
# Check for spree_heroku
|
|
8
|
+
# https://github.com/paxer/spree-heroku
|
|
9
|
+
#
|
|
10
|
+
if defined?(SpreeHeroku)
|
|
11
|
+
has_attached_file :attachment,
|
|
12
|
+
:styles => Proc.new{ |clip| clip.instance.attachment_sizes },
|
|
13
|
+
:default_style => :medium,
|
|
14
|
+
:path => "assets/uploads/:id/:style/:basename.:extension",
|
|
15
|
+
:storage => "s3",
|
|
16
|
+
:s3_credentials => "#{Rails.root}/config/s3.yml"
|
|
17
|
+
else
|
|
18
|
+
has_attached_file :attachment,
|
|
19
|
+
:styles => Proc.new{ |clip| clip.instance.attachment_sizes },
|
|
20
|
+
:default_style => :medium,
|
|
21
|
+
:url => "/assets/uploads/:id/:style/:basename.:extension",
|
|
22
|
+
:path => ":rails_root/public/assets/uploads/:id/:style/:basename.:extension"
|
|
23
|
+
end
|
|
10
24
|
|
|
11
25
|
def image_content?
|
|
12
26
|
attachment_content_type.match(/\/(jpeg|png|gif|tiff|x-photoshop)/)
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
<% content_for :sub_menu do %>
|
|
2
|
-
<ul id="sub_nav">
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
<%= tab *cls.sub_tab if defined?(cls.sub_tab) %>
|
|
6
|
-
<% end %>
|
|
7
|
-
<%= tab :uploads, :label => 'admin.subnav.uploads' %>
|
|
2
|
+
<ul id="sub_nav" data-hook="essentials_sub_nav">
|
|
3
|
+
<% SpreeEssentials.essentials.each_pair do |name, cls| %>
|
|
4
|
+
<%= tab *cls.sub_tab if defined?(cls.sub_tab) %>
|
|
8
5
|
<% end %>
|
|
6
|
+
<%= tab :uploads, :label => 'admin.subnav.uploads' %>
|
|
9
7
|
</ul>
|
|
10
8
|
<% end %>
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
<%=
|
|
2
|
-
|
|
1
|
+
<%= contents_tab %>
|
|
@@ -4,15 +4,24 @@ module SpreeEssentials
|
|
|
4
4
|
|
|
5
5
|
include Rails::Generators::Migration
|
|
6
6
|
|
|
7
|
-
def self.count
|
|
7
|
+
def self.count
|
|
8
8
|
@count ||= 0
|
|
9
9
|
(@count += 1) * 3
|
|
10
10
|
end
|
|
11
|
+
|
|
12
|
+
def self.new_migration_number
|
|
13
|
+
(Time.new.utc + self.count).strftime("%Y%m%d%H%M%S")
|
|
14
|
+
end
|
|
11
15
|
|
|
12
16
|
def self.next_migration_number(path)
|
|
13
17
|
@time ||= Time.new.utc
|
|
14
18
|
if ActiveRecord::Base.timestamped_migrations
|
|
15
|
-
|
|
19
|
+
files = Dir.entries(Rails.root.join("db/migrate"))
|
|
20
|
+
migration = new_migration_number
|
|
21
|
+
while files.join.include?(migration)
|
|
22
|
+
migration = new_migration_number
|
|
23
|
+
end
|
|
24
|
+
migration
|
|
16
25
|
else
|
|
17
26
|
"%.3d" % (current_migration_number(dirname) + 1)
|
|
18
27
|
end
|
|
@@ -20,4 +29,4 @@ module SpreeEssentials
|
|
|
20
29
|
|
|
21
30
|
end
|
|
22
31
|
end
|
|
23
|
-
end
|
|
32
|
+
end
|
data/lib/spree_essentials.rb
CHANGED
|
@@ -30,17 +30,18 @@ module SpreeEssentials
|
|
|
30
30
|
app.middleware.insert_before ::Rack::Lock, ::ActionDispatch::Static, "#{config.root}/public"
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
config.to_prepare do
|
|
34
|
+
#loads application's model / class decorators
|
|
35
|
+
Dir.glob File.expand_path("../../app/**/*_decorator*.rb") do |c|
|
|
36
|
+
Rails.configuration.cache_classes ? require(c) : load(c)
|
|
36
37
|
end
|
|
37
|
-
end
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
#loads application's deface view overrides
|
|
40
|
+
Dir.glob File.expand_path("../../app/overrides/*.rb", __FILE__) do |c|
|
|
41
|
+
Rails.application.config.cache_classes ? require(c) : load(c)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
44
45
|
end
|
|
45
|
-
|
|
46
|
+
|
|
46
47
|
end
|
|
@@ -21,9 +21,18 @@ Capybara.default_selector = :css
|
|
|
21
21
|
# Define a bare test case to use with Capybara
|
|
22
22
|
class ActiveSupport::IntegrationCase < ActiveSupport::TestCase
|
|
23
23
|
|
|
24
|
-
include Capybara
|
|
24
|
+
include Capybara::DSL
|
|
25
25
|
include Rails.application.routes.url_helpers
|
|
26
26
|
|
|
27
|
+
|
|
28
|
+
# Extreme hax! wtf is this for anyways.. and why is it erroring?
|
|
29
|
+
def testmail_admin_mail_method_url(*args)
|
|
30
|
+
"#wtf"
|
|
31
|
+
end
|
|
32
|
+
alias :testmail_admin_mail_method_path :testmail_admin_mail_method_url
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
27
36
|
self.use_transactional_fixtures = false
|
|
28
37
|
|
|
29
38
|
# Checks for missing translations after each test
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: spree_essentials
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.1
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,22 +9,22 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2011-12-15 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: spree_core
|
|
16
|
-
requirement: &
|
|
16
|
+
requirement: &70108455614680 !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
|
-
- -
|
|
19
|
+
- - ! '>='
|
|
20
20
|
- !ruby/object:Gem::Version
|
|
21
|
-
version: 0.
|
|
21
|
+
version: 0.70.0
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
|
-
version_requirements: *
|
|
24
|
+
version_requirements: *70108455614680
|
|
25
25
|
- !ruby/object:Gem::Dependency
|
|
26
26
|
name: rdiscount
|
|
27
|
-
requirement: &
|
|
27
|
+
requirement: &70108455614020 !ruby/object:Gem::Requirement
|
|
28
28
|
none: false
|
|
29
29
|
requirements:
|
|
30
30
|
- - ! '>='
|
|
@@ -32,84 +32,62 @@ dependencies:
|
|
|
32
32
|
version: 1.6.8
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
|
-
version_requirements: *
|
|
35
|
+
version_requirements: *70108455614020
|
|
36
36
|
- !ruby/object:Gem::Dependency
|
|
37
37
|
name: shoulda
|
|
38
|
-
requirement: &
|
|
38
|
+
requirement: &70108455613300 !ruby/object:Gem::Requirement
|
|
39
39
|
none: false
|
|
40
40
|
requirements:
|
|
41
41
|
- - ! '>='
|
|
42
42
|
- !ruby/object:Gem::Version
|
|
43
|
-
version:
|
|
43
|
+
version: 3.0.0.beta2
|
|
44
44
|
type: :development
|
|
45
45
|
prerelease: false
|
|
46
|
-
version_requirements: *
|
|
46
|
+
version_requirements: *70108455613300
|
|
47
47
|
- !ruby/object:Gem::Dependency
|
|
48
48
|
name: dummier
|
|
49
|
-
requirement: &
|
|
49
|
+
requirement: &70108455612720 !ruby/object:Gem::Requirement
|
|
50
50
|
none: false
|
|
51
51
|
requirements:
|
|
52
52
|
- - ! '>='
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: 0.2.
|
|
54
|
+
version: 0.2.4
|
|
55
55
|
type: :development
|
|
56
56
|
prerelease: false
|
|
57
|
-
version_requirements: *
|
|
57
|
+
version_requirements: *70108455612720
|
|
58
58
|
- !ruby/object:Gem::Dependency
|
|
59
59
|
name: factory_girl
|
|
60
|
-
requirement: &
|
|
60
|
+
requirement: &70108455611860 !ruby/object:Gem::Requirement
|
|
61
61
|
none: false
|
|
62
62
|
requirements:
|
|
63
63
|
- - ! '>='
|
|
64
64
|
- !ruby/object:Gem::Version
|
|
65
|
-
version: 2.
|
|
65
|
+
version: 2.3.2
|
|
66
66
|
type: :development
|
|
67
67
|
prerelease: false
|
|
68
|
-
version_requirements: *
|
|
68
|
+
version_requirements: *70108455611860
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: capybara
|
|
71
|
-
requirement: &
|
|
71
|
+
requirement: &70108455610640 !ruby/object:Gem::Requirement
|
|
72
72
|
none: false
|
|
73
73
|
requirements:
|
|
74
74
|
- - ! '>='
|
|
75
75
|
- !ruby/object:Gem::Version
|
|
76
|
-
version: 1.
|
|
76
|
+
version: 1.1.2
|
|
77
77
|
type: :development
|
|
78
78
|
prerelease: false
|
|
79
|
-
version_requirements: *
|
|
79
|
+
version_requirements: *70108455610640
|
|
80
80
|
- !ruby/object:Gem::Dependency
|
|
81
81
|
name: sqlite3
|
|
82
|
-
requirement: &
|
|
83
|
-
none: false
|
|
84
|
-
requirements:
|
|
85
|
-
- - ! '>='
|
|
86
|
-
- !ruby/object:Gem::Version
|
|
87
|
-
version: 1.3.3
|
|
88
|
-
type: :development
|
|
89
|
-
prerelease: false
|
|
90
|
-
version_requirements: *70343609048820
|
|
91
|
-
- !ruby/object:Gem::Dependency
|
|
92
|
-
name: spork
|
|
93
|
-
requirement: &70343609048360 !ruby/object:Gem::Requirement
|
|
94
|
-
none: false
|
|
95
|
-
requirements:
|
|
96
|
-
- - ! '>='
|
|
97
|
-
- !ruby/object:Gem::Version
|
|
98
|
-
version: 0.9.0.rc9
|
|
99
|
-
type: :development
|
|
100
|
-
prerelease: false
|
|
101
|
-
version_requirements: *70343609048360
|
|
102
|
-
- !ruby/object:Gem::Dependency
|
|
103
|
-
name: spork-testunit
|
|
104
|
-
requirement: &70343609047760 !ruby/object:Gem::Requirement
|
|
82
|
+
requirement: &70108455598500 !ruby/object:Gem::Requirement
|
|
105
83
|
none: false
|
|
106
84
|
requirements:
|
|
107
85
|
- - ! '>='
|
|
108
86
|
- !ruby/object:Gem::Version
|
|
109
|
-
version:
|
|
87
|
+
version: 1.3.4
|
|
110
88
|
type: :development
|
|
111
89
|
prerelease: false
|
|
112
|
-
version_requirements: *
|
|
90
|
+
version_requirements: *70108455598500
|
|
113
91
|
description: Spree Essentials provides a base for several other Spree Commerce extensions.
|
|
114
92
|
The idea is to provide other extensions with common functionality such as an asset-upload
|
|
115
93
|
interface, a markdown editor, and a common admin-navigation tab.
|
|
@@ -129,11 +107,42 @@ files:
|
|
|
129
107
|
- lib/spree_essentials/test_helper.rb
|
|
130
108
|
- lib/spree_essentials/version.rb
|
|
131
109
|
- lib/spree_essentials.rb
|
|
110
|
+
- app/assets/images/admin/icons/pages.png
|
|
111
|
+
- app/assets/images/blog/rss.png
|
|
112
|
+
- app/assets/images/markitup/bg-container.png
|
|
113
|
+
- app/assets/images/markitup/bg-editor.png
|
|
114
|
+
- app/assets/images/markitup/bg-picker.png
|
|
115
|
+
- app/assets/images/markitup/bold.png
|
|
116
|
+
- app/assets/images/markitup/code.png
|
|
117
|
+
- app/assets/images/markitup/h1.png
|
|
118
|
+
- app/assets/images/markitup/h2.png
|
|
119
|
+
- app/assets/images/markitup/h3.png
|
|
120
|
+
- app/assets/images/markitup/h4.png
|
|
121
|
+
- app/assets/images/markitup/h5.png
|
|
122
|
+
- app/assets/images/markitup/h6.png
|
|
123
|
+
- app/assets/images/markitup/handle.png
|
|
124
|
+
- app/assets/images/markitup/image-picker.png
|
|
125
|
+
- app/assets/images/markitup/italic.png
|
|
126
|
+
- app/assets/images/markitup/link.png
|
|
127
|
+
- app/assets/images/markitup/list-bullet.png
|
|
128
|
+
- app/assets/images/markitup/list-numeric.png
|
|
129
|
+
- app/assets/images/markitup/menu.png
|
|
130
|
+
- app/assets/images/markitup/more-tag.png
|
|
131
|
+
- app/assets/images/markitup/picture.png
|
|
132
|
+
- app/assets/images/markitup/preview.png
|
|
133
|
+
- app/assets/images/markitup/quotes.png
|
|
134
|
+
- app/assets/images/markitup/submenu.png
|
|
135
|
+
- app/assets/javascripts/date.js
|
|
136
|
+
- app/assets/javascripts/jquery.autodate.js
|
|
137
|
+
- app/assets/javascripts/jquery.markitup.js
|
|
138
|
+
- app/assets/javascripts/markdown.set.js
|
|
139
|
+
- app/assets/stylesheets/markitup.css.erb
|
|
132
140
|
- app/controllers/admin/markdown_controller.rb
|
|
133
141
|
- app/controllers/admin/uploads_controller.rb
|
|
134
|
-
- app/helpers/admin/
|
|
135
|
-
- app/models/
|
|
142
|
+
- app/helpers/admin/spree_essentials_helper.rb
|
|
143
|
+
- app/models/image_decorator.rb
|
|
136
144
|
- app/models/upload.rb
|
|
145
|
+
- app/overrides/spree_essentials.rb
|
|
137
146
|
- app/validators/datetime_validator.rb
|
|
138
147
|
- app/views/admin/shared/_contents_sub_menu.html.erb
|
|
139
148
|
- app/views/admin/shared/_contents_tab.html.erb
|
|
@@ -142,36 +151,6 @@ files:
|
|
|
142
151
|
- app/views/admin/uploads/index.html.erb
|
|
143
152
|
- app/views/admin/uploads/new.html.erb
|
|
144
153
|
- app/views/admin/uploads/picker.html.erb
|
|
145
|
-
- public/images/admin/icons/pages.png
|
|
146
|
-
- public/images/blog/rss.png
|
|
147
|
-
- public/images/markitup/bg-container.png
|
|
148
|
-
- public/images/markitup/bg-editor.png
|
|
149
|
-
- public/images/markitup/bg-picker.png
|
|
150
|
-
- public/images/markitup/bold.png
|
|
151
|
-
- public/images/markitup/code.png
|
|
152
|
-
- public/images/markitup/h1.png
|
|
153
|
-
- public/images/markitup/h2.png
|
|
154
|
-
- public/images/markitup/h3.png
|
|
155
|
-
- public/images/markitup/h4.png
|
|
156
|
-
- public/images/markitup/h5.png
|
|
157
|
-
- public/images/markitup/h6.png
|
|
158
|
-
- public/images/markitup/handle.png
|
|
159
|
-
- public/images/markitup/image-picker.png
|
|
160
|
-
- public/images/markitup/italic.png
|
|
161
|
-
- public/images/markitup/link.png
|
|
162
|
-
- public/images/markitup/list-bullet.png
|
|
163
|
-
- public/images/markitup/list-numeric.png
|
|
164
|
-
- public/images/markitup/menu.png
|
|
165
|
-
- public/images/markitup/more-tag.png
|
|
166
|
-
- public/images/markitup/picture.png
|
|
167
|
-
- public/images/markitup/preview.png
|
|
168
|
-
- public/images/markitup/quotes.png
|
|
169
|
-
- public/images/markitup/submenu.png
|
|
170
|
-
- public/javascripts/date.js
|
|
171
|
-
- public/javascripts/jquery.autodate.js
|
|
172
|
-
- public/javascripts/jquery.markitup.js
|
|
173
|
-
- public/javascripts/markdown.set.js
|
|
174
|
-
- public/stylesheets/markitup.css
|
|
175
154
|
- Rakefile
|
|
176
155
|
homepage: https://github.com/citrus/spree_essentials
|
|
177
156
|
licenses: []
|
|
@@ -187,7 +166,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
187
166
|
version: '0'
|
|
188
167
|
segments:
|
|
189
168
|
- 0
|
|
190
|
-
hash: -
|
|
169
|
+
hash: -706572084736491213
|
|
191
170
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
171
|
none: false
|
|
193
172
|
requirements:
|
|
@@ -196,7 +175,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
196
175
|
version: '0'
|
|
197
176
|
segments:
|
|
198
177
|
- 0
|
|
199
|
-
hash: -
|
|
178
|
+
hash: -706572084736491213
|
|
200
179
|
requirements: []
|
|
201
180
|
rubyforge_project:
|
|
202
181
|
rubygems_version: 1.8.10
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
Spree::BaseHelper.class_eval do
|
|
2
|
-
|
|
3
|
-
def markdown_helper
|
|
4
|
-
content_tag('em', :class => 'small') do
|
|
5
|
-
[
|
|
6
|
-
" ",
|
|
7
|
-
t('essentials.parsed_with'),
|
|
8
|
-
link_to("Markdown", "http://daringfireball.net/projects/markdown/basics", :onclick => 'window.open(this.href); return false')
|
|
9
|
-
].join(" ").html_safe
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def method_missing(method, *args, &block)
|
|
14
|
-
return super unless method.to_s =~ /_path$/
|
|
15
|
-
"/" + method.to_s.sub(/_path$/, '').gsub('_', '-')
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
end
|