sibyl 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +24 -10
  3. data/app/assets/images/old_moon/old_moon.png +0 -0
  4. data/app/assets/images/old_moon/old_moon_@2X.jpg +0 -0
  5. data/app/assets/images/old_moon/readme.txt +8 -0
  6. data/app/assets/images/ui-bg_diagonals-thick_15_0b3e6f_40x40.png +0 -0
  7. data/app/assets/images/ui-bg_dots-medium_30_0b58a2_4x4.png +0 -0
  8. data/app/assets/images/ui-bg_dots-small_20_333333_2x2.png +0 -0
  9. data/app/assets/images/ui-bg_dots-small_30_a32d00_2x2.png +0 -0
  10. data/app/assets/images/ui-bg_dots-small_40_00498f_2x2.png +0 -0
  11. data/app/assets/images/ui-bg_gloss-wave_20_111111_500x100.png +0 -0
  12. data/app/assets/images/ui-icons_00498f_256x240.png +0 -0
  13. data/app/assets/images/ui-icons_98d2fb_256x240.png +0 -0
  14. data/app/assets/images/ui-icons_9ccdfc_256x240.png +0 -0
  15. data/app/assets/images/ui-icons_ffffff_256x240.png +0 -0
  16. data/app/assets/javascripts/jquery-ui.js +18706 -0
  17. data/app/assets/javascripts/jquery-ui.min.js +13 -0
  18. data/app/assets/javascripts/jquery.min.js +5 -0
  19. data/app/assets/javascripts/sibyl/application.js +2 -0
  20. data/app/assets/javascripts/sibyl/editor.js +218 -2
  21. data/app/assets/stylesheets/atelier-seaside-dark.css +1 -0
  22. data/app/assets/stylesheets/default.css +1 -0
  23. data/app/assets/stylesheets/jquery-ui.css +1312 -0
  24. data/app/assets/stylesheets/jquery-ui.min.css +7 -0
  25. data/app/assets/stylesheets/jquery-ui.structure.css +886 -0
  26. data/app/assets/stylesheets/jquery-ui.structure.min.css +5 -0
  27. data/app/assets/stylesheets/jquery-ui.theme.css +443 -0
  28. data/app/assets/stylesheets/jquery-ui.theme.min.css +5 -0
  29. data/app/assets/stylesheets/sibyl/application.css +9 -0
  30. data/app/assets/stylesheets/sibyl/editor.css +148 -4
  31. data/app/controllers/sibyl/editor_controller.rb +81 -3
  32. data/app/views/layouts/sibyl/application.html.erb +3 -2
  33. data/app/views/sibyl/editor/create_scaffold.html.erb +0 -0
  34. data/app/views/sibyl/editor/edit.html.erb +83 -1
  35. data/app/views/sibyl/editor/index.html.erb +28 -2
  36. data/app/views/sibyl/editor/index_task.html.erb +25 -0
  37. data/app/views/sibyl/editor/new_scaffold.html.erb +35 -0
  38. data/config/routes.rb +10 -2
  39. data/lib/generators/sibyl/form/USAGE +8 -0
  40. data/lib/generators/sibyl/form/form_generator.rb +34 -0
  41. data/lib/generators/sibyl/install/USAGE +8 -0
  42. data/lib/generators/sibyl/install/install_generator.rb +17 -0
  43. data/lib/generators/sibyl/install/templates/sibyl.rb +1 -0
  44. data/lib/generators/sibyl/model/USAGE +8 -0
  45. data/lib/generators/sibyl/model/model_generator.rb +29 -0
  46. data/lib/sibyl/base.rb +101 -0
  47. data/lib/sibyl/engine.rb +7 -0
  48. data/lib/sibyl/form.rb +43 -0
  49. data/lib/sibyl/task.rb +123 -0
  50. data/lib/sibyl/version.rb +1 -1
  51. data/lib/sibyl.rb +2 -0
  52. data/lib/tasks/sibyl_tasks.rake +19 -4
  53. metadata +123 -2
@@ -1,12 +1,90 @@
1
1
  require_dependency "sibyl/application_controller"
2
+ require 'launchy'
2
3
 
3
4
  module Sibyl
4
5
  class EditorController < ApplicationController
5
- def index
6
- end
6
+ protect_from_forgery :except => :save_form
7
+
8
+ def index
9
+ @tasks = Sibyl::Base.tasks
10
+ end
11
+
12
+ def list_task
13
+ @filesystem_bag = Sibyl::Base.forms(params[:task])
14
+ render json: @filesystem_bag
15
+ end
16
+
17
+ def index_task
18
+ @filesystem_bag = Sibyl::Base.forms(params[:task])
19
+ @task = params[:task]
20
+ render "index_task"
21
+ end
22
+
23
+ def index_form
24
+ @pages = Sibyl::Base.pages(params[:task], params[:form])
25
+ render json: @pages
26
+ end
27
+
28
+ def save_form
29
+ filesystem_bag = {}
30
+ dir = Rails.root.join("app", "sibyl", params[:task], params[:form])
31
+ json_file = dir.to_s.gsub(/$/, ".json")
32
+ STDERR.puts "Writing: #{json_file}"
33
+ File.open(json_file, "w") do |f|
34
+ f.write params[:json].to_json
35
+ end
36
+ head :ok
37
+ end
38
+
39
+ def create
40
+ logger.info "Got request: #{params[:task]} -> #{params[:form]}"
41
+ task = params[:task]
42
+ form = params[:form]
43
+ @errors = []
44
+ @errors.push ["Task name '#{task}' is not a valid ruby class name."] unless task =~ /^[A-Z]\w+/
45
+ @errors.push ["Form name '#{form}' is not a valid ruby class name."] unless form =~ /^[A-Z]\w+/
46
+ task = task.underscore.downcase
47
+ form = form.underscore.downcase
48
+
49
+ unless @errors.length == 0 and (@errors = Sibyl::Form.create_form(task, form, params[:pdf])).length == 0
50
+ redirect_to "/sibyl/editor/edit/#{task}/#{form}"
51
+ else
52
+ logger.info "Errors: #{@errors}"
53
+ rendeer 'create_error'
54
+ end
55
+ end
7
56
 
8
57
  def edit
9
- @root = Rails.root
58
+ @task = params[:task]
59
+ @form = params[:form]
60
+ @pages = Sibyl::Base.pages(@task, @form)
10
61
  end
62
+
63
+ def new_scaffold
64
+ @task = params[:task]
65
+ @forms = Sibyl::Base.forms(@task)
66
+ end
67
+
68
+ def create_scaffold
69
+ @task = params[:task]
70
+ @columns = params[:columns]
71
+ columns = @columns.map {|k,v| "#{k}:#{v}"}
72
+ force = ''
73
+ if params[:force] == 'on'
74
+ force == '--force'
75
+ end
76
+ args = [Rails.root.join("bin", "rails").to_s, "generate", "scaffold", @task.titleize.to_s, *columns, "--migration", "--timestamps", force]
77
+ logger.info("args: #{args.join(' ')}")
78
+ system(*args)
79
+ args = [Rails.root.join("bin", "rake").to_s, "db:migrate"]
80
+ system(*args)
81
+ redirect_to "/#{@task}"
82
+ end
83
+
84
+ def open_image
85
+ logger.info("params: " +params.inspect)
86
+ logger.info("image: #{Rails.root.join("app", "sibyl", params[:task], params[:form], params[:page]).to_s}")
87
+ Launchy.open(Rails.root.join("app", "sibyl", params[:task], params[:form], params[:page]).to_s)
88
+ end
11
89
  end
12
90
  end
@@ -4,8 +4,9 @@
4
4
  <title>Sibyl</title>
5
5
  <%= stylesheet_link_tag "sibyl/application", media: "all" %>
6
6
  <%= javascript_include_tag "sibyl/application" %>
7
- <%= csrf_meta_tags %>
8
- </head>
7
+ <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.8.0/styles/hybrid.min.css">
8
+ <link href="https://fonts.googleapis.com/css?family=Roboto+Slab" rel="stylesheet">
9
+ <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.8.0/highlight.min.js"></script>
9
10
  <body>
10
11
 
11
12
  <%= yield %>
File without changes
@@ -1 +1,83 @@
1
- <h1><%= @root %></h1>
1
+ <style>
2
+ body {
3
+ background-image: none;
4
+ margin: 0;
5
+ padding: 0;
6
+ }
7
+ </style>
8
+
9
+ <script>
10
+ window.data = <%= raw @pages.to_json %>
11
+ $(document).ready(sibylEditor);
12
+ </script>
13
+
14
+ <div class="tiles">
15
+ <div class="controls">
16
+ <button id="close" type="button" class="ui-button ui-corner-all ui-widget ui-button-icon-only ui-dialog-titlebar-close" title="Close"><span class="ui-button-icon ui-icon ui-icon-closethick"></span><span class="ui-button-icon-space"> </span>Close</button>
17
+ <div id="title">Sibyl Editor</div>
18
+ <div id="current_labels">
19
+ Task: <span id="task"></span><br /><br />
20
+ Form: <span id="form"></span>
21
+ </div>
22
+ <input type="button" id="save_form" class="ui-button ui-widget ui-corner-all" value="Save Form" title="Save data for form" />
23
+ <input type="button" id="open_image" class="ui-button ui-widget ui-corner-all" value="Open Image" title="Open image in default editor" />
24
+ <a href="/sibyl/editor/scaffold/<%= @task %>" class="ui-button ui-widget ui-corner-all" id="scaffold" title="Create scaffold for task">Create Scaffold</a>
25
+ <select id="page_number"></select>
26
+ <div id="page_buttons">
27
+ <input type="button" value="Previous" id="previous_page" class="ui-button ui-widget ui-corner-all" title="Go to previous page" />
28
+ <input type="button" value="Next" id="next_page" class="ui-button ui-widget ui-corner-all" title="Go to next page" />
29
+ </div>
30
+ <div id="tabs">
31
+ <ul>
32
+ <li id="new_field"><a href="#tabs-1" title="Current element">Element</a></li>
33
+ <li id="elements"><a href="#tabs-2" title="List of elements">List</a></li>
34
+ <li id="jsonTab"><a href="#tabs-3" title="JSON View">JSON</a></li>
35
+ </ul>
36
+ <div id="tabs-1">
37
+ <p>Element Name</p>
38
+ <select id="select_element_name" class="element_text" title="Select an existing element name from the task">
39
+ <option value="custom">Custom Element Name</option>
40
+ </select>
41
+ <div id="task"></div>
42
+ <input type="text" id="custom_element_name" class="element_text" placeholder="Element Name" />
43
+ <div id="position_controls">
44
+ Select XY
45
+ <div class="box">
46
+ X: <input type="text" id="dx" class="xy_select" placeholder="X" /><br />
47
+ Y: <input type="text" id="dy" class="xy_select" placeholder="Y" /><br />
48
+ <input type="button" id="locate" value="Locate Element" class="ui-button ui-widget ui-corner-all" title="Find element location on the page" />
49
+ </div>
50
+ </div>
51
+ <label for="column">Column?</label>
52
+ <input type="checkbox" checked="checked" name="column" id="column" title="Should this element be a database column?" />
53
+ <label for="font_size">Font Size</label>
54
+ <select name="font_size" id="font_size" title="Font size on the page">
55
+ <%= 1.upto(48).each do |i| %>
56
+ <option value="<%= i %>" <%= i == 18 ? 'selected="selected"' : '' %>><%= i %></option>
57
+ <% end %>
58
+ </select>
59
+ <br /><br />
60
+ <label for="default_element_content">Default Element Content</label>
61
+ <input type="text" class="element_text" id="default_element_content" name="default_element_content" title="What is the default content?" />
62
+ <input type="button" id="save_element" class="ui-button ui-widget ui-corner-all" value="Save Element" title="Save element and go to list" />
63
+ </div>
64
+ <div id="tabs-2">
65
+ <div class="scrollContainer">
66
+ <table id="elements_list">
67
+ </table>
68
+ </div>
69
+ </div>
70
+ <div id="tabs-3">
71
+ <div class="scrollContainer">
72
+ <div id="jsonView" class="code apache hljs">
73
+ </div>
74
+ </div>
75
+ <div id="json" style="display: none">
76
+ {}
77
+ </div>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ <div class="tile">
82
+ </div>
83
+ </div>
@@ -1,2 +1,28 @@
1
- <h1>Editor#index</h1>
2
- <p>Find me in app/views/sibyl/editor/index.html.erb</p>
1
+ <h1>Sibyl Tasks</h1>
2
+ <ol>
3
+ <%- @tasks.each do |task| %>
4
+ <li><%= link_to task, "/sibyl/editor/index/#{task}" %></li>
5
+ <% end %>
6
+ </ol>
7
+
8
+ <br />
9
+
10
+ <div class="sibyl_form">
11
+ <h2>New Task</h2>
12
+ <%= form_tag "/sibyl/editor/create", :method => :post, :multipart => true do %>
13
+ <%= label_tag :for => 'task' do %>
14
+ Task Name
15
+ <% end %>
16
+ <%= text_field_tag 'task', nil, placeholder: "Task" %><br />
17
+ <%= label_tag :for => 'form' do %>
18
+ Form Name
19
+ <% end %>
20
+ <%= text_field_tag 'form', nil, placeholder: "Form" %><br /><br />
21
+ <%= label_tag :for => 'pdf' do %>
22
+ PDF File
23
+ <% end %>
24
+ <%= file_field_tag 'pdf', :accept => ".pdf" %><br />
25
+ <br />
26
+ <%= submit_tag "Create", :class => 'ui-button ui-widget ui-corner-all' %>
27
+ <% end %>
28
+ </div>
@@ -0,0 +1,25 @@
1
+ <h1>Forms for: <%= @task %></h1>
2
+
3
+ <ol>
4
+ <%- @filesystem_bag['forms'].each do |form| %>
5
+ <li><%= link_to form, "/sibyl/editor/edit/#{@task}/#{form}" %></li>
6
+ <%- end %>
7
+ </ol>
8
+ <br />
9
+
10
+ <div class="sibyl_form">
11
+ <h2>New Form</h2>
12
+ <%= form_tag "/sibyl/editor/create", :method => :post, :multipart => true do %>
13
+ <%= hidden_field_tag 'task', nil, :value => @task %>
14
+ <%= label_tag :for => 'form' do %>
15
+ Form Name
16
+ <% end %>
17
+ <%= text_field_tag 'form', nil, placeholder: "Form" %><br /><br />
18
+ <%= label_tag :for => 'pdf' do %>
19
+ PDF File
20
+ <% end %>
21
+ <%= file_field_tag 'pdf', :accept => ".pdf" %><br />
22
+ <br />
23
+ <%= submit_tag "Create", :class => 'ui-button ui-widget ui-corner-all' %>
24
+ <% end %>
25
+ </div>
@@ -0,0 +1,35 @@
1
+ <h1>Generate scaffold for: <%= @task %></h1>
2
+
3
+ <%= form_tag "/sibyl/editor/scaffold/#{@task}", :method => :post do %>
4
+ <table style="width: 400px">
5
+ <thead>
6
+ <tr>
7
+ <th>Model Attribute</th>
8
+ <th>Data Type</th>
9
+ </tr>
10
+ </thead>
11
+ <tbody>
12
+ <% if @forms.has_key? 'columns' %>
13
+ <% @forms['columns'].each_key do |col| %>
14
+ <tr>
15
+ <td><%= col %></td>
16
+ <td>
17
+ <select name="columns[<%= col %>]">
18
+ <% [:string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean].each do |type| %>
19
+ <option><%= type %></option>
20
+ <% end %>
21
+ </select>
22
+ </td>
23
+ </tr>
24
+ <% end %>
25
+ <% end %>
26
+ </tbody>
27
+ </table>
28
+ <br />
29
+ <label for="force">
30
+ Force
31
+ </label>
32
+ <input type="checkbox" checked="checked" name="force" /><br />
33
+ <br />
34
+ <%= submit_tag 'Create', :class =>"ui-button ui-widget ui-corner-all" %>
35
+ <% end %>
data/config/routes.rb CHANGED
@@ -1,4 +1,12 @@
1
1
  Sibyl::Engine.routes.draw do
2
- get 'editor/index'
3
- get 'editor/edit'
2
+ get "editor/edit/:task/:form", to: "editor#edit"
3
+ get "editor/index", to: "editor#index"
4
+ get "editor/open_image", to: "editor#open_image"
5
+ post "editor/create", to: "editor#create"
6
+ get "editor/scaffold/:task", to: "editor#new_scaffold"
7
+ post "editor/scaffold/:task", to: "editor#create_scaffold"
8
+ get "editor/index/:task(?)", to: "editor#index_task"
9
+ get "editor/list/:task(?)", to: "editor#list_task"
10
+ get "editor/index/:task/:form(?)", to: "editor#index_form"
11
+ put "editor/save/:task/:form(?)", to: "editor#save_form"
4
12
  end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate sibylform Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,34 @@
1
+ require 'fileutils'
2
+ require 'rails/generators/active_record'
3
+
4
+ module Sibyl
5
+ class FormGenerator < ActiveRecord::Generators::Base
6
+ desc "Creates a new form from a PDF"
7
+ argument :task, type: :string
8
+ argument :form, type: :string
9
+ argument :file, type: :string
10
+
11
+ def create_png_pages
12
+ STDERR.puts "Task: #{task}"
13
+ STDERR.puts "Form: #{form}"
14
+ STDERR.puts "File: #{file}"
15
+ unless task =~ /^[a-zA-Z0-9_-]+$/
16
+ STDERR.puts "Error: Task must not contain whitespace or invalid characters."
17
+ Sibyl::Form.usage
18
+ end
19
+ unless form =~ /^[a-zA-Z0-9_-]+$/
20
+ STDERR.puts "Error: Form must not contain whitespace or invalid characters."
21
+ Sibyl::Form.usage
22
+ end
23
+ unless File.exists? file
24
+ STDERR.puts "Error: File does not exist: #{file}"
25
+ Sibyl::Form.usage
26
+ end
27
+
28
+ dir = Rails.root.join("app", "sibyl", task, form)
29
+ FileUtils.mkdir_p dir
30
+
31
+ Sibyl::Form.convert_to_pdf(dir, file)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate install Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,17 @@
1
+ require 'rails/generators/base'
2
+
3
+ module Sibyl
4
+ class InstallGenerator < Rails::Generators::Base
5
+ desc "Installs sibyl on a fresh Rails project"
6
+
7
+ source_root File.expand_path('../templates', __FILE__)
8
+
9
+ def copy_initializer
10
+ template 'sibyl.rb', 'config/initializers/sibyl.rb'
11
+ end
12
+
13
+ def mount_engine
14
+ route 'mount Sibyl::Engine => "/sibyl"'
15
+ end
16
+ end
17
+ end
@@ -0,0 +1 @@
1
+ Sibyl::Base.load
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate sibylmodel Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,29 @@
1
+ require 'rails/generators/active_record'
2
+
3
+ module Sibyl
4
+ class ModelGenerator < ActiveRecord::Generators::Base
5
+ desc "Prepare Sibyl model and views"
6
+ argument :task, type: :string
7
+
8
+ def inject_into_model
9
+ file = Rails.root.join("app", "models", "#{task.classify.underscore}.rb")
10
+ inject_into_file file, after: "class #{task.classify} < ApplicationRecord" do
11
+ "\n include Sibyl::Task\n"
12
+ end
13
+ end
14
+
15
+ def modify_controller
16
+ file = Rails.root.join("app", "controllers", "#{task}_controller.rb")
17
+ gsub_file file, /def show *(\r?\n)\s*end/, "def show\n respond_to do |format|\n format.html\n format.zip { send_file @#{task.classify.underscore}.zip_path }\n end\n end"
18
+ end
19
+
20
+ def modify_view
21
+ file = Rails.root.join("app", "views", task, "index.html.erb")
22
+ gsub_file file, "<th colspan=\"3\"></th>", "<th colspan=\"4\"></th>"
23
+ inject_into_file file, after: "<td><%= link_to 'Show', #{task.classify.underscore} %></td>" do
24
+ "\n <td><%= link_to 'Download', #{task.classify.underscore}_path(#{task.classify.underscore})+'.zip' %></td>"
25
+ end
26
+ end
27
+
28
+ end
29
+ end
data/lib/sibyl/base.rb ADDED
@@ -0,0 +1,101 @@
1
+ require 'pathname'
2
+ require File.expand_path("../task.rb", __FILE__)
3
+
4
+ module Sibyl
5
+ class Base
6
+ def self.load
7
+ self.tasks.each do |task|
8
+ Dir[Rails.root.join("app", "sibyl", task, "*.rb").to_s].each do |rb|
9
+ STDERR.puts "Requiring: #{rb}"
10
+ require rb
11
+ end
12
+ end
13
+ end
14
+
15
+ def self.tasks
16
+ tasks = []
17
+ Dir[Rails.root.join("app", "sibyl", "*").to_s].each do |file|
18
+ if File.directory? file
19
+ tasks.push(Pathname.new(file).basename)
20
+ end
21
+ end
22
+ tasks
23
+ end
24
+
25
+ def self.list_columns(task)
26
+ columns = {}
27
+ Dir[Rails.root.join("app", "sibyl", task, "*.json").to_s].each do |json_file|
28
+ json = JSON.parse(File.read(json_file))
29
+ json.each_key do |page|
30
+ if json[page].has_key? 'elements'
31
+ json[page]['elements'].each_key do |name|
32
+ if json[page]['elements'][name].has_key? 'column' and json[page]['elements'][name]['column'].to_s == "true"
33
+ columns[name] = true
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ return columns
40
+ end
41
+
42
+ def self.list_defaults(task)
43
+ defaults = {}
44
+ Dir[Rails.root.join("app", "sibyl", task, "*.json").to_s].each do |json_file|
45
+ json = JSON.parse(File.read(json_file))
46
+ json.each_key do |page|
47
+ if json[page].has_key? 'elements'
48
+ json[page]['elements'].each_key do |name|
49
+ if json[page]['elements'][name].has_key? 'default'
50
+ defaults[name] = json[page]['elements'][name]['default']
51
+ else
52
+ defaults[name] = "Default #{name}"
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ return defaults
59
+ end
60
+
61
+ def self.forms(task)
62
+ dir = Rails.root.join("app", "sibyl", task)
63
+ filesystem_bag = {}
64
+ entries = Dir.entries(dir).select {|entry| File.directory? File.join(dir,entry) and !(entry =='.' || entry == '..') }
65
+ entries.each do |form|
66
+ name = form.split(/\//).last
67
+ filesystem_bag['forms'] = [] unless filesystem_bag.has_key? 'forms'
68
+ filesystem_bag['forms'].push name
69
+ end
70
+ begin
71
+ filesystem_bag['defaults'] = self.list_defaults(task)
72
+ filesystem_bag['columns'] = self.list_columns(task)
73
+ rescue Exception => e
74
+ STDERR.puts "Exception: #{e}: #{e.backtrace}"
75
+ end
76
+ return filesystem_bag
77
+ end
78
+
79
+ def self.pages(task, form)
80
+ filesystem_bag = {}
81
+ dir = Rails.root.join("app", "sibyl", task, form)
82
+ json_file = dir.to_s.gsub(/$/, ".json")
83
+ STDERR.puts "Reading: #{json_file}"
84
+ begin
85
+ filesystem_bag = JSON.parse(File.read(json_file))
86
+ rescue Exception => e
87
+ STDERR.puts("Exception: #{e}: #{e.backtrace}")
88
+ Dir[dir.join("*")].each do |form|
89
+ name = form.split(/\//).last
90
+ unless filesystem_bag.has_key? name
91
+ filesystem_bag[name] = {}
92
+ end
93
+ img = Magick::Image.ping( form ).first
94
+ filesystem_bag[name]['width'] = img.columns
95
+ filesystem_bag[name]['height'] = img.rows
96
+ end
97
+ end
98
+ return filesystem_bag
99
+ end
100
+ end
101
+ end
data/lib/sibyl/engine.rb CHANGED
@@ -1,5 +1,12 @@
1
1
  module Sibyl
2
2
  class Engine < ::Rails::Engine
3
3
  isolate_namespace Sibyl
4
+ initializer "static assets" do |app|
5
+ app.middleware.insert_before(::ActionDispatch::Static, ::ActionDispatch::Static, Rails.root.join("app", "sibyl").to_s)
6
+ end
7
+ def self.open
8
+ require 'launchy'
9
+ Launchy.open("http://localhost:3000/sibyl/editor/index")
10
+ end
4
11
  end
5
12
  end
data/lib/sibyl/form.rb ADDED
@@ -0,0 +1,43 @@
1
+ require 'RMagick'
2
+ require 'fileutils'
3
+
4
+ module Sibyl
5
+ class Form
6
+ def self.usage
7
+ STDERR.puts <<EOT
8
+ Usage: bin/rails generate siblform <task name> <form name> <pdffile>
9
+ Task name and form name must be valid file names. Task name is a general
10
+ category for all forms that relate to a particular task. This is just for
11
+ organization purposes. Both task and form name should be alphanumeric and
12
+ not contain any whitespace.
13
+ EOT
14
+ exit
15
+ end
16
+ def self.create_form(task,form,file)
17
+ dir = Rails.root.join("app", "sibyl", task, form)
18
+ pdf_file = dir.to_s.gsub(/$/, '.pdf')
19
+ STDERR.puts "Dir: #{dir}"
20
+ STDERR.puts "Saving: #{pdf_file}"
21
+ STDERR.puts "Creating: #{dir}"
22
+ FileUtils.mkdir_p dir
23
+ File.open(pdf_file, 'wb') do |f|
24
+ f.write(file.read)
25
+ end
26
+ STDERR.puts "Done"
27
+ convert_to_pdf(dir,pdf_file)
28
+ end
29
+ def self.convert_to_pdf(folder, pdf)
30
+ im = Magick::ImageList.new(pdf) {
31
+ self.density = '300'
32
+ self.background_color = "none"
33
+ }
34
+ im.reverse.each_with_index do |img, i|
35
+ filename = sprintf "page%03d.png", i
36
+ out = folder.join(filename)
37
+ STDERR.puts "writing: #{out}"
38
+ xr = img.write(out)
39
+ p xr
40
+ end
41
+ end
42
+ end
43
+ end