motion-awesome 0.0.3

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,13 @@
1
+ unless defined?(Motion::Project::Config)
2
+ raise "motion-awesome must be required within a RubyMotion project Rakefile."
3
+ end
4
+
5
+ LIB_DIR = File.dirname(__FILE__)
6
+ Motion::Project::App.setup do |app|
7
+ Dir.glob(File.join( LIB_DIR, %w(motion-awesome ** *.rb))).each do |file|
8
+ app.files.unshift(file)
9
+ end
10
+ FileUtils.cp( File.join( LIB_DIR, %w(assets fontawesome-webfont.ttf) ), './resources/' )
11
+ FileUtils.cp( File.join( LIB_DIR, %w(assets fontawesome.plist) ), './resources/' )
12
+ app.fonts << "fontawesome-webfont.ttf"
13
+ end
@@ -0,0 +1,70 @@
1
+ module MotionAwesome
2
+ module_function
3
+
4
+ class InvalidAwesomeIconError < RuntimeError; end
5
+
6
+ def button( icon, options={}, &block )
7
+ opts = parse_options( icon, options )
8
+ comp = UIButton.buttonWithType( map_types( opts.type? ? opts.type : nil ) )
9
+ comp.setAttributedTitle( attributed_text(opts), forState: UIControlStateNormal )
10
+ yield comp if block_given?
11
+ comp
12
+ end
13
+
14
+ def label( icon, options={}, &block )
15
+ opts = parse_options( icon, options )
16
+ comp = UILabel.alloc.initWithFrame( [[0,0],[opts[:size],opts[:size]]] )
17
+ comp.setAttributedText( attributed_text(opts) )
18
+ comp.awesome_color = opts.color if opts.color?
19
+ yield comp if block_given?
20
+ comp
21
+ end
22
+
23
+ def font( size )
24
+ UIFont.fontWithName( 'FontAwesome', size:size )
25
+ end
26
+
27
+ def parse_options( icon, opts )
28
+ options = MotionMap::Map[opts.merge( icon: xform_icon(icon) )]
29
+ options[:size] = UIFont.systemFontSize unless options[:size]
30
+ options
31
+ end
32
+
33
+ def xform_icon( icon )
34
+ icon.to_s.gsub( /_/, '-')
35
+ end
36
+
37
+ def attributed_text( opts )
38
+ awesome_attrs = MotionMap::Map[NSFontAttributeName, font(opts[:size])]
39
+ awesome_attrs[NSForegroundColorAttributeName] = opts.color if opts.color?
40
+ text = hex_for_icon( opts.icon )
41
+ text += " " + opts.text if opts.text?
42
+ range = opts.text? ? (0..1) : (0..0)
43
+ NSMutableAttributedString.alloc.initWithString( text, attributes: nil ).tap do |attrs|
44
+ attrs.setAttributes( awesome_attrs, range:range )
45
+ end
46
+ end
47
+
48
+ def hex_for_icon( icon )
49
+ index = plist["icon-#{icon}"]
50
+ raise InvalidAwesomeIconError, "Unable to find icon representation for `#{icon.inspect}" unless index
51
+ index.hex.chr(Encoding::UTF_8)
52
+ end
53
+
54
+ def map_types( type )
55
+ button_types.get(type) {UIButtonTypeRoundedRect}
56
+ end
57
+
58
+ def plist
59
+ @plist ||= begin
60
+ NSMutableDictionary.dictionaryWithContentsOfFile(
61
+ NSBundle.mainBundle.resourcePath.stringByAppendingPathComponent( "fontawesome.plist" )
62
+ )
63
+ end
64
+ end
65
+
66
+ def button_types
67
+ @button_types ||=
68
+ MotionMap::Map[custom: UIButtonTypeCustom, rounded: UIButtonTypeRoundedRect]
69
+ end
70
+ end
@@ -0,0 +1,21 @@
1
+ class UILabel
2
+ attr_accessor :awesome_color
3
+
4
+ def awesome?
5
+ (self.text =~ /\A\W/) != nil
6
+ end
7
+
8
+ def font=( font )
9
+ super
10
+ return unless awesome?
11
+
12
+ attr_text = self.attributedText
13
+ if attr_text.length > 1
14
+ attr_text.addAttribute( NSFontAttributeName, value: font, range:(2..attr_text.length-1) )
15
+ end
16
+ attr_text.addAttribute( NSFontAttributeName,
17
+ value:MotionAwesome.font(font.pointSize),
18
+ range:(0...1) )
19
+ attr_text.addAttribute( NSForegroundColorAttributeName, value:awesome_color, range:(0...1) ) if awesome_color
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module MotionAwesome
2
+ VERSION = '0.0.3'
3
+ end
@@ -0,0 +1,30 @@
1
+ require 'css_parser'
2
+ include CssParser
3
+ require 'plist'
4
+
5
+ module MotionAwesome
6
+ class Generator
7
+ def self.plist; File.join( File.dirname( __FILE__), %w(.. .. resources fontawesome.plist) ) end
8
+
9
+ def self.gen_plist( css )
10
+ parser = CssParser::Parser.new
11
+ parser.load_file!( css )
12
+ fonts = {}
13
+ parser.each_selector do |selector, declarations, specificity|
14
+ next if selector !~ /\A.icon/
15
+ name = selector[/\.(.*)\:before/,1]
16
+ next unless name and name != 'icon-large'
17
+ hex_val = "0x#{declarations[/(f.*)"/, 1]}"
18
+ puts "#{name} : #{hex_val.inspect}"
19
+ fonts[name] = hex_val
20
+ end
21
+ write( fonts )
22
+ end
23
+
24
+ def self.write( fonts )
25
+ File.open( plist, 'w' ) do |f|
26
+ f << fonts.to_plist
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/motion-awesome/version.rb', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = 'motion-awesome'
6
+ gem.version = MotionAwesome::VERSION
7
+ gem.authors = ['Fernand Galiana']
8
+ gem.email = ['fernand.galiana@gmail.com']
9
+ gem.summary = %{Port of the most excellent FontAwesome lib to IOS}
10
+ gem.description = %{Blah Blah attributions}
11
+ gem.homepage = 'http://derailed.github.io/motion-awesome'
12
+ gem.files = `git ls-files`.split($\)
13
+ gem.test_files = gem.files.grep(%r{^spec/})
14
+ gem.require_paths = ['lib']
15
+
16
+ gem.add_development_dependency 'rspec'
17
+ gem.add_development_dependency 'plist'
18
+ gem.add_development_dependency 'css_parser'
19
+
20
+ gem.add_dependency 'motion-map'
21
+ end
Binary file
Binary file
@@ -0,0 +1,93 @@
1
+ describe MotionAwesome do
2
+
3
+ describe "#label" do
4
+ it "builds a simple label correctly" do
5
+ comp = MotionAwesome.label( :flag ) do |label|
6
+ label.class.should == UILabel
7
+ end
8
+ comp.text.should == "\xEF\x80\xA4"
9
+ end
10
+
11
+ it "builds a text label correctly" do
12
+ comp = MotionAwesome.label( :flag, text:%q(Bozo!) ) do |label|
13
+ label.class.should == UILabel
14
+ end
15
+ comp.text.should == "\xEF\x80\xA4 Bozo!"
16
+ end
17
+
18
+ it "builds a text label with all the fixins correctly" do
19
+ comp = MotionAwesome.label( :flag, text:%q(Bozo!), color: UIColor.redColor ) do |label|
20
+ label.color = UIColor.greenColor
21
+ label.font = UIFont.fontWithName( 'copperplate', size:40 )
22
+ label.class.should == UILabel
23
+ end
24
+ comp.text.should == "\xEF\x80\xA4 Bozo!"
25
+ attrs = comp.attributedText
26
+ attrs.string.should == "\xEF\x80\xA4 Bozo!"
27
+
28
+ attrs.enumerateAttributesInRange( (0...1),
29
+ options:NSAttributedStringEnumerationReverse,
30
+ usingBlock:->(attrs, range, stop) {
31
+ attrs['NSColor'].should == UIColor.redColor
32
+ attrs['NSFont'].familyName.should == 'FontAwesome'
33
+ }
34
+ )
35
+ attrs.enumerateAttributesInRange( (2..attrs.string.size-1),
36
+ options:NSAttributedStringEnumerationReverse,
37
+ usingBlock:->(attrs, range, stop) {
38
+ attrs['NSColor'].should == UIColor.greenColor
39
+ attrs['NSFont'].familyName.should == 'Copperplate'
40
+ attrs['NSFont'].pointSize.should == 40
41
+ }
42
+ )
43
+ end
44
+
45
+ it 'raises an error if no icon is found' do
46
+ lambda {
47
+ MotionAwesome.label( :bozo )
48
+ }.should.raise(MotionAwesome::InvalidAwesomeIconError)
49
+ end
50
+ end
51
+
52
+ describe '#button' do
53
+ it 'build a round button correctly' do
54
+ comp = MotionAwesome.button( :flag, text:%q(Hello World!) ) do |button|
55
+ button.class.should == UIRoundedRectButton
56
+ end
57
+ comp.attributedTitleForState(UIControlStateNormal).string.should == "\xEF\x80\xA4 Hello World!"
58
+ end
59
+
60
+ it 'build a cust button correctly' do
61
+ comp = MotionAwesome.button( :flag, type: :custom, text:%q(Bumblebee Tuna) ) do |button|
62
+ button.class.should == UIButton
63
+ end
64
+ comp.attributedTitleForState(UIControlStateNormal).string.should == "\xEF\x80\xA4 Bumblebee Tuna"
65
+ end
66
+
67
+ it "builds a button with all the fixins correctly" do
68
+ comp = MotionAwesome.button( :flag, text:%q(Bozo!), color: UIColor.redColor ) do |button|
69
+ button.titleLabel.textColor = UIColor.greenColor
70
+ button.titleLabel.font = UIFont.fontWithName( "Vermin Vibes Out Of Ink", size:55 )
71
+ end
72
+
73
+ attrs = comp.attributedTitleForState(UIControlStateNormal)
74
+ attrs.string.should == "\xEF\x80\xA4 Bozo!"
75
+
76
+ attrs.enumerateAttributesInRange( (0...1),
77
+ options:NSAttributedStringEnumerationReverse,
78
+ usingBlock:->(attrs, range, stop) {
79
+ attrs['NSColor'].should == UIColor.redColor
80
+ attrs['NSFont'].familyName.should == 'FontAwesome'
81
+ }
82
+ )
83
+ # attrs.enumerateAttributesInRange( (2..attrs.string.size-1),
84
+ # options:NSAttributedStringEnumerationReverse,
85
+ # usingBlock:->(attrs, range, stop) {
86
+ # # attrs['NSColor'].should == UIColor.greenColor
87
+ # # attrs['NSFont'].familyName.should == 'Copperplate'
88
+ # # attrs['NSFont'].pointSize.should == 40
89
+ # }
90
+ # )
91
+ end
92
+ end
93
+ end
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: motion-awesome
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Fernand Galiana
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-04-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ prerelease: false
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ name: rspec
21
+ requirement: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ! '>='
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ type: :development
27
+ - !ruby/object:Gem::Dependency
28
+ prerelease: false
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ name: plist
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :development
41
+ - !ruby/object:Gem::Dependency
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ name: css_parser
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ - !ruby/object:Gem::Dependency
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ name: motion-map
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :runtime
69
+ description: Blah Blah attributions
70
+ email:
71
+ - fernand.galiana@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - Gemfile
78
+ - Gemfile.lock
79
+ - README.md
80
+ - Rakefile
81
+ - app/app_delegate.rb
82
+ - app/controllers/a.rb
83
+ - app/controllers/b.rb
84
+ - app/controllers/c.rb
85
+ - app/controllers/d.rb
86
+ - app/controllers/e.rb
87
+ - app/controllers/z.rb
88
+ - lib/assets/fontawesome-webfont.ttf
89
+ - lib/assets/fontawesome.plist
90
+ - lib/motion-awesome.rb
91
+ - lib/motion-awesome/awesome.rb
92
+ - lib/motion-awesome/core_ext/ui_label.rb
93
+ - lib/motion-awesome/version.rb
94
+ - lib/utils/generator.rb
95
+ - motion-awesome.gemspec
96
+ - resources/button-bg.png
97
+ - resources/button-bg@2x.png
98
+ - resources/vermin_vibes_out_of_ink.ttf
99
+ - spec/motion-awesome/motion_awesome_spec.rb
100
+ homepage: http://derailed.github.io/motion-awesome
101
+ licenses: []
102
+ metadata: {}
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ requirements: []
118
+ rubyforge_project:
119
+ rubygems_version: 2.0.3
120
+ signing_key:
121
+ specification_version: 4
122
+ summary: Port of the most excellent FontAwesome lib to IOS
123
+ test_files:
124
+ - spec/motion-awesome/motion_awesome_spec.rb