bmmlexporter 0.0.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.
@@ -0,0 +1,4 @@
1
+ === 0.0.1 2009-08-07
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
@@ -0,0 +1,57 @@
1
+ = bmmlexporter
2
+
3
+ * http://cesario.github.com/bmmlexporter
4
+
5
+ == DESCRIPTION:
6
+
7
+ bmmlexporter provides an easy way to convert a bmml file to HTML or SWF.
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * Export to HTML with plenty of div's
12
+
13
+ == SYNOPSIS:
14
+
15
+ $:.push('bmmlexporter')
16
+
17
+ require 'bmmlhtmlexporter'
18
+ include BmmlExporters
19
+
20
+ exporter = BmmlExporters::BmmlExporter.new :import => 'file', :file => 'mu.bmml', :export_type => 'html', :export_folder => 'output/', :exporter => BmmlExporters::BmmlHtmlExport.new
21
+ exporter.export!
22
+ p "Export done"
23
+ p exporter.to_s
24
+
25
+ == REQUIREMENTS:
26
+
27
+ * cgi
28
+ * rexml/document
29
+
30
+ == INSTALL:
31
+
32
+ * FIX (sudo gem install, anything else)
33
+
34
+ == LICENSE:
35
+
36
+ (The MIT License)
37
+
38
+ Copyright (c) 2009 Franck Verrot
39
+
40
+ Permission is hereby granted, free of charge, to any person obtaining
41
+ a copy of this software and associated documentation files (the
42
+ 'Software'), to deal in the Software without restriction, including
43
+ without limitation the rights to use, copy, modify, merge, publish,
44
+ distribute, sublicense, and/or sell copies of the Software, and to
45
+ permit persons to whom the Software is furnished to do so, subject to
46
+ the following conditions:
47
+
48
+ The above copyright notice and this permission notice shall be
49
+ included in all copies or substantial portions of the Software.
50
+
51
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
52
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
53
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
54
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
55
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
56
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
57
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,56 @@
1
+ #$:.unshift(File.dirname(__FILE__)) unless
2
+ # $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+ require 'rexml/document'
4
+ require 'cgi'
5
+ require File.dirname(__FILE__) + '/bmmlhtmlexporter'
6
+ include REXML
7
+
8
+ module BmmlExporters
9
+ VERSION = '0.0.1'
10
+
11
+ class BmmlExporter
12
+ attr_accessor :opts
13
+ def initialize(*opts)
14
+ set_options(*opts)
15
+ end
16
+
17
+ def to_s
18
+ check_response_and_call(@exporter, :to_s)
19
+ end
20
+
21
+ def set_options(*opts)
22
+ options = *opts
23
+
24
+ raise "Require :import parameter" if options[:import].to_s.nil?
25
+ raise "Require :export_type parameter" if options[:export_type].to_s.nil?
26
+
27
+ if options[:import].eql? "file"
28
+ raise "Require :file if :import => 'file'" if options[:file].nil?
29
+ end
30
+
31
+ raise "Require a valid :export_type: html / flex, mentioned " + options[:export_type] unless options[:export_type].eql? 'html' or options[:export_type].eql? 'flex'
32
+
33
+ # Reminder: :import (file,inline), :file(name.bmml), :export_type (html/flex), :export_folder('./output')
34
+ @exporter = options[:exporter]
35
+ check_response_and_call(@exporter, :set_options, options)
36
+ end
37
+
38
+ def export
39
+ check_response_and_call(@exporter, :export)
40
+ end
41
+
42
+ def save
43
+ check_response_and_call(@exporter, :save)
44
+ end
45
+
46
+ def export!
47
+ export
48
+ save
49
+ end
50
+
51
+ def check_response_and_call(obj, method_symbol, *args)
52
+ raise 'The exporter '+obj.class.to_s+' does not respond to the method '+method_symbol.to_s unless obj and obj.respond_to?(method_symbol)
53
+ obj.send(method_symbol, *args)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,204 @@
1
+ #require 'bmmlexporter'
2
+ #require File.dirname(__FILE__) + '/../lib/bmmlexporter'
3
+
4
+ class String
5
+ def url_decode
6
+ CGI::unescape(self)
7
+ end
8
+ end
9
+
10
+ module BmmlExporters
11
+
12
+ class BmmlHtmlExporter
13
+ def to_s
14
+ @output_content
15
+ end
16
+
17
+ def initialize(*opts)
18
+ super
19
+ @output_content = ""
20
+ end
21
+
22
+ class HtmlStyle < Hash
23
+ def to_s
24
+ s = ""
25
+ each { |key,value|
26
+ s << key+": "+value+";"
27
+ }
28
+ s
29
+ end
30
+ end
31
+
32
+ def set_options(*opts)
33
+ options = *opts
34
+ # :import (file,inline), :file(name.bmml), :export_type (html/flex), :export_folder('./output')
35
+
36
+ @output = "output.html" #options[:export_folder]+'/index.html'
37
+ @doc = Document.new(File.new(options[:file]))
38
+ end
39
+
40
+ def render(type,text,*args)
41
+ send('render_'+type.to_s,text,*args)
42
+ end
43
+
44
+ def make_color
45
+ r = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
46
+ #"#"+r[rand(1+15)] + r[rand(1+15)] + r[rand(1+15)] + r[rand(1+15)] + r[rand(1+15)] + r[rand(1+15)]
47
+ r = ['blue','yellow','red','green','purple','pink','cyan']
48
+ r[rand(r.size-1)+1]
49
+ end
50
+
51
+ def format(text)
52
+ transformations = {
53
+ "/_*_/" => "<b>\1</b>"
54
+ }
55
+ transformations.each do |what, how|
56
+ #text.gsub!(what,how)
57
+ text.gsub!(/_([^_]+)_/,'<b>\1</b>')
58
+ end
59
+ text
60
+ end
61
+
62
+ def render_button(text,style)
63
+ s = HtmlStyle.new
64
+ s["width"] = style["width"]
65
+ text = "no text found" if text.nil?
66
+ '<button type="button" style="'+style.to_s+'">'+text+'</button>'
67
+ end
68
+
69
+ def render_titlewindow(text,style)
70
+ text
71
+ end
72
+
73
+ def render_tree(text,style)
74
+ html = ""
75
+ groups = text.split('F')
76
+ groups.shift
77
+
78
+ groups.each do |group|
79
+ lines = group.split('%0A')
80
+ html << "<ul>"+lines.shift
81
+ lines.each do |line|
82
+ html << "<li>"+line+"</li>"
83
+ end
84
+ html << "</ul>"
85
+ end
86
+ html
87
+ end
88
+
89
+ def render_label(text,style)
90
+ '<label for="'+text+'">'+text+'</label>'
91
+ end
92
+
93
+ def render_breadcrumbs(text,style)
94
+ text.split(',').join(' > ')
95
+ end
96
+
97
+ def render_buttonbar(text,style)
98
+ text
99
+ end
100
+
101
+ def render_textinput(text,style)
102
+ myStyle = HtmlStyle.new
103
+ myStyle["width"] = style["width"]
104
+ '<input type="text" value="'+text+'" size='+(myStyle["width"].to_i/9).to_s+'>'
105
+ end
106
+
107
+ def render_combobox(text,style)
108
+ render = "<select name=\"combobox\">"
109
+ text.split('/').each do |t|
110
+ render << "<option value=\""+t+"\">"+t+"</option>"
111
+ end
112
+ render << "</select></div>"
113
+ render
114
+ end
115
+
116
+ def render_canvas(text,style)
117
+ text
118
+ end
119
+
120
+ def render_hrule(text,style)
121
+ "<h />"
122
+ end
123
+ $fieldset_was_already_opened = false
124
+ def render_fieldset(text,style)
125
+ myStyle = HtmlStyle.new
126
+ myStyle["width"] = style["width"].to_i - 20
127
+ myStyle["height"] = style["height"].to_i - 20
128
+ response = ""
129
+ response << "</fieldset>" if $fieldset_was_already_opened
130
+ response << "<fieldset style=\"height: " + myStyle["height"].to_s + "; width: " + myStyle["width"].to_s + "\"><legend>" + text + "</legend>"
131
+ $fieldset_was_already_opened = true
132
+ response
133
+ end
134
+
135
+ def render_textarea(text,style)
136
+ "<textarea>"+text+"</textarea>"
137
+ end
138
+
139
+ def render_formattingtoolbar(text,style)
140
+ "<img src=\"images/formattingtoolbar.png\" />"
141
+ end
142
+
143
+ def render_checkbox(text,style)
144
+ text+" <INPUT TYPE=CHECKBOX NAME=\""+text+"\">"
145
+ end
146
+
147
+ def render_stickynote(text,style)
148
+ "<div style=\"width: 100%; height: 100%;background-color: yellow;\"><b>Sticky note</b><br />"+text+"</div>"
149
+ end
150
+
151
+ def export
152
+ @output_content = "<html><body>"
153
+ i = 1
154
+ @doc.root.each_element('//control') { |control|
155
+ color = make_color
156
+ type = control.attributes["controlTypeID"].gsub!(/com.balsamiq.mockups::/,'').to_s.downcase
157
+ text = ""
158
+ left = control.attributes["x"]
159
+ top = control.attributes["y"]
160
+ width = control.attributes["w"]
161
+ if width.to_i == -1 and width.to_i < control.attributes["measuredW"].to_i
162
+ width = control.attributes["measuredW"]
163
+ end
164
+ height = control.attributes["h"]
165
+ if height.to_i == -1 and height.to_i < control.attributes["measuredH"].to_i
166
+ height = control.attributes["measuredH"]
167
+ end
168
+ zindex = control.attributes["zOrder"]
169
+
170
+ style = HtmlStyle.new
171
+ style["left"] = left
172
+ style["top"] = top
173
+ style["width"] = width
174
+ style["height"] = height
175
+
176
+ # begin
177
+ unless control[1].nil? or control[1][1].nil? or control[1][1].text.nil?
178
+ text = control[1][1].text.url_decode
179
+ end
180
+ @output_content << "<div style=\"border: 0px black solid; background-color:"+"; position:absolute; z-index:"+zindex+';'+
181
+ "left:"+left+"px;"+
182
+ "top:"+top+"px;"+
183
+ "width:"+width+"px;"+
184
+ "height:"+height+"px;"+
185
+ "\">"+render(type,format(text),style)+"</div><br />\n" unless width.nil? or height.nil?
186
+ # rescue Exception => e
187
+ # p "Control removed: "+control.to_s+" because "+e.message
188
+ # end
189
+ i += 1
190
+ }
191
+
192
+ @output_content += "</body></html>"
193
+ end
194
+
195
+ def save
196
+ File.open(@output, 'w') {|f| f.write(@output_content) }
197
+ end
198
+
199
+ def export!
200
+ export
201
+ save
202
+ end
203
+ end
204
+ end
metadata ADDED
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bmmlexporter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Franck Verrot
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-08-07 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Bmmlexporter provides simple Balsamiq Mockup .bmml files exporting features.
17
+ email: franck@verrot.fr
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - README.rdoc
26
+ - lib/bmmlexporter.rb
27
+ - lib/bmmlhtmlexporter.rb
28
+ - History.txt
29
+ has_rdoc: true
30
+ homepage: http://home.dev-fr.com
31
+ post_install_message:
32
+ rdoc_options: []
33
+
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: "0"
41
+ version:
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ requirements: []
49
+
50
+ rubyforge_project: bmmlexporter
51
+ rubygems_version: 1.3.1
52
+ signing_key:
53
+ specification_version: 2
54
+ summary: Bmmlexporter provides simple Balsamiq Mockup .bmml files exporting features.
55
+ test_files: []
56
+