burp_cms 1.3.8 → 1.3.9
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.
- checksums.yaml +7 -0
- data/Rakefile +1 -1
- data/app/assets/packages/burp/editing/js/content-decorator.js +8 -4
- data/app/assets/packages/burp/editing/js/jquery.html2markdown.js +106 -0
- data/app/assets/packages/burp/editing/js/main.js +34 -28
- data/app/assets/packages/burp/editing.js +1 -2
- data/app/controllers/burp/pages_controller.rb +0 -1
- data/app/models/burp/page_model.rb +3 -3
- data/config/cucumber.yml +6 -6
- data/lib/burp/version.rb +1 -1
- metadata +34 -706
- data/app/assets/packages/burp/editing/js/md5.js +0 -207
- data/app/assets/packages/burp/editing/js/stay.js +0 -143
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 69640b78009a3ef7f7ce44e6200c2d1e22b88fd5
|
4
|
+
data.tar.gz: 362bf1d918fcf70b7463e0a59a7d441ecbead81d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7bb555fbcfc93e2e20736a38177d625b03d944158e2a2265960f4821f3b6b1713066c6c2916831f685a14a41a8442d64ea6cc6acc0228b8615b5159e73b9a9c0
|
7
|
+
data.tar.gz: cb0fc29aa1944da612f0cb92042394965ebe23dc3c7f516d3bbee6baebf57b73361596ec07218aa28f1af97024e0ae25f8e492d0e95eb8d9a9d634dc0701b1e6
|
data/Rakefile
CHANGED
@@ -19,7 +19,7 @@ require 'burp/version'
|
|
19
19
|
Jeweler::Tasks.new do |gem|
|
20
20
|
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
21
21
|
gem.name = "burp_cms"
|
22
|
-
|
22
|
+
gem.homepage = "http://github.com/bjornblomqvist/burp"
|
23
23
|
gem.license = "LGPL3"
|
24
24
|
gem.summary = %Q{ A CMS that tryes hard to not get in your way! }
|
25
25
|
gem.description = %Q{ A CMS that tryes hard to not get in your way! }
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*global
|
2
|
-
marked
|
2
|
+
marked
|
3
3
|
*/
|
4
4
|
(function($) {
|
5
5
|
|
@@ -17,7 +17,6 @@
|
|
17
17
|
|
18
18
|
function ContentDecorator(element, options) {
|
19
19
|
this.element = $(element);
|
20
|
-
this.parking = $('<div style="display: none;"></div>');
|
21
20
|
|
22
21
|
if (typeof(options) === 'object') {
|
23
22
|
this.onUpdate = options['update'];
|
@@ -166,6 +165,7 @@
|
|
166
165
|
}
|
167
166
|
|
168
167
|
$("#gallery").removeClass('delete-active');
|
168
|
+
$(document).trigger("image-drop-done.burp");
|
169
169
|
}
|
170
170
|
});
|
171
171
|
|
@@ -283,10 +283,14 @@
|
|
283
283
|
}
|
284
284
|
});
|
285
285
|
|
286
|
-
$(this.element).park('.movable');
|
287
286
|
this.element.html("");
|
288
287
|
this.element.append(tempElement.children());
|
289
|
-
|
288
|
+
|
289
|
+
initializeMovable(this, this.element.find('img'), function(element, positionClass) {
|
290
|
+
$(element).removeClass('left center right');
|
291
|
+
$(element).addClass(positionClass);
|
292
|
+
return element;
|
293
|
+
});
|
290
294
|
},
|
291
295
|
|
292
296
|
makeDroppable: function(elements, createCallback) {
|
@@ -0,0 +1,106 @@
|
|
1
|
+
|
2
|
+
function getAfterPadding(element,padding) {
|
3
|
+
var next = $(element).get(0).nextSibling;
|
4
|
+
if(!next) {
|
5
|
+
padding = "";
|
6
|
+
} else if(next.nodeType === 3) {
|
7
|
+
if(next.data.match(/^(\t| )*\n(\t| )*\n/)) {
|
8
|
+
padding = "";
|
9
|
+
} else if(next.data.match(/^(\t| )*\n/) && padding.length > 1) {
|
10
|
+
padding = "\n";
|
11
|
+
}
|
12
|
+
}
|
13
|
+
return padding;
|
14
|
+
}
|
15
|
+
|
16
|
+
function getBeforePadding(element,padding) {
|
17
|
+
var previous = $(element).get(0).previousSibling;
|
18
|
+
if(!previous) {
|
19
|
+
padding = "";
|
20
|
+
} else if(previous.nodeType === 3) {
|
21
|
+
if(previous.data.match(/\n(\t| )*\n(\t| )*$/)) {
|
22
|
+
padding = "";
|
23
|
+
} else if(previous.data.match(/\n(\t| )*$/) && padding.length > 1) {
|
24
|
+
padding = "\n";
|
25
|
+
}
|
26
|
+
}
|
27
|
+
return padding;
|
28
|
+
}
|
29
|
+
|
30
|
+
function Html2Markdown(value) {
|
31
|
+
var dom = $("<div id=\"root\"></div>");
|
32
|
+
dom.append(value);
|
33
|
+
|
34
|
+
dom.find("> hr").each(function() {
|
35
|
+
$(this).replaceWith("---");
|
36
|
+
});
|
37
|
+
|
38
|
+
dom.find("em > strong").each(function() {
|
39
|
+
$(this).replaceWith("**"+$(this).html()+"**");
|
40
|
+
});
|
41
|
+
|
42
|
+
dom.find("> p > em, > em, > ul > li > em").each(function() {
|
43
|
+
$(this).replaceWith("_"+$(this).html()+"_");
|
44
|
+
});
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
dom.find("> strong, > p > strong, > ul > li > strong").each(function() {
|
49
|
+
$(this).replaceWith("**"+$(this).html()+"**");
|
50
|
+
});
|
51
|
+
|
52
|
+
dom.find("> p, blockquote > p").each(function() {
|
53
|
+
if($(this).get(0).attributes.length === 0) {
|
54
|
+
$(this).replaceWith(getBeforePadding(this,"\n\n")+$(this).html()+getAfterPadding(this,"\n\n"));
|
55
|
+
}
|
56
|
+
});
|
57
|
+
|
58
|
+
dom.find("ul").each(function() {
|
59
|
+
$(this).find('li').each(function() {
|
60
|
+
$(this).replaceWith("- "+$(this).html()+getAfterPadding(this,"\n"));
|
61
|
+
});
|
62
|
+
$(this).replaceWith(getBeforePadding(this,"\n\n")+$(this).html());
|
63
|
+
});
|
64
|
+
|
65
|
+
dom.find("ol").each(function() {
|
66
|
+
$(this).find('li').each(function(index,value) {
|
67
|
+
$(this).replaceWith((index+1)+". "+$(this).html()+getAfterPadding(this,"\n"));
|
68
|
+
});
|
69
|
+
$(this).replaceWith(getBeforePadding(this,"\n\n")+$(this).html());
|
70
|
+
});
|
71
|
+
|
72
|
+
dom.find('blockquote').each(function() {
|
73
|
+
$(this).replaceWith("> "+$.trim($(this).html()).replace(/\n{2,20}/g,"\n\n").replace(/\n/g,'\n> ').replace(/> \n/g,">\n"));
|
74
|
+
});
|
75
|
+
|
76
|
+
$.each(["h1",'h2','h3','h4','h5'],function(index,value) {
|
77
|
+
|
78
|
+
var hashes = "";
|
79
|
+
var i = 0;
|
80
|
+
for(; i <= index;i++) {
|
81
|
+
hashes += "#";
|
82
|
+
}
|
83
|
+
|
84
|
+
dom.find("> "+value).each(function() {
|
85
|
+
|
86
|
+
if($(this).get(0).attributes.length === 0) {
|
87
|
+
$(this).find("> strong").each(function() {
|
88
|
+
$(this).replaceWith("**"+$(this).html()+"**");
|
89
|
+
});
|
90
|
+
|
91
|
+
$(this).find("> em").each(function() {
|
92
|
+
$(this).replaceWith("_"+$(this).html()+"_");
|
93
|
+
});
|
94
|
+
|
95
|
+
var newLine = "\n\n";
|
96
|
+
if($(this).next().length === 0) {
|
97
|
+
newLine = "";
|
98
|
+
}
|
99
|
+
|
100
|
+
$(this).replaceWith(getBeforePadding(this,"\n\n")+hashes+" "+$.trim($(this).html()) + newLine);
|
101
|
+
}
|
102
|
+
});
|
103
|
+
});
|
104
|
+
|
105
|
+
return dom.html().replace(/^>/mg,'>').replace(/^</mg,'<').replace(/\n{2,20}/g,"\n\n");
|
106
|
+
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*global
|
2
|
-
snippets CodeMirror ContentDecorator qq
|
2
|
+
snippets CodeMirror ContentDecorator qq Html2Markdown
|
3
3
|
*/
|
4
4
|
|
5
5
|
$(function() {
|
@@ -51,36 +51,37 @@ $(function() {
|
|
51
51
|
}
|
52
52
|
}
|
53
53
|
|
54
|
+
function loadHTML() {
|
55
|
+
|
56
|
+
var element = snippets().snippets[snippetName].elements().clone();
|
57
|
+
element.find('.markdown').each(function() {
|
58
|
+
$(this).removeClass('markdown');
|
59
|
+
if($(this).attr('class') === "") {
|
60
|
+
$(this).removeAttr('class');
|
61
|
+
}
|
62
|
+
});
|
63
|
+
|
64
|
+
element.find('script[type="text/dont-run-javascript"]').each(function() {
|
65
|
+
$(this).attr("type",'text/javascript');
|
66
|
+
});
|
67
|
+
|
68
|
+
element.find('img.movable').each(function() {
|
69
|
+
$(this).removeClass('movable ui-draggable ui-droppable');
|
70
|
+
});
|
71
|
+
|
72
|
+
editor.setValue(Html2Markdown(element.children()));
|
73
|
+
}
|
74
|
+
|
54
75
|
function loadSnippet() {
|
55
76
|
var path = window.burp_path || window.location.pathname;
|
56
77
|
if(path === "/") {
|
57
78
|
path = "/$root";
|
58
79
|
}
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
if(data === null) {
|
65
|
-
// No page yet so our code needs a bit help
|
66
|
-
data = {};
|
67
|
-
}
|
68
|
-
|
69
|
-
// We default to the html
|
70
|
-
var value = originalHtml;
|
71
|
-
if(data.misc && data.misc.markdown && data.misc.markdown[snippetName]) {
|
72
|
-
value = data.misc.markdown[snippetName];
|
73
|
-
} else if(data.snippets[snippetName]) {
|
74
|
-
value = data.snippets[snippetName];
|
75
|
-
}
|
76
|
-
|
77
|
-
originalValue = value;
|
78
|
-
editor.setValue(value);
|
79
|
-
editor.clearHistory();
|
80
|
-
|
81
|
-
update(editor.getValue());
|
82
|
-
}
|
83
|
-
});
|
80
|
+
|
81
|
+
loadHTML();
|
82
|
+
editor.clearHistory();
|
83
|
+
update(editor.getValue());
|
84
|
+
originalValue = editor.getValue();
|
84
85
|
}
|
85
86
|
|
86
87
|
function loadFiles() {
|
@@ -176,8 +177,15 @@ $(function() {
|
|
176
177
|
$.adminDock.title('');
|
177
178
|
$.adminDock.footer.addButton({ icon: 'picture', text: "Pictures", showModule: $('#gallery') });
|
178
179
|
$.adminDock.footer.addButton({ icon: 'edit', text: "Edit text", showModule: $('#myContentEditor'), show: function() {
|
180
|
+
loadHTML();
|
179
181
|
editor.refresh();
|
180
182
|
} });
|
183
|
+
|
184
|
+
|
185
|
+
$(document).on('image-drop-done.burp', function() {
|
186
|
+
loadHTML();
|
187
|
+
editor.refresh();
|
188
|
+
});
|
181
189
|
|
182
190
|
var snippet_names = [];
|
183
191
|
$.each(snippets().snippets,function(name,snippet) {
|
@@ -255,8 +263,6 @@ $(function() {
|
|
255
263
|
data = data || {snippets:{}};
|
256
264
|
|
257
265
|
data.snippets[snippetName] = contentDecorator.getHtml();
|
258
|
-
data.misc = data.misc || {markdown:{}};
|
259
|
-
data.misc.markdown[snippetName] = contentDecorator.getMarkdown();
|
260
266
|
|
261
267
|
$.ajax("/burp/pages/"+path,{
|
262
268
|
type:"post",
|
@@ -4,9 +4,8 @@
|
|
4
4
|
//= require jquery.ui.droppable
|
5
5
|
//= require ../gritter/gritter.js
|
6
6
|
//= require ../../javascripts/burp/lib/fileupload.js
|
7
|
-
//= require ./editing/js/md5.js
|
8
7
|
//= require ./editing/js/marked.js
|
9
|
-
//= require ./editing/js/
|
8
|
+
//= require ./editing/js/jquery.html2markdown.js
|
10
9
|
//= require ./editing/js/admin-dock.js
|
11
10
|
//= require ./editing/js/content-decorator.js
|
12
11
|
//= require ./editing/dep/CodeMirror-2.3/lib/codemirror.js
|
@@ -8,7 +8,7 @@ module Burp
|
|
8
8
|
include ActiveModel::Conversion
|
9
9
|
extend ActiveModel::Naming
|
10
10
|
|
11
|
-
attr_accessor :path, :title, :snippets
|
11
|
+
attr_accessor :path, :title, :snippets
|
12
12
|
|
13
13
|
validates_presence_of :path, :message => "You must enter a path"
|
14
14
|
validates :path, :format => { :with => /^\//, :message => "Must start with a slash" }
|
@@ -49,7 +49,7 @@ module Burp
|
|
49
49
|
|
50
50
|
page_data = File.exist?("#{on_disk_path}/page.json") ? JSON.parse(File.read("#{on_disk_path}/page.json")) : {}
|
51
51
|
|
52
|
-
PageModel.new(:snippets => data,:title => page_data['title']
|
52
|
+
PageModel.new(:snippets => data,:title => page_data['title'], :path => path, :original_path => path)
|
53
53
|
else
|
54
54
|
nil
|
55
55
|
end
|
@@ -110,7 +110,7 @@ module Burp
|
|
110
110
|
def save_metadata
|
111
111
|
|
112
112
|
File.open("#{on_disk_path}/page.json","w:utf-8") do |file|
|
113
|
-
file.write(JSON.pretty_generate({:title => title
|
113
|
+
file.write(JSON.pretty_generate({:title => title}))
|
114
114
|
end
|
115
115
|
|
116
116
|
end
|
data/config/cucumber.yml
CHANGED
@@ -3,10 +3,10 @@ rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
|
|
3
3
|
rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
|
4
4
|
std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} --strict --color --tags ~@wip"
|
5
5
|
%>
|
6
|
-
default: --
|
7
|
-
pretty:
|
8
|
-
wip: --
|
6
|
+
default: --port 4012 <%= std_opts %> features --guess -r ./features
|
7
|
+
pretty: --color --port 4012 features --guess -r ./features
|
8
|
+
wip: --port 4012 --color --tags @wip --wip features --guess -r ./features
|
9
9
|
rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip --guess -r ./features
|
10
|
-
autotest: --color --
|
11
|
-
autotest-all: --color --format pretty --tags @auto --
|
12
|
-
current: --
|
10
|
+
autotest: --color --port 4012 --format pretty --guess -r ./features
|
11
|
+
autotest-all: --color --format pretty --tags @auto --port 4012 --guess -r ./features
|
12
|
+
current: --port 4012 --tags @current --guess -r ./features --format pretty --strict
|
data/lib/burp/version.rb
CHANGED