1. Exaos Lee
  2. o-blog

Commits

Exaos Lee  committed 70d3ccf Merge

Merge origin/master: fab625

  • Participants
  • Parent commits f0a9857, fab6256
  • Branches zh-example

Comments (0)

Files changed (71)

File README.asciidoc

View file
 
 Open the +~/.emacs.d/o-blog/example/sample.org+ file and type +M-x
 org-publish-blog+. The result site would be published by default in
-+~/.emacs.d/o-blog/out+.
++~/.emacs.d/o-blog/example/out+.
 
 See the +example/out/blog/index.html+ and +example/out/todo.html+' for more
 details.

File example/emacs-logo.png

Added
New image

File example/sample.org

View file
 #+TITLE: o-blog
-#-DESCRIPTION: standalone blogging system for org-mode
-#+DATE: 2012-07-02 22:29:39
+#-DESCRIPTION: A stand-alone blogging system for Org-mode
+#+DATE: 2012-08-21 11:02:33
 
 #+STARTUP: logdone
 
 #+begin_o_blog_hero_unit
 #+HTML: <h1>o-blog</h1>
 
-A stand-alone blog and publication tool for [[http://orgmode.org/][org-mode]].
+A stand-alone blog and publication tool for [[http://orgmode.org/][Org-mode]].
 #+end_o_blog_hero_unit
 
 #+HTML: <h1 style="font-size: 500%;">Quick start guide</h1>
 
 [[https://github.com/renard/o-blog][/icon-github-sign icon-white/ Github]]
 
-[[file:{lisp}(ob:path-to-root){/lisp}/testimonials.html][/icon-comments-alt/ Testimonials]]
+[[file:{lisp}(ob:path-to-root){/lisp}/testimonials.html][/icon-comments-alt icon-white/ Testimonials]]
 
 [[file:{lisp}(ob:path-to-root){/lisp}/changelog.html][/icon-pencil icon-white/ Changelog]]
 
 
 ** Setup
 
-
-First you need to install [[http://www.gnu.org/s/emacs][emacs]] (tested with version 24, might work with 23)
-and [[http://orgmode.org/][org-mode]] (tested with version 7.8.09, other /might/ work as well). Then
+First you need to install [[http://www.gnu.org/s/emacs][Emacs]] (tested with version 24, might work with 23)
+and [[http://orgmode.org/][Org-mode]] (tested with version 7.8.09, other /might/ work as well). Then
 you have 2 ways to install [[https://github.com/renard/o-blog][o-blog]].
 
 #+begin_o_blog_row 5
 
   - [[file:{lisp}(ob:path-to-root){/lisp}/archives.html][/icon-list icon-white/ Archives]]
 
-  - [[file:{lisp}(ob:path-to-root){/lisp}/testimonials.html][/icon-comments-alt/ Testimonials]]
+  - [[file:{lisp}(ob:path-to-root){/lisp}/testimonials.html][/icon-comments-alt icon-white/ Testimonials]]
 
   - [[file:{lisp}(ob:path-to-root){/lisp}/roadmap.html][/icon-tasks icon-white/ Roadmap]]
 
   :TEMPLATE: blog_post-by-tags.html
   :END:
 
+
 * Changelog
   :PROPERTIES:
   :PAGE:     changelog.html
 - 2012-01-23
   - Change tag system from "Tags" to org tagging system.
 
+
 * Documentation
 ** Debug
    :PROPERTIES:
   :PAGE:     features.html
   :END:
 
-- Appearance
-  - Dynamic template system (using lisp functions) with [[file:{lisp}(ob:path-to-root){/lisp}/debug.html][nice debugging
+o-blog transforms the simple and powerful markup of Org-mode documents
+to a full-featured, easily deployed web site, ready to serve online to
+a wide range of devices.
+
+- Appearance - modern, dynamic, and customizable:
+  - Dynamic template system (using elisp functions) with [[file:{lisp}(ob:path-to-root){/lisp}/debug.html][nice debugging
     features]] and easy embedded [[file:{lisp}(ob:path-to-root){/lisp}/bug-report.html][bug report tool]]
   - Syntax highlighting for exported code snippets
-  - [[http://twitter.github.com/bootstrap/][bootstrap]] support
+  - [[http://twitter.github.com/bootstrap/][Bootstrap 2]] support
   - [[http://fortaweso.me/font-awesome/][Font-Awesome]] support
-  - [[http://lesscss.org/][lesscss]] support
-  - [[http://jquery.com/][JQuery]] support
+  - [[http://lesscss.org/][LESS CSS]] support
+  - [[http://jquery.com/][jQuery]] support
   - HTML5 / CSS3 ready
-  - Custom [[http://www.google.com/webfonts][Google webfonts]] support.
-  - [[http://twitter.github.com/bootstrap/scaffolding.html#responsive][Responsive design]].
-- Blog
+  - Custom [[http://www.google.com/webfonts][Google web fonts]] support
+  - [[http://twitter.github.com/bootstrap/scaffolding.html#responsive][Responsive design]] for many devices
+- Blog - all the key features are here:
   - Static pages
   - [[file:{lisp}(ob:path-to-root){/lisp}/tags/index.html][Tag cloud]]
   - Multiple blogs
   - [[file:{lisp}(ob:path-to-root){/lisp}/archives.html][Archives]]
   - [[http://disqus.com][Disqus]] support
   - [[http://en.wikipedia.org/wiki/QR_code][QR code]] support
-- Publication
-  - Both synchrone and asynchrone publication
+- Publication - fast and convenient:
+  - Both synchronous and asynchronous publication
   - Publish directly to the webserver (using tramp)
-- [[http://twitter.github.com/bootstrap/][Bootstrap]] extra
+- [[http://twitter.github.com/bootstrap/][Bootstrap]] flair and widgets:
   - Alert boxes
   - Icons ([[http://glyphicons.com/][glyphicons]]) support
-  - widgets (labels, badges, progress bar, well, etc…)
+  - Widgets such as labels, badges, progress bar, well, etc.
 
 ** Templates
   :PROPERTIES:
   :PAGE:     templates.html
   :END:
 
-Templates which are a big part of the [[https://github.com/renard/o-blog][o-blog]] export process, are HTML-based
-files. Lisp code could be interpreted as long as =<lisp>= tags surrounds it.
+Templates, which are a big part of the [[https://github.com/renard/o-blog][o-blog]] export process, are
+HTML-based files. Within templates, Lisp code can be interpreted as
+long as =<lisp>= tags surrounds the code.
 
 #+begin_src html
 <h1><lisp>(ob:blog-title BLOG)</lisp></h1>
 #+end_src
 
-The previous snippet would be exported to something similar to:
+The above would be exported to something like:
 
 #+begin_src html
 <h1>o-blog</h1>
 #+end_src
 
 #+begin_o_blog_alert info Information
-[[https://github.com/renard/o-blog][o-blog]] only needs =blog_= prefixed templates as long as they do not need any
+[[https://github.com/renard/o-blog][o-blog]] only needs =blog_= prefixed templates, as long as they do not need any
 other templates (using =ob:insert-template= function).
 
 All other templates are defined for convenience.
 
 =blog_= prefixed templates.
 
- - =blog_static.html=: exports any static page (function =ob-write-static=).
- - =blog_post.html=: exports a blog post (function =ob-write-posts=).
- - =blog_tags.html=: exports a tag cloud page (function =ob-write-tags=).
- - =blog_tags-detail.html=: exports page matching a specific tag (function
+ - =blog_static.html=: Exports any static page (function =ob-write-static=).
+ - =blog_post.html=: Exports a blog post (function =ob-write-posts=).
+ - =blog_tags.html=: Exports a tag cloud page (function =ob-write-tags=).
+ - =blog_tags-detail.html=: Exports page matching a specific tag (function
    =ob-write-tags=).
- - =blog_archive.html=: exports the whole archives (all categories, all
+ - =blog_archive.html=: Exports the whole archives (all categories, all
    years, all months) page (function =ob-write-index=).
- - =blog_rss.html=: exports the rss feed (function =ob-write-index=).
- - =blog_index_month.html= export index page for a given month (function
+ - =blog_rss.html=: Exports the rss feed (function =ob-write-index=).
+ - =blog_index_month.html= Export index page for a given month (function
    =ob-write-index=).
- - =blog_index_year.html= export index page for a given year (function
+ - =blog_index_year.html= Export index page for a given year (function
    =ob-write-index=).
- - =blog_index_catery.html= export index page for a given category (function
+ - =blog_index_catery.html= Export index page for a given category (function
    =ob-write-index=).
 
-*** index templates
+*** Index-page templates
 
-=index_= prefixed templates. They are used my all =blog_index_*.html=
+=index_= prefixed templates. They are used by all =blog_index_*.html=
 templates to generate a list of articles matching given category, year and
-month and the whole archives.
+month, and the entire archives.
 
  - =index_archives.html=
  - =index_category.html=
 
 *** Navigation templates
 
-=nav_= prefixed templates used to generate navigation snippets:
+=nav_= prefixed templates are used to generate navigation snippets:
 
- - =nav_links.html=: used to generate navigation menu used in both page
-   header and footer.
- - =nav_tag-cloud.html=: used to generate tag cloud on page bottom.
+ - =nav_links.html=: Used to generate navigation menu used in both the
+   page header and footer.
+ - =nav_tag-cloud.html=: Used to generate tag cloud on page bottom.
 
 *** Page templates
 
-=page_= prefixed templates used for both html header and footer.
+=page_= prefixed templates used for both HTML header and footer.
 
 
 ** Structures
 
 Structure used to define a blog:
 
- - =file=: the blog source file (read-only).
- - =buffer=: buffer visiting the blog file (read-only).
- - =publish-dir=: where to publish the blog defined by the =#+PUBLISH_DIR:=
+ - =file=: The blog source file (read-only).
+ - =buffer=: Buffer visiting the blog file (read-only).
+ - =publish-dir=: Where to publish the blog, defined by the =#+PUBLISH_DIR:=
    header directive or =out= in the same directory as the blog source file.
- - =template-dir=: location of the template directory defined by the
+ - =template-dir=: Location of the template directory defined by the
    =#+TEMPLATE_DIR:= header directive or the =templates= directory of the
    =o-blog= library.
- - =style-dir=: path of the /css/ files defined by the =#STYLE_DIR:= header
+ - =style-dir=: Path of the /css/ files defined by the =#STYLE_DIR:= header
    directive or =style=. This directory is relative to =template-dir=.
- - =posts-filter=: default filter for post defined by the =#POSTS_FILTER:=
+ - =posts-filter=: Default filter for posts defined by the =#POSTS_FILTER:=
    header directive or =+TODO={DONE}=.
- - =static-filter=: default filter for static pages defined by the
+ - =static-filter=: Default filter for static pages defined by the
    =#STATIC_FILTER:= header directive or =+PAGES={.*}=.
- - =snippet-filter=  default filter for snippets defined by the
+ - =snippet-filter=  Default filter for snippets defined by the
    =#SNIPPET_FILTER:= header directive or =+SNIPPET={.*}=.
  - =title=: Blog title defined by the =#+TITLE:= header directive.
- - =description=: blog description defined by the =#+DESCRIPTION:= header
+ - =description=: Blog description defined by the =#+DESCRIPTION:= header
    directive.
  - =url=: Blog base URL defined by the =#+URL:= header.
- - =default-category=: default category for posts  defined by the
+ - =default-category=: Default category for posts defined by the
    =#DEFAULT_CATEGORY:= header or =Blog=.
- - =disqus=: [[http://docs.disqus.com/developers/universal/][disqus]] account (called a forum on [[http://disqus.com][Disqus]]) this system
-   belongs to. Defined by the =#+DISQUS:= header.
- - =filename-sanitizer=: 1-argument function to be used to sanitize
+ - =disqus=: The [[http://docs.disqus.com/developers/universal/][Disqus]] account (called a forum on [[http://disqus.com][Disqus]]) this o-blog
+   site belongs to. Defined by the =#+DISQUS:= header.
+ - =filename-sanitizer=: A 1-argument function to be used to sanitize
    post filenames. Defined by =#+FILENAME_SANITIZER:= or
    =ob-sanitize-string=.
- - =post-sorter=: a 2-argument function to be used to sort the
+ - =post-sorter=: A 2-argument function to be used to sort the
    posts. Defined by =#+POST_SORTER:= or =ob-sort-posts-by-date=.
 
 Example:
 
 **** Structures: =ob:post=
 
- - =id=: the post numerical id. Posts are sort by reversed chronological
+ - =id=: The post's numerical id. Posts are sort by reversed chronological
    order. The most recent post get the id 0.
- - =title=: the post title read from the entry title.
- - =timestamp=: the post timestamp given by the =CLOSED= property or the
+ - =title=: The post title, read from the entry title.
+ - =timestamp=: The post timestamp given by the =CLOSED= property or the
    current time.
- - =year=: numerical year computed from =timestamp=.
- - =month=: numerical month computed from =timestamp=.
- - =day=: numerical day computed from =timestamp=.
- - =category=: category read from =CATEGORY= property org =blog=.
- - =tags=: list of =ob:tags=.
- - =template=: template to use for current post read from =TEMPLATE=
+ - =year=: Numerical year computed from =timestamp=.
+ - =month=: Numerical month computed from =timestamp=.
+ - =day=: Numerical day computed from =timestamp=.
+ - =category=: Category read from =CATEGORY= property org =blog=.
+ - =tags=: List of =ob:tags=.
+ - =template=: Template to use for current post read from =TEMPLATE=
    property or =blog_post.html=.
- - =filepath=: relative path from the blog root directory to the post
+ - =filepath=: Relative path from the blog root directory to the post
    directory (directory only).
- - =filename=: sanitized filename generated from =title=.
- - =htmlfile=: full relative path to the post html file (file and
+ - =filename=: Sanitized filename generated from =title=.
+ - =htmlfile=: Full relative path to the post html file (file and
    directory).
- - =path-to-root=: relative path from the post html file to the blog root.
- - =content=: raw content of the post (org-mode format).
+ - =path-to-root=: Relative path from the post html file to the blog root.
+ - =content=: Raw content of the post (Org-mode format).
  - =content-html=: HTML export of the post.
 
 Example:
 
 #+begin_src emacs-lisp
-;; get the HTML content of the post defined in variable POST.
+;; Get the HTML content of the post defined in variable POST.
 (ob:post-content-html POST)
 #+end_src
 
 
 Structure used to define a tag:
 
- - =name=: string defying the tag name.
- - =safe=: web safe tag name for URL.
- - =count=: how many time the tag is used.
- - =size=: the font size in percent.
+ - =name=: The string defining the tag name.
+ - =safe=: Web/URL-safe tag name.
+ - =count=: How many times the tag is used across posts.
+ - =size=: The font size in percent.
 
 Example:
 
 
 *** Variables
 
-Following variables are always available when publishing a blog:
+The following variables are always available when publishing a blog:
 
- - =BLOG= (=ob:blog=): information about the blog being published.
- - =POSTS= (list of =ob:post=): list of all posts of the blog or restricted
-   list of posts (depending what is exported).
- - =ALL-POSTS=: A copy of =POSTS= except this *always* contents all the
+ - =BLOG= (=ob:blog=): Information about the blog being published.
+ - =POSTS= (list of =ob:post=): List of all posts of the blog or restricted
+   list of posts (depending on what is exported).
+ - =ALL-POSTS=: A copy of =POSTS= except this *always* contains all the
    posts from the blog.
- - =STATIC= (list of =ob:post=): list of static pages.
- - =SNIPPETS= (list of =ob:post=): list of snippets pages.
- - =TAGS= (list of =ob:tags=): list of all tags.
+ - =STATIC= (list of =ob:post=): List of static pages.
+ - =SNIPPETS= (list of =ob:post=): List of snippets pages.
+ - =TAGS= (list of =ob:tags=): List of all tags.
 
 Some variables may be defined in some functions:
 
- - =POST= (=ob:post=): post (or static page) being currently published.
- - =TAG= (=ob:tags=): tag being currently published.
- - =CATEGORY= (=string=): the category being published.
- - =YEAR=, =MONTH (=integer=): the year and month being published.
- - =PATH-TO-ROOT= (=string=): (intern use only, use =ob:path-to-root=
-   instead) path to blog root used by =ob:path-to-root=.
+ - =POST= (=ob:post=): The post (or static page) being currently published.
+ - =TAG= (=ob:tags=): The tag being currently published.
+ - =CATEGORY= (=string=): The category being published.
+ - =YEAR=, =MONTH (=integer=): The year and month being published.
+ - =PATH-TO-ROOT= (=string=): (internal use only, use =ob:path-to-root=
+   instead) Path to blog root used by =ob:path-to-root=.
 
 ** Functions
   :PROPERTIES:
   :PAGE:     functions.html
   :END:
 
-Basically any lisp function could be used withing a blog template as long as
-they are known when exporting. Meanwhile some of them are specifically made
-to be used withing templates. These functions are prefixed by =ob:=.
+Basically any elisp function could be used within an o-blog template,
+as long as they are known when exporting. Meanwhile some functions are
+specifically made to be used within templates. These functions are
+prefixed by =ob:=.
 
 Descriptions are taken from function docstrings.
 
 =PREDICATE=. Limit to =COUNT= results if defined and sorted using
 =SORTFUNC=.
 
-=PREDICATE= is a function run for each post with the post itself as
-argument. If =PREDICATE= is nil, no filter would be done on posts.
+=PREDICATE= is a function that runs for each post, with the post
+itself as argument. If =PREDICATE= is nil, no filtering will be done
+on posts.
 
-=SORTFUNC= is used a =sort= =PREDICATE=.
+=SORTFUNC= uses a =sort= =PREDICATE=.
 
 If =COLLECT= is defined, only returns the =COLLECT= field of a
 =ob:post= structure.
 
 Examples:
 
-Getting last 10 posts:
+Getting the last 10 posts:
 
 #+begin_src emacs-lisp
    (ob:get-posts nil 10)
 #+end_src
 
 
-Getting post from January 2012:
+Getting posts from January 2012:
 
 #+begin_src emacs-lisp
    (ob:get-posts
 
 *** Function: =(ob:get-post-by-id ID)=
 
-Return post which id is =ID=.
+Return post whose id is =ID=.
 
 **** Template usages
 
-Posts navigation:
+Posts navigation, setting up links to previous and next post:
 
 #+begin_src html
   <nav class="articles-nav">
 
 Get =HEADER= from blog buffer as defined in =BLOG= global context variable.
 
-Returns only fist match except if =ALL= is defined.
+Returns only the first match, unless =ALL= is defined.
 
 **** Template usages
 
-Get the last updated header for rss export:
+Get the last updated header for RSS export:
 
 #+begin_src html
   <updated><lisp>(ob:format-date (ob:get-header "DATE"))</lisp></updated>
 
 Format =DATE= using =FORMAT= and =LOCALE=.
 
-=DATE= can heither be string suitable for =parse-time-string= or a list of
-interger using =current-time= format.
+=DATE= can either be a string suitable for =parse-time-string= or a list of
+integers using =current-time= format.
 
 =FORMAT= is a =format-time-string= compatible definition. If not
-set ISO8601 =%Y-%m-%dT%TZ= format would be used.
+set, ISO8601 =%Y-%m-%dT%TZ= format will be used.
 
 **** Template usages
 
-Add a human readable timestamp for a post:
+Add a human-readable timestamp for a post:
 
 #+begin_src html
   Posted on <time datetime="<lisp> (ob:format-date (ob:post-timestamp POST)) </lisp>">
 
 To report a bug please be sure your issue is =o-blog= related.
 
-You can bootstrap a simple clean environment
+You can bootstrap a simple clean environment:
 
 #+begin_src sh
 rm -rf ~/dev/.emacs.d
 
 You can change =x-www-browser= to your favorite browser.
 
-If anything runs fine emacs would exit normally. Otherwise a buffer called
-=o-blog Bug-report= is created and its content is copied to primary X
-selection (if available). This buffer contains useful information for
-debugging your issue. A browser is launch to the [[https://github.com/renard/o-blog/issues/new][o-blog new issue page]]. You
-can either paste content of the =o-blog Bug-report= buffer or the X primary
-selection (middle click).
+If everything runs fine emacs will exit normally. Otherwise a buffer
+called =o-blog Bug-report= is created and its content is copied to
+primary X selection (if available). This buffer contains useful
+information for debugging your issue. A browser window will open to
+the [[https://github.com/renard/o-blog/issues/new][o-blog new issue page]]. Then you can either paste content of the
+=o-blog Bug-report= buffer, or use the X primary selection (middle
+click).
 
-Please describe as much as possible your issue (in English). do no hesitate
-to paste your blog file to https://gist.github.com/ this might be useful to
-debug.
+Please describe as much as possible your issue (in English). Do not hesitate
+to paste your blog file to https://gist.github.com/ as this might be useful in
+debugging.
 
 
 
 #+HTML: <h1>Testimonials</h1>
 
 #+begin_quote
-/“o-blog, great static site generator from emacs org-mode.”/
+/“o-blog, great static site generator from emacs Org-mode.”/
 
 -- Pierre-Yves Ritschard [[https://twitter.com/pyr/status/160466727195521024][@pyr]] ([[http://openbds.org][OpenBSD]] relayd original author)
 
 - [[http://mikio.github.com/index.html][Mikio Kun]]
 - [[http://mimes.is/][Journal of the creative imagination]]
 - [[http://www.djcbsoftware.nl][DJCB Software]]
+- [[http://dimilar.com/de/index.html][Erlang Vision]]
+- [[http://pharos-alexandria.github.com][Pharos (Annette von Stockhausen)]]
 
 #+end_o_blog_hero_unit
 
   :PAGE:     faq.html
   :END:
 
-*** My page looks ugly
+*** Why does my page look ugly/un-styled?
 
-Maybe you are using [[https://www.google.com/chrome/][google-chrome]] and try to view your site locally using a
-=file:///path/to/your/site/out/index.html= scheme. Open the javascript console
-=Ctrl+Shift+I= you should see something like:
+Maybe you are using [[https://www.google.com/chrome/][Google Chrome]] and you're trying to view your site
+locally using a =file:///path/to/your/site/out/index.html= scheme.
+Open the JavaScript console =Ctrl+Shift+I= and you should see
+something like:
 
 #+begin_example
 XMLHttpRequest cannot load file:///path/to/your/site/out/out/style/css/o-blog.less. Cross origin requests are only supported for HTTP.
 less-1.2.1.min.js:8Uncaught Error: NETWORK_ERR: XMLHttpRequest Exception 101
 #+end_example
 
-There is a known Chrome issue with loading local javascript files. This is a
-/security feature/ in Chrome.
-
-You can disable this with the =--allow-file-access-from-files= option to
-chrome or you can use an other browser or setup a local webserver.
+If so, that is a known Chrome issue with loading local javascript
+files, and is actually a /security feature/ in Chrome.
 
-There are many complex solutions for a webserver such as [[http://nginx.org/][nginx]] or [[http://httpd.apache.org/][Apache]] or
-many [[http://en.wikipedia.org/wiki/Comparison_of_web_server_software][others]].
+You can disable this with the =--allow-file-access-from-files= option
+in Chrome, or you can use another browser like Firefox, or setup a
+local webserver.
 
-You may want to prefer a lighter and simpler solution.
-
-With python simply run:
+To use a local webserver, there are many complex solutions such as
+[[http://nginx.org/][nginx]] or [[http://httpd.apache.org/][Apache]] or many [[http://en.wikipedia.org/wiki/Comparison_of_web_server_software][others]]. If you prefer a lighter and simpler
+solution using Python, simply run:
 
 #+begin_src sh
 cd /path/to/your/site && python -m SimpleHTTPServer
 #+end_src
 
-And browse http://localhost:8000
+...and browse http://localhost:8000
 
-Or within emacs you can run [[https://github.com/jrhbailey/emacs-http-server][emacs-http-server]]:
+Or within Emacs you can run the [[https://github.com/jrhbailey/emacs-http-server][emacs-http-server]]:
 
 #+begin_src emacs-lisp
 (require 'httpd)
 (httpd-start)
 #+end_src
 
-and browse http://localhost:8080
+...and browse http://localhost:8080
 
-An other alternative would be the use of [[http://www.emacswiki.org/emacs/Elnode][elnode]] but it seems to be more
+Another alternative would be the use of [[http://www.emacswiki.org/emacs/Elnode][elnode]] but it seems to be more
 complex.
 
+
+*** Why html pages are not minified?
+
+HTML compression very tricky. Things can easily go wrong. Using a
+[[http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/][GZip
+compression]] would be more efficient.
+
+Anyway if you still want to minify your pages, you can have a look to
+[[http://code.google.com/p/htmlcompressor/][htmlcompressor]],
+[[http://developer.yahoo.com/yui/compressor/][yuicompressor]] and
+[[https://developers.google.com/closure/compiler/][Closure compiler]]. You
+can also read Juriy Zaytsev's articles on
+[[http://perfectionkills.com/optimizing-html/][optimizing HTML]] and
+[[http://perfectionkills.com/experimenting-with-html-minifier/][experimenting
+with html minifier]].
+
+So here is the magic! Once your site is generated, you can run the following command:
+
+#+BEGIN_SRC sh
+htmlcompressor --compress-js --compress-css --recursive --mask '*.js;*.html;*.xml;*.css;*.less' -o /path/to/out/ /path/to/out
+#+END_SRC
+
+
 * Tips
 ** DONE Creating a blog					       :usage:o@blog:
   CLOSED: [2012-01-07 Sat 00:13]
 
-A blog consists of org entries. Each entry has a title, some properties and
-some text. Exporting a blog means publishing all entries with a =DONE=
-=TODO=.
+In o-blog, a site is contained in a single Org-mode file specifying
+both pages and a blog; in turn, the blog consists of Org-mode entries,
+specifically, [[http://orgmode.org/manual/TODO-Items.html#TODO-Items][Org-mode TODO items]]. Each entry has a headline/title,
+some properties and some text. Exporting a blog means publishing all
+the entries of an Org-mode file (to their own HTML5 files) that are
+=TODO= items marked =DONE=.
 
-A minimal blog file could be something like:
+A minimal o-blog Org-mode file could look like:
 
 #+begin_src org
 
 ** DONE How to use tags					       :usage:o@blog:
   CLOSED: [2012-01-07 Sat 00:28]
 
-Tags are useful to classify articles. They are stored as [[http://orgmode.org/manual/Tags.html][org-mode tags]] for
-each entries. To add or modify a tag for a post, just use =C-c C-c= and
+Tags are useful to classify o-blog articles/posts (but not for pages).
+They are stored as [[http://orgmode.org/manual/Tags.html][Org-mode tags]] for each entry. To add or modify a
+tag for a post, just use =C-c C-c= when on an Org-mode headline, and
 enter the tag value.
 
 If an article has more than one tag, separate them by a colon (=:=).
 This is a level 6
 
 
-Up to 6 levels of indentation could be used.
+Up to 6 levels of indentation can be used.
 
 *** Praragaphs
 
 
 *** Lists
 
-As taken from org manual:
+As taken from the Org-mode manual:
 
 My favorite scenes are (in this order)
         1. The attack of the Rohirrim
 
 *** Footnotes
 
-The Org homepage[fn:1] now looks a lot better than it used to.
+The Org-mode homepage[fn:1] now looks a lot better than it used to.
 
 [fn:1] The link is: http://orgmode.org
 
 
 You can make words *bold*, /italic/, _underlined_, =code= and ~verbatim~,
 and, if you must, ‘+strike-through+’. Text in the code and verbatim string
-is not processed for Org mode specific syntax; it is exported verbatim.
+is not processed for Org-mode specific syntax; it is exported verbatim.
 
 *** Horizontal rules
 
 
 Lines starting with ‘#’ in column zero are treated as comments and will
 never be exported. If you want an indented line to be treated as a comment,
-start it with ‘#+ ’. Also entire subtrees starting with the word ‘COMMENT’
+start it with ‘#+ ’. Also, entire subtrees starting with the word ‘COMMENT’
 will never be exported. Finally, regions surrounded by ‘#+BEGIN\_COMMENT’
 ... ‘#+END\_COMMENT’ will not be exported.
 
 
 *** tag: <details>
 
-Works only with chrome.
+This tag works only with the Chrome browser.
 
 #+HTML: <details>
 #+HTML: <summary>Lorem ipsum dolor sit amet, consectetuer adipiscing elit</summary>
 The /org template shorcut/ is =<os= =TAB=. Two parameters might be used:
 - The mandatory =/path/to/file= which is the path to the file from which
   content should be read.
-- The optional =mode= which could be determined by if omitted.
+- The optional =mode= parameter, which can be determined if omitted.
 
 Here is an example of the =sample-init.el= file:
 
 ** DONE Adding icons					    :usage:Bootstrap:
    CLOSED: [2012-02-10 Fri 00:19]
 
-Icons from [[http://glyphicons.com/][glyphicons]] are supported support by simply naming the icon using
-italic style:
+Icons from [[http://glyphicons.com/][glyphicons]] are supported, by simply naming the icon using
+italics style forward-slashes:
 
 #+begin_o_blog_row 6
 
 
 
 
-This could also be used for the top /navbar/ using something like:
+Icons can also be used for the top /navbar/ using something like:
 
 #+begin_o_blog_row 6
 
 </div>
 #+end_html
 
-Please note the blank line between menu items. if blanks are omitted, the
+Please note the blank line between menu items. If blanks are omitted, the
 rendered result might be damaged.
 
 #+end_o_blog_row
 ** DONE Using Bootstrap grid				    :usage:Bootstrap:
    CLOSED: [2012-02-10 Fri 01:19]
 
-[[http://twitter.github.com/bootstrap/scaffolding.html][Bootstrap scaffolding]] could be defined using both =#+begin_o_blog_row= and
-=#+end_o_blog_row= directives (or =<og= =TAB= shortcut). A new column could
+[[http://twitter.github.com/bootstrap/scaffolding.html][Bootstrap scaffolding]] can be defined using both =#+begin_o_blog_row= and
+=#+end_o_blog_row= directives (or =<og= =TAB= shortcut). A new column can
 be started using =#+o_blog_row_column= single directive (or =<ogr= =TAB=
 shortcut).
 
    CLOSED: [2012-05-07 Mon 16:38]
 
 [[http://www.google.com/webfonts][Google webfonts]] can be easily used in o-blog in 2 different ways: using
-google API or by providing resources in the =templates/style= directory.
+the Google API, or by providing resources in the =templates/style= directory.
 
 #+begin_o_blog_alert warning Caution
 Using many font styles can slow down your webpage, so only select the font
 styles that you actually need on your webpage.
 #+end_o_blog_alert
 
-Both example are given using the [[http://www.yanone.de/typedesign/kaffeesatz/][Yanone Kaffeesatz]] font.
+Both examples below use the [[http://www.yanone.de/typedesign/kaffeesatz/][Yanone Kaffeesatz]] font.
 
 *** Using Google API
 
 
 *** Providing resources
 
-That is less efficient in terms of network resources but provide a good
+That is less efficient in terms of network resources but provides a good
 alternative for offline publications.
 
 
 @import "font-Yanone-Kaffeesatz.less";
 #+END_SRC
 
-Add declare its use like in the Google API version:
+Finally, declare its use as in the Google API version:
 
 #+BEGIN_SRC css
 h1, h2, h3, h4, h5, h6 {
 #+END_SRC
 
 #+end_o_blog_row
+** DONE Adding an image into a post			       :usage:o@blog:
+   CLOSED: [2012-08-21 Tue 10:43]
+
+
+#+begin_o_blog_row 8
+
+Adding an image to a post is pretty simple since
+[[http://orgmode.org][Org-mode]] offers a special link scheme for
+that. Image source file can be stored anywhere since its path is
+valid. During the export process, the image file is copied into a folder
+related to the post and all links are corrected to point to its new
+location.
+
+
+#+begin_o_blog_row 5
+
+For example, the following piece of code will copy the =emacs-logo.png= from the current
+directory and is is then copied into it into
+=tips/2012/08/21_adding-an-image-into-a-post/emacs-logo.png=.
+
+#+o_blog_row_column 3
+
+
+#+BEGIN_SRC org
+ file:emacs-logo.png
+#+END_SRC
+
+#+end_o_blog_row
+
+
+
+#+o_blog_row_column 4
+[[file:emacs-logo.png]]
+
+#+end_o_blog_row
+
+
+
+The HTML result is something similar to:
+
+#+BEGIN_SRC html
+ <img src="21_adding-an-image-into-a-post/emacs-logo.png"  alt="21_adding-an-image-into-a-post/emacs-logo.png" />
+#+END_SRC
+
+
+
+A best practice is to have all files info a =/files= folder. Then you can
+create a sub-folder for each posts such as:
+ - =/files/post1/file1=
+ - =/files/post1/file2=
+ - =/files/post2/file=
+ - ...

File o-blog-pkg.el

View file
+(define-package 
+  "o-blog"
+  "1.2"
+  "Org-blog exporter")

File o-blog.el

View file
 ;; Author: Sébastien Gross <seb•ɑƬ•chezwam•ɖɵʈ•org>
 ;; Keywords: emacs,
 ;; Created: 2012-01-04
-;; Last changed: 2012-07-03 22:45:15
+;; Last changed: 2012-08-21 11:44:41
 ;; Licence: WTFPL, grab your copy here: http://sam.zoy.org/wtfpl/
 
 ;; This file is NOT part of GNU Emacs.
 (eval-when-compile
   (require 'cl nil t)
   (require 'browse-url nil t))
+(require 'ob-ditaa nil t)
 (require 'htmlize nil t)
 (require 'sgml-mode nil t)
 (require 'html2text nil t)
 
 	    (when (file-exists-p file)
 	      (replace-match
-	       (format "%s%s/%s/%s%s"
-		       prefix
-		       (file-relative-name "." filepath)
-		       (file-name-sans-extension htmlfile)
-		       (file-name-nondirectory file) suffix ))
+	       (if page
+		   (format "%s%s/%s%s"
+			   prefix
+			   (or (file-name-directory htmlfile) ".")
+			   (file-name-nondirectory file) suffix)
 
-	      (add-to-list 'ret file))))
+		 (format "%s%s/%s/%s%s"
+			 prefix
+			 (file-relative-name "." filepath)
+			 (file-name-sans-extension htmlfile)
+			 (file-name-nondirectory file) suffix ))
+
+	       (add-to-list 'ret file)))))
 
 	(when ret
-	  ;; create a redirection page as index.html into files' directory
-	  (with-temp-buffer
-	    (insert
-	     (mapconcat 'identity
-			`(,(format "* Redirect from (%s)" title)
-			  ":PROPERTIES:"
-			  ,(format ":PAGE: %s/index.html" (file-name-sans-extension htmlfile))
-			  ":TEMPLATE: page_redirect.html"
-			  ":END:")
-			"\n"))
-	    (org-mode)
-	    (goto-char (point-min))
-	    (setf STATIC (append STATIC (list (ob-parse-entry)))))
+	  (unless page
+	    ;; create a redirection page as index.html into files' directory
+	    (with-temp-buffer
+	      (insert
+	       (mapconcat 'identity
+			  `(,(format "* Redirect from (%s)" title)
+			    ":PROPERTIES:"
+			    ,(format ":PAGE: %s/index.html" (file-name-sans-extension htmlfile))
+			    ":TEMPLATE: page_redirect.html"
+			    ":END:")
+			  "\n"))
+	      (org-mode)
+	      (goto-char (point-min))
+	      (setf STATIC (append STATIC (list (ob-parse-entry))))))
 
 	  ;; copy all files into their target directory.
 	  (loop for f in ret
-		do (let ((target (format "%s/%s/%s"
-					 (ob:blog-publish-dir BLOG)
-					 ;; file path is nil when exporting static page?
-					 ;;(or filepath ".")
-					 (file-name-sans-extension htmlfile)
-					 (file-name-nondirectory f))))
+		do (let ((target
+			  (if page
+			      (format "%s/%s"
+ 				      (ob:blog-publish-dir BLOG)
+				      (file-name-nondirectory f))
+			    (format "%s/%s/%s"
+				    (ob:blog-publish-dir BLOG)
+				    ;; file path is nil when exporting static page?
+				    ;;(or filepath ".")
+				    (file-name-sans-extension htmlfile)
+				    (file-name-nondirectory f)))))
 		     (mkdir (file-name-directory target) t)
 		     (ob-do-copy f target))))))))
 (add-hook 'o-blog-html-plugins-hook 'o-blog-publish-linked-files)
 	   (filename (or (org-entry-get (point) "CUSTOM_ID")
 			 (ob:sanitize-string title)))
 	   (filepath (funcall (ob:blog-posts-filepath BLOG) category-safe year month))
-	   (htmlfile (funcall (ob:blog-posts-htmlfile BLOG) filepath day filename))
-
-	   (content (ob-get-entry-text)))
+	   (htmlfile (funcall (ob:blog-posts-htmlfile BLOG) filepath day filename)))
 
       (when page
 	(setq htmlfile page
 	      filename (file-name-sans-extension (file-name-nondirectory htmlfile))
 	      filepath (file-name-directory htmlfile)))
 
-      (make-ob:post :title title
-		    :tags tags
-		    :timestamp timestamp
-		    :year year
-		    :month month
-		    :day day
-		    :filename filename
-		    :filepath filepath
-		    :path-to-root (file-relative-name "." filepath)
-		    :htmlfile htmlfile
-		    :template (or (org-entry-get (point) "TEMPLATE")
-				  (if page "blog_static.html" "blog_post.html"))
-		    :content content
-		    :content-html (ob-export-string-to-html content)
-		    :category (make-ob:category
-			       :name category
-			       :safe category-safe)
-                    :sitemap (or (org-entry-get (point) "SITEMAP"))
-		    ))))
+      (let ((content (ob-get-entry-text)))
+	(make-ob:post :title title
+		      :tags tags
+		      :timestamp timestamp
+		      :year year
+		      :month month
+		      :day day
+		      :filename filename
+		      :filepath filepath
+		      :path-to-root (file-relative-name "." filepath)
+		      :htmlfile htmlfile
+		      :template (or (org-entry-get (point) "TEMPLATE")
+				    (if page "blog_static.html" "blog_post.html"))
+		      :content content
+		      :content-html (ob-export-string-to-html content)
+		      :category (make-ob:category
+				 :name category
+				 :safe category-safe)
+		      :sitemap (or (org-entry-get (point) "SITEMAP"))
+		      )))))
 
 
 
   (with-temp-buffer
     (insert string)
     (org-mode)
-    (substring-no-properties (org-export-as-html nil nil nil 'string t))))
+    (goto-char (point-min))
+    ;; exporting block with ditaa is kinda messy since it requires a real
+    ;; file (does not work with a temp-buffer which is not associated to any
+    ;; file).
+    (let ((saved-file
+	   (when
+	       (re-search-forward "^#\\+BEGIN_SRC:?[ \t]+\\(ditaa\\)" nil t)
+	     (format "/%s/%s/%s.src.org"
+		     default-directory
+		     (ob:blog-publish-dir BLOG)
+		     ;; variable inherited from `ob-parse-entry'
+		     htmlfile)))
+	  (org-confirm-babel-evaluate nil)
+	  ret)
+      (when saved-file
+	(ob-write-file saved-file))
+      (setq ret (substring-no-properties (org-export-as-html nil nil nil 'string t)))
+      (when saved-file
+	(delete-file saved-file))
+      ret)))
 
 
 (defun ob-compute-tags (posts &optional min_r max_r)
 (defun ob-write-file (file)
   "Write current buffer to FILE and create full path if necessary."
   (mkdir (file-name-directory file) t)
-  (write-file file))
+  (let ((coding-system-for-write
+	 (with-current-buffer
+	     (ob:blog-buffer BLOG)
+	   buffer-file-coding-system)))
+    (write-file file)))
 
 (defun ob-write-index()
   "Publish all indexes (default, categories, year, month)"

File templates/blog_post.html

View file
   </div>
   
   <footer class="well article-footer">
-    <lisp>(ob:gettext :posted-on)</lisp> <time datetime=\"<lisp> (ob:format-date (ob:post-timestamp POST)) </lisp>\"> <lisp> (ob:format-date (ob:post-timestamp POST) (ob:gettext :post-timestamp))</lisp></time>.
+    <lisp>(ob:gettext :posted-on)</lisp> <time datetime="<lisp> (ob:format-date (ob:post-timestamp POST)) </lisp>"> <lisp> (ob:format-date (ob:post-timestamp POST) (ob:gettext :post-timestamp))</lisp></time>.
     <nav class="tag-cloud">
       <h1><i class="icon-tags"></i> <lisp>(ob:gettext :related-tags)</lisp></h1>
       <ul>

File templates/debug.html

View file
   display: block;
   }
 
-  #toc a[title=H1] { font-size: 14pt; margin-left: 10px;}
-  #toc a[title=H2] { font-size: 13pt; margin-left: 20px;}
-  #toc a[title=H3] { font-size: 12pt; margin-left: 30px;}
-  #toc a[title=H4] { font-size: 11pt; margin-left: 40px;}
-  #toc a[title=H5] { font-size: 10pt; margin-left: 50px;}
-  #toc a[title=H6] { font-size: 9pt; margin-left: 60px;}
+  #toc a[title=H1] { font-size: 9pt; margin-left: 10px;}
+  #toc a[title=H2] { font-size: 8pt; margin-left: 20px;}
+  #toc a[title=H3] { font-size: 7pt; margin-left: 30px;}
+  #toc a[title=H4] { font-size: 6pt; margin-left: 40px;}
+  #toc a[title=H5] { font-size: 5pt; margin-left: 50px;}
+  #toc a[title=H6] { font-size: 4pt; margin-left: 60px;}
   
 </style>
 

File templates/page_header.html

View file
   <head>
     <meta charset="utf-8"/>
     <title><lisp>(if (boundp 'POST) (ob:post-title POST) (ob:blog-title BLOG))</lisp></title>
-    <link rel="stylesheet" type="text/less" href="<lisp>(ob:path-to-root)</lisp>/style/less/o-blog.less">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <meta name="generator" content="<lisp>(o-blog-version)</lisp>">
+    <link rel="stylesheet" type="text/less" href="<lisp>(ob:path-to-root)</lisp>/style/less/o-blog.less"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+    <meta name="generator" content="<lisp>(o-blog-version)</lisp>"/>
     <script src="<lisp>(ob:path-to-root)</lisp>/style/js/less-1.3.0.min.js" type="text/javascript"></script>
     <script src="<lisp>(ob:path-to-root)</lisp>/style/js/jquery-1.7.1.min.js" type="text/javascript"></script>
     <script src="<lisp>(ob:path-to-root)</lisp>/style/bootstrap/js/bootstrap-modal.js" type="text/javascript"></script>

File templates/style/Font-Awesome/font/fontawesome-webfont.eot

Binary file modified.

File templates/style/Font-Awesome/font/fontawesome-webfont.svg

View file
Old
Old image
New
New image

File templates/style/Font-Awesome/font/fontawesome-webfont.ttf

Binary file modified.

File templates/style/Font-Awesome/font/fontawesome-webfont.woff

Binary file modified.

File templates/style/Font-Awesome/less/font-awesome-ie7.less

View file
+[class^="icon-"],
+[class*=" icon-"] {
+	font-family: FontAwesome;
+	font-style: normal;
+	font-weight: normal;
+}
+
+.btn.dropdown-toggle [class^="icon-"], .btn.dropdown-toggle [class*=" icon-"] {
+/* keeps button heights with and without icons the same */
+	line-height: 1.4em;
+}
+
+.icon-large {
+	font-size: 1.3333em;
+}
+
+.ie7icon(@inner) {
+	*zoom: ~"expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '@{inner}&nbsp;')";
+}
+
+.icon-glass                { .ie7icon('&#xf000;'); }
+.icon-music                { .ie7icon('&#xf001;'); }
+.icon-search               { .ie7icon('&#xf002;'); }
+.icon-envelope             { .ie7icon('&#xf003;'); }
+.icon-heart                { .ie7icon('&#xf004;'); }
+.icon-star                 { .ie7icon('&#xf005;'); }
+.icon-star-empty           { .ie7icon('&#xf006;'); }
+.icon-user                 { .ie7icon('&#xf007;'); }
+.icon-film                 { .ie7icon('&#xf008;'); }
+.icon-th-large             { .ie7icon('&#xf009;'); }
+.icon-th                   { .ie7icon('&#xf00a;'); }
+.icon-th-list              { .ie7icon('&#xf00b;'); }
+.icon-ok                   { .ie7icon('&#xf00c;'); }
+.icon-remove               { .ie7icon('&#xf00d;'); }
+.icon-zoom-in              { .ie7icon('&#xf00e;'); }
+
+.icon-zoom-out             { .ie7icon('&#xf010;'); }
+.icon-off                  { .ie7icon('&#xf011;'); }
+.icon-signal               { .ie7icon('&#xf012;'); }
+.icon-cog                  { .ie7icon('&#xf013;'); }
+.icon-trash                { .ie7icon('&#xf014;'); }
+.icon-home                 { .ie7icon('&#xf015;'); }
+.icon-file                 { .ie7icon('&#xf016;'); }
+.icon-time                 { .ie7icon('&#xf017;'); }
+.icon-road                 { .ie7icon('&#xf018;'); }
+.icon-download-alt         { .ie7icon('&#xf019;'); }
+.icon-download             { .ie7icon('&#xf01a;'); }
+.icon-upload               { .ie7icon('&#xf01b;'); }
+.icon-inbox                { .ie7icon('&#xf01c;'); }
+.icon-play-circle          { .ie7icon('&#xf01d;'); }
+.icon-repeat               { .ie7icon('&#xf01e;'); }
+
+.icon-refresh              { .ie7icon('&#xf021;'); }
+.icon-list-alt             { .ie7icon('&#xf022;'); }
+.icon-lock                 { .ie7icon('&#xf023;'); }
+.icon-flag                 { .ie7icon('&#xf024;'); }
+.icon-headphones           { .ie7icon('&#xf025;'); }
+.icon-volume-off           { .ie7icon('&#xf026;'); }
+.icon-volume-down          { .ie7icon('&#xf027;'); }
+.icon-volume-up            { .ie7icon('&#xf028;'); }
+.icon-qrcode               { .ie7icon('&#xf029;'); }
+.icon-barcode              { .ie7icon('&#xf02a;'); }
+.icon-tag                  { .ie7icon('&#xf02b;'); }
+.icon-tags                 { .ie7icon('&#xf02c;'); }
+.icon-book                 { .ie7icon('&#xf02d;'); }
+.icon-bookmark             { .ie7icon('&#xf02e;'); }
+.icon-print                { .ie7icon('&#xf02f;'); }
+
+.icon-camera               { .ie7icon('&#xf030;'); }
+.icon-font                 { .ie7icon('&#xf031;'); }
+.icon-bold                 { .ie7icon('&#xf032;'); }
+.icon-italic               { .ie7icon('&#xf033;'); }
+.icon-text-height          { .ie7icon('&#xf034;'); }
+.icon-text-width           { .ie7icon('&#xf035;'); }
+.icon-align-left           { .ie7icon('&#xf036;'); }
+.icon-align-center         { .ie7icon('&#xf037;'); }
+.icon-align-right          { .ie7icon('&#xf038;'); }
+.icon-align-justify        { .ie7icon('&#xf039;'); }
+.icon-list                 { .ie7icon('&#xf03a;'); }
+.icon-indent-left          { .ie7icon('&#xf03b;'); }
+.icon-indent-right         { .ie7icon('&#xf03c;'); }
+.icon-facetime-video       { .ie7icon('&#xf03d;'); }
+.icon-picture              { .ie7icon('&#xf03e;'); }
+
+.icon-pencil               { .ie7icon('&#xf040;'); }
+.icon-map-marker           { .ie7icon('&#xf041;'); }
+.icon-adjust               { .ie7icon('&#xf042;'); }
+.icon-tint                 { .ie7icon('&#xf043;'); }
+.icon-edit                 { .ie7icon('&#xf044;'); }
+.icon-share                { .ie7icon('&#xf045;'); }
+.icon-check                { .ie7icon('&#xf046;'); }
+.icon-move                 { .ie7icon('&#xf047;'); }
+.icon-step-backward        { .ie7icon('&#xf048;'); }
+.icon-fast-backward        { .ie7icon('&#xf049;'); }
+.icon-backward             { .ie7icon('&#xf04a;'); }
+.icon-play                 { .ie7icon('&#xf04b;'); }
+.icon-pause                { .ie7icon('&#xf04c;'); }
+.icon-stop                 { .ie7icon('&#xf04d;'); }
+.icon-forward              { .ie7icon('&#xf04e;'); }
+
+.icon-fast-forward         { .ie7icon('&#xf050;'); }
+.icon-step-forward         { .ie7icon('&#xf051;'); }
+.icon-eject                { .ie7icon('&#xf052;'); }
+.icon-chevron-left         { .ie7icon('&#xf053;'); }
+.icon-chevron-right        { .ie7icon('&#xf054;'); }
+.icon-plus-sign            { .ie7icon('&#xf055;'); }
+.icon-minus-sign           { .ie7icon('&#xf056;'); }
+.icon-remove-sign          { .ie7icon('&#xf057;'); }
+.icon-ok-sign              { .ie7icon('&#xf058;'); }
+.icon-question-sign        { .ie7icon('&#xf059;'); }
+.icon-info-sign            { .ie7icon('&#xf05a;'); }
+.icon-screenshot           { .ie7icon('&#xf05b;'); }
+.icon-remove-circle        { .ie7icon('&#xf05c;'); }
+.icon-ok-circle            { .ie7icon('&#xf05d;'); }
+.icon-ban-circle           { .ie7icon('&#xf05e;'); }
+
+.icon-arrow-left           { .ie7icon('&#xf060;'); }
+.icon-arrow-right          { .ie7icon('&#xf061;'); }
+.icon-arrow-up             { .ie7icon('&#xf062;'); }
+.icon-arrow-down           { .ie7icon('&#xf063;'); }
+.icon-share-alt            { .ie7icon('&#xf064;'); }
+.icon-resize-full          { .ie7icon('&#xf065;'); }
+.icon-resize-small         { .ie7icon('&#xf066;'); }
+.icon-plus                 { .ie7icon('&#xf067;'); }
+.icon-minus                { .ie7icon('&#xf068;'); }
+.icon-asterisk             { .ie7icon('&#xf069;'); }
+.icon-exclamation-sign     { .ie7icon('&#xf06a;'); }
+.icon-gift                 { .ie7icon('&#xf06b;'); }
+.icon-leaf                 { .ie7icon('&#xf06c;'); }
+.icon-fire                 { .ie7icon('&#xf06d;'); }
+.icon-eye-open             { .ie7icon('&#xf06e;'); }
+
+.icon-eye-close            { .ie7icon('&#xf070;'); }
+.icon-warning-sign         { .ie7icon('&#xf071;'); }
+.icon-plane                { .ie7icon('&#xf072;'); }
+.icon-calendar             { .ie7icon('&#xf073;'); }
+.icon-random               { .ie7icon('&#xf074;'); }
+.icon-comment              { .ie7icon('&#xf075;'); }
+.icon-magnet               { .ie7icon('&#xf076;'); }
+.icon-chevron-up           { .ie7icon('&#xf077;'); }
+.icon-chevron-down         { .ie7icon('&#xf078;'); }
+.icon-retweet              { .ie7icon('&#xf079;'); }
+.icon-shopping-cart        { .ie7icon('&#xf07a;'); }
+.icon-folder-close         { .ie7icon('&#xf07b;'); }
+.icon-folder-open          { .ie7icon('&#xf07c;'); }
+.icon-resize-vertical      { .ie7icon('&#xf07d;'); }
+.icon-resize-horizontal    { .ie7icon('&#xf07e;'); }
+
+.icon-bar-chart            { .ie7icon('&#xf080;'); }
+.icon-twitter-sign         { .ie7icon('&#xf081;'); }
+.icon-facebook-sign        { .ie7icon('&#xf082;'); }
+.icon-camera-retro         { .ie7icon('&#xf083;'); }
+.icon-key                  { .ie7icon('&#xf084;'); }
+.icon-cogs                 { .ie7icon('&#xf085;'); }
+.icon-comments             { .ie7icon('&#xf086;'); }
+.icon-thumbs-up            { .ie7icon('&#xf087;'); }
+.icon-thumbs-down          { .ie7icon('&#xf088;'); }
+.icon-star-half            { .ie7icon('&#xf089;'); }
+.icon-heart-empty          { .ie7icon('&#xf08a;'); }
+.icon-signout              { .ie7icon('&#xf08b;'); }
+.icon-linkedin-sign        { .ie7icon('&#xf08c;'); }
+.icon-pushpin              { .ie7icon('&#xf08d;'); }
+.icon-external-link        { .ie7icon('&#xf08e;'); }
+
+.icon-signin               { .ie7icon('&#xf090;'); }
+.icon-trophy               { .ie7icon('&#xf091;'); }
+.icon-github-sign          { .ie7icon('&#xf092;'); }
+.icon-upload-alt           { .ie7icon('&#xf093;'); }
+.icon-lemon                { .ie7icon('&#xf094;'); }
+.icon-phone                { .ie7icon('&#xf095;'); }
+.icon-check-empty          { .ie7icon('&#xf096;'); }
+.icon-bookmark-empty       { .ie7icon('&#xf097;'); }
+.icon-phone-sign           { .ie7icon('&#xf098;'); }
+.icon-twitter              { .ie7icon('&#xf099;'); }
+.icon-facebook             { .ie7icon('&#xf09a;'); }
+.icon-github               { .ie7icon('&#xf09b;'); }
+.icon-unlock               { .ie7icon('&#xf09c;'); }
+.icon-credit-card          { .ie7icon('&#xf09d;'); }
+.icon-rss                  { .ie7icon('&#xf09e;'); }
+
+.icon-hdd                  { .ie7icon('&#xf0a0;'); }
+.icon-bullhorn             { .ie7icon('&#xf0a1;'); }
+.icon-bell                 { .ie7icon('&#xf0a2;'); }
+.icon-certificate          { .ie7icon('&#xf0a3;'); }
+.icon-hand-right           { .ie7icon('&#xf0a4;'); }
+.icon-hand-left            { .ie7icon('&#xf0a5;'); }
+.icon-hand-up              { .ie7icon('&#xf0a6;'); }
+.icon-hand-down            { .ie7icon('&#xf0a7;'); }
+.icon-circle-arrow-left    { .ie7icon('&#xf0a8;'); }
+.icon-circle-arrow-right   { .ie7icon('&#xf0a9;'); }
+.icon-circle-arrow-up      { .ie7icon('&#xf0aa;'); }
+.icon-circle-arrow-down    { .ie7icon('&#xf0ab;'); }
+.icon-globe                { .ie7icon('&#xf0ac;'); }
+.icon-wrench               { .ie7icon('&#xf0ad;'); }
+.icon-tasks                { .ie7icon('&#xf0ae;'); }
+
+.icon-filter               { .ie7icon('&#xf0b0;'); }
+.icon-briefcase            { .ie7icon('&#xf0b1;'); }
+.icon-fullscreen           { .ie7icon('&#xf0b2;'); }
+
+.icon-group                { .ie7icon('&#xf0c0;'); }
+.icon-link                 { .ie7icon('&#xf0c1;'); }
+.icon-cloud                { .ie7icon('&#xf0c2;'); }
+.icon-beaker               { .ie7icon('&#xf0c3;'); }
+.icon-cut                  { .ie7icon('&#xf0c4;'); }
+.icon-copy                 { .ie7icon('&#xf0c5;'); }
+.icon-paper-clip           { .ie7icon('&#xf0c6;'); }
+.icon-save                 { .ie7icon('&#xf0c7;'); }
+.icon-sign-blank           { .ie7icon('&#xf0c8;'); }
+.icon-reorder              { .ie7icon('&#xf0c9;'); }
+.icon-list-ul              { .ie7icon('&#xf0ca;'); }
+.icon-list-ol              { .ie7icon('&#xf0cb;'); }
+.icon-strikethrough        { .ie7icon('&#xf0cc;'); }
+.icon-underline            { .ie7icon('&#xf0cd;'); }
+.icon-table                { .ie7icon('&#xf0ce;'); }
+
+.icon-magic                { .ie7icon('&#xf0d0;'); }
+.icon-truck                { .ie7icon('&#xf0d1;'); }
+.icon-pinterest            { .ie7icon('&#xf0d2;'); }
+.icon-pinterest-sign       { .ie7icon('&#xf0d3;'); }
+.icon-google-plus-sign     { .ie7icon('&#xf0d4;'); }
+.icon-google-plus          { .ie7icon('&#xf0d5;'); }
+.icon-money                { .ie7icon('&#xf0d6;'); }
+.icon-caret-down           { .ie7icon('&#xf0d7;'); }
+.icon-caret-up             { .ie7icon('&#xf0d8;'); }
+.icon-caret-left           { .ie7icon('&#xf0d9;'); }
+.icon-caret-right          { .ie7icon('&#xf0da;'); }
+.icon-columns              { .ie7icon('&#xf0db;'); }
+.icon-sort                 { .ie7icon('&#xf0dc;'); }
+.icon-sort-down            { .ie7icon('&#xf0dd;'); }
+.icon-sort-up              { .ie7icon('&#xf0de;'); }
+
+.icon-envelope-alt         { .ie7icon('&#xf0e0;'); }
+.icon-linkedin             { .ie7icon('&#xf0e1;'); }
+.icon-undo                 { .ie7icon('&#xf0e2;'); }
+.icon-legal                { .ie7icon('&#xf0e3;'); }
+.icon-dashboard            { .ie7icon('&#xf0e4;'); }
+.icon-comment-alt          { .ie7icon('&#xf0e5;'); }
+.icon-comments-alt         { .ie7icon('&#xf0e6;'); }
+.icon-bolt                 { .ie7icon('&#xf0e7;'); }
+.icon-sitemap              { .ie7icon('&#xf0e8;'); }
+.icon-umbrella             { .ie7icon('&#xf0e9;'); }
+.icon-paste                { .ie7icon('&#xf0ea;'); }
+
+.icon-user-md              { .ie7icon('&#xf200;'); }

File templates/style/Font-Awesome/less/font-awesome.less

View file
     -------------------------------------------------------
     Email: dave@davegandy.com
     Twitter: http://twitter.com/fortaweso_me
-    Work: http://lemonwi.se co-founder
+    Work: Lead Product Designer @ http://kyruus.com
 
     */
 
-@font-face {
-    font-family: 'FontAwesome';
-    src: url('../font/fontawesome-webfont.eot');
-    src: url('../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),
-         url('../font/fontawesome-webfont.woff') format('woff'),
-         url('../font/fontawesome-webfont.ttf') format('truetype'),
-         url('../font/fontawesome-webfont.svgz#FontAwesomeRegular') format('svg'),
-         url('../font/fontawesome-webfont.svg#FontAwesomeRegular') format('svg');
-    font-weight: normal;
-    font-style: normal;
-}
+@fontAwesomePath: '../font';
 
-/* sprites.less reset */
-[class^="icon-"],
-[class*=" icon-"] {
-    display: inline;
-    width: auto;
-    height: auto;
-    line-height: inherit;
-    vertical-align: baseline;
-    background-image: none;
-    background-position: 0% 0%;
-    background-repeat: repeat;
-}
-li[class^="icon-"],
-li[class*=" icon-"] {
-    display: block;
+@font-face {
+  font-family: 'FontAwesome';
+  src: url('@{fontAwesomePath}/fontawesome-webfont.eot');
+  src: url('@{fontAwesomePath}/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),
+    url('@{fontAwesomePath}/fontawesome-webfont.woff') format('woff'),
+    url('@{fontAwesomePath}/fontawesome-webfont.ttf') format('truetype'),
+    url('@{fontAwesomePath}/fontawesome-webfont.svg#FontAwesome') format('svg');
+  font-weight: normal;
+  font-style: normal;
 }
 
 /*  Font Awesome styles
     ------------------------------------------------------- */
 [class^="icon-"]:before,
 [class*=" icon-"]:before {
-    font-family: FontAwesome;
-    font-weight: normal;
-    font-style: normal;
-    display: inline-block;
-    text-decoration: inherit;
+  font-family: FontAwesome;
+  font-weight: normal;
+  font-style: normal;
+  display: inline-block;
+  text-decoration: inherit;
 }
 
 a [class^="icon-"],
 a [class*=" icon-"] {
-    display: inline-block;
-    text-decoration: inherit;
+  display: inline-block;
+  text-decoration: inherit;
 }
 
 /* makes the font 33% larger relative to the icon container */
 .icon-large:before {
-    vertical-align: top;
-    font-size: 4/3em;
+  vertical-align: middle;
+  font-size: 4/3em;
 }
 
-.btn {
-    [class^="icon-"],
-    [class*=" icon-"] {
-        /* keeps button heights with and without icons the same */
-        line-height: .9em;
-    }
+.btn, .nav-tabs {
+  [class^="icon-"],
+  [class*=" icon-"] {
+  /* keeps button heights with and without icons the same */
+    line-height: .9em;
+  }
 }
 
 li {
-    [class^="icon-"],
-    [class*=" icon-"] {
-        display: inline-block;
-        width: 1.25em;
-        text-align: center;
-    }
-    .icon-large[class^="icon-"],
-    .icon-large[class*=" icon-"]  {
-        /* 1.5 increased font size for icon-large * 1.25 width */
-        width: 1.5*1.25em;
-    }
+  [class^="icon-"],
+  [class*=" icon-"] {
+    display: inline-block;
+    width: 1.25em;
+    text-align: center;
+  }
+  .icon-large:before,
+  .icon-large:before {
+    /* 1.5 increased font size for icon-large * 1.25 width */
+    width: 1.5*1.25em;
+  }
 }
 
-li[class^="icon-"],
-li[class*=" icon-"] {
-    margin-left: 0;
-    list-style-type: none;
+ul.icons {
+  list-style-type: none;
+  margin-left: 2em;
+  text-indent: -.8em;
 
-    &:before {
-        text-indent: -2em;
-        text-align: center;
+  li {
+    [class^="icon-"],
+    [class*=" icon-"] {
+      width: .8em;
     }
-    &.icon-large:before {
-        text-indent: -4/3em;
+    .icon-large:before,
+    .icon-large:before {
+      /* 1.5 increased font size for icon-large * 1.25 width */
+      vertical-align: initial;
+//      width: 1.5*1.25em;
     }
+  }
 }
 
 /*  Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
     readers do not read off random characters that represent icons */
-.icon-glass:before              { content: "\f000"; }
-.icon-music:before              { content: "\f001"; }
-.icon-search:before             { content: "\f002"; }
-.icon-envelope:before           { content: "\f003"; }
-.icon-heart:before              { content: "\f004"; }
-.icon-star:before               { content: "\f005"; }
-.icon-star-empty:before         { content: "\f006"; }
-.icon-user:before               { content: "\f007"; }
-.icon-film:before               { content: "\f008"; }
-.icon-th-large:before           { content: "\f009"; }
-.icon-th:before                 { content: "\f00a"; }
-.icon-th-list:before            { content: "\f00b"; }
-.icon-ok:before                 { content: "\f00c"; }
-.icon-remove:before             { content: "\f00d"; }
-.icon-zoom-in:before            { content: "\f00e"; }
+.icon-glass:before                { content: "\f000"; }
+.icon-music:before                { content: "\f001"; }
+.icon-search:before               { content: "\f002"; }
+.icon-envelope:before             { content: "\f003"; }
+.icon-heart:before                { content: "\f004"; }
+.icon-star:before                 { content: "\f005"; }
+.icon-star-empty:before           { content: "\f006"; }
+.icon-user:before                 { content: "\f007"; }
+.icon-film:before                 { content: "\f008"; }
+.icon-th-large:before             { content: "\f009"; }
+.icon-th:before                   { content: "\f00a"; }
+.icon-th-list:before              { content: "\f00b"; }
+.icon-ok:before                   { content: "\f00c"; }
+.icon-remove:before               { content: "\f00d"; }
+.icon-zoom-in:before              { content: "\f00e"; }
+
+.icon-zoom-out:before             { content: "\f010"; }
+.icon-off:before                  { content: "\f011"; }
+.icon-signal:before               { content: "\f012"; }
+.icon-cog:before                  { content: "\f013"; }
+.icon-trash:before                { content: "\f014"; }
+.icon-home:before                 { content: "\f015"; }
+.icon-file:before                 { content: "\f016"; }
+.icon-time:before                 { content: "\f017"; }
+.icon-road:before                 { content: "\f018"; }
+.icon-download-alt:before         { content: "\f019"; }
+.icon-download:before             { content: "\f01a"; }
+.icon-upload:before               { content: "\f01b"; }
+.icon-inbox:before                { content: "\f01c"; }
+.icon-play-circle:before          { content: "\f01d"; }
+.icon-repeat:before               { content: "\f01e"; }
+
+/* \f020 doesn't work in Safari. all shifted one down */
+.icon-refresh:before              { content: "\f021"; }
+.icon-list-alt:before             { content: "\f022"; }
+.icon-lock:before                 { content: "\f023"; }
+.icon-flag:before                 { content: "\f024"; }
+.icon-headphones:before           { content: "\f025"; }
+.icon-volume-off:before           { content: "\f026"; }
+.icon-volume-down:before          { content: "\f027"; }
+.icon-volume-up:before            { content: "\f028"; }
+.icon-qrcode:before               { content: "\f029"; }
+.icon-barcode:before              { content: "\f02a"; }
+.icon-tag:before                  { content: "\f02b"; }
+.icon-tags:before                 { content: "\f02c"; }
+.icon-book:before                 { content: "\f02d"; }
+.icon-bookmark:before             { content: "\f02e"; }
+.icon-print:before                { content: "\f02f"; }
+
+.icon-camera:before               { content: "\f030"; }
+.icon-font:before                 { content: "\f031"; }
+.icon-bold:before                 { content: "\f032"; }
+.icon-italic:before               { content: "\f033"; }
+.icon-text-height:before          { content: "\f034"; }
+.icon-text-width:before           { content: "\f035"; }
+.icon-align-left:before           { content: "\f036"; }
+.icon-align-center:before         { content: "\f037"; }
+.icon-align-right:before          { content: "\f038"; }
+.icon-align-justify:before        { content: "\f039"; }
+.icon-list:before                 { content: "\f03a"; }
+.icon-indent-left:before          { content: "\f03b"; }
+.icon-indent-right:before         { content: "\f03c"; }
+.icon-facetime-video:before       { content: "\f03d"; }
+.icon-picture:before              { content: "\f03e"; }
+
+.icon-pencil:before               { content: "\f040"; }
+.icon-map-marker:before           { content: "\f041"; }
+.icon-adjust:before               { content: "\f042"; }
+.icon-tint:before                 { content: "\f043"; }
+.icon-edit:before                 { content: "\f044"; }
+.icon-share:before                { content: "\f045"; }
+.icon-check:before                { content: "\f046"; }
+.icon-move:before                 { content: "\f047"; }
+.icon-step-backward:before        { content: "\f048"; }
+.icon-fast-backward:before        { content: "\f049"; }
+.icon-backward:before             { content: "\f04a"; }
+.icon-play:before                 { content: "\f04b"; }
+.icon-pause:before                { content: "\f04c"; }
+.icon-stop:before                 { content: "\f04d"; }
+.icon-forward:before              { content: "\f04e"; }
+
+.icon-fast-forward:before         { content: "\f050"; }
+.icon-step-forward:before         { content: "\f051"; }
+.icon-eject:before                { content: "\f052"; }
+.icon-chevron-left:before         { content: "\f053"; }
+.icon-chevron-right:before        { content: "\f054"; }
+.icon-plus-sign:before            { content: "\f055"; }
+.icon-minus-sign:before           { content: "\f056"; }
+.icon-remove-sign:before          { content: "\f057"; }
+.icon-ok-sign:before              { content: "\f058"; }
+.icon-question-sign:before        { content: "\f059"; }
+.icon-info-sign:before            { content: "\f05a"; }
+.icon-screenshot:before           { content: "\f05b"; }
+.icon-remove-circle:before        { content: "\f05c"; }
+.icon-ok-circle:before            { content: "\f05d"; }
+.icon-ban-circle:before           { content: "\f05e"; }
+
+.icon-arrow-left:before           { content: "\f060"; }
+.icon-arrow-right:before          { content: "\f061"; }
+.icon-arrow-up:before             { content: "\f062"; }
+.icon-arrow-down:before           { content: "\f063"; }
+.icon-share-alt:before            { content: "\f064"; }
+.icon-resize-full:before          { content: "\f065"; }
+.icon-resize-small:before         { content: "\f066"; }
+.icon-plus:before                 { content: "\f067"; }
+.icon-minus:before                { content: "\f068"; }
+.icon-asterisk:before             { content: "\f069"; }
+.icon-exclamation-sign:before     { content: "\f06a"; }
+.icon-gift:before                 { content: "\f06b"; }
+.icon-leaf:before                 { content: "\f06c"; }
+.icon-fire:before                 { content: "\f06d"; }
+.icon-eye-open:before             { content: "\f06e"; }
 
-.icon-zoom-out:before           { content: "\f010"; }
-.icon-off:before                { content: "\f011"; }
-.icon-signal:before             { content: "\f012"; }
-.icon-cog:before                { content: "\f013"; }
-.icon-trash:before              { content: "\f014"; }
-.icon-home:before               { content: "\f015"; }
-.icon-file:before               { content: "\f016"; }
-.icon-time:before               { content: "\f017"; }
-.icon-road:before               { content: "\f018"; }
-.icon-download-alt:before       { content: "\f019"; }
-.icon-download:before           { content: "\f01a"; }
-.icon-upload:before             { content: "\f01b"; }
-.icon-inbox:before              { content: "\f01c"; }
-.icon-play-circle:before        { content: "\f01d"; }
-.icon-repeat:before             { content: "\f01e"; }
+.icon-eye-close:before            { content: "\f070"; }
+.icon-warning-sign:before         { content: "\f071"; }
+.icon-plane:before                { content: "\f072"; }
+.icon-calendar:before             { content: "\f073"; }
+.icon-random:before               { content: "\f074"; }
+.icon-comment:before              { content: "\f075"; }
+.icon-magnet:before               { content: "\f076"; }
+.icon-chevron-up:before           { content: "\f077"; }
+.icon-chevron-down:before         { content: "\f078"; }
+.icon-retweet:before              { content: "\f079"; }
+.icon-shopping-cart:before        { content: "\f07a"; }
+.icon-folder-close:before         { content: "\f07b"; }
+.icon-folder-open:before          { content: "\f07c"; }
+.icon-resize-vertical:before      { content: "\f07d"; }
+.icon-resize-horizontal:before    { content: "\f07e"; }
 
-/* \f020 is not a valid unicode character. all shifted one down */
-.icon-refresh:before            { content: "\f021"; }
-.icon-list-alt:before           { content: "\f022"; }
-.icon-lock:before               { content: "\f023"; }
-.icon-flag:before               { content: "\f024"; }
-.icon-headphones:before         { content: "\f025"; }
-.icon-volume-off:before         { content: "\f026"; }
-.icon-volume-down:before        { content: "\f027"; }
-.icon-volume-up:before          { content: "\f028"; }
-.icon-qrcode:before             { content: "\f029"; }
-.icon-barcode:before            { content: "\f02a"; }
-.icon-tag:before                { content: "\f02b"; }
-.icon-tags:before               { content: "\f02c"; }
-.icon-book:before               { content: "\f02d"; }
-.icon-bookmark:before           { content: "\f02e"; }
-.icon-print:before              { content: "\f02f"; }
+.icon-bar-chart:before            { content: "\f080"; }
+.icon-twitter-sign:before         { content: "\f081"; }
+.icon-facebook-sign:before        { content: "\f082"; }
+.icon-camera-retro:before         { content: "\f083"; }
+.icon-key:before                  { content: "\f084"; }
+.icon-cogs:before                 { content: "\f085"; }
+.icon-comments:before             { content: "\f086"; }
+.icon-thumbs-up:before            { content: "\f087"; }
+.icon-thumbs-down:before          { content: "\f088"; }
+.icon-star-half:before            { content: "\f089"; }
+.icon-heart-empty:before          { content: "\f08a"; }
+.icon-signout:before              { content: "\f08b"; }
+.icon-linkedin-sign:before        { content: "\f08c"; }
+.icon-pushpin:before              { content: "\f08d"; }
+.icon-external-link:before        { content: "\f08e"; }
 
-.icon-camera:before             { content: "\f030"; }
-.icon-font:before               { content: "\f031"; }
-.icon-bold:before               { content: "\f032"; }
-.icon-italic:before             { content: "\f033"; }
-.icon-text-height:before        { content: "\f034"; }
-.icon-text-width:before         { content: "\f035"; }
-.icon-align-left:before         { content: "\f036"; }
-.icon-align-center:before       { content: "\f037"; }
-.icon-align-right:before        { content: "\f038"; }
-.icon-align-justify:before      { content: "\f039"; }
-.icon-list:before               { content: "\f03a"; }
-.icon-indent-left:before        { content: "\f03b"; }
-.icon-indent-right:before       { content: "\f03c"; }
-.icon-facetime-video:before     { content: "\f03d"; }
-.icon-picture:before            { content: "\f03e"; }
+.icon-signin:before               { content: "\f090"; }
+.icon-trophy:before               { content: "\f091"; }
+.icon-github-sign:before          { content: "\f092"; }
+.icon-upload-alt:before           { content: "\f093"; }
+.icon-lemon:before                { content: "\f094"; }
+.icon-phone:before                { content: "\f095"; }
+.icon-check-empty:before          { content: "\f096"; }
+.icon-bookmark-empty:before       { content: "\f097"; }
+.icon-phone-sign:before           { content: "\f098"; }
+.icon-twitter:before              { content: "\f099"; }
+.icon-facebook:before             { content: "\f09a"; }
+.icon-github:before               { content: "\f09b"; }
+.icon-unlock:before               { content: "\f09c"; }
+.icon-credit-card:before          { content: "\f09d"; }
+.icon-rss:before                  { content: "\f09e"; }
 
-.icon-pencil:before             { content: "\f040"; }
-.icon-map-marker:before         { content: "\f041"; }
-.icon-adjust:before             { content: "\f042"; }
-.icon-tint:before               { content: "\f043"; }
-.icon-edit:before               { content: "\f044"; }
-.icon-share:before              { content: "\f045"; }
-.icon-check:before              { content: "\f046"; }
-.icon-move:before               { content: "\f047"; }
-.icon-step-backward:before      { content: "\f048"; }
-.icon-fast-backward:before      { content: "\f049"; }
-.icon-backward:before           { content: "\f04a"; }
-.icon-play:before               { content: "\f04b"; }
-.icon-pause:before              { content: "\f04c"; }
-.icon-stop:before               { content: "\f04d"; }
-.icon-forward:before            { content: "\f04e"; }
+.icon-hdd:before                  { content: "\f0a0"; }
+.icon-bullhorn:before             { content: "\f0a1"; }
+.icon-bell:before                 { content: "\f0a2"; }
+.icon-certificate:before          { content: "\f0a3"; }
+.icon-hand-right:before           { content: "\f0a4"; }
+.icon-hand-left:before            { content: "\f0a5"; }
+.icon-hand-up:before              { content: "\f0a6"; }
+.icon-hand-down:before            { content: "\f0a7"; }
+.icon-circle-arrow-left:before    { content: "\f0a8"; }
+.icon-circle-arrow-right:before   { content: "\f0a9"; }
+.icon-circle-arrow-up:before      { content: "\f0aa"; }
+.icon-circle-arrow-down:before    { content: "\f0ab"; }
+.icon-globe:before                { content: "\f0ac"; }
+.icon-wrench:before               { content: "\f0ad"; }
+.icon-tasks:before                { content: "\f0ae"; }
 
-.icon-fast-forward:before       { content: "\f050"; }
-.icon-step-forward:before       { content: "\f051"; }
-.icon-eject:before              { content: "\f052"; }
-.icon-chevron-left:before       { content: "\f053"; }
-.icon-chevron-right:before      { content: "\f054"; }
-.icon-plus-sign:before          { content: "\f055"; }
-.icon-minus-sign:before         { content: "\f056"; }
-.icon-remove-sign:before        { content: "\f057"; }
-.icon-ok-sign:before            { content: "\f058"; }
-.icon-question-sign:before      { content: "\f059"; }
-.icon-info-sign:before          { content: "\f05a"; }
-.icon-screenshot:before         { content: "\f05b"; }
-.icon-remove-circle:before      { content: "\f05c"; }
-.icon-ok-circle:before          { content: "\f05d"; }
-.icon-ban-circle:before         { content: "\f05e"; }
+.icon-filter:before               { content: "\f0b0"; }
+.icon-briefcase:before            { content: "\f0b1"; }
+.icon-fullscreen:before           { content: "\f0b2"; }
 
-.icon-arrow-left:before         { content: "\f060"; }
-.icon-arrow-right:before        { content: "\f061"; }
-.icon-arrow-up:before           { content: "\f062"; }
-.icon-arrow-down:before         { content: "\f063"; }
-.icon-share-alt:before          { content: "\f064"; }
-.icon-resize-full:before        { content: "\f065"; }
-.icon-resize-small:before       { content: "\f066"; }
-.icon-plus:before               { content: "\f067"; }
-.icon-minus:before              { content: "\f068"; }
-.icon-asterisk:before           { content: "\f069"; }
-.icon-exclamation-sign:before   { content: "\f06a"; }
-.icon-gift:before               { content: "\f06b"; }
-.icon-leaf:before               { content: "\f06c"; }
-.icon-fire:before               { content: "\f06d"; }
-.icon-eye-open:before           { content: "\f06e"; }
+.icon-group:before                { content: "\f0c0"; }
+.icon-link:before                 { content: "\f0c1"; }
+.icon-cloud:before                { content: "\f0c2"; }
+.icon-beaker:before               { content: "\f0c3"; }
+.icon-cut:before                  { content: "\f0c4"; }
+.icon-copy:before                 { content: "\f0c5"; }
+.icon-paper-clip:before           { content: "\f0c6"; }
+.icon-save:before                 { content: "\f0c7"; }
+.icon-sign-blank:before           { content: "\f0c8"; }
+.icon-reorder:before              { content: "\f0c9"; }
+.icon-list-ul:before              { content: "\f0ca"; }
+.icon-list-ol:before              { content: "\f0cb"; }
+.icon-strikethrough:before        { content: "\f0cc"; }
+.icon-underline:before            { content: "\f0cd"; }
+.icon-table:before                { content: "\f0ce"; }
 
-.icon-eye-close:before          { content: "\f070"; }
-.icon-warning-sign:before       { content: "\f071"; }
-.icon-plane:before              { content: "\f072"; }
-.icon-calendar:before           { content: "\f073"; }
-.icon-random:before             { content: "\f074"; }
-.icon-comment:before            { content: "\f075"; }
-.icon-magnet:before             { content: "\f076"; }
-.icon-chevron-up:before         { content: "\f077"; }
-.icon-chevron-down:before       { content: "\f078"; }
-.icon-retweet:before            { content: "\f079"; }
-.icon-shopping-cart:before      { content: "\f07a"; }
-.icon-folder-close:before       { content: "\f07b"; }
-.icon-folder-open:before        { content: "\f07c"; }
-.icon-resize-vertical:before    { content: "\f07d"; }
-.icon-resize-horizontal:before  { content: "\f07e"; }
+.icon-magic:before                { content: "\f0d0"; }
+.icon-truck:before                { content: "\f0d1"; }
+.icon-pinterest:before            { content: "\f0d2"; }
+.icon-pinterest-sign:before       { content: "\f0d3"; }
+.icon-google-plus-sign:before     { content: "\f0d4"; }
+.icon-google-plus:before          { content: "\f0d5"; }
+.icon-money:before                { content: "\f0d6"; }
+.icon-caret-down:before           { content: "\f0d7"; }
+.icon-caret-up:before             { content: "\f0d8"; }
+.icon-caret-left:before           { content: "\f0d9"; }
+.icon-caret-right:before          { content: "\f0da"; }
+.icon-columns:before              { content: "\f0db"; }
+.icon-sort:before                 { content: "\f0dc"; }
+.icon-sort-down:before            { content: "\f0dd"; }
+.icon-sort-up:before              { content: "\f0de"; }
 
-.icon-bar-chart:before          { content: "\f080"; }
-.icon-twitter-sign:before       { content: "\f081"; }
-.icon-facebook-sign:before      { content: "\f082"; }
-.icon-camera-retro:before       { content: "\f083"; }
-.icon-key:before                { content: "\f084"; }
-.icon-cogs:before               { content: "\f085"; }
-.icon-comments:before           { content: "\f086"; }
-.icon-thumbs-up:before          { content: "\f087"; }
-.icon-thumbs-down:before        { content: "\f088"; }
-.icon-star-half:before          { content: "\f089"; }
-.icon-heart-empty:before        { content: "\f08a"; }
-.icon-signout:before            { content: "\f08b"; }
-.icon-linkedin-sign:before      { content: "\f08c"; }
-.icon-pushpin:before            { content: "\f08d"; }
-.icon-external-link:before      { content: "\f08e"; }
+.icon-envelope-alt:before         { content: "\f0e0"; }
+.icon-linkedin:before             { content: "\f0e1"; }
+.icon-undo:before                 { content: "\f0e2"; }
+.icon-legal:before                { content: "\f0e3"; }
+.icon-dashboard:before            { content: "\f0e4"; }
+.icon-comment-alt:before          { content: "\f0e5"; }
+.icon-comments-alt:before         { content: "\f0e6"; }
+.icon-bolt:before                 { content: "\f0e7"; }
+.icon-sitemap:before              { content: "\f0e8"; }
+.icon-umbrella:before             { content: "\f0e9"; }
+.icon-paste:before                { content: "\f0ea"; }
 
-.icon-signin:before             { content: "\f090"; }
-.icon-trophy:before             { content: "\f091"; }
-.icon-github-sign:before        { content: "\f092"; }
-.icon-upload-alt:before         { content: "\f093"; }
-.icon-lemon:before              { content: "\f094"; }
+.icon-user-md:before              { content: "\f200"; }

File templates/style/bootstrap/img/glyphicons-halflings.png

Old
Old image
New
New image

File templates/style/bootstrap/js/.jshintrc

View file
     "laxcomma" : true,
     "laxbreak" : true,
     "browser"  : true,
+    "eqnull"   : true,
     "debug"    : true,
+    "devel"    : true,
     "boss"     : true,
     "expr"     : true,
     "asi"      : true

File templates/style/bootstrap/js/bootstrap-affix.js

View file
+/* ==========================================================
+ * bootstrap-affix.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#affix
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* AFFIX CLASS DEFINITION
+  * ====================== */
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, $.fn.affix.defaults, options)
+    this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
+    this.$element = $(element)
+    this.checkPosition()
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var scrollHeight = $(document).height()
+      , scrollTop = this.$window.scrollTop()
+      , position = this.$element.offset()
+      , offset = this.options.offset