reportir 0.2.0

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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/CODE_OF_CONDUCT.md +13 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +81 -0
  9. data/Rakefile +6 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +7 -0
  12. data/lib/reportir/static_site_template/.editorconfig +13 -0
  13. data/lib/reportir/static_site_template/.gitattributes +1 -0
  14. data/lib/reportir/static_site_template/.gitignore +2 -0
  15. data/lib/reportir/static_site_template/.htaccess +984 -0
  16. data/lib/reportir/static_site_template/404.html +60 -0
  17. data/lib/reportir/static_site_template/LICENSE.txt +19 -0
  18. data/lib/reportir/static_site_template/apple-touch-icon.png +0 -0
  19. data/lib/reportir/static_site_template/browserconfig.xml +12 -0
  20. data/lib/reportir/static_site_template/crossdomain.xml +15 -0
  21. data/lib/reportir/static_site_template/css/font/FontAwesome.otf +0 -0
  22. data/lib/reportir/static_site_template/css/font/fontawesome-webfont.eot +0 -0
  23. data/lib/reportir/static_site_template/css/font/fontawesome-webfont.svg +284 -0
  24. data/lib/reportir/static_site_template/css/font/fontawesome-webfont.ttf +0 -0
  25. data/lib/reportir/static_site_template/css/font/fontawesome-webfont.woff +0 -0
  26. data/lib/reportir/static_site_template/css/main.css +348 -0
  27. data/lib/reportir/static_site_template/css/normalize.css +424 -0
  28. data/lib/reportir/static_site_template/css/vendor/bootstrap.min.css +5 -0
  29. data/lib/reportir/static_site_template/css/vendor/font-awesome.min.css +33 -0
  30. data/lib/reportir/static_site_template/doc/TOC.md +29 -0
  31. data/lib/reportir/static_site_template/doc/css.md +162 -0
  32. data/lib/reportir/static_site_template/doc/extend.md +663 -0
  33. data/lib/reportir/static_site_template/doc/faq.md +62 -0
  34. data/lib/reportir/static_site_template/doc/html.md +223 -0
  35. data/lib/reportir/static_site_template/doc/js.md +37 -0
  36. data/lib/reportir/static_site_template/doc/misc.md +175 -0
  37. data/lib/reportir/static_site_template/doc/usage.md +130 -0
  38. data/lib/reportir/static_site_template/favicon.ico +0 -0
  39. data/lib/reportir/static_site_template/humans.txt +15 -0
  40. data/lib/reportir/static_site_template/img/.gitignore +0 -0
  41. data/lib/reportir/static_site_template/img/pagination.png +0 -0
  42. data/lib/reportir/static_site_template/index.html +78 -0
  43. data/lib/reportir/static_site_template/js/main.js +0 -0
  44. data/lib/reportir/static_site_template/js/plugins.js +24 -0
  45. data/lib/reportir/static_site_template/js/vendor/bootstrap.min.js +7 -0
  46. data/lib/reportir/static_site_template/js/vendor/jquery-1.11.3.min.js +6 -0
  47. data/lib/reportir/static_site_template/js/vendor/jquery.slides.min.js +7 -0
  48. data/lib/reportir/static_site_template/js/vendor/modernizr-2.8.3.min.js +4 -0
  49. data/lib/reportir/static_site_template/robots.txt +5 -0
  50. data/lib/reportir/static_site_template/tile-wide.png +0 -0
  51. data/lib/reportir/static_site_template/tile.png +0 -0
  52. data/lib/reportir/version.rb +3 -0
  53. data/lib/reportir.rb +109 -0
  54. data/reportir.gemspec +29 -0
  55. metadata +196 -0
@@ -0,0 +1,663 @@
1
+ [HTML5 Boilerplate homepage](https://html5boilerplate.com) | [Documentation
2
+ table of contents](TOC.md)
3
+
4
+ # Extend and customise HTML5 Boilerplate
5
+
6
+ Here is some useful advice for how you can make your project with HTML5
7
+ Boilerplate even better. We don't want to include it all by default, as
8
+ not everything fits with everyone's needs.
9
+
10
+
11
+ * [App Stores](#app-stores)
12
+ * [DNS prefetching](#dns-prefetching)
13
+ * [Google Universal Analytics](#google-universal-analytics)
14
+ * [Internet Explorer](#internet-explorer)
15
+ * [Miscellaneous](#miscellaneous)
16
+ * [News Feeds](#news-feeds)
17
+ * [Search](#search)
18
+ * [Social Networks](#social-networks)
19
+ * [URLs](#urls)
20
+ * [Web Apps](#web-apps)
21
+
22
+
23
+ ## App Stores
24
+
25
+ ### Install a Chrome Web Store app
26
+
27
+ Users can install a Chrome app directly from your website, as long as
28
+ the app and site have been associated via Google's Webmaster Tools.
29
+ Read more on [Chrome Web Store's Inline Installation
30
+ docs](https://developer.chrome.com/webstore/inline_installation).
31
+
32
+ ```html
33
+ <link rel="chrome-webstore-item" href="https://chrome.google.com/webstore/detail/APP_ID">
34
+ ```
35
+
36
+ ### Smart App Banners in iOS 6+ Safari
37
+
38
+ Stop bothering everyone with gross modals advertising your entry in the
39
+ App Store. Include the following [meta tag](https://developer.apple.com/library/IOS/documentation/AppleApplications/Reference/SafariWebContent/PromotingAppswithAppBanners/PromotingAppswithAppBanners.html#//apple_ref/doc/uid/TP40002051-CH6-SW2)
40
+ will unintrusively allow the user the option to download your iOS app,
41
+ or open it with some data about the user's current state on the website.
42
+
43
+ ```html
44
+ <meta name="apple-itunes-app" content="app-id=APP_ID,app-argument=SOME_TEXT">
45
+ ```
46
+
47
+ ## DNS prefetching
48
+
49
+ In short, DNS Prefetching is a method of informing the browser of domain names
50
+ referenced on a site so that the client can resolve the DNS for those hosts,
51
+ cache them, and when it comes time to use them, have a faster turn around on
52
+ the request.
53
+
54
+ ### Implicit prefetches
55
+
56
+ There is a lot of prefetching done for you automatically by the browser. When
57
+ the browser encounters an anchor in your html that does not share the same
58
+ domain name as the current location the browser requests, from the client OS,
59
+ the IP address for this new domain. The client first checks its cache and
60
+ then, lacking a cached copy, makes a request from a DNS server. These requests
61
+ happen in the background and are not meant to block the rendering of the
62
+ page.
63
+
64
+ The goal of this is that when the foreign IP address is finally needed it will
65
+ already be in the client cache and will not block the loading of the foreign
66
+ content. Fewer requests result in faster page load times. The perception of this
67
+ is increased on a mobile platform where DNS latency can be greater.
68
+
69
+ #### Disable implicit prefetching
70
+
71
+ ```html
72
+ <meta http-equiv="x-dns-prefetch-control" content="off">
73
+ ```
74
+
75
+ Even with X-DNS-Prefetch-Control meta tag (or http header) browsers will still
76
+ prefetch any explicit dns-prefetch links.
77
+
78
+ **_WARNING:_** THIS MAY MAKE YOUR SITE SLOWER IF YOU RELY ON RESOURCES FROM
79
+ FOREIGN DOMAINS.
80
+
81
+ ### Explicit prefetches
82
+
83
+ Typically the browser only scans the HTML for foreign domains. If you have
84
+ resources that are outside of your HTML (a javascript request to a remote
85
+ server or a CDN that hosts content that may not be present on every page of
86
+ your site, for example) then you can queue up a domain name to be prefetched.
87
+
88
+ ```html
89
+ <link rel="dns-prefetch" href="//example.com">
90
+ <link rel="dns-prefetch" href="https://ajax.googleapis.com">
91
+ ```
92
+
93
+ You can use as many of these as you need, but it's best if they are all
94
+ immediately after the [Meta
95
+ Charset](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-charset)
96
+ element (which should go right at the top of the `head`), so the browser can
97
+ act on them ASAP.
98
+
99
+ #### Common Prefetch Links
100
+
101
+ Amazon S3:
102
+
103
+ ```html
104
+ <link rel="dns-prefetch" href="//s3.amazonaws.com">
105
+ ```
106
+
107
+ Google APIs:
108
+
109
+ ```html
110
+ <link rel="dns-prefetch" href="https://ajax.googleapis.com">
111
+ ```
112
+
113
+ Microsoft Ajax Content Delivery Network:
114
+
115
+ ```html
116
+ <link rel="dns-prefetch" href="//ajax.microsoft.com">
117
+ <link rel="dns-prefetch" href="//ajax.aspnetcdn.com">
118
+ ```
119
+
120
+ ### Further reading about DNS prefetching
121
+
122
+ * https://developer.mozilla.org/en-US/docs/Controlling_DNS_prefetching
123
+ * https://dev.chromium.org/developers/design-documents/dns-prefetching
124
+ * http://blogs.msdn.com/b/ie/archive/2011/03/17/internet-explorer-9-network-performance-improvements.aspx
125
+ * http://dayofjs.com/videos/22158462/web-browsers_alex-russel
126
+
127
+
128
+ ## Google Universal Analytics
129
+
130
+ ### More tracking settings
131
+
132
+ The [optimized Google Universal Analytics
133
+ snippet](https://mathiasbynens.be/notes/async-analytics-snippet#universal-analytics)
134
+ included with HTML5 Boilerplate includes something like this:
135
+
136
+ ```js
137
+ ga('create', 'UA-XXXXX-X', 'auto'); ga('send', 'pageview');
138
+ ```
139
+
140
+ To customize further, see Google's [Advanced
141
+ Setup](https://developers.google.com/analytics/devguides/collection/analyticsjs/advanced),
142
+ [Pageview](https://developers.google.com/analytics/devguides/collection/analyticsjs/pages),
143
+ and [Event](https://developers.google.com/analytics/devguides/collection/analyticsjs/events) Docs.
144
+
145
+ ### Anonymize IP addresses
146
+
147
+ In some countries, no personal data may be transferred outside jurisdictions
148
+ that do not have similarly strict laws (i.e. from Germany to outside the EU).
149
+ Thus a webmaster using the Google Universal Analytics may have to ensure that
150
+ no personal (trackable) data is transferred to the US. You can do that with
151
+ [the `ga('set', 'anonymizeIp', true);`
152
+ parameter](https://developers.google.com/analytics/devguides/collection/analyticsjs/advanced#anonymizeip)
153
+ before sending any events/pageviews. In use it looks like this:
154
+
155
+ ```js
156
+ ga('create', 'UA-XXXXX-X', 'auto');
157
+ ga('set', 'anonymizeIp', true);
158
+ ga('send', 'pageview');
159
+ ```
160
+
161
+ ### Track jQuery AJAX requests in Google Analytics
162
+
163
+ An article by @JangoSteve explains how to [track jQuery AJAX requests in Google
164
+ Analytics](http://www.alfajango.com/blog/track-jquery-ajax-requests-in-google-analytics/).
165
+
166
+ Add this to `plugins.js`:
167
+
168
+ ```js
169
+ /*
170
+ * Log all jQuery AJAX requests to Google Analytics
171
+ * See: http://www.alfajango.com/blog/track-jquery-ajax-requests-in-google-analytics/
172
+ */
173
+ if (typeof ga !== "undefined" && ga !== null) {
174
+ $(document).ajaxSend(function(event, xhr, settings){
175
+ ga('send', 'pageview', settings.url);
176
+ });
177
+ }
178
+ ```
179
+
180
+ ### Track JavaScript errors in Google Analytics
181
+
182
+ Add this function after `ga` is defined:
183
+
184
+ ```js
185
+ (function(window){
186
+ var undefined,
187
+ link = function (href) {
188
+ var a = window.document.createElement('a');
189
+ a.href = href;
190
+ return a;
191
+ };
192
+ window.onerror = function (message, file, line, column) {
193
+ var host = link(file).hostname;
194
+ ga('send', {
195
+ 'hitType': 'event',
196
+ 'eventCategory': (host == window.location.hostname || host == undefined || host == '' ? '' : 'external ') + 'error',
197
+ 'eventAction': message,
198
+ 'eventLabel': (file + ' LINE: ' + line + (column ? ' COLUMN: ' + column : '')).trim(),
199
+ 'nonInteraction': 1
200
+ });
201
+ };
202
+ }(window));
203
+ ```
204
+
205
+ ### Track page scroll
206
+
207
+ Add this function after `ga` is defined:
208
+
209
+ ```js
210
+ $(function(){
211
+ var isDuplicateScrollEvent,
212
+ scrollTimeStart = new Date,
213
+ $window = $(window),
214
+ $document = $(document),
215
+ scrollPercent;
216
+
217
+ $window.scroll(function() {
218
+ scrollPercent = Math.round(100 * ($window.height() + $window.scrollTop())/$document.height());
219
+ if (scrollPercent > 90 && !isDuplicateScrollEvent) { //page scrolled to 90%
220
+ isDuplicateScrollEvent = 1;
221
+ ga('send', 'event', 'scroll',
222
+ 'Window: ' + $window.height() + 'px; Document: ' + $document.height() + 'px; Time: ' + Math.round((new Date - scrollTimeStart )/1000,1) + 's'
223
+ );
224
+ }
225
+ });
226
+ });
227
+ ```
228
+
229
+ ## Internet Explorer
230
+
231
+ ### Prompt users to switch to "Desktop Mode" in IE10 Metro
232
+
233
+ IE10 does not support plugins, such as Flash, in Metro mode. If
234
+ your site requires plugins, you can let users know that via the
235
+ `x-ua-compatible` meta element, which will prompt them to switch
236
+ to Desktop Mode.
237
+
238
+ ```html
239
+ <meta http-equiv="x-ua-compatible" content="requiresActiveX=true">
240
+ ```
241
+
242
+ Here's what it looks like alongside H5BP's default `x-ua-compatible`
243
+ values:
244
+
245
+ ```html
246
+ <meta http-equiv="x-ua-compatible" content="ie=edge,requiresActiveX=true">
247
+ ```
248
+
249
+ You can find more information in [Microsoft's IEBlog post about prompting for
250
+ plugin use in IE10 Metro
251
+ Mode](http://blogs.msdn.com/b/ie/archive/2012/01/31/web-sites-and-a-plug-in-free-web.aspx).
252
+
253
+ ### IE Pinned Sites (IE9+)
254
+
255
+ Enabling your application for pinning will allow IE9 users to add it to their
256
+ Windows Taskbar and Start Menu. This comes with a range of new tools that you
257
+ can easily configure with the elements below. See more [documentation on IE9
258
+ Pinned Sites](https://msdn.microsoft.com/en-us/library/gg131029.aspx).
259
+
260
+ ### Name the Pinned Site for Windows
261
+
262
+ Without this rule, Windows will use the page title as the name for your
263
+ application.
264
+
265
+ ```html
266
+ <meta name="application-name" content="Sample Title">
267
+ ```
268
+
269
+ ### Give your Pinned Site a tooltip
270
+
271
+ You know — a tooltip. A little textbox that appears when the user holds their
272
+ mouse over your Pinned Site's icon.
273
+
274
+ ```html
275
+ <meta name="msapplication-tooltip" content="A description of what this site does.">
276
+ ```
277
+
278
+ ### Set a default page for your Pinned Site
279
+
280
+ If the site should go to a specific URL when it is pinned (such as the
281
+ homepage), enter it here. One idea is to send it to a special URL so you can
282
+ track the number of pinned users, like so:
283
+ `http://www.example.com/index.html?pinned=true`
284
+
285
+ ```html
286
+ <meta name="msapplication-starturl" content="http://www.example.com/index.html?pinned=true">
287
+ ```
288
+
289
+ ### Recolor IE's controls manually for a Pinned Site
290
+
291
+ IE9+ will automatically use the overall color of your Pinned Site's favicon to
292
+ shade its browser buttons. UNLESS you give it another color here. Only use
293
+ named colors (`red`) or hex colors (`#ff0000`).
294
+
295
+ ```html
296
+ <meta name="msapplication-navbutton-color" content="#ff0000">
297
+ ```
298
+
299
+ ### Manually set the window size of a Pinned Site
300
+
301
+ If the site should open at a certain window size once pinned, you can specify
302
+ the dimensions here. It only supports static pixel dimensions. 800x600
303
+ minimum.
304
+
305
+ ```html
306
+ <meta name="msapplication-window" content="width=800;height=600">
307
+ ```
308
+
309
+ ### Jump List "Tasks" for Pinned Sites
310
+
311
+ Add Jump List Tasks that will appear when the Pinned Site's icon gets a
312
+ right-click. Each Task goes to the specified URL, and gets its own mini icon
313
+ (essentially a favicon, a 16x16 .ICO). You can add as many of these as you
314
+ need.
315
+
316
+ ```html
317
+ <meta name="msapplication-task" content="name=Task 1;action-uri=http://host/Page1.html;icon-uri=http://host/icon1.ico">
318
+ <meta name="msapplication-task" content="name=Task 2;action-uri=http://microsoft.com/Page2.html;icon-uri=http://host/icon2.ico">
319
+ ```
320
+
321
+ ### (Windows 8) High quality visuals for Pinned Sites
322
+
323
+ Windows 8 adds the ability for you to provide a PNG tile image and specify the
324
+ tile's background color. [Full details on the IE
325
+ blog](http://blogs.msdn.com/b/ie/archive/2012/06/08/high-quality-visuals-for-pinned-sites-in-windows-8.aspx).
326
+
327
+ * Create a 144x144 image of your site icon, filling all of the canvas, and
328
+ using a transparent background.
329
+ * Save this image as a 32-bit PNG and optimize it without reducing
330
+ colour-depth. It can be named whatever you want (e.g. `metro-tile.png`).
331
+ * To reference the tile and its color, add the HTML `meta` elements described
332
+ in the IE Blog post.
333
+
334
+ ### (Windows 8) Badges for Pinned Sites
335
+
336
+ IE10 will poll an XML document for badge information to display on your app's
337
+ tile in the Start screen. The user will be able to receive these badge updates
338
+ even when your app isn't actively running. The badge's value can be a number,
339
+ or one of a predefined list of glyphs.
340
+
341
+ * [Tutorial on IEBlog with link to badge XML schema](http://blogs.msdn.com/b/ie/archive/2012/04/03/pinned-sites-in-windows-8.aspx)
342
+ * [Available badge values](https://msdn.microsoft.com/en-us/library/ie/br212849.aspx)
343
+
344
+ ```html
345
+ <meta name="msapplication-badge" value="frequency=NUMBER_IN_MINUTES;polling-uri=http://www.example.com/path/to/file.xml">
346
+ ```
347
+
348
+ ### Disable link highlighting upon tap in IE10
349
+
350
+ Similar to [-webkit-tap-highlight-color](http://davidwalsh.name/mobile-highlight-color)
351
+ in iOS Safari. Unlike that CSS property, this is an HTML meta element, and its
352
+ value is boolean rather than a color. It's all or nothing.
353
+
354
+ ```html
355
+ <meta name="msapplication-tap-highlight" content="no" />
356
+ ```
357
+
358
+ You can read about this useful element and more techniques in
359
+ [Microsoft's documentation on adapting WebKit-oriented apps for IE10](https://blogs.windows.com/buildingapps/2012/11/15/adapting-your-webkit-optimized-site-for-internet-explorer-10/)
360
+
361
+ ## Search
362
+
363
+ ### Direct search spiders to your sitemap
364
+
365
+ [Learn how to make a sitemap](http://www.sitemaps.org/protocol.html)
366
+
367
+ ```html
368
+ <link rel="sitemap" type="application/xml" title="Sitemap" href="/sitemap.xml">
369
+ ```
370
+
371
+ ### Hide pages from search engines
372
+
373
+ According to Heather Champ, former community manager at Flickr, you should not
374
+ allow search engines to index your "Contact Us" or "Complaints" page if you
375
+ value your sanity. This is an HTML-centric way of achieving that.
376
+
377
+ ```html
378
+ <meta name="robots" content="noindex">
379
+ ```
380
+
381
+ **_WARNING:_** DO NOT INCLUDE ON PAGES THAT SHOULD APPEAR IN SEARCH ENGINES.
382
+
383
+ ### Firefox and IE Search Plugins
384
+
385
+ Sites with in-site search functionality should be strongly considered for a
386
+ browser search plugin. A "search plugin" is an XML file which defines how your
387
+ plugin behaves in the browser. [How to make a browser search
388
+ plugin](https://www.google.com/search?ie=UTF-8&q=how+to+make+browser+search+plugin).
389
+
390
+ ```html
391
+ <link rel="search" title="" type="application/opensearchdescription+xml" href="">
392
+ ```
393
+
394
+
395
+ ## Miscellaneous
396
+
397
+ * Use [polyfills](https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills).
398
+
399
+ * Use [Microformats](http://microformats.org/wiki/Main_Page) (via
400
+ [microdata](http://microformats.org/wiki/microdata)) for optimum search
401
+ results
402
+ [visibility](http://googlewebmastercentral.blogspot.com/2009/05/introducing-rich-snippets.html).
403
+
404
+ * If you're building a web app you may want [native style momentum scrolling in
405
+ iOS 5+](http://www.johanbrook.com/articles/native-style-momentum-scrolling-to-arrive-in-ios-5/)
406
+ using `-webkit-overflow-scrolling: touch`.
407
+
408
+ * If you want to disable the translation prompt in Chrome or block Google
409
+ Translate from translating your web page, use [`<meta name="google"
410
+ value="notranslate">`](https://support.google.com/translate/?hl=en#2641276).
411
+ To disable translation for a particular section of the web page, add
412
+ [`class="notranslate"`](https://support.google.com/translate/?hl=en#2641276).
413
+
414
+ * If you want to disable the automatic detection and formatting of possible
415
+ phone numbers in Safari on iOS, use [`<meta name="format-detection"
416
+ content="telephone=no">`](https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html/#//apple_ref/doc/uid/TP40008193-SW5).
417
+
418
+ * Avoid development/stage websites "leaking" into SERPs (search engine results
419
+ page) by [implementing X-Robots-tag
420
+ headers](https://github.com/h5bp/html5-boilerplate/issues/804).
421
+
422
+ * Screen readers currently have less-than-stellar support for HTML5 but the JS
423
+ script [accessifyhtml5.js](https://github.com/yatil/accessifyhtml5.js) can
424
+ help increase accessibility by adding ARIA roles to HTML5 elements.
425
+
426
+
427
+ ## News Feeds
428
+
429
+ ### RSS
430
+
431
+ Have an RSS feed? Link to it here. Want to [learn how to write an RSS feed from
432
+ scratch](http://www.rssboard.org/rss-specification)?
433
+
434
+ ```html
435
+ <link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml">
436
+ ```
437
+
438
+ ### Atom
439
+
440
+ Atom is similar to RSS, and you might prefer to use it instead of or in
441
+ addition to it. [See what Atom's all
442
+ about](http://www.atomenabled.org/developers/syndication/).
443
+
444
+ ```html
445
+ <link rel="alternate" type="application/atom+xml" title="Atom" href="/atom.xml">
446
+ ```
447
+
448
+ ### Pingbacks
449
+
450
+ Your server may be notified when another site links to yours. The href
451
+ attribute should contain the location of your pingback service.
452
+
453
+ ```html
454
+ <link rel="pingback" href="">
455
+ ```
456
+
457
+ * High-level explanation: https://codex.wordpress.org/Introduction_to_Blogging#Pingbacks
458
+ * Step-by-step example case: http://www.hixie.ch/specs/pingback/pingback-1.0#TOC5
459
+ * PHP pingback service: https://web.archive.org/web/20131211032834/http://blog.perplexedlabs.com/2009/07/15/xmlrpc-pingbacks-using-php/
460
+
461
+
462
+
463
+ ## Social Networks
464
+
465
+ ### Facebook Open Graph data
466
+
467
+ You can control the information that Facebook and others display when users
468
+ share your site. Below are just the most basic data points you might need. For
469
+ specific content types (including "website"), see [Facebook's built-in Open
470
+ Graph content
471
+ templates](https://developers.facebook.com/docs/opengraph/objects/builtin/).
472
+ Take full advantage of Facebook's support for complex data and activity by
473
+ following the [Open Graph
474
+ tutorial](https://developers.facebook.com/docs/opengraph/tutorial/).
475
+
476
+ ```html
477
+ <meta property="og:title" content="">
478
+ <meta property="og:description" content="">
479
+ <meta property="og:image" content="">
480
+ ```
481
+
482
+ ### Twitter Cards
483
+
484
+ Twitter provides a snippet specification that serves a similar purpose to Open
485
+ Graph. In fact, Twitter will use Open Graph when Cards is not available. Note
486
+ that, as of this writing, Twitter requires that app developers activate Cards
487
+ on a per-domain basis. You can read more about the various snippet formats
488
+ and application process in the [official Twitter Cards
489
+ documentation](https://dev.twitter.com/docs/cards).
490
+
491
+ ```html
492
+ <meta name="twitter:card" content="summary">
493
+ <meta name="twitter:site" content="@site_account">
494
+ <meta name="twitter:creator" content="@individual_account">
495
+ <meta name="twitter:url" content="http://www.example.com/path/to/page.html">
496
+ <meta name="twitter:title" content="">
497
+ <meta name="twitter:description" content="">
498
+ <meta name="twitter:image" content="http://www.example.com/path/to/image.jpg">
499
+ ```
500
+
501
+
502
+ ## URLs
503
+
504
+ ### Canonical URL
505
+
506
+ Signal to search engines and others "Use this URL for this page!" Useful when
507
+ parameters after a `#` or `?` is used to control the display state of a page.
508
+ `http://www.example.com/cart.html?shopping-cart-open=true` can be indexed as
509
+ the cleaner, more accurate `http://www.example.com/cart.html`.
510
+
511
+ ```html
512
+ <link rel="canonical" href="">
513
+ ```
514
+
515
+ ### Official shortlink
516
+
517
+ Signal to the world "This is the shortened URL to use this page!" Poorly
518
+ supported at this time. Learn more by reading the [article about shortlinks on
519
+ the Microformats wiki](http://microformats.org/wiki/rel-shortlink).
520
+
521
+ ```html
522
+ <link rel="shortlink" href="h5bp.com">
523
+ ```
524
+
525
+ ### Separate mobile URLs
526
+
527
+ If you use separate URLs for desktop and mobile users, you should consider
528
+ helping search engine algorithms better understand the configuration on your
529
+ web site.
530
+
531
+ This can be done by adding the following annotations in your HTML pages:
532
+
533
+ * on the desktop page, add the `link rel="alternate"` tag pointing to the
534
+ corresponding mobile URL, e.g.:
535
+
536
+ `<link rel="alternate" media="only screen and (max-width: 640px)" href="http://m.example.com/page.html" >`
537
+
538
+ * on the mobile page, add the `link rel="canonical"` tag pointing to the
539
+ corresponding desktop URL, e.g.:
540
+
541
+ `<link rel="canonical" href="http://www.example.com/page.html">`
542
+
543
+ For more information please see:
544
+
545
+ * https://developers.google.com/webmasters/smartphone-sites/details#separateurls
546
+ * https://developers.google.com/webmasters/smartphone-sites/feature-phones
547
+
548
+
549
+ ## Web Apps
550
+
551
+ There are a couple of meta tags that provide information about a web app when
552
+ added to the Home Screen on iOS:
553
+
554
+ * Adding `apple-mobile-web-app-capable` will make your web app chrome-less and
555
+ provide the default iOS app view. You can control the color scheme of the
556
+ default view by adding `apple-mobile-web-app-status-bar-style`.
557
+
558
+ ```html
559
+ <meta name="apple-mobile-web-app-capable" content="yes">
560
+ <meta name="apple-mobile-web-app-status-bar-style" content="black">
561
+ ```
562
+
563
+ * You can use `apple-mobile-web-app-title` to add a specific sites name for the
564
+ Home Screen icon. This works since iOS 6.
565
+
566
+ ```html
567
+ <meta name="apple-mobile-web-app-title" content="">
568
+ ```
569
+
570
+ For further information please read the [official
571
+ documentation](https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html)
572
+ on Apple's site.
573
+
574
+
575
+ ### Apple Touch Icons
576
+
577
+ The Apple touch icons can be seen as the favicons of iOS devices.
578
+
579
+ The main sizes of the Apple touch icons are:
580
+
581
+ * `57×57px` – iPhone with @1x display and iPod Touch
582
+ * `72×72px` – iPad and iPad mini with @1x display running iOS ≤ 6
583
+ * `76×76px` – iPad and iPad mini with @1x display running iOS ≥ 7
584
+ * `114×114px` – iPhone with @2x display running iOS ≤ 6
585
+ * `120×120px` – iPhone with @2x and @3x display running iOS ≥ 7
586
+ * `144×144px` – iPad and iPad mini with @2x display running iOS ≤ 6
587
+ * `152×152px` – iPad and iPad mini with @2x display running iOS 7
588
+ * `180×180px` – iPad and iPad mini with @2x display running iOS 8
589
+
590
+ Displays meaning:
591
+
592
+ * @1x - non-Retina
593
+ * @2x - Retina
594
+ * @3x - Retina HD
595
+
596
+ More information about the displays of iOS devices can be found
597
+ [here](https://en.wikipedia.org/wiki/List_of_iOS_devices#Display).
598
+
599
+ In most cases, one `180×180px` touch icon named `apple-touch-icon.png`
600
+ and including:
601
+
602
+ ```html
603
+ <link rel="apple-touch-icon" href="apple-touch-icon.png">
604
+ ```
605
+
606
+ in the `<head>` of the page is enough. If you use art-direction and/or
607
+ want to have different content for each device, you can add more touch
608
+ icons as written above.
609
+
610
+ For a more comprehensive overview, please refer to Mathias' [article on Touch
611
+ Icons](https://mathiasbynens.be/notes/touch-icons).
612
+
613
+
614
+ ### Apple Touch Startup Image
615
+
616
+ Apart from that it is possible to add start-up screens for web apps on iOS. This
617
+ basically works by defining `apple-touch-startup-image` with an according link
618
+ to the image. Since iOS devices have different screen resolutions it is
619
+ necessary to add media queries to detect which image to load. Here is an
620
+ example for a retina iPhone:
621
+
622
+ ```html
623
+ <link rel="apple-touch-startup-image" media="(max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2)" href="img/startup-retina.png">
624
+ ```
625
+
626
+ However, it is possible to detect which start-up image to use with JavaScript.
627
+ The Mobile Boilerplate provides a useful function for this. Please see
628
+ [helpers.js](https://github.com/h5bp/mobile-boilerplate/blob/v4.1.0/js/helper.js#L336-L383)
629
+ for the implementation.
630
+
631
+
632
+ ### Chrome Mobile web apps
633
+
634
+ Chrome Mobile has a specific meta tag for making apps [installable to the
635
+ homescreen](https://developer.chrome.com/multidevice/android/installtohomescreen)
636
+ which tries to be a more generic replacement to Apple's proprietary meta tag:
637
+
638
+ ```html
639
+ <meta name="mobile-web-app-capable" content="yes">
640
+ ```
641
+
642
+ Same applies to the touch icons:
643
+
644
+ ```html
645
+ <link rel="icon" sizes="192x192" href="highres-icon.png">
646
+ ```
647
+
648
+ ### Theme Color
649
+
650
+ You can add the [`theme-color` meta extension](https://github.com/whatwg/meta-theme-color)
651
+ in the `<head>` of your pages to suggest the color that browsers and
652
+ OSes should use if they customize the display of individual pages in
653
+ their UIs with varying colors.
654
+
655
+ ```html
656
+ <meta name="theme-color" content="#ff69b4">
657
+ ```
658
+
659
+ The `content` attribute extension can take any valid CSS color.
660
+
661
+ Currently, the `theme-color` meta extension is supported by [Chrome 39+
662
+ for Android Lollipop](http://updates.html5rocks.com/2014/11/Support-for-theme-color-in-Chrome-39-for-Android)
663
+ and [Firefox OS 2.1+](https://twitter.com/ahmednefzaoui/status/492344698493997057).