open_graph_reader 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bea1c38c6567749ce9bd8b369867d5e7c0b7a2b3
4
- data.tar.gz: b0805bdd3e5e1efddc7f73c59dd40ad7315b99c3
3
+ metadata.gz: 9d234bea4b2c6f26c897f1135cfd266874346e7c
4
+ data.tar.gz: 5ec41308b56fe3d639d83b880ab24354df45a398
5
5
  SHA512:
6
- metadata.gz: 6d3d1edbaa5b0ac800300c79631d5494e6eebf7cc362b618621ca6006530d303c7de679fa761ae5d6edd3b826fa069f1dde3ff6f76dbd295b3781e68fa4eb29e
7
- data.tar.gz: f9ba7d6080e164c75491abbd297994627f2812e907c230c5edb5c4f42681657da27c7e730b83b42df19fc96ddcb9fd9a3cd44b3121f933ac45d8db1635b040c6
6
+ metadata.gz: b489f32ebd5873b754860971b571f1375490fc29db6495adfc576a882aad9d8c21de6e92083f8bb0017271eefa8433aab728a8c0ca50fbc09384b1eccecc0b41
7
+ data.tar.gz: b6f990bcbdfa495f24b4862777c32cc712dbfb511039de0f20437e60ef8c149c145f4dc73420016305ec08306a8d13af9ed24fb291e01238e09a0eb90fad6878
@@ -38,10 +38,12 @@ module OpenGraphReader
38
38
  # @raise [NoOpenGraphDataError] {include:NoOpenGraphDataError}
39
39
  # @raise [InvalidObjectError] {include:InvalidObjectError}
40
40
  def self.parse! html, origin=nil
41
+ self.current_origin = origin
41
42
  parser = Parser.new html
42
43
  raise NoOpenGraphDataError, "#{origin || html} does not contain any OpenGraph tags" unless parser.has_tags?
43
- Builder.new(parser.graph, parser.additional_namespaces).base.tap {|base|
44
+ Builder.new(parser).base.tap {|base|
44
45
  base.origin = origin.to_s if origin
46
+ self.current_origin = nil
45
47
  }
46
48
  end
47
49
 
@@ -86,6 +88,19 @@ module OpenGraphReader
86
88
  Configuration.instance
87
89
  end
88
90
 
91
+ # Thread local to retrieve the current origin if available.
92
+ # See {Base#origin} if you want to know the origin of a parsed object.
93
+ #
94
+ # @api private
95
+ # @return [String,nil]
96
+ def self.current_origin
97
+ Thread.current[:_open_graph_reader_current_origin]
98
+ end
99
+
100
+ def self.current_origin= value
101
+ Thread.current[:_open_graph_reader_current_origin] = value
102
+ end
103
+
89
104
  # The target couldn't be fetched, didn't contain any HTML or
90
105
  # any OpenGraph tags.
91
106
  class NoOpenGraphDataError < StandardError
@@ -100,4 +115,8 @@ module OpenGraphReader
100
115
  # @api private
101
116
  class UnknownNamespaceError < StandardError
102
117
  end
118
+
119
+ # The target does not define the requested property.
120
+ class UndefinedPropertyError < StandardError
121
+ end
103
122
  end
@@ -11,14 +11,11 @@ module OpenGraphReader
11
11
 
12
12
  # Create a new builder.
13
13
  #
14
- # @param [Parser::Graph] graph
15
- # @param [Array<String>] additional_namespaces Namespaces found in the
16
- # prefix attribute of the head tag of the HTML document
14
+ # @param [Parser] parser
17
15
  # @see Parser#graph
18
16
  # @see Parser#additional_namespaces
19
- def initialize graph, additional_namespaces=[]
20
- @graph = graph
21
- @additional_namespaces = additional_namespaces
17
+ def initialize parser
18
+ @parser = parser
22
19
  end
23
20
 
24
21
  # Build and return the base.
@@ -27,14 +24,15 @@ module OpenGraphReader
27
24
  def base
28
25
  base = Base.new
29
26
 
30
- type = @graph.fetch('og:type', 'website').downcase
27
+ type = @parser.graph.fetch('og:type', 'website').downcase
31
28
 
32
29
  validate_type type
33
30
 
34
- @graph.each do |property|
31
+ @parser.graph.each do |property|
35
32
  build_property base, property
36
33
  end
37
34
 
35
+ synthesize_required_properties base
38
36
  validate base
39
37
 
40
38
  base
@@ -62,7 +60,7 @@ module OpenGraphReader
62
60
  else # Direct attribute
63
61
  object[name] = property.content
64
62
  end
65
- rescue UnknownNamespaceError => e
63
+ rescue UnknownNamespaceError, UndefinedPropertyError => e
66
64
  raise InvalidObjectError, e.message if OpenGraphReader.config.strict
67
65
  end
68
66
 
@@ -85,11 +83,17 @@ module OpenGraphReader
85
83
  next_object
86
84
  end
87
85
 
86
+ def synthesize_required_properties base
87
+ if OpenGraphReader.config.synthesize_title && base.og.title.nil?
88
+ base.og['title'] = @parser.title
89
+ end
90
+ end
91
+
88
92
  def validate_type type
89
93
  return unless OpenGraphReader.config.strict
90
94
 
91
95
  unless KNOWN_TYPES.include?(type) ||
92
- @additional_namespaces.include?(type) ||
96
+ @parser.additional_namespaces.include?(type) ||
93
97
  Object::Registry.verticals.include?(type)
94
98
  raise InvalidObjectError, "Undefined type #{type}"
95
99
  end
@@ -2,6 +2,8 @@ require 'singleton'
2
2
 
3
3
  module OpenGraphReader
4
4
  # The behavior of this library can be tweaked with some parameters.
5
+ # Note that configuration is global, changing it at runtime is not
6
+ # thread safe.
5
7
  #
6
8
  # @example
7
9
  # OpenGraphReader.configure do |config|
@@ -10,7 +12,7 @@ module OpenGraphReader
10
12
  class Configuration
11
13
  include Singleton
12
14
 
13
- # Strict mode (default: <tt>false</tt>)
15
+ # Strict mode (default: <tt>false</tt>).
14
16
  #
15
17
  # In strict mode, if the fetched site defines an unknown type
16
18
  # or property, {InvalidObjectError} is thrown instead of just ignoring
@@ -19,7 +21,7 @@ module OpenGraphReader
19
21
  # @return [Bool]
20
22
  attr_accessor :strict
21
23
 
22
- # Validate required (default: <tt>true</tt>)
24
+ # Validate required (default: <tt>true</tt>).
23
25
  #
24
26
  # Validate that required properties exist. If this is enabled and
25
27
  # they do not, {InvalidObjectError} is thrown.
@@ -27,7 +29,7 @@ module OpenGraphReader
27
29
  # @return [Bool]
28
30
  attr_accessor :validate_required
29
31
 
30
- # Validate references (default: <tt>true</tt>)
32
+ # Validate references (default: <tt>true</tt>).
31
33
  #
32
34
  # If an object should be a reference to another object,
33
35
  # validate that it contains an URL. Be careful in turning this off,
@@ -36,6 +38,27 @@ module OpenGraphReader
36
38
  # @return [Bool]
37
39
  attr_accessor :validate_references
38
40
 
41
+ # Fallback to the title tag if og:title is missing (default: <tt>false</tt>).
42
+ #
43
+ # The standard makes defining og:title required, but it's
44
+ # a common practice to rely on the parser falling back to
45
+ # synthesize it from the title tag. This option enables this feature.
46
+ #
47
+ # @return [Bool]
48
+ attr_accessor :synthesize_title
49
+
50
+
51
+ # Guess image URL when it looks like a path (default: <tt>false</tt>).
52
+ #
53
+ # The standard requires og:image, og:image:url and og:image:secure_url
54
+ # to be a full URL. However it's common practice to put a path relative
55
+ # to the domain URL. When enabled, the library tries to guess the full
56
+ # URL from such a path. Note the object can still turn invalid if it fails
57
+ # to do so.
58
+ #
59
+ # @return [Bool]
60
+ attr_accessor :synthesize_image_url
61
+
39
62
  # @private
40
63
  def initialize
41
64
  reset_to_defaults!
@@ -46,6 +69,8 @@ module OpenGraphReader
46
69
  @strict = false
47
70
  @validate_required = true
48
71
  @validate_references = true
72
+ @synthesize_title = false
73
+ @synthesize_image_url = false
49
74
  end
50
75
  end
51
76
  end
@@ -54,7 +54,7 @@ module OpenGraphReader
54
54
  include Object
55
55
 
56
56
  namespace :og, :image
57
- content :url
57
+ content :url, image: true
58
58
 
59
59
  url :url
60
60
 
@@ -67,10 +67,10 @@ module OpenGraphReader
67
67
  # @api private
68
68
  # @param [#to_s] name
69
69
  # @todo right error?
70
- # @raise [InvalidObjectError] If the requested property is undefined.
70
+ # @raise [UndefinedPropertyError] If the requested property is undefined.
71
71
  # @return [String, Object]
72
72
  def [] name
73
- raise InvalidObjectError, "Undefined property #{name} on #{inspect}" unless has_property? name
73
+ raise UndefinedPropertyError, "Undefined property #{name} on #{inspect}" unless has_property? name
74
74
  public_send name.to_s #properties[name.to_s]
75
75
  end
76
76
 
@@ -79,12 +79,12 @@ module OpenGraphReader
79
79
  # @api private
80
80
  # @param [#to_s] name
81
81
  # @param [String, Object] value
82
- # @raise [InvalidObjectError] If the requested property is undefined.
82
+ # @raise [UndefinedPropertyError] If the requested property is undefined.
83
83
  def []= name, value
84
84
  if has_property?(name)
85
85
  public_send "#{name}=", value
86
86
  elsif OpenGraphReader.config.strict
87
- raise InvalidObjectError, "Undefined property #{name} on #{inspect}"
87
+ raise UndefinedPropertyError, "Undefined property #{name} on #{inspect}"
88
88
  end
89
89
  end
90
90
 
@@ -75,7 +75,9 @@ module OpenGraphReader
75
75
  end
76
76
  end
77
77
  end
78
- singleton_class.send(:alias_method, :define_type_with_args, :define_type)
78
+
79
+ # Alias to trick YARD
80
+ singleton_class.send(:alias_method, :define_type_no_doc, :define_type)
79
81
 
80
82
  # @overload namespace
81
83
  # Get the namespace of this object.
@@ -1,4 +1,5 @@
1
1
  require 'date'
2
+ require 'uri'
2
3
 
3
4
  require 'open_graph_reader/object/dsl'
4
5
 
@@ -10,22 +11,41 @@ module OpenGraphReader
10
11
  value.to_s
11
12
  end
12
13
 
13
- # @see http://ogp.me/#url
14
- define_type :url do |value, options|
15
- value.to_s.tap {|value|
16
- unless value.start_with?('http://') || value.start_with?('https://')
17
- if options.has_key?(:to) && OpenGraphReader.config.validate_references
18
- raise InvalidObjectError, "URL #{value.inspect} does not start with http:// or https://"
14
+ # @!method url(name, options={})
15
+ # @option options [Bool] :image (false) Mark attribute as image to be eligible
16
+ # for URL synthesization. See {Configuration#synthesize_image_url}.
17
+ # @!macro define_type_description
18
+ # @see http://ogp.me/#url
19
+ define_type_no_doc :url do |value, options|
20
+ value = value.to_s
21
+
22
+ unless value.start_with?('http://') || value.start_with?('https://')
23
+ if options[:image] && OpenGraphReader.config.synthesize_image_url
24
+ unless OpenGraphReader.current_origin
25
+ raise ArgumentError, "Enabled image url synthesization but didn't pass an origin"
26
+ end
27
+
28
+ begin
29
+ value = "/#{value}" unless value.start_with? '/' # Normalize to absolute path
30
+ uri = URI.parse(OpenGraphReader.current_origin)
31
+ uri.path = value
32
+ value = uri.to_s
33
+ rescue
34
+ raise InvalidObjectError, "URL #{value.inspect} does not start with http:// or https:// and failed to synthesize a full URL"
19
35
  end
36
+ elsif options.has_key?(:to) && OpenGraphReader.config.validate_references
37
+ raise InvalidObjectError, "URL #{value.inspect} does not start with http:// or https://"
20
38
  end
21
- }
39
+ end
40
+
41
+ value
22
42
  end
23
43
 
24
44
  # @!method enum(name, allowed, options={})
25
45
  # @param [Array<String>] allowed the list of allowed values
26
46
  # @!macro define_type_description
27
- # @see http://ogp.me/#enum
28
- define_type_with_args :enum do |value, allowed|
47
+ # @see http://ogp.me/#enum
48
+ define_type_no_doc :enum do |value, allowed|
29
49
  unless allowed.include? value
30
50
  raise InvalidObjectError, "Expected one of #{allowed.inspect} but was #{value.inspect}"
31
51
  end
@@ -46,6 +46,13 @@ module OpenGraphReader
46
46
  @graph ||= build_graph
47
47
  end
48
48
 
49
+ # The value of the title tag of the passed document.
50
+ #
51
+ # @return [String]
52
+ def title
53
+ @doc.xpath('/html/head/title').first.text
54
+ end
55
+
49
56
  private
50
57
 
51
58
  def build_graph
@@ -1,4 +1,4 @@
1
1
  module OpenGraphReader
2
2
  # Tbe library version
3
- VERSION = "0.2.0"
3
+ VERSION = "0.3.0"
4
4
  end
@@ -0,0 +1,699 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Fritzing Download</title>
6
+ <!-- viewport -->
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
9
+ <!-- meta tags -->
10
+ <meta property="og:title" content="Fritzing">
11
+ <meta property="og:type" content="website">
12
+ <meta property="og:image" content="/static/img/fritzing.png">
13
+ <meta property="og:url" content="http://fritzing.org/">
14
+ <meta name="description" content="">
15
+ <meta name="author" content="">
16
+ <!-- favicon -->
17
+ <link rel="shortcut icon" href="/static/img/favicon.ico">
18
+ <!-- style sheets -->
19
+ <link rel="stylesheet" type="text/css" media="screen" href="/static/css/reset.css">
20
+ <link rel="stylesheet" type="text/css" media="screen" href="/static/css/structure.css">
21
+ <link rel="stylesheet" type="text/css" media="screen" href="/static/css/design.css">
22
+ <link rel="stylesheet" type="text/css" media="screen" href="/static/lib/dropit/dropit.css">
23
+ <!-- fonts -->
24
+ <link rel="stylesheet" type="text/css" media="screen" href="/static/fonts/ocr-a-tribute/ocr-a-tribute.css">
25
+ <!--<link rel="stylesheet" type="text/css" media="screen" href="/static/fonts/droid-sans/droid-sans.css">-->
26
+ <link href='http://fonts.googleapis.com/css?family=Open+Sans:300,400,600' rel='stylesheet' type='text/css'>
27
+ <!-- scripts -->
28
+ <script type="text/javascript" src="/static/lib/jquery.min.js"></script>
29
+ <script type="text/javascript" src="/static/lib/jquery.cookie.js"></script>
30
+ <script type="text/javascript" src="/static/js/index.js"></script>
31
+ <script type="text/javascript" src="/static/lib/dropit/dropit.js"></script>
32
+ <script type="text/javascript" src="/static/js/search.js"></script>
33
+ <!-- polyfills -->
34
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
35
+ <!--[if lt IE 9]><script src="/static/lib/html5shiv.min.js" type="text/javascript"></script><![endif]-->
36
+
37
+ <script type="text/javascript" src="/static/js/download.js"></script>
38
+ <link rel="stylesheet" href="/static/css/download.css" type="text/css" media="screen" />
39
+ <link rel="stylesheet" href="/static/lib/magnific-popup/magnific-popup.css" type="text/css" media="screen" />
40
+ <script type="text/javascript" src="/static/lib/magnific-popup/jquery.magnific-popup.min.js"></script>
41
+
42
+ <script type="text/javascript">var NREUMQ=NREUMQ||[];NREUMQ.push(["mark","firstbyte",new Date().getTime()]);</script></head>
43
+ <body>
44
+
45
+ <div id="header-container">
46
+ <header>
47
+ <div id="fritzing-logo">
48
+ <h1><a href="/">Fritzing</a></h1>
49
+ <p><a href="/">electronics made easy</a></p>
50
+ </div>
51
+ <nav id="nav-responsive" class="resp">
52
+ <ul class="dropit-resp">
53
+ <li>
54
+ <a href="#">Menu</a>
55
+ <ul>
56
+
57
+
58
+
59
+ <li><a href="/projects/" class="" title="Projects">Projects</a></li>
60
+ <li><a href="/parts/" class="" title="Parts">Parts</a></li>
61
+ <li><a href="/download/" class=" active " title="Download">Download</a></li>
62
+ <li><a href="/learning/" class="" title="Learning">Learning</a></li>
63
+ <li><a href="/forum/" class="" title="Forum">Forum</a></li>
64
+ <li><a href="/services/" class="" title="Services">Services</a></li>
65
+ <li><a href="/support-us/" class="" title="Contribute">Contribute</a></li>
66
+
67
+
68
+
69
+
70
+
71
+ <li><a href="/account/signup/"><strong>SIGN UP</strong></a></li>
72
+ <li><a href="/account/login/" class="login-link">LOGIN</a></li>
73
+
74
+
75
+
76
+
77
+ <!--<li class="main"><a href="/" title="Main Site" class="active">Main Site</a></li>
78
+ <li class="blog"><a href="http://blog.fritzing.org" title="Blog" target="_blank">Blog</a></li>-->
79
+ <li class="fab"><a href="http://fab.fritzing.org" title="Fab" target="_blank">Fab</a></li>
80
+ <li class="shop"><a href="http://shop.fritzing.org" title="Shop" target="_blank">Shop</a></li>
81
+
82
+
83
+
84
+ </ul>
85
+ </li>
86
+ </ul>
87
+ </nav>
88
+ <nav id="nav-main">
89
+ <ul>
90
+
91
+ <li><a href="/projects/" class="" title="Projects">Projects</a></li>
92
+ <li><a href="/parts/" class="" title="Parts">Parts</a></li>
93
+ <li><a href="/download/" class=" active " title="Download">Download</a></li>
94
+ <li><a href="/learning/" class="" title="Learning">Learning</a></li>
95
+ <li><a href="/forum/" class="" title="Forum">Forum</a></li>
96
+ <li><a href="/services/" class="" title="Services">Services</a></li>
97
+ <li><a href="/support-us/" class="" title="Contribute">Contribute</a></li>
98
+
99
+
100
+ </ul>
101
+ </nav>
102
+ <nav id="nav-global">
103
+ <ul>
104
+
105
+ <!--<li class="main"><a href="/" title="Main Site" class="active">Main Site</a></li>
106
+ <li class="blog"><a href="http://blog.fritzing.org" title="Blog" target="_blank">Blog</a></li>-->
107
+ <li class="fab"><a href="http://fab.fritzing.org" title="Fab" target="_blank">Fab</a></li>
108
+ <li class="shop"><a href="http://shop.fritzing.org" title="Shop" target="_blank">Shop</a></li>
109
+
110
+ </ul>
111
+ </nav>
112
+ <nav id="nav-sub">
113
+
114
+
115
+
116
+ </nav>
117
+ <nav id="nav-account">
118
+ <ul >
119
+
120
+
121
+
122
+ <li><a href="/account/signup/"><strong>SIGN UP</strong></a></li>
123
+ <li><a href="/account/login/" class="login-link">LOGIN</a></li>
124
+
125
+
126
+
127
+ </ul>
128
+ </nav>
129
+ </header>
130
+ </div>
131
+
132
+
133
+ <div id="container" class="clearfix">
134
+ <div id="main" role="main" class="clearfix">
135
+ <!-- content -->
136
+ <div id="content">
137
+
138
+
139
+
140
+ <!-- *27031979,15877,0# -->
141
+
142
+ <div class="cols cols-2 clearfix">
143
+
144
+ <div class="col">
145
+ <div class="clearfix">
146
+
147
+
148
+ <p class="lead">Fritzing is open source, free software. Please consider <a href="/shop/donations/">donating
149
+ to Friends-of-Fritzing e.V.</a> before downloading the app.<br/>
150
+ Fritzing is a non-profit organization devoted to making creative use of electronics accessible to everyone.</p>
151
+
152
+ <form action="https://www.paypal.com/cgi-bin/webscr" method="post" id="donateForm">
153
+ <p class="messages"></p>
154
+ <!-- PayPal variables -->
155
+ <input type="hidden" name="cmd" value="_donations">
156
+ <input type="hidden" name="business" value="friends@fritzing.org">
157
+ <input type="hidden" name="item_name" value="Donation">
158
+ <input type="hidden" name="currency_code" value="EUR">
159
+ <input type="hidden" name="return" value="http://fritzing.org/download/?donation=1">
160
+ <input type="hidden" name="cancel_return" value="http://fritzing.org/download/?donation=0">
161
+ <input type="hidden" name="rm" value="2">
162
+ <!-- Form interaction -->
163
+ <input type="hidden" name="form" value="1">
164
+ <input type="hidden" name="radioChecked" value="0">
165
+ <label><input type="radio" name="amount" value="0"> No Donation</label>
166
+ <label><input type="radio" name="amount" value="10"> &euro; 10</label>
167
+ <label><input type="radio" name="amount" value="25"> &euro; 25</label>
168
+ <label class="text-input"><input type="radio" name="amount" value="other" id="wildcard"> &euro;&nbsp;&nbsp;<input type="text" id="otra" placeholder="50"></label>
169
+ <input type="submit" name="submit" value="Donate &amp; Download">
170
+ </form>
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+ <p>Version <strong><a href="/download/0.9.1b/">0.9.1b</a></strong>
179
+ was released on <strong>Dec. 2, 2014</strong>.</p>
180
+
181
+ </div>
182
+ <p>Downloaded <em>15877</em> times.</p>
183
+ <p>See <a href="/download/history-changes/" title="History of Changes">what's new</a> and the <a href="/download/known-issues/" title="Known Issues">known issues</a>.</p>
184
+ <p>Read the <a href="#install">installation instructions</a> below.</p>
185
+ <p>
186
+ This version includes translations for:<br/>
187
+ <em lang="de">Deutsch</em> (German),
188
+ <em>English</em>,
189
+ <em lang="es">Español</em> (Spanish),
190
+ <em lang="fr">Français</em> (French),
191
+ <em lang="it">Italiano</em> (Italian),
192
+ <em lang="nl">Nederlands</em> (Dutch),
193
+ <em lang="pt-PT">Português (eu)</em> (Portuguese EU),
194
+ <em lang="pt-BR">Português (br)</em> (Portuguese BR),
195
+ <em lang="ja">日本語</em> (Japanese),
196
+ <em lang="zh-CN">中文 (简体)</em> (Chinese Simplified),
197
+ <em lang="zh-TW">正體中文 (繁體)</em> (Chinese Traditional),
198
+ <em lang="ru">Русский</em> (Russian),
199
+ <em lang="cs">Čeština</em> (Czech),
200
+ <em lang="ko">한국어</em> (Korean),
201
+ <em lang="el">Ελληνικά</em> (Greek),
202
+ <em lang="sk">slovenčina</em> (Slovak),
203
+ <em lang="tr">Türkçe</em> (Turkish),
204
+ <em lang="bg">Български</em> (Bulgarian),
205
+ <em lang="bn">বাংলা</em> (Bengali).
206
+ </p>
207
+ </div>
208
+ <div class="col slideshow">
209
+ <p><a href="/static/img/fritzing-preview-bb.png"><img src="/static/img/fritzing-preview-bb.png" /></a></p>
210
+ <p><a href="/static/img/fritzing-preview-schem.png"><img src="/static/img/fritzing-preview-schem.png" /></a></p>
211
+ <p><a href="/static/img/fritzing-preview-pcb.png"><img src="/static/img/fritzing-preview-pcb.png" /></a></p>
212
+ <p style="display: none"><a href="/static/img/fritzing-preview-welcome.png"><img src="/static/img/fritzing-preview-welcome.png" /></a></p>
213
+ <script type="text/javascript">
214
+ $(document).ready(function() {
215
+ $('.slideshow').magnificPopup({
216
+ delegate: 'a',
217
+ type: 'image',
218
+ closeBtnInside: false,
219
+ mainClass: 'mfp-with-zoom mfp-img-mobile',
220
+ gallery: {
221
+ enabled: true,
222
+ navigateByImgClick: true,
223
+ preload: [0,1]
224
+ },
225
+ zoom: {
226
+ enabled: true,
227
+ duration: 300,
228
+ opener: function(element) {
229
+ return element.find('img');
230
+ }
231
+ }
232
+ });
233
+ });
234
+ </script>
235
+ </div>
236
+ </div>
237
+
238
+ <div class="cols cols-1 clearfix">
239
+
240
+ <div class="col">
241
+ <a id="install"></a>
242
+ <h2>Installing Fritzing</h2>
243
+
244
+ <p>Please make sure your system satisfies one of these requirements:<br/>
245
+ <em>Windows</em> - XP and up<br />
246
+ <em>Mac</em> - OSX 10.7 and up, though 10.6 might work too<br />
247
+ <em>Linux</em> - a fairly recent linux distro with libc &gt;= 2.6
248
+ </p>
249
+
250
+ <ol>
251
+ <li>Start downloading the Fritzing package that's right for you.</li>
252
+ <li>Unzip your Fritzing folder somewhere convenient on your hard drive.
253
+ <ul>
254
+ <li>This may also be a good time for you to create a shortcut to the Fritzing application.</li>
255
+ <li>A free unzipping program can be found <a href="http://www.rarlab.com/download.htm">here</a>, should you need it.</li>
256
+ <li>If you are updating your release of Fritzing, your custom files (parts and bins) are not stored with the application, so they will not be destroyed if you delete the older version of the Fritzing application folder.</li>
257
+ </ul>
258
+ </li>
259
+ <li>To start Fritzing:
260
+ <ul>
261
+ <li>on <em>Windows</em>: double-click fritzing.exe</li>
262
+ <li>on <em>Mac</em>: double-click the Fritzing application</li>
263
+ <li>on <em>Linux</em>: double-click Fritzing, or try ./Fritzing in your shell window</li>
264
+ </ul>
265
+ </li>
266
+ <li>If you experience problems, please try downloading again. This often helps. If it doesn't, have a look at our forums.</li>
267
+ </ol>
268
+
269
+ <h5>Mac notes</h5>
270
+ <p>
271
+ Recent versions of OS X do not allow "unverified" software to be launched directly. In order to run Fritzing, you will need to either:
272
+ <ol>
273
+ <li>right-click the Fritzing icon and select "Open"</li>
274
+ <li>in the warning dialog, click "Open"</li>
275
+ </ol>
276
+ or, to get rid of the warning permanently:
277
+ <ol>
278
+ <li>go to the System Preferences</li>
279
+ <li>open the Security & Privacy page</li>
280
+ <li>unlock it by clicking the lock in the lower left corner</li>
281
+ <li>set it to allow app downloads from anywhere</li>
282
+ </ol>
283
+ </p>
284
+
285
+ <h5>Linux notes</h5>
286
+ <p>
287
+ This binary release has been built and tested under Ubuntu 12.04 LTS.<br/>
288
+ Distros for other flavors of linux can be found at <a href="https://build.opensuse.org/package/show?package=fritzing&project=Education">openSUSE's repository</a>,
289
+ at <a href="http://software.opensuse.org/download.html?project=home:Heinervdm:branches:Education&package=fritzing">Heinervdm's openSUSE repo</a>; including a <a href="/media/uploads/fritzing.ymp">one-click download for openSUSE</a>.
290
+ Search our <a href="/forum/">forum</a> for even more. Fedora users can install Fritzing with 'yum install fritzing'.<br/>
291
+ We heartily thank openSUSE, Thomas Zimmermann, Debian.org, Bruno Canning, the Fedora Project, Ed Marshall, and other people and organizations for making these available. (But please be aware we have not tested these builds.)
292
+ </p>
293
+
294
+ <h2>Older releases</h2>
295
+ <p><div class="release_list">
296
+ <ul>
297
+
298
+
299
+ <li>
300
+
301
+ <strong><a href="/download/0.9.1b/">0.9.1b</a></strong> &gt;
302
+ Dec. 2, 2014 &gt; 15877 downloads:<br/>
303
+
304
+ <a href="/download/0.9.1b/windows-64bit/fritzing.0.9.1b.64.pc_1.zip" onclick="_gaq.push(['_trackPageview', '/download/0.9.1b/Windows (64-bit)']);">
305
+ Windows (64-bit)</a>,
306
+
307
+ <a href="/download/0.9.1b/windows/fritzing.0.9.1b.32.pc_1.zip" onclick="_gaq.push(['_trackPageview', '/download/0.9.1b/Windows']);">
308
+ Windows</a>,
309
+
310
+ <a href="/download/0.9.1b/source-tarball/fritzing-0.9.1b.source.zip" onclick="_gaq.push(['_trackPageview', '/download/0.9.1b/Source tarball']);">
311
+ Source tarball</a>,
312
+
313
+ <a href="/download/0.9.1b/mac-os-x-105/Fritzing-0.9.1b_1.dmg" onclick="_gaq.push(['_trackPageview', '/download/0.9.1b/Mac OS X 10.5']);">
314
+ Mac OS X 10.5</a>,
315
+
316
+ <a href="/download/0.9.1b/linux-64bit/fritzing-0.9.1b.linux.AMD64.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.9.1b/Linux (64-bit)']);">
317
+ Linux (64-bit)</a>,
318
+
319
+ <a href="/download/0.9.1b/linux-32bit/fritzing-0.9.1b.linux.i386.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.9.1b/Linux (32-bit)']);">
320
+ Linux (32-bit)</a>
321
+
322
+ <br />
323
+
324
+ </li>
325
+
326
+ <li>
327
+
328
+ <strong><a href="/download/0.9.0b/">0.9.0b</a></strong> &gt;
329
+ July 14, 2014 &gt; 282971 downloads:<br/>
330
+
331
+ <a href="/download/0.9.0b/windows-64bit/fritzing.0.9.0b.64.pc.zip" onclick="_gaq.push(['_trackPageview', '/download/0.9.0b/Windows (64-bit)']);">
332
+ Windows (64-bit)</a>,
333
+
334
+ <a href="/download/0.9.0b/windows/fritzing.0.9.0b.32.pc.zip" onclick="_gaq.push(['_trackPageview', '/download/0.9.0b/Windows']);">
335
+ Windows</a>,
336
+
337
+ <a href="/download/0.9.0b/source-tarball/fritzing-0.9.0b.source.tar_1.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.9.0b/Source tarball']);">
338
+ Source tarball</a>,
339
+
340
+ <a href="/download/0.9.0b/mac-os-x-105/Fritzing0.9.0b.dmg" onclick="_gaq.push(['_trackPageview', '/download/0.9.0b/Mac OS X 10.5']);">
341
+ Mac OS X 10.5</a>,
342
+
343
+ <a href="/download/0.9.0b/linux-64bit/fritzing-0.9.0b.linux.AMD64.tar_1.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.9.0b/Linux (64-bit)']);">
344
+ Linux (64-bit)</a>,
345
+
346
+ <a href="/download/0.9.0b/linux-32bit/fritzing-0.9.0b.linux.i386.tar_1.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.9.0b/Linux (32-bit)']);">
347
+ Linux (32-bit)</a>
348
+
349
+ <br />
350
+
351
+ </li>
352
+
353
+ <li>
354
+
355
+ <strong><a href="/download/0.8.7b/">0.8.7b</a></strong> &gt;
356
+ Jan. 24, 2014 &gt; 316685 downloads:<br/>
357
+
358
+ <a href="/download/0.8.7b/windows/fritzing.0.8.7b.pc.zip" onclick="_gaq.push(['_trackPageview', '/download/0.8.7b/Windows']);">
359
+ Windows</a>,
360
+
361
+ <a href="/download/0.8.7b/source-tarball/fritzing-0.8.7b.source.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.7b/Source tarball']);">
362
+ Source tarball</a>,
363
+
364
+ <a href="/download/0.8.7b/mac-os-x-105/fritzing.0.8.7b.cocoa.dmg" onclick="_gaq.push(['_trackPageview', '/download/0.8.7b/Mac OS X 10.5']);">
365
+ Mac OS X 10.5</a>,
366
+
367
+ <a href="/download/0.8.7b/linux-64bit/fritzing-0.8.7b.linux.AMD64.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.7b/Linux (64-bit)']);">
368
+ Linux (64-bit)</a>,
369
+
370
+ <a href="/download/0.8.7b/linux-32bit/fritzing-0.8.7b.linux.i386.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.7b/Linux (32-bit)']);">
371
+ Linux (32-bit)</a>
372
+
373
+ <br />
374
+
375
+ </li>
376
+
377
+ <li>
378
+
379
+ <strong><a href="/download/0.8.6b/">0.8.6b</a></strong> &gt;
380
+ Jan. 22, 2014 &gt; 11456 downloads:<br/>
381
+
382
+ <a href="/download/0.8.6b/windows/fritzing.0.8.6b.pc.zip" onclick="_gaq.push(['_trackPageview', '/download/0.8.6b/Windows']);">
383
+ Windows</a>,
384
+
385
+ <a href="/download/0.8.6b/source-tarball/fritzing-0.8.6b.source.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.6b/Source tarball']);">
386
+ Source tarball</a>,
387
+
388
+ <a href="/download/0.8.6b/mac-os-x-105/fritzing.0.8.6b.cocoa.dmg" onclick="_gaq.push(['_trackPageview', '/download/0.8.6b/Mac OS X 10.5']);">
389
+ Mac OS X 10.5</a>,
390
+
391
+ <a href="/download/0.8.6b/linux-64bit/fritzing-0.8.6b.linux.AMD64.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.6b/Linux (64-bit)']);">
392
+ Linux (64-bit)</a>,
393
+
394
+ <a href="/download/0.8.6b/linux-32bit/fritzing-0.8.6b.linux.i386.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.6b/Linux (32-bit)']);">
395
+ Linux (32-bit)</a>
396
+
397
+ <br />
398
+
399
+ </li>
400
+
401
+ <li>
402
+
403
+ <strong><a href="/download/0.8.5b/">0.8.5b</a></strong> &gt;
404
+ Dec. 17, 2013 &gt; 104195 downloads:<br/>
405
+
406
+ <a href="/download/0.8.5b/windows/fritzing.2013.12.17.pc.zip" onclick="_gaq.push(['_trackPageview', '/download/0.8.5b/Windows']);">
407
+ Windows</a>,
408
+
409
+ <a href="/download/0.8.5b/source-tarball/fritzing-0.8.5b.source.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.5b/Source tarball']);">
410
+ Source tarball</a>,
411
+
412
+ <a href="/download/0.8.5b/mac-os-x-105/fritzing.2013.12.17.cocoa.dmg" onclick="_gaq.push(['_trackPageview', '/download/0.8.5b/Mac OS X 10.5']);">
413
+ Mac OS X 10.5</a>,
414
+
415
+ <a href="/download/0.8.5b/linux-64bit/fritzing-0.8.5b.linux.AMD64.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.5b/Linux (64-bit)']);">
416
+ Linux (64-bit)</a>,
417
+
418
+ <a href="/download/0.8.5b/linux-32bit/fritzing-0.8.5b.linux.i386.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.5b/Linux (32-bit)']);">
419
+ Linux (32-bit)</a>
420
+
421
+ <br />
422
+
423
+ </li>
424
+
425
+ <li>
426
+
427
+ <strong><a href="/download/0.8.4b/">0.8.4b</a></strong> &gt;
428
+ Dec. 15, 2013 &gt; 12238 downloads:<br/>
429
+
430
+ <a href="/download/0.8.4b/windows/fritzing.2013.12.15.pc.zip" onclick="_gaq.push(['_trackPageview', '/download/0.8.4b/Windows']);">
431
+ Windows</a>,
432
+
433
+ <a href="/download/0.8.4b/source-tarball/fritzing-0.8.4b.source.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.4b/Source tarball']);">
434
+ Source tarball</a>,
435
+
436
+ <a href="/download/0.8.4b/mac-os-x-105/fritzing.2013.12.15.cocoa.dmg" onclick="_gaq.push(['_trackPageview', '/download/0.8.4b/Mac OS X 10.5']);">
437
+ Mac OS X 10.5</a>,
438
+
439
+ <a href="/download/0.8.4b/linux-64bit/fritzing-0.8.4b.linux.AMD64.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.4b/Linux (64-bit)']);">
440
+ Linux (64-bit)</a>,
441
+
442
+ <a href="/download/0.8.4b/linux-32bit/fritzing-0.8.4b.linux.i386.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.4b/Linux (32-bit)']);">
443
+ Linux (32-bit)</a>
444
+
445
+ <br />
446
+
447
+ </li>
448
+
449
+ <li>
450
+
451
+ <strong><a href="/download/0.8.3b/">0.8.3b</a></strong> &gt;
452
+ July 27, 2013 &gt; 231293 downloads:<br/>
453
+
454
+ <a href="/download/0.8.3b/windows/fritzing.2013.07.27.pc.zip" onclick="_gaq.push(['_trackPageview', '/download/0.8.3b/Windows']);">
455
+ Windows</a>,
456
+
457
+ <a href="/download/0.8.3b/source-tarball/fritzing-0.8.3b.source.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.3b/Source tarball']);">
458
+ Source tarball</a>,
459
+
460
+ <a href="/download/0.8.3b/mac-os-x-105/fritzing.2013.07.27.cocoa.dmg" onclick="_gaq.push(['_trackPageview', '/download/0.8.3b/Mac OS X 10.5']);">
461
+ Mac OS X 10.5</a>,
462
+
463
+ <a href="/download/0.8.3b/linux-64bit/fritzing-0.8.3b.linux.AMD64.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.3b/Linux (64-bit)']);">
464
+ Linux (64-bit)</a>,
465
+
466
+ <a href="/download/0.8.3b/linux-32bit/fritzing-0.8.3b.linux.i386.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.3b/Linux (32-bit)']);">
467
+ Linux (32-bit)</a>
468
+
469
+ <br />
470
+
471
+ </li>
472
+
473
+ <li>
474
+
475
+ <strong><a href="/download/0.8.2b/">0.8.2b</a></strong> &gt;
476
+ July 26, 2013 &gt; 10665 downloads:<br/>
477
+
478
+ <a href="/download/0.8.2b/windows/fritzing.2013.07.26.pc.zip" onclick="_gaq.push(['_trackPageview', '/download/0.8.2b/Windows']);">
479
+ Windows</a>,
480
+
481
+ <a href="/download/0.8.2b/source-tarball/fritzing-0.8.2b.source.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.2b/Source tarball']);">
482
+ Source tarball</a>,
483
+
484
+ <a href="/download/0.8.2b/mac-os-x-105/fritzing.2013.07.26.cocoa.dmg" onclick="_gaq.push(['_trackPageview', '/download/0.8.2b/Mac OS X 10.5']);">
485
+ Mac OS X 10.5</a>,
486
+
487
+ <a href="/download/0.8.2b/linux-64bit/fritzing-0.8.2b.linux.AMD64.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.2b/Linux (64-bit)']);">
488
+ Linux (64-bit)</a>,
489
+
490
+ <a href="/download/0.8.2b/linux-32bit/fritzing-0.8.2b.linux.i386.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.2b/Linux (32-bit)']);">
491
+ Linux (32-bit)</a>
492
+
493
+ <br />
494
+
495
+ </li>
496
+
497
+ <li>
498
+
499
+ <strong><a href="/download/0.8.1b/">0.8.1b</a></strong> &gt;
500
+ July 25, 2013 &gt; 9344 downloads:<br/>
501
+
502
+ <a href="/download/0.8.1b/windows/fritzing.2013.07.25.pc.zip" onclick="_gaq.push(['_trackPageview', '/download/0.8.1b/Windows']);">
503
+ Windows</a>,
504
+
505
+ <a href="/download/0.8.1b/source-tarball/fritzing-0.8.1b.source.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.1b/Source tarball']);">
506
+ Source tarball</a>,
507
+
508
+ <a href="/download/0.8.1b/mac-os-x-105/fritzing.2013.07.25.cocoa.dmg" onclick="_gaq.push(['_trackPageview', '/download/0.8.1b/Mac OS X 10.5']);">
509
+ Mac OS X 10.5</a>,
510
+
511
+ <a href="/download/0.8.1b/linux-64bit/fritzing-0.8.1b.linux.AMD64.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.1b/Linux (64-bit)']);">
512
+ Linux (64-bit)</a>,
513
+
514
+ <a href="/download/0.8.1b/linux-32bit/fritzing-0.8.1b.linux.i386.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.1b/Linux (32-bit)']);">
515
+ Linux (32-bit)</a>
516
+
517
+ <br />
518
+
519
+ </li>
520
+
521
+ <li>
522
+
523
+ <strong><a href="/download/0.8.0b/">0.8.0b</a></strong> &gt;
524
+ June 13, 2013 &gt; 85480 downloads:<br/>
525
+
526
+ <a href="/download/0.8.0b/windows/fritzing.2013.06.13.pc.zip" onclick="_gaq.push(['_trackPageview', '/download/0.8.0b/Windows']);">
527
+ Windows</a>,
528
+
529
+ <a href="/download/0.8.0b/source-tarball/fritzing-0.8.0b.source.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.0b/Source tarball']);">
530
+ Source tarball</a>,
531
+
532
+ <a href="/download/0.8.0b/mac-os-x-105/fritzing.2013.06.13.cocoa.dmg" onclick="_gaq.push(['_trackPageview', '/download/0.8.0b/Mac OS X 10.5']);">
533
+ Mac OS X 10.5</a>,
534
+
535
+ <a href="/download/0.8.0b/linux-64bit/fritzing-0.8.0b.linux.AMD64.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.0b/Linux (64-bit)']);">
536
+ Linux (64-bit)</a>,
537
+
538
+ <a href="/download/0.8.0b/linux-32bit/fritzing-0.8.0b.linux.i386.tar.bz2" onclick="_gaq.push(['_trackPageview', '/download/0.8.0b/Linux (32-bit)']);">
539
+ Linux (32-bit)</a>
540
+
541
+ <br />
542
+
543
+ </li>
544
+
545
+
546
+ </ul>
547
+ </div>
548
+ </p>
549
+ </div>
550
+ </div>
551
+
552
+ </div>
553
+ <!-- sidebar -->
554
+ <div id="sidebar-container">
555
+
556
+
557
+ <form id="search" class="search" action="http://www.google.com/search" method="get">
558
+ <input type="text" name="q" id="" size="">
559
+ <input type="submit" value="GO">
560
+ </form>
561
+
562
+
563
+ <nav id="nav-aside">
564
+ <ul>
565
+ <li><a href="/faq/" class="" title="FAQ">FAQ</a></li>
566
+ <li><a href="/about/" class="" title="About">About</a></li>
567
+ <li><a href="/contact/" class="" title="About">Contact</a></li>
568
+ </ul>
569
+
570
+ <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
571
+ <!-- Fritzing Website Small Square -->
572
+ <ins class="adsbygoogle"
573
+ style="display:inline-block;width:200px;height:200px"
574
+ data-ad-client="ca-pub-2306514257167796"
575
+ data-ad-slot="4043282069"></ins>
576
+ <script>
577
+ (adsbygoogle = window.adsbygoogle || []).push({});
578
+ </script>
579
+ </nav>
580
+ <!--
581
+ <ul>
582
+ % show_menu "Right" %
583
+ </ul>
584
+ -->
585
+
586
+ <aside id="sidebar">
587
+ <section class="teasers">
588
+ <!-- external wordpress blog -->
589
+ <h3>Blog</h3>
590
+
591
+ <ul>
592
+ <li>
593
+ <a href="http://blog.fritzing.org/2014/12/02/its-fritzmas-new-fritzing-code-view-release-and-a-little-present/" title="It&#039;s Fritzmas! New Fritzing &quot;Code View&quot; release, and a little present">It's Fritzmas! New Fritzing "Code View" release, and a little present</a>
594
+ <a href="http://blog.fritzing.org/2014/12/02/its-fritzmas-new-fritzing-code-view-release-and-a-little-present/"><small>Dec. 2, 2014</small></a>
595
+ </li> <li>
596
+ <a href="http://blog.fritzing.org/2014/11/24/an-intel-galileo-shield-data-monster/" title="An Intel Galileo Shield: Data Monster">An Intel Galileo Shield: Data Monster</a>
597
+ <a href="http://blog.fritzing.org/2014/11/24/an-intel-galileo-shield-data-monster/"><small>Nov. 24, 2014</small></a>
598
+ </li> <li>
599
+ <a href="http://blog.fritzing.org/2014/11/18/das-fritzing-creator-kit-im-schulunterricht/" title="Das Fritzing Creator Kit im Schulunterricht">Das Fritzing Creator Kit im Schulunterricht</a>
600
+ <a href="http://blog.fritzing.org/2014/11/18/das-fritzing-creator-kit-im-schulunterricht/"><small>Nov. 18, 2014</small></a>
601
+ </li> </ul>
602
+ <a href="http://blog.fritzing.org">More posts&hellip;</a>
603
+
604
+ </section>
605
+
606
+
607
+
608
+
609
+
610
+
611
+ <section class="teasers">
612
+ <h3>Forum</h3>
613
+ <ul>
614
+
615
+ <li>
616
+ <a href="/forum/thread/5980/?page=last#post13795">Breadboard not showing on top level</a>
617
+ <a href="/forum/creatorkit/"><small>Creator Kit</small></a>
618
+ </li>
619
+
620
+ <li>
621
+ <a href="/forum/thread/5979/?page=last#post13794">Creating Custom Parts Bin?</a>
622
+ <a href="/forum/how-do-i/"><small>How do I...</small></a>
623
+ </li>
624
+
625
+ <li>
626
+ <a href="/forum/thread/5935/?page=last#post13792">Exporting Parts as SVG</a>
627
+ <a href="/forum/parts/"><small>Parts</small></a>
628
+ </li>
629
+
630
+ </ul>
631
+ <a href="/forum/">More discussions&hellip;</a>
632
+ </section>
633
+
634
+
635
+
636
+
637
+
638
+ <section class="teasers">
639
+ <h3>Projects</h3>
640
+ <ul>
641
+
642
+ <li><a href="/projects/lunokhod/">Lunokhod</a>
643
+ <a href="/profiles/roboter/"><small>roboter</small></a>
644
+ </li>
645
+
646
+ <li><a href="/projects/arduino-yun-temperature-and-humidity-sensor/">Arduino Yun Temperature and Humidity sensor/Thingspeak</a>
647
+ <a href="/profiles/quickoo/"><small>quickoo</small></a>
648
+ </li>
649
+
650
+ <li><a href="/projects/joydelox-v10/">Joydelox v1.0</a>
651
+ <a href="/profiles/RebeccaRGB/"><small>RebeccaRGB</small></a>
652
+ </li>
653
+
654
+ </ul>
655
+ <a href="/projects/">More projects&hellip;</a>
656
+ </section>
657
+
658
+
659
+ <section class="highlight">
660
+ <h3>Get a Creator Kit!</h3>
661
+ <a href="http://creatorkit.fritzing.org" target="_blank"><img src="/static/img/creatorkit-teaser.png"/></a>
662
+ </section>
663
+
664
+
665
+ </aside>
666
+
667
+ </div>
668
+ </div>
669
+ </div>
670
+
671
+
672
+ <div id="footer-container" class="clearfix">
673
+ <footer>
674
+ <p>
675
+ Fritzing was initiated at the <a href="http://design.fh-potsdam.de" title="University of Applied Sciences Potsdam">FH Potsdam</a>, and is now developed by the <a href="http://friends.fritzing.org" title="Friends-of-Fritzing e.V.">Friends-of-Fritzing</a> foundation and <a href="http://www.ixds.de">IXDS</a>.
676
+ </p>
677
+ <p>
678
+ Follow us on:
679
+ <a title="Twitter: @FritzingOrg" href="http://twitter.com/#!/FritzingOrg" target="_blank">Twitter</a>,
680
+ <a title="Facebook: Fritzing" href="http://www.facebook.com/pages/Fritzing/178139742262089" target="_blank">Facebook</a>,
681
+ <a title="YouTube: fritzingpcb" href="http://www.youtube.com/user/fritzingpcb" target="_blank">YouTube</a>,
682
+ <a title="Flickr: fritzing_pcb" href="http://www.flickr.com/photos/fritzing_pcb/" target="_blank">Flickr</a>
683
+ </p>
684
+ </footer>
685
+ </div>
686
+
687
+
688
+ <script>
689
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
690
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
691
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
692
+ })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
693
+
694
+ ga('create', 'UA-46238307-1', 'fritzing.org');
695
+ ga('send', 'pageview');
696
+
697
+ </script>
698
+ <script type="text/javascript">if(!NREUMQ.f){NREUMQ.f=function(){NREUMQ.push(["load",new Date().getTime()]);var e=document.createElement("script");e.type="text/javascript";e.src=(("http:"===document.location.protocol)?"http:":"https:")+"//"+"js-agent.newrelic.com/nr-100.js";document.body.appendChild(e);if(NREUMQ.a)NREUMQ.a();};NREUMQ.a=window.onload;window.onload=NREUMQ.f;};NREUMQ.push(["nrfj","beacon-6.newrelic.com","3a12f7bbca","1887546","MlRaZ0dUC0pQVBFfDQsefkZbVhFQXllKVxIVQhZXWkILVV5WAUVME1hdREYPF1xdUgRFBzpdUUBB",0,251,new Date().getTime(),"","","","",""]);</script></body>
699
+ </html>