pageflow-chart 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +21 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile +10 -0
- data/README.md +91 -0
- data/Rakefile +20 -0
- data/app/assets/images/pageflow/chart/fs_close_sprite.png +0 -0
- data/app/assets/images/pageflow/chart_pictogram.png +0 -0
- data/app/assets/images/pageflow/chart_pictogram_small.png +0 -0
- data/app/assets/images/pageflow/chart_sprite.png +0 -0
- data/app/assets/images/pageflow/ov-chart.png +0 -0
- data/app/assets/javascripts/pageflow/chart.js +5 -0
- data/app/assets/javascripts/pageflow/chart/asset_urls.js.erb +3 -0
- data/app/assets/javascripts/pageflow/chart/editor.js +9 -0
- data/app/assets/javascripts/pageflow/chart/editor/collections/scraped_sites_collection.js +23 -0
- data/app/assets/javascripts/pageflow/chart/editor/initializers/setup_collections.js +1 -0
- data/app/assets/javascripts/pageflow/chart/editor/models/scraped_site.js +55 -0
- data/app/assets/javascripts/pageflow/chart/editor/templates/scraped_site_status.jst.ejs +2 -0
- data/app/assets/javascripts/pageflow/chart/editor/templates/url_input.jst.ejs +7 -0
- data/app/assets/javascripts/pageflow/chart/editor/views/configuration_editor.js +26 -0
- data/app/assets/javascripts/pageflow/chart/editor/views/embedded/iframe_embedded_view.js +47 -0
- data/app/assets/javascripts/pageflow/chart/editor/views/inputs/scraped_url_input_view.js +49 -0
- data/app/assets/javascripts/pageflow/chart/editor/views/scraped_site_status_view.js +18 -0
- data/app/assets/javascripts/pageflow/chart/page_type.js +152 -0
- data/app/assets/stylesheets/pageflow/chart.css.scss +130 -0
- data/app/assets/stylesheets/pageflow/chart/custom.css.scss +209 -0
- data/app/assets/stylesheets/pageflow/chart/editor.css.scss +17 -0
- data/app/assets/stylesheets/pageflow/chart/themes/default.css.scss +10 -0
- data/app/controllers/pageflow/chart/application_controller.rb +6 -0
- data/app/controllers/pageflow/chart/scraped_sites_controller.rb +25 -0
- data/app/helpers/pageflow/chart/scraped_sites_helper.rb +13 -0
- data/app/jobs/pageflow/chart/scrape_site_job.rb +59 -0
- data/app/models/pageflow/chart/scraped_site.rb +51 -0
- data/app/views/pageflow/chart/page.html +41 -0
- data/app/views/pageflow/chart/page_type.json.jbuilder +2 -0
- data/bin/rails +8 -0
- data/chart.gemspec +30 -0
- data/config/locales/de.yml +40 -0
- data/config/locales/en.yml +22 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20140417112724_create_pageflow_chart_scraped_sites.rb +14 -0
- data/lib/pageflow/chart.rb +21 -0
- data/lib/pageflow/chart/configuration.rb +63 -0
- data/lib/pageflow/chart/downloader.rb +53 -0
- data/lib/pageflow/chart/engine.rb +17 -0
- data/lib/pageflow/chart/page_type.rb +15 -0
- data/lib/pageflow/chart/scraper.rb +107 -0
- data/spec/controllers/pageflow/chart/scraped_sites_controller_spec.rb +35 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +22 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/db/schema.rb +39 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/scraped_sites.rb +5 -0
- data/spec/fixtures/datawrapper.html +121 -0
- data/spec/jobs/pageflow/chart/scrape_site_job_spec.rb +22 -0
- data/spec/models/pageflow/chart/scraped_site_spec.rb +19 -0
- data/spec/pageflow/chart/downloader_spec.rb +90 -0
- data/spec/pageflow/chart/scraper_spec.rb +179 -0
- data/spec/requests/scraping_site_spec.rb +23 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/support/factory_girl.rb +5 -0
- data/spec/support/html_fragment.rb +13 -0
- data/spec/support/paperclip.rb +11 -0
- data/spec/support/resque.rb +20 -0
- data/spec/support/webmock.rb +11 -0
- metadata +363 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZmViYWVjOGM0OGIwOTFkODk3MzA1NjBiOWQxMDBiMjQ3NDNkNzFjZA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZTBhODQ0ZTE2ZGNiYzI4NDQ0YTRhYmFlN2Y1NjZiZTg1NjllODNlMA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZTQzNzQxZjczZDBiZDkyY2VmMTg2ZjQ2NGY1ZDAwY2RiZDdmOGRjZGMyYWQx
|
10
|
+
NTYyMDU0YWUyNzYzMDllODQxNTA4NmYyYjc2NTVmNmIyMzVlMDc3NDJiNWY2
|
11
|
+
ODk1Y2M5NDVjNDAwY2IyZWM1ZTljNGMzODIzMjM2YWM0MWMxMTU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NDk1NDY1YTkzNWQ0ODRiMWZlNjhjZDM2ZDM3ZTNhOTNiYTQ4YWI1MzUzMWQw
|
14
|
+
ZGNkZWRkM2ZiMjcxNjMxMTJmYTc0MmVlYjU3YzcwNDY1OWM5Mjc1NmQ5MWE4
|
15
|
+
MWQwZjIyYTlkMDk2MmFlOWYyYWIzYzk5ZmU2ZDNlM2M1NDE1Y2U=
|
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in chart.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
gem 'activeadmin', :git => 'https://github.com/codevise/active_admin.git', :branch => 'rails4'
|
7
|
+
gem 'ransack'
|
8
|
+
gem 'inherited_resources', '1.4.1'
|
9
|
+
gem 'formtastic', '2.3.0.rc2'
|
10
|
+
|
data/README.md
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
# Pageflow Chart
|
2
|
+
|
3
|
+
Page type showing scraped svg diagramms from Datawrapper.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
# Gemfile
|
10
|
+
gem 'pagflow-chart'
|
11
|
+
|
12
|
+
Mount the engine:
|
13
|
+
|
14
|
+
# config/routes.rb
|
15
|
+
mount Pageflow::Chart::Engine, :at => '/chart'
|
16
|
+
|
17
|
+
Register the page type:
|
18
|
+
|
19
|
+
# config/initializers/pageflow.rb
|
20
|
+
config.register_page_type(Pageflow::Chart.page_type)
|
21
|
+
|
22
|
+
Include javascript/stylesheets:
|
23
|
+
|
24
|
+
# app/assets/javascripts/pageflow/application.js
|
25
|
+
//= require "pageflow/chart"
|
26
|
+
|
27
|
+
# app/assets/javascripts/pageflow/editor.js
|
28
|
+
//= require pageflow/chart/editor
|
29
|
+
|
30
|
+
# app/assets/stylesheets/pageflow/application.scss.css;
|
31
|
+
@import "pageflow/chart";
|
32
|
+
|
33
|
+
|
34
|
+
# app/assets/stylesheets/pageflow/editor.scss.css;
|
35
|
+
@import "pageflow/chart/editor";
|
36
|
+
|
37
|
+
# Adding basic style to your theme
|
38
|
+
# app/assets/stylesheets/pageflow/themes/default.css.scss
|
39
|
+
@import "pageflow/chart/themes/default";
|
40
|
+
|
41
|
+
Install and run migrations:
|
42
|
+
|
43
|
+
rake pageflow_chart:install:migrations
|
44
|
+
rake db:migrate SCOPE=pageflow_chart
|
45
|
+
|
46
|
+
## Create Proxy
|
47
|
+
|
48
|
+
Create a proxy (via Apache, Nginx, ...) from your domain to your configured
|
49
|
+
`S3_HOST_ALIAS` to circumvent the same-domain policy. Configure this
|
50
|
+
in your Pageflow Chart initializer `config/initializers/pageflow_chart.rb`.
|
51
|
+
|
52
|
+
Example conf snippet for Nginx:
|
53
|
+
|
54
|
+
location /datawrapper/ {
|
55
|
+
proxy_pass http://bucketname.s3-website-eu-west-1.amazonaws.com/;
|
56
|
+
proxy_redirect http://bucketname.s3-website-eu-west-1.amazonaws.com/ $scheme://$host/datawrapper/;
|
57
|
+
}
|
58
|
+
|
59
|
+
This is needed so the charts can be servered from the same origin as
|
60
|
+
the entry.
|
61
|
+
|
62
|
+
## Configuration
|
63
|
+
|
64
|
+
Configure Pageflow Chart by creating an initializer in your app
|
65
|
+
`config/initializers/pageflow_chart.rb`.
|
66
|
+
|
67
|
+
Example:
|
68
|
+
|
69
|
+
Pageflow::Chart.configure do |config|
|
70
|
+
config.scraped_sites_root_url = '/datawrapper'
|
71
|
+
end
|
72
|
+
|
73
|
+
Please see `lib/pageflow/chart/configuration.rb` for the possible options.
|
74
|
+
|
75
|
+
TODO: Document config options here
|
76
|
+
|
77
|
+
## Troubleshooting
|
78
|
+
|
79
|
+
If you run into problems while installing the page type, please also
|
80
|
+
refer to the
|
81
|
+
[Troubleshooting](https://github.com/codevise/pageflow/wiki/Troubleshooting)
|
82
|
+
wiki page in the
|
83
|
+
[Pageflow repository](https://github.com/codevise/pageflow). If that
|
84
|
+
doesn't help, consider
|
85
|
+
[filing an issue](https://github.com/codevise/pageflow-chart/issues).
|
86
|
+
|
87
|
+
## Contributing Locales
|
88
|
+
|
89
|
+
Edit the translations directly on the
|
90
|
+
[pageflow-chart](http://www.localeapp.com/projects/public?search=tf/pageflow-chart)
|
91
|
+
locale project.
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'Pageflow Chart'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
Bundler::GemHelper.install_tasks
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,9 @@
|
|
1
|
+
//= require_self
|
2
|
+
//= require_tree ./editor/models
|
3
|
+
//= require_tree ./editor/collections
|
4
|
+
//= require_tree ./editor/views/inputs
|
5
|
+
//= require_tree ./editor/templates
|
6
|
+
//= require_tree ./editor/views
|
7
|
+
//= require_tree ./editor/initializers
|
8
|
+
|
9
|
+
pageflow.chart = pageflow.chart || {};
|
@@ -0,0 +1,23 @@
|
|
1
|
+
pageflow.chart.ScrapedSitesCollection = Backbone.Collection.extend({
|
2
|
+
model: pageflow.chart.ScrapedSite,
|
3
|
+
|
4
|
+
name: 'scraped_sites',
|
5
|
+
|
6
|
+
getOrFetch: function(id, options) {
|
7
|
+
options = options || {};
|
8
|
+
var model = this.get(id);
|
9
|
+
|
10
|
+
if (model) {
|
11
|
+
if (options.success) {
|
12
|
+
options.success(model);
|
13
|
+
}
|
14
|
+
}
|
15
|
+
else {
|
16
|
+
model = new pageflow.chart.ScrapedSite({id: id});
|
17
|
+
this.add(model);
|
18
|
+
model.fetch(options);
|
19
|
+
}
|
20
|
+
|
21
|
+
return model;
|
22
|
+
}
|
23
|
+
});
|
@@ -0,0 +1 @@
|
|
1
|
+
pageflow.chart.scrapedSites = new pageflow.chart.ScrapedSitesCollection();
|
@@ -0,0 +1,55 @@
|
|
1
|
+
pageflow.chart.ScrapedSite = Backbone.Model.extend({
|
2
|
+
modelName: 'scraped_site',
|
3
|
+
paramRoot: 'scraped_site',
|
4
|
+
|
5
|
+
initialize: function() {
|
6
|
+
this.listenTo(this, 'sync', function() {
|
7
|
+
if (this.isProcessing() && !this.pollingInterval) {
|
8
|
+
this.pollUntilScraped();
|
9
|
+
}
|
10
|
+
});
|
11
|
+
},
|
12
|
+
|
13
|
+
urlRoot: function() {
|
14
|
+
return '/chart/scraped_sites';
|
15
|
+
},
|
16
|
+
|
17
|
+
isProcessed: function() {
|
18
|
+
return this.get('state') === 'processed';
|
19
|
+
},
|
20
|
+
|
21
|
+
isProcessing: function() {
|
22
|
+
return this.get('state') === 'processing';
|
23
|
+
},
|
24
|
+
|
25
|
+
isFailed: function() {
|
26
|
+
return this.get('state') === 'processing_failed';
|
27
|
+
},
|
28
|
+
|
29
|
+
pollUntilScraped: function() {
|
30
|
+
var model = this;
|
31
|
+
|
32
|
+
if (model.isProcessed()) {
|
33
|
+
return;
|
34
|
+
}
|
35
|
+
|
36
|
+
model.pollingInterval = setInterval(poll, 1000);
|
37
|
+
|
38
|
+
function stopPolling() {
|
39
|
+
if (model.pollingInterval) {
|
40
|
+
clearInterval(model.pollingInterval);
|
41
|
+
model.pollingInterval = null;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
function poll() {
|
46
|
+
model.fetch({
|
47
|
+
success: function() {
|
48
|
+
if (!model.isProcessing()) {
|
49
|
+
stopPolling();
|
50
|
+
}
|
51
|
+
}
|
52
|
+
});
|
53
|
+
}
|
54
|
+
}
|
55
|
+
});
|
@@ -0,0 +1,26 @@
|
|
1
|
+
pageflow.ConfigurationEditorView.register('chart', {
|
2
|
+
configure: function() {
|
3
|
+
var supportedHosts = this.options.pageType.supportedHosts;
|
4
|
+
|
5
|
+
this.tab('general', function() {
|
6
|
+
this.group('general');
|
7
|
+
});
|
8
|
+
|
9
|
+
this.tab('files', function() {
|
10
|
+
this.input('scraped_site_id', pageflow.chart.ScrapedUrlInputView, {
|
11
|
+
supportedHosts: supportedHosts,
|
12
|
+
displayPropertyName: 'display_scraped_site_url',
|
13
|
+
required: true
|
14
|
+
});
|
15
|
+
this.input('background_image_id', pageflow.FileInputView, {collection: pageflow.imageFiles});
|
16
|
+
this.input('thumbnail_image_id', pageflow.FileInputView, {
|
17
|
+
collection: pageflow.imageFiles,
|
18
|
+
imagePositioning: false
|
19
|
+
});
|
20
|
+
});
|
21
|
+
|
22
|
+
this.tab('options', function() {
|
23
|
+
this.group('options');
|
24
|
+
});
|
25
|
+
}
|
26
|
+
});
|
@@ -0,0 +1,47 @@
|
|
1
|
+
pageflow.chart.IframeEmbeddedView = Backbone.Marionette.View.extend({
|
2
|
+
modelEvents: {
|
3
|
+
'change': 'update'
|
4
|
+
},
|
5
|
+
|
6
|
+
render: function() {
|
7
|
+
this.updateScrapedSite();
|
8
|
+
return this;
|
9
|
+
},
|
10
|
+
|
11
|
+
update: function() {
|
12
|
+
if (this.model.hasChanged(this.options.propertyName)) {
|
13
|
+
this.updateScrapedSite();
|
14
|
+
}
|
15
|
+
},
|
16
|
+
|
17
|
+
updateScrapedSite: function() {
|
18
|
+
var view = this;
|
19
|
+
|
20
|
+
if (this.scrapedSite) {
|
21
|
+
this.stopListening(this.scrapedSite);
|
22
|
+
}
|
23
|
+
|
24
|
+
var scrapedSiteId = this.model.get(this.options.propertyName);
|
25
|
+
|
26
|
+
if (scrapedSiteId) {
|
27
|
+
this.scrapedSite = pageflow.chart.scrapedSites.getOrFetch(scrapedSiteId, {
|
28
|
+
success: function(scrapedSite) {
|
29
|
+
view.updateSrc(scrapedSite);
|
30
|
+
}
|
31
|
+
});
|
32
|
+
|
33
|
+
this.listenTo(this.scrapedSite, 'change', this.updateSrc);
|
34
|
+
}
|
35
|
+
},
|
36
|
+
|
37
|
+
updateSrc: function(scrapedSite) {
|
38
|
+
scrapedSite = scrapedSite || this.scrapedSite;
|
39
|
+
|
40
|
+
if (scrapedSite && scrapedSite.isProcessed()) {
|
41
|
+
this.$el.attr('src', scrapedSite.get('html_file_url'));
|
42
|
+
}
|
43
|
+
else {
|
44
|
+
this.$el.attr('src', '');
|
45
|
+
}
|
46
|
+
}
|
47
|
+
});
|
@@ -0,0 +1,49 @@
|
|
1
|
+
pageflow.chart.ScrapedUrlInputView = pageflow.UrlInputView.extend({
|
2
|
+
template: 'pageflow/chart/editor/templates/url_input',
|
3
|
+
|
4
|
+
regions: {
|
5
|
+
statusContainer: '.status_container'
|
6
|
+
},
|
7
|
+
|
8
|
+
onLoad: function() {
|
9
|
+
this.listenTo(this.model, 'change:' + this.options.propertyName, function() {
|
10
|
+
this.updateScrapingStatus();
|
11
|
+
});
|
12
|
+
|
13
|
+
this.updateScrapingStatus();
|
14
|
+
},
|
15
|
+
|
16
|
+
transformPropertyValue: function(url) {
|
17
|
+
return $.Deferred(function(deferred) {
|
18
|
+
pageflow.chart.scrapedSites.create(
|
19
|
+
{
|
20
|
+
url: url
|
21
|
+
},
|
22
|
+
{
|
23
|
+
success: function(scrapedSite) {
|
24
|
+
deferred.resolve(scrapedSite.id);
|
25
|
+
}
|
26
|
+
}
|
27
|
+
);
|
28
|
+
}).promise();
|
29
|
+
},
|
30
|
+
|
31
|
+
updateScrapingStatus: function() {
|
32
|
+
var scrapedSite = this.getScrapedSite();
|
33
|
+
|
34
|
+
if (scrapedSite) {
|
35
|
+
this.statusContainer.show(new pageflow.chart.ScrapedSiteStatusView({
|
36
|
+
model: scrapedSite
|
37
|
+
}));
|
38
|
+
}
|
39
|
+
else {
|
40
|
+
this.statusContainer.close();
|
41
|
+
}
|
42
|
+
},
|
43
|
+
|
44
|
+
getScrapedSite: function() {
|
45
|
+
if (this.model.has(this.options.propertyName)) {
|
46
|
+
return pageflow.chart.scrapedSites.getOrFetch(this.model.get(this.options.propertyName));
|
47
|
+
}
|
48
|
+
}
|
49
|
+
});
|
@@ -0,0 +1,18 @@
|
|
1
|
+
pageflow.chart.ScrapedSiteStatusView = Backbone.Marionette.ItemView.extend({
|
2
|
+
template: 'pageflow/chart/editor/templates/scraped_site_status',
|
3
|
+
className: 'scraped_site_status',
|
4
|
+
|
5
|
+
modelEvents: {
|
6
|
+
change: 'update'
|
7
|
+
},
|
8
|
+
|
9
|
+
onRender: function() {
|
10
|
+
this.update();
|
11
|
+
},
|
12
|
+
|
13
|
+
update: function() {
|
14
|
+
this.$el.toggleClass('processed', this.model.isProcessed());
|
15
|
+
this.$el.toggleClass('failed', this.model.isFailed());
|
16
|
+
this.$el.toggleClass('processing', this.model.isProcessing());
|
17
|
+
}
|
18
|
+
});
|