bcms_tools 0.0.3 → 0.0.4

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
data/bcms_tools.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{bcms_tools}
8
- s.version = "0.0.3"
8
+ s.version = "0.0.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["buzzware"]
12
- s.date = %q{2010-01-19}
12
+ s.date = %q{2010-02-15}
13
13
  s.description = %q{Tools for BrowserCms.}
14
14
  s.email = %q{contact@buzzware.com.au}
15
15
  s.extra_rdoc_files = [
@@ -24,9 +24,13 @@ Gem::Specification.new do |s|
24
24
  "Rakefile",
25
25
  "VERSION",
26
26
  "bcms_tools.gemspec",
27
+ "bcms_tools.vpj",
28
+ "bcms_tools.vpw",
27
29
  "lib/bcms_tools.rb",
28
30
  "lib/bcms_tools/bcms_thumbnails.rb",
29
31
  "lib/bcms_tools/bcms_thumbnails.rb",
32
+ "lib/bcms_tools/form_helpers.rb",
33
+ "lib/bcms_tools/form_helpers.rb",
30
34
  "lib/bcms_tools/view_helpers.rb",
31
35
  "lib/bcms_tools/view_helpers.rb",
32
36
  "lib/bcms_tools_dev.rb",
data/bcms_tools.vpj ADDED
@@ -0,0 +1,90 @@
1
+ <!DOCTYPE Project SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpj.dtd">
2
+ <Project
3
+ Version="10.0"
4
+ VendorName="SlickEdit"
5
+ WorkingDir=".">
6
+ <Config
7
+ Name="Release"
8
+ OutputFile=""
9
+ CompilerConfigName="Latest Version">
10
+ <Menu>
11
+ <Target
12
+ Name="Compile"
13
+ MenuCaption="&amp;Compile"
14
+ CaptureOutputWith="ProcessBuffer"
15
+ SaveOption="SaveCurrent"
16
+ RunFromDir="%rw">
17
+ <Exec/>
18
+ </Target>
19
+ <Target
20
+ Name="Build"
21
+ MenuCaption="&amp;Build"
22
+ CaptureOutputWith="ProcessBuffer"
23
+ SaveOption="SaveWorkspaceFiles"
24
+ RunFromDir="%rw">
25
+ <Exec/>
26
+ </Target>
27
+ <Target
28
+ Name="Rebuild"
29
+ MenuCaption="&amp;Rebuild"
30
+ CaptureOutputWith="ProcessBuffer"
31
+ SaveOption="SaveWorkspaceFiles"
32
+ RunFromDir="%rw">
33
+ <Exec/>
34
+ </Target>
35
+ <Target
36
+ Name="Debug"
37
+ MenuCaption="&amp;Debug"
38
+ SaveOption="SaveNone"
39
+ RunFromDir="%rw">
40
+ <Exec/>
41
+ </Target>
42
+ <Target
43
+ Name="Execute"
44
+ MenuCaption="E&amp;xecute"
45
+ SaveOption="SaveNone"
46
+ RunFromDir="%rw">
47
+ <Exec CmdLine='"FrescoClient.exe"'/>
48
+ </Target>
49
+ </Menu>
50
+ </Config>
51
+ <CustomFolders>
52
+ <Folder
53
+ Name="Source Files"
54
+ Filters="*.c;*.C;*.cc;*.cpp;*.cp;*.cxx;*.c++;*.prg;*.pas;*.dpr;*.asm;*.s;*.bas;*.java;*.cs;*.sc;*.e;*.cob;*.html;*.rc;*.tcl;*.py;*.pl"/>
55
+ <Folder
56
+ Name="Header Files"
57
+ Filters="*.h;*.H;*.hh;*.hpp;*.hxx;*.inc;*.sh;*.cpy;*.if"/>
58
+ <Folder
59
+ Name="Resource Files"
60
+ Filters="*.ico;*.cur;*.dlg"/>
61
+ <Folder
62
+ Name="Bitmaps"
63
+ Filters="*.bmp"/>
64
+ <Folder
65
+ Name="Other Files"
66
+ Filters="">
67
+ </Folder>
68
+ </CustomFolders>
69
+ <Files AutoFolders="DirectoryView">
70
+ <Folder Name="lib">
71
+ <F
72
+ N="lib/*"
73
+ Recurse="1"
74
+ Refilter="0"
75
+ Excludes=""/>
76
+ </Folder>
77
+ <Folder Name="test">
78
+ <F
79
+ N="test/*"
80
+ Recurse="1"
81
+ Refilter="0"
82
+ Excludes=""/>
83
+ </Folder>
84
+ <F
85
+ N="*"
86
+ Recurse="0"
87
+ Refilter="0"
88
+ Excludes=""/>
89
+ </Files>
90
+ </Project>
data/bcms_tools.vpw ADDED
@@ -0,0 +1,6 @@
1
+ <!DOCTYPE Workspace SYSTEM "http://www.slickedit.com/dtd/vse/10.0/vpw.dtd">
2
+ <Workspace Version="10.0" VendorName="SlickEdit">
3
+ <Projects>
4
+ <Project File="bcms_tools.vpj" />
5
+ </Projects>
6
+ </Workspace>
@@ -13,7 +13,7 @@ module BcmsTools
13
13
 
14
14
  def self.thumbnail_name_from_attachment(aAttachment,aWidth,aHeight)
15
15
  extThumb = aAttachment.file_extension
16
- size = "#{aWidth}x#{aHeight}"
16
+ size = "#{aWidth.to_s}x#{aHeight.to_s}"
17
17
  return File.basename(aAttachment.file_location)+'-'+size+'.'+extThumb
18
18
  end
19
19
 
@@ -31,7 +31,17 @@ module BcmsTools
31
31
  return att && att.full_file_location
32
32
  end
33
33
 
34
+ # Scale given aWidth,aHeight up to fit within aDestWidth,aDestHeight
35
+ # return original width and height if nil given for both aDestWidth & aDestHeight
36
+ # If either aDestWidth or aDestHeight are nil, it will scale to fit the other dimension
34
37
  def self.scale_to_fit(aWidth,aHeight,aDestWidth,aDestHeight)
38
+ if aDestWidth.nil? && aDestHeight.nil?
39
+ wRatio = 1
40
+ hRatio = 1
41
+ else
42
+ wRatio = aDestWidth / aWidth unless aDestWidth.nil?
43
+ hRatio = (aDestHeight.nil? ? wRatio : (aDestHeight / aHeight))
44
+ end
35
45
  wRatio = aDestWidth / aWidth
36
46
  hRatio = aDestHeight / aHeight
37
47
  ratio = (wRatio < hRatio ? wRatio : hRatio)
@@ -0,0 +1,107 @@
1
+ Cms::FormBuilder.class_eval do
2
+
3
+ attr_reader :template
4
+
5
+ # ensure the related css is included
6
+ def ensure_css
7
+ template.content_for :html_head do
8
+ template.stylesheet_link_tag("for_bcms_tools.css")
9
+ end
10
+ end
11
+
12
+ def remove_check_box()
13
+ "#{check_box('_destroy')} Remove ?"
14
+ end
15
+
16
+ def jquery_escape(aString)
17
+ # from http://samuelsjoberg.com/archive/2009/09/escape-jquery-selectors
18
+ # return str.replace(/([#;&,\.\+\*\~':"\!\^$\[\]\(\)=>\|])/g, "\\$1");
19
+ aString.gsub(/([#;&,\.\+\*\~':"\!\^$\[\]\(\)=>\|])/) {|c| '\\\\'+c}
20
+ end
21
+
22
+ # standard original file upload
23
+ #
24
+ #//<![CDATA[
25
+ #
26
+ # jQuery(function($) {
27
+ # $('#mock_stock_image_attachment_file') // <input type="text"
28
+ # .focus(function() {this.blur()})
29
+ # .mousedown(function() {this.blur()})
30
+ # $('#stock_image_attachment_file').change(function() { // <input type="file"
31
+ # $('#mock_stock_image_attachment_file') // <input type="text"
32
+ # .attr('value', $(this).attr('value'))
33
+ # })
34
+ # })
35
+ #
36
+ #//]]>
37
+ #
38
+ #<div class="fields file_fields">
39
+ #
40
+ # <label for="stock_image_attachment_file">File</label>
41
+ #
42
+ # <div class="file_inputs" id="stock_image_attachment_file_div">
43
+ # <input type="file" tabindex="3" size="1" name="stock_image[attachment_file]" id="stock_image_attachment_file" class="file">
44
+ # <div class="fakefile">
45
+ # <input type="text" id="mock_stock_image_attachment_file" class="mock" name="temp">
46
+ # <img src="/images/cms/browse.gif?1261031544" alt="Browse">
47
+ # </div>
48
+ # </div>
49
+ #
50
+ #</div>
51
+
52
+ def thumbnail_upload_field(aOptions)
53
+ ensure_css
54
+ aOptions[:label] ||= "Upload Image"
55
+ result = cms_file_field(:attachment_file, aOptions) + '<br clear="all" />'
56
+ method = 'attachment_file'
57
+
58
+ underscore_id = object_name+'_'+options[:index].to_s+'_'+method
59
+ underscore_id_esc = jquery_escape(underscore_id)
60
+ underscore_id_nobrac = underscore_id.gsub('[','_').gsub(']','')
61
+
62
+ template.content_for :html_head do
63
+ template.javascript_tag do
64
+ <<-EOS
65
+ jQuery(function($) {
66
+ $('input#mock_#{underscore_id_esc}') // <input type="text"
67
+ .focus(function() {this.blur()})
68
+ .mousedown(function() {this.blur()})
69
+ $('input##{underscore_id_nobrac}').change(function() { // <input type="file"
70
+ $('input#mock_#{underscore_id_esc}') // <input type="text"
71
+ .attr('value', $(this).attr('value'))
72
+ })
73
+ })
74
+ EOS
75
+ end
76
+ end
77
+
78
+ thumbnail = if object.attachment
79
+ "<img class=\"thumbnail\" src=\"#{Cms::PageHelper.attachment_cropped_src(object.attachment,64,64)}\" width=\"64\" height=\"64\"/>"
80
+ else
81
+ '<div style="width: 64px; height: 64px; position:static; display: block; float: left; border-style: solid; border-width: 1px; border-color: gray"></div>'
82
+ end
83
+ result = result.sub('</label>','</label>'+thumbnail)
84
+ result = result.gsub(object_name+'_'+method,underscore_id)
85
+ result = StringUtils.split3(result,/<div class="fields file_fields.*?>/) {|h,m,t| XmlUtils.quick_join_att(m,'class','thumbnail_upload',' ') }
86
+ result = '<div style="display: block; float: right; width: auto; height: auto;">'+remove_check_box()+'</div>' + result unless aOptions[:remove_check_box]==false || object.new_record?
87
+ return result
88
+ end
89
+
90
+ # surround child fields with an appropriate div
91
+ # usage :
92
+ #<% f.child_fields do %>
93
+ # <% f.fields_for( :stock_images_attributes, img, :index => i ) do |image_form| %>
94
+ # <%= image_form.cms_text_field :name, :label => "name (short)" %>
95
+ # <%= image_form.cms_text_field :caption, :label => 'caption' %>
96
+ # <% end %>
97
+ #<% end %>
98
+ def child_fields(aClass='child_fields', &block)
99
+ content = template.capture(&block)
100
+ template.concat("<div class=\"#{aClass}\">")
101
+ template.concat(content)
102
+ template.concat("</div>")
103
+ end
104
+
105
+ end
106
+
107
+
@@ -1,6 +1,9 @@
1
1
  module ActionView
2
2
  module Helpers
3
-
3
+
4
+ # makes these accessible via ActionView::Helpers.function
5
+ module_function
6
+
4
7
  def google_analytics(aTrackingId = nil)
5
8
  return '' if request.host.begins_with?('cms.')
6
9
  aTrackingId ||= APP_CONFIG[:google_analytics_tracking_id]
@@ -23,7 +26,7 @@ module ActionView
23
26
  def default_content_for(name, &block)
24
27
  name = name.kind_of?(Symbol) ? ":#{name}" : name
25
28
  out = eval("yield #{name}", block.binding)
26
- concat(out || capture(&block), block.binding)
29
+ concat(out || capture(&block))
27
30
  end
28
31
 
29
32
  #render_menu(), or more precisely menu_items() doesn't seem to work well
@@ -47,7 +50,8 @@ module ActionView
47
50
 
48
51
  selected_page = opts[:page] || @page
49
52
  ancestors = selected_page.ancestors
50
- top_section = ancestors[opts[:from_top]]
53
+ top_section = ancestors[opts[:from_top].to_i]
54
+ return '' unless top_section
51
55
  opts[:path] = top_section.path
52
56
 
53
57
  ancestors << selected_page if (selected_page.section == top_section) || (selected_page != selected_page.section.pages.first)
@@ -61,6 +65,62 @@ module ActionView
61
65
  render_menu opts
62
66
  end
63
67
 
68
+ # Construct tree_nodes, an array of arrays - each array a level in tree.
69
+ # Each level is a list children to the parents in the level before
70
+ def construct_category_tree(aRootCategory)
71
+ aRootCategory = Category.find_by_name(aRootCategory) unless aRootCategory.is_a? Category
72
+ tree_nodes = []
73
+ level_nodes = [aRootCategory]
74
+ begin
75
+ tree_nodes << level_nodes
76
+ ids = level_nodes.map {|n| n.id}
77
+ level_nodes = Category.find_all_by_parent_id(ids) #Category.all({:conditions => ['parent_id in (?)',ids.join(',')]})
78
+ end while !level_nodes.empty?
79
+ tree_nodes
80
+ end
81
+
82
+ # :base_url (String) : prepended to menu urls eg. /products
83
+ # :category (String) : name of current category eg. 'Shoes'
84
+ # :id_prefix (String) : will be prepended to ids of menu eg. 'section_'
85
+ def category_menu_items(aRootCategory, aOptions={})
86
+ aBaseUrl = (aOptions[:base_url] || '')
87
+ aIdPrefix = (aOptions[:id_prefix] || '')
88
+ category = aOptions[:category]
89
+ category = category.name.urlize('+') if category.is_a?(Category)
90
+ tree_nodes = construct_category_tree(aRootCategory)
91
+
92
+ # now turn tree_nodes into menu items, still as array of levels
93
+ tree_items = []
94
+ last_lvl = nil
95
+ tree_nodes.each do |lvl|
96
+ item_level = []
97
+ lvl.each do |node|
98
+ name = (node.name.index('/') ? File.basename(node.name) : node.name)
99
+ item = {:id => aIdPrefix+node.id.to_s, :name => name }
100
+ item[:node] = node
101
+ if last_lvl && parent_item = last_lvl.find {|i| i[:node].id == node.parent_id}
102
+ parent_item[:children] ||= []
103
+ parent_item[:children] << item
104
+ item[:url] = parent_item[:url]
105
+ item[:url] += '+' unless item[:url]=='' || item[:url].ends_with?('/') || item[:url].ends_with?('+')
106
+ item[:url] += name.urlize('-')
107
+ else
108
+ item[:url] = aBaseUrl
109
+ end
110
+ item[:selected] = true if category && category==node.name.urlize('+')
111
+ item_level << item
112
+ end
113
+ tree_items << item_level
114
+ last_lvl = item_level
115
+ end
116
+
117
+ # clean
118
+ tree_items.each do |lvl|
119
+ lvl.each{|i| i.filter_include!([:url,:selected,:id,:name,:children])}
120
+ end
121
+ tree_items.first
122
+ end
123
+
64
124
  module CaptureHelper
65
125
  def set_content_for(name, content = nil, &block)
66
126
  ivar = "@content_for_#{name}"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bcms_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - buzzware
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-19 00:00:00 +08:00
12
+ date: 2010-02-15 00:00:00 +08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -59,8 +59,11 @@ files:
59
59
  - Rakefile
60
60
  - VERSION
61
61
  - bcms_tools.gemspec
62
+ - bcms_tools.vpj
63
+ - bcms_tools.vpw
62
64
  - lib/bcms_tools.rb
63
65
  - lib/bcms_tools/bcms_thumbnails.rb
66
+ - lib/bcms_tools/form_helpers.rb
64
67
  - lib/bcms_tools/view_helpers.rb
65
68
  - lib/bcms_tools_dev.rb
66
69
  - rails/init.rb