Browse Source

docs moved to another repo

Andrey Konstantinov 5 years ago
parent
commit
9c36ac927f
54 changed files with 0 additions and 16354 deletions
  1. 0 1109
      docs/assets/css/bootstrap-responsive.css
  2. 0 6315
      docs/assets/css/bootstrap.css
  3. 0 1132
      docs/assets/css/docs.css
  4. 0 130
      docs/assets/css/oldstyle.css
  5. BIN
      docs/assets/ico/apple-touch-icon-114-precomposed.png
  6. BIN
      docs/assets/ico/apple-touch-icon-144-precomposed.png
  7. BIN
      docs/assets/ico/apple-touch-icon-57-precomposed.png
  8. BIN
      docs/assets/ico/apple-touch-icon-72-precomposed.png
  9. BIN
      docs/assets/ico/favicon.ico
  10. BIN
      docs/assets/ico/favicon.ico.bak
  11. BIN
      docs/assets/ico/favicon.png
  12. BIN
      docs/assets/ico/favicon.png.bak
  13. BIN
      docs/assets/img/Customer-Analysis-Competitive-Analysis.jpg
  14. BIN
      docs/assets/img/fm_logo.png
  15. BIN
      docs/assets/img/glyphicons-halflings-white.png
  16. BIN
      docs/assets/img/glyphicons-halflings.png
  17. BIN
      docs/assets/img/grid-baseline-20px.png
  18. BIN
      docs/assets/img/logo.png
  19. BIN
      docs/assets/img/logo_project.png
  20. BIN
      docs/assets/img/logo_small.gif
  21. BIN
      docs/assets/img/logo_small.png
  22. BIN
      docs/assets/img/piechart.png
  23. BIN
      docs/assets/img/slide-01.jpg
  24. BIN
      docs/assets/img/slide-02.jpg
  25. BIN
      docs/assets/img/slide-03.jpg
  26. BIN
      docs/assets/img/softpedia_free_award_f.gif
  27. BIN
      docs/assets/img/web_screenshot.png
  28. 0 106
      docs/assets/js/README.md
  29. 0 156
      docs/assets/js/application.js
  30. 0 117
      docs/assets/js/bootstrap-affix.js
  31. 0 99
      docs/assets/js/bootstrap-alert.js
  32. 0 105
      docs/assets/js/bootstrap-button.js
  33. 0 207
      docs/assets/js/bootstrap-carousel.js
  34. 0 167
      docs/assets/js/bootstrap-collapse.js
  35. 0 169
      docs/assets/js/bootstrap-dropdown.js
  36. 0 247
      docs/assets/js/bootstrap-modal.js
  37. 0 114
      docs/assets/js/bootstrap-popover.js
  38. 0 162
      docs/assets/js/bootstrap-scrollspy.js
  39. 0 144
      docs/assets/js/bootstrap-tab.js
  40. 0 361
      docs/assets/js/bootstrap-tooltip.js
  41. 0 60
      docs/assets/js/bootstrap-transition.js
  42. 0 335
      docs/assets/js/bootstrap-typeahead.js
  43. 0 2280
      docs/assets/js/bootstrap.js
  44. 0 6
      docs/assets/js/bootstrap.min.js
  45. 0 30
      docs/assets/js/google-code-prettify/prettify.css
  46. 0 28
      docs/assets/js/google-code-prettify/prettify.js
  47. 0 401
      docs/assets/js/holder/holder.js
  48. 0 8
      docs/assets/js/html5shiv.js
  49. 0 5
      docs/assets/js/jquery.js
  50. 0 893
      docs/extend.html
  51. 0 614
      docs/home.html
  52. 0 35
      docs/index.html
  53. 0 35
      docs/project.html
  54. 0 784
      docs/workflow.html

File diff suppressed because it is too large
+ 0 - 1109
docs/assets/css/bootstrap-responsive.css


File diff suppressed because it is too large
+ 0 - 6315
docs/assets/css/bootstrap.css


File diff suppressed because it is too large
+ 0 - 1132
docs/assets/css/docs.css


+ 0 - 130
docs/assets/css/oldstyle.css

@@ -1,130 +0,0 @@
-/*
-
-    Metrix++, Copyright 2009-2013, Metrix++ Project
-    Link: http://metrixplusplus.sourceforge.net
-    
-    This file is a part of Metrix++ Tool.
-    
-    Metrix++ is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, version 3 of the License.
-    
-    Metrix++ is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-    GNU General Public License for more details.
-    
-    You should have received a copy of the GNU General Public License
-    along with Metrix++.  If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-body{
-	font-family: Arial, sans-serif;
-	color: #333333;
-	line-height: 1.166;
-	margin: 0px;
-	padding: 10px;
-	font-size: 14px;
-}
-
-pre{
-    font-size: 100%;
-    padding-left: 50px;
-    font-family:Courier;
-}
-
-td{
-	background-position: left;
-	background-repeat: no-repeat;
-}
-
-a{
-	color: #AA0033;
-	text-decoration: none;
-}
-
-a:link{
-	color: #AA0033;
-	text-decoration: none;
-}
-
-a:visited{
-	color: #AA0033;
-	text-decoration: none;
-}
-
-a:hover{
-	color: #FF9933;
-	text-decoration: underline;
-}
-
-h1{
- font-family: Verdana,Arial,sans-serif;
- font-size: 130%;
- color: #116633;
- margin: 0px;
- padding: 0px;
-}
-
-h2{
- font-family: Arial,sans-serif;
- font-size: 120%;
- color: #330099;
- margin: 0px;
- padding: 0px;
-}
-
-h3{
- font-family: Arial, sans-serif;
- font-size: 120%;
- color: #AA0033;
- margin: 0px;
- padding: 0px;
-}
-
-h4{
- font-family: Verdana,Arial,sans-serif;
- font-size: 100%;
- color: #334d55;
- margin: 0px;
- padding: 0px;
-}
-
-h5{
- margin: 0px;
- padding: 0px;
- font-family: Verdana,Arial,sans-serif;
- font-size: 100%;
- color: #334d55;
-}
-
-ul{
- list-style-type: disc;
-}
-
-ul ul{
- list-style-type: circle;
-}
-
-ul ul ul{
- list-style-type: disc;
-}
-
-label{
-	font-family: Arial, sans-serif;
-	font-size: 100%;
-	color: #116633;
-}
-
-.highImportance {
-	color: #FF0000
-}
-
-.normalImportance {
-	color: #009900
-}
-
-.lowImportance{
-    color: #999999;
-}

BIN
docs/assets/ico/apple-touch-icon-114-precomposed.png


BIN
docs/assets/ico/apple-touch-icon-144-precomposed.png


BIN
docs/assets/ico/apple-touch-icon-57-precomposed.png


BIN
docs/assets/ico/apple-touch-icon-72-precomposed.png


BIN
docs/assets/ico/favicon.ico


BIN
docs/assets/ico/favicon.ico.bak


BIN
docs/assets/ico/favicon.png


BIN
docs/assets/ico/favicon.png.bak


BIN
docs/assets/img/Customer-Analysis-Competitive-Analysis.jpg


BIN
docs/assets/img/fm_logo.png


BIN
docs/assets/img/glyphicons-halflings-white.png


BIN
docs/assets/img/glyphicons-halflings.png


BIN
docs/assets/img/grid-baseline-20px.png


BIN
docs/assets/img/logo.png


BIN
docs/assets/img/logo_project.png


BIN
docs/assets/img/logo_small.gif


BIN
docs/assets/img/logo_small.png


BIN
docs/assets/img/piechart.png


BIN
docs/assets/img/slide-01.jpg


BIN
docs/assets/img/slide-02.jpg


BIN
docs/assets/img/slide-03.jpg


BIN
docs/assets/img/softpedia_free_award_f.gif


BIN
docs/assets/img/web_screenshot.png


+ 0 - 106
docs/assets/js/README.md

@@ -1,106 +0,0 @@
-## 2.0 BOOTSTRAP JS PHILOSOPHY
-These are the high-level design rules which guide the development of Bootstrap's plugin apis.
-
----
-
-### DATA-ATTRIBUTE API
-
-We believe you should be able to use all plugins provided by Bootstrap purely through the markup API without writing a single line of javascript.
-
-We acknowledge that this isn't always the most performant and sometimes it may be desirable to turn this functionality off altogether. Therefore, as of 2.0 we provide the ability to disable the data attribute API by unbinding all events on the body namespaced with `'data-api'`. This looks like this:
-
-    $('body').off('.data-api')
-
-To target a specific plugin, just include the plugins name as a namespace along with the data-api namespace like this:
-
-    $('body').off('.alert.data-api')
-
----
-
-### PROGRAMMATIC API
-
-We also believe you should be able to use all plugins provided by Bootstrap purely through the JS API.
-
-All public APIs should be single, chainable methods, and return the collection acted upon.
-
-    $(".btn.danger").button("toggle").addClass("fat")
-
-All methods should accept an optional options object, a string which targets a particular method, or null which initiates the default behavior:
-
-    $("#myModal").modal() // initialized with defaults
-    $("#myModal").modal({ keyboard: false }) // initialized with now keyboard
-    $("#myModal").modal('show') // initializes and invokes show immediately afterqwe2
-
----
-
-### OPTIONS
-
-Options should be sparse and add universal value. We should pick the right defaults.
-
-All plugins should have a default object which can be modified to effect all instance's default options. The defaults object should be available via `$.fn.plugin.defaults`.
-
-    $.fn.modal.defaults = { … }
-
-An options definition should take the following form:
-
-    *noun*: *adjective* - describes or modifies a quality of an instance
-
-examples:
-
-    backdrop: true
-    keyboard: false
-    placement: 'top'
-
----
-
-### EVENTS
-
-All events should have an infinitive and past participle form. The infinitive is fired just before an action takes place, the past participle on completion of the action.
-
-    show | shown
-    hide | hidden
-
----
-
-### CONSTRUCTORS
-
-Each plugin should expose it's raw constructor on a `Constructor` property -- accessed in the following way:
-
-
-    $.fn.popover.Constructor
-
----
-
-### DATA ACCESSOR
-
-Each plugin stores a copy of the invoked class on an object. This class instance can be accessed directly through jQuery's data API like this:
-
-    $('[rel=popover]').data('popover') instanceof $.fn.popover.Constructor
-
----
-
-### DATA ATTRIBUTES
-
-Data attributes should take the following form:
-
-- data-{{verb}}={{plugin}} - defines main interaction
-- data-target || href^=# - defined on "control" element (if element controls an element other than self)
-- data-{{noun}} - defines class instance options
-
-examples:
-
-    // control other targets
-    data-toggle="modal" data-target="#foo"
-    data-toggle="collapse" data-target="#foo" data-parent="#bar"
-
-    // defined on element they control
-    data-spy="scroll"
-
-    data-dismiss="modal"
-    data-dismiss="alert"
-
-    data-toggle="dropdown"
-
-    data-toggle="button"
-    data-toggle="buttons-checkbox"
-    data-toggle="buttons-radio"

+ 0 - 156
docs/assets/js/application.js

@@ -1,156 +0,0 @@
-// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT
-// IT'S ALL JUST JUNK FOR OUR DOCS!
-// ++++++++++++++++++++++++++++++++++++++++++
-
-!function ($) {
-
-  $(function(){
-
-    var $window = $(window)
-
-    // Disable certain links in docs
-    $('section [href^=#]').click(function (e) {
-      e.preventDefault()
-    })
-
-    // side bar
-    setTimeout(function () {
-      $('.bs-docs-sidenav').affix({
-        offset: {
-          top: function () { return $window.width() <= 980 ? 290 : 210 }
-        , bottom: 270
-        }
-      })
-    }, 100)
-
-    // make code pretty
-    window.prettyPrint && prettyPrint()
-
-    // add-ons
-    $('.add-on :checkbox').on('click', function () {
-      var $this = $(this)
-        , method = $this.attr('checked') ? 'addClass' : 'removeClass'
-      $(this).parents('.add-on')[method]('active')
-    })
-
-    // add tipsies to grid for scaffolding
-    if ($('#gridSystem').length) {
-      $('#gridSystem').tooltip({
-          selector: '.show-grid > [class*="span"]'
-        , title: function () { return $(this).width() + 'px' }
-      })
-    }
-
-    // tooltip demo
-    $('.tooltip-demo').tooltip({
-      selector: "a[data-toggle=tooltip]"
-    })
-
-    $('.tooltip-test').tooltip()
-    $('.popover-test').popover()
-
-    // popover demo
-    $("a[data-toggle=popover]")
-      .popover()
-      .click(function(e) {
-        e.preventDefault()
-      })
-
-    // button state demo
-    $('#fat-btn')
-      .click(function () {
-        var btn = $(this)
-        btn.button('loading')
-        setTimeout(function () {
-          btn.button('reset')
-        }, 3000)
-      })
-
-    // carousel demo
-    $('#myCarousel').carousel()
-
-    // javascript build logic
-    var inputsComponent = $("#components.download input")
-      , inputsPlugin = $("#plugins.download input")
-      , inputsVariables = $("#variables.download input")
-
-    // toggle all plugin checkboxes
-    $('#components.download .toggle-all').on('click', function (e) {
-      e.preventDefault()
-      inputsComponent.attr('checked', !inputsComponent.is(':checked'))
-    })
-
-    $('#plugins.download .toggle-all').on('click', function (e) {
-      e.preventDefault()
-      inputsPlugin.attr('checked', !inputsPlugin.is(':checked'))
-    })
-
-    $('#variables.download .toggle-all').on('click', function (e) {
-      e.preventDefault()
-      inputsVariables.val('')
-    })
-
-    // request built javascript
-    $('.download-btn .btn').on('click', function () {
-
-      var css = $("#components.download input:checked")
-            .map(function () { return this.value })
-            .toArray()
-        , js = $("#plugins.download input:checked")
-            .map(function () { return this.value })
-            .toArray()
-        , vars = {}
-        , img = ['glyphicons-halflings.png', 'glyphicons-halflings-white.png']
-
-    $("#variables.download input")
-      .each(function () {
-        $(this).val() && (vars[ $(this).prev().text() ] = $(this).val())
-      })
-
-      $.ajax({
-        type: 'POST'
-      , url: /\?dev/.test(window.location) ? 'http://localhost:3000' : 'http://bootstrap.herokuapp.com'
-      , dataType: 'jsonpi'
-      , params: {
-          js: js
-        , css: css
-        , vars: vars
-        , img: img
-      }
-      })
-    })
-  })
-
-// Modified from the original jsonpi https://github.com/benvinegar/jquery-jsonpi
-$.ajaxTransport('jsonpi', function(opts, originalOptions, jqXHR) {
-  var url = opts.url;
-
-  return {
-    send: function(_, completeCallback) {
-      var name = 'jQuery_iframe_' + jQuery.now()
-        , iframe, form
-
-      iframe = $('<iframe>')
-        .attr('name', name)
-        .appendTo('head')
-
-      form = $('<form>')
-        .attr('method', opts.type) // GET or POST
-        .attr('action', url)
-        .attr('target', name)
-
-      $.each(opts.params, function(k, v) {
-
-        $('<input>')
-          .attr('type', 'hidden')
-          .attr('name', k)
-          .attr('value', typeof v == 'string' ? v : JSON.stringify(v))
-          .appendTo(form)
-      })
-
-      form.appendTo('body').submit()
-    }
-  }
-})
-
-}(window.jQuery)

+ 0 - 117
docs/assets/js/bootstrap-affix.js

@@ -1,117 +0,0 @@
-/* ==========================================================
- * bootstrap-affix.js v2.3.2
- * 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))
-      .on('click.affix.data-api',  $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, 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
-      , offsetBottom = offset.bottom
-      , offsetTop = offset.top
-      , reset = 'affix affix-top affix-bottom'
-      , affix
-
-    if (typeof offset != 'object') offsetBottom = offsetTop = offset
-    if (typeof offsetTop == 'function') offsetTop = offset.top()
-    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
-
-    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
-      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
-      'bottom' : offsetTop != null && scrollTop <= offsetTop ?
-      'top'    : false
-
-    if (this.affixed === affix) return
-
-    this.affixed = affix
-    this.unpin = affix == 'bottom' ? position.top - scrollTop : null
-
-    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
-  }
-
-
- /* AFFIX PLUGIN DEFINITION
-  * ======================= */
-
-  var old = $.fn.affix
-
-  $.fn.affix = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('affix')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('affix', (data = new Affix(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.affix.Constructor = Affix
-
-  $.fn.affix.defaults = {
-    offset: 0
-  }
-
-
- /* AFFIX NO CONFLICT
-  * ================= */
-
-  $.fn.affix.noConflict = function () {
-    $.fn.affix = old
-    return this
-  }
-
-
- /* AFFIX DATA-API
-  * ============== */
-
-  $(window).on('load', function () {
-    $('[data-spy="affix"]').each(function () {
-      var $spy = $(this)
-        , data = $spy.data()
-
-      data.offset = data.offset || {}
-
-      data.offsetBottom && (data.offset.bottom = data.offsetBottom)
-      data.offsetTop && (data.offset.top = data.offsetTop)
-
-      $spy.affix(data)
-    })
-  })
-
-
-}(window.jQuery);

+ 0 - 99
docs/assets/js/bootstrap-alert.js

@@ -1,99 +0,0 @@
-/* ==========================================================
- * bootstrap-alert.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#alerts
- * ==========================================================
- * 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 ;_;
-
-
- /* ALERT CLASS DEFINITION
-  * ====================== */
-
-  var dismiss = '[data-dismiss="alert"]'
-    , Alert = function (el) {
-        $(el).on('click', dismiss, this.close)
-      }
-
-  Alert.prototype.close = function (e) {
-    var $this = $(this)
-      , selector = $this.attr('data-target')
-      , $parent
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-    }
-
-    $parent = $(selector)
-
-    e && e.preventDefault()
-
-    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
-
-    $parent.trigger(e = $.Event('close'))
-
-    if (e.isDefaultPrevented()) return
-
-    $parent.removeClass('in')
-
-    function removeElement() {
-      $parent
-        .trigger('closed')
-        .remove()
-    }
-
-    $.support.transition && $parent.hasClass('fade') ?
-      $parent.on($.support.transition.end, removeElement) :
-      removeElement()
-  }
-
-
- /* ALERT PLUGIN DEFINITION
-  * ======================= */
-
-  var old = $.fn.alert
-
-  $.fn.alert = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('alert')
-      if (!data) $this.data('alert', (data = new Alert(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  $.fn.alert.Constructor = Alert
-
-
- /* ALERT NO CONFLICT
-  * ================= */
-
-  $.fn.alert.noConflict = function () {
-    $.fn.alert = old
-    return this
-  }
-
-
- /* ALERT DATA-API
-  * ============== */
-
-  $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
-
-}(window.jQuery);

+ 0 - 105
docs/assets/js/bootstrap-button.js

@@ -1,105 +0,0 @@
-/* ============================================================
- * bootstrap-button.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#buttons
- * ============================================================
- * 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 ;_;
-
-
- /* BUTTON PUBLIC CLASS DEFINITION
-  * ============================== */
-
-  var Button = function (element, options) {
-    this.$element = $(element)
-    this.options = $.extend({}, $.fn.button.defaults, options)
-  }
-
-  Button.prototype.setState = function (state) {
-    var d = 'disabled'
-      , $el = this.$element
-      , data = $el.data()
-      , val = $el.is('input') ? 'val' : 'html'
-
-    state = state + 'Text'
-    data.resetText || $el.data('resetText', $el[val]())
-
-    $el[val](data[state] || this.options[state])
-
-    // push to event loop to allow forms to submit
-    setTimeout(function () {
-      state == 'loadingText' ?
-        $el.addClass(d).attr(d, d) :
-        $el.removeClass(d).removeAttr(d)
-    }, 0)
-  }
-
-  Button.prototype.toggle = function () {
-    var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
-
-    $parent && $parent
-      .find('.active')
-      .removeClass('active')
-
-    this.$element.toggleClass('active')
-  }
-
-
- /* BUTTON PLUGIN DEFINITION
-  * ======================== */
-
-  var old = $.fn.button
-
-  $.fn.button = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('button')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('button', (data = new Button(this, options)))
-      if (option == 'toggle') data.toggle()
-      else if (option) data.setState(option)
-    })
-  }
-
-  $.fn.button.defaults = {
-    loadingText: 'loading...'
-  }
-
-  $.fn.button.Constructor = Button
-
-
- /* BUTTON NO CONFLICT
-  * ================== */
-
-  $.fn.button.noConflict = function () {
-    $.fn.button = old
-    return this
-  }
-
-
- /* BUTTON DATA-API
-  * =============== */
-
-  $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
-    var $btn = $(e.target)
-    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
-    $btn.button('toggle')
-  })
-
-}(window.jQuery);

+ 0 - 207
docs/assets/js/bootstrap-carousel.js

@@ -1,207 +0,0 @@
-/* ==========================================================
- * bootstrap-carousel.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#carousel
- * ==========================================================
- * 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 ;_;
-
-
- /* CAROUSEL CLASS DEFINITION
-  * ========================= */
-
-  var Carousel = function (element, options) {
-    this.$element = $(element)
-    this.$indicators = this.$element.find('.carousel-indicators')
-    this.options = options
-    this.options.pause == 'hover' && this.$element
-      .on('mouseenter', $.proxy(this.pause, this))
-      .on('mouseleave', $.proxy(this.cycle, this))
-  }
-
-  Carousel.prototype = {
-
-    cycle: function (e) {
-      if (!e) this.paused = false
-      if (this.interval) clearInterval(this.interval);
-      this.options.interval
-        && !this.paused
-        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
-      return this
-    }
-
-  , getActiveIndex: function () {
-      this.$active = this.$element.find('.item.active')
-      this.$items = this.$active.parent().children()
-      return this.$items.index(this.$active)
-    }
-
-  , to: function (pos) {
-      var activeIndex = this.getActiveIndex()
-        , that = this
-
-      if (pos > (this.$items.length - 1) || pos < 0) return
-
-      if (this.sliding) {
-        return this.$element.one('slid', function () {
-          that.to(pos)
-        })
-      }
-
-      if (activeIndex == pos) {
-        return this.pause().cycle()
-      }
-
-      return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
-    }
-
-  , pause: function (e) {
-      if (!e) this.paused = true
-      if (this.$element.find('.next, .prev').length && $.support.transition.end) {
-        this.$element.trigger($.support.transition.end)
-        this.cycle(true)
-      }
-      clearInterval(this.interval)
-      this.interval = null
-      return this
-    }
-
-  , next: function () {
-      if (this.sliding) return
-      return this.slide('next')
-    }
-
-  , prev: function () {
-      if (this.sliding) return
-      return this.slide('prev')
-    }
-
-  , slide: function (type, next) {
-      var $active = this.$element.find('.item.active')
-        , $next = next || $active[type]()
-        , isCycling = this.interval
-        , direction = type == 'next' ? 'left' : 'right'
-        , fallback  = type == 'next' ? 'first' : 'last'
-        , that = this
-        , e
-
-      this.sliding = true
-
-      isCycling && this.pause()
-
-      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
-
-      e = $.Event('slide', {
-        relatedTarget: $next[0]
-      , direction: direction
-      })
-
-      if ($next.hasClass('active')) return
-
-      if (this.$indicators.length) {
-        this.$indicators.find('.active').removeClass('active')
-        this.$element.one('slid', function () {
-          var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
-          $nextIndicator && $nextIndicator.addClass('active')
-        })
-      }
-
-      if ($.support.transition && this.$element.hasClass('slide')) {
-        this.$element.trigger(e)
-        if (e.isDefaultPrevented()) return
-        $next.addClass(type)
-        $next[0].offsetWidth // force reflow
-        $active.addClass(direction)
-        $next.addClass(direction)
-        this.$element.one($.support.transition.end, function () {
-          $next.removeClass([type, direction].join(' ')).addClass('active')
-          $active.removeClass(['active', direction].join(' '))
-          that.sliding = false
-          setTimeout(function () { that.$element.trigger('slid') }, 0)
-        })
-      } else {
-        this.$element.trigger(e)
-        if (e.isDefaultPrevented()) return
-        $active.removeClass('active')
-        $next.addClass('active')
-        this.sliding = false
-        this.$element.trigger('slid')
-      }
-
-      isCycling && this.cycle()
-
-      return this
-    }
-
-  }
-
-
- /* CAROUSEL PLUGIN DEFINITION
-  * ========================== */
-
-  var old = $.fn.carousel
-
-  $.fn.carousel = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('carousel')
-        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
-        , action = typeof option == 'string' ? option : options.slide
-      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
-      if (typeof option == 'number') data.to(option)
-      else if (action) data[action]()
-      else if (options.interval) data.pause().cycle()
-    })
-  }
-
-  $.fn.carousel.defaults = {
-    interval: 5000
-  , pause: 'hover'
-  }
-
-  $.fn.carousel.Constructor = Carousel
-
-
- /* CAROUSEL NO CONFLICT
-  * ==================== */
-
-  $.fn.carousel.noConflict = function () {
-    $.fn.carousel = old
-    return this
-  }
-
- /* CAROUSEL DATA-API
-  * ================= */
-
-  $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
-    var $this = $(this), href
-      , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
-      , options = $.extend({}, $target.data(), $this.data())
-      , slideIndex
-
-    $target.carousel(options)
-
-    if (slideIndex = $this.attr('data-slide-to')) {
-      $target.data('carousel').pause().to(slideIndex).cycle()
-    }
-
-    e.preventDefault()
-  })
-
-}(window.jQuery);

+ 0 - 167
docs/assets/js/bootstrap-collapse.js

@@ -1,167 +0,0 @@
-/* =============================================================
- * bootstrap-collapse.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#collapse
- * =============================================================
- * 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 ;_;
-
-
- /* COLLAPSE PUBLIC CLASS DEFINITION
-  * ================================ */
-
-  var Collapse = function (element, options) {
-    this.$element = $(element)
-    this.options = $.extend({}, $.fn.collapse.defaults, options)
-
-    if (this.options.parent) {
-      this.$parent = $(this.options.parent)
-    }
-
-    this.options.toggle && this.toggle()
-  }
-
-  Collapse.prototype = {
-
-    constructor: Collapse
-
-  , dimension: function () {
-      var hasWidth = this.$element.hasClass('width')
-      return hasWidth ? 'width' : 'height'
-    }
-
-  , show: function () {
-      var dimension
-        , scroll
-        , actives
-        , hasData
-
-      if (this.transitioning || this.$element.hasClass('in')) return
-
-      dimension = this.dimension()
-      scroll = $.camelCase(['scroll', dimension].join('-'))
-      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
-
-      if (actives && actives.length) {
-        hasData = actives.data('collapse')
-        if (hasData && hasData.transitioning) return
-        actives.collapse('hide')
-        hasData || actives.data('collapse', null)
-      }
-
-      this.$element[dimension](0)
-      this.transition('addClass', $.Event('show'), 'shown')
-      $.support.transition && this.$element[dimension](this.$element[0][scroll])
-    }
-
-  , hide: function () {
-      var dimension
-      if (this.transitioning || !this.$element.hasClass('in')) return
-      dimension = this.dimension()
-      this.reset(this.$element[dimension]())
-      this.transition('removeClass', $.Event('hide'), 'hidden')
-      this.$element[dimension](0)
-    }
-
-  , reset: function (size) {
-      var dimension = this.dimension()
-
-      this.$element
-        .removeClass('collapse')
-        [dimension](size || 'auto')
-        [0].offsetWidth
-
-      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
-
-      return this
-    }
-
-  , transition: function (method, startEvent, completeEvent) {
-      var that = this
-        , complete = function () {
-            if (startEvent.type == 'show') that.reset()
-            that.transitioning = 0
-            that.$element.trigger(completeEvent)
-          }
-
-      this.$element.trigger(startEvent)
-
-      if (startEvent.isDefaultPrevented()) return
-
-      this.transitioning = 1
-
-      this.$element[method]('in')
-
-      $.support.transition && this.$element.hasClass('collapse') ?
-        this.$element.one($.support.transition.end, complete) :
-        complete()
-    }
-
-  , toggle: function () {
-      this[this.$element.hasClass('in') ? 'hide' : 'show']()
-    }
-
-  }
-
-
- /* COLLAPSE PLUGIN DEFINITION
-  * ========================== */
-
-  var old = $.fn.collapse
-
-  $.fn.collapse = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('collapse')
-        , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option)
-      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.collapse.defaults = {
-    toggle: true
-  }
-
-  $.fn.collapse.Constructor = Collapse
-
-
- /* COLLAPSE NO CONFLICT
-  * ==================== */
-
-  $.fn.collapse.noConflict = function () {
-    $.fn.collapse = old
-    return this
-  }
-
-
- /* COLLAPSE DATA-API
-  * ================= */
-
-  $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
-    var $this = $(this), href
-      , target = $this.attr('data-target')
-        || e.preventDefault()
-        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
-      , option = $(target).data('collapse') ? 'toggle' : $this.data()
-    $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
-    $(target).collapse(option)
-  })
-
-}(window.jQuery);

+ 0 - 169
docs/assets/js/bootstrap-dropdown.js

@@ -1,169 +0,0 @@
-/* ============================================================
- * bootstrap-dropdown.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#dropdowns
- * ============================================================
- * 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 ;_;
-
-
- /* DROPDOWN CLASS DEFINITION
-  * ========================= */
-
-  var toggle = '[data-toggle=dropdown]'
-    , Dropdown = function (element) {
-        var $el = $(element).on('click.dropdown.data-api', this.toggle)
-        $('html').on('click.dropdown.data-api', function () {
-          $el.parent().removeClass('open')
-        })
-      }
-
-  Dropdown.prototype = {
-
-    constructor: Dropdown
-
-  , toggle: function (e) {
-      var $this = $(this)
-        , $parent
-        , isActive
-
-      if ($this.is('.disabled, :disabled')) return
-
-      $parent = getParent($this)
-
-      isActive = $parent.hasClass('open')
-
-      clearMenus()
-
-      if (!isActive) {
-        if ('ontouchstart' in document.documentElement) {
-          // if mobile we we use a backdrop because click events don't delegate
-          $('<div class="dropdown-backdrop"/>').insertBefore($(this)).on('click', clearMenus)
-        }
-        $parent.toggleClass('open')
-      }
-
-      $this.focus()
-
-      return false
-    }
-
-  , keydown: function (e) {
-      var $this
-        , $items
-        , $active
-        , $parent
-        , isActive
-        , index
-
-      if (!/(38|40|27)/.test(e.keyCode)) return
-
-      $this = $(this)
-
-      e.preventDefault()
-      e.stopPropagation()
-
-      if ($this.is('.disabled, :disabled')) return
-
-      $parent = getParent($this)
-
-      isActive = $parent.hasClass('open')
-
-      if (!isActive || (isActive && e.keyCode == 27)) {
-        if (e.which == 27) $parent.find(toggle).focus()
-        return $this.click()
-      }
-
-      $items = $('[role=menu] li:not(.divider):visible a', $parent)
-
-      if (!$items.length) return
-
-      index = $items.index($items.filter(':focus'))
-
-      if (e.keyCode == 38 && index > 0) index--                                        // up
-      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
-      if (!~index) index = 0
-
-      $items
-        .eq(index)
-        .focus()
-    }
-
-  }
-
-  function clearMenus() {
-    $('.dropdown-backdrop').remove()
-    $(toggle).each(function () {
-      getParent($(this)).removeClass('open')
-    })
-  }
-
-  function getParent($this) {
-    var selector = $this.attr('data-target')
-      , $parent
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-    }
-
-    $parent = selector && $(selector)
-
-    if (!$parent || !$parent.length) $parent = $this.parent()
-
-    return $parent
-  }
-
-
-  /* DROPDOWN PLUGIN DEFINITION
-   * ========================== */
-
-  var old = $.fn.dropdown
-
-  $.fn.dropdown = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('dropdown')
-      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  $.fn.dropdown.Constructor = Dropdown
-
-
- /* DROPDOWN NO CONFLICT
-  * ==================== */
-
-  $.fn.dropdown.noConflict = function () {
-    $.fn.dropdown = old
-    return this
-  }
-
-
-  /* APPLY TO STANDARD DROPDOWN ELEMENTS
-   * =================================== */
-
-  $(document)
-    .on('click.dropdown.data-api', clearMenus)
-    .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
-    .on('click.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
-    .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
-
-}(window.jQuery);

+ 0 - 247
docs/assets/js/bootstrap-modal.js

@@ -1,247 +0,0 @@
-/* =========================================================
- * bootstrap-modal.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#modals
- * =========================================================
- * 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 ;_;
-
-
- /* MODAL CLASS DEFINITION
-  * ====================== */
-
-  var Modal = function (element, options) {
-    this.options = options
-    this.$element = $(element)
-      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
-    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
-  }
-
-  Modal.prototype = {
-
-      constructor: Modal
-
-    , toggle: function () {
-        return this[!this.isShown ? 'show' : 'hide']()
-      }
-
-    , show: function () {
-        var that = this
-          , e = $.Event('show')
-
-        this.$element.trigger(e)
-
-        if (this.isShown || e.isDefaultPrevented()) return
-
-        this.isShown = true
-
-        this.escape()
-
-        this.backdrop(function () {
-          var transition = $.support.transition && that.$element.hasClass('fade')
-
-          if (!that.$element.parent().length) {
-            that.$element.appendTo(document.body) //don't move modals dom position
-          }
-
-          that.$element.show()
-
-          if (transition) {
-            that.$element[0].offsetWidth // force reflow
-          }
-
-          that.$element
-            .addClass('in')
-            .attr('aria-hidden', false)
-
-          that.enforceFocus()
-
-          transition ?
-            that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
-            that.$element.focus().trigger('shown')
-
-        })
-      }
-
-    , hide: function (e) {
-        e && e.preventDefault()
-
-        var that = this
-
-        e = $.Event('hide')
-
-        this.$element.trigger(e)
-
-        if (!this.isShown || e.isDefaultPrevented()) return
-
-        this.isShown = false
-
-        this.escape()
-
-        $(document).off('focusin.modal')
-
-        this.$element
-          .removeClass('in')
-          .attr('aria-hidden', true)
-
-        $.support.transition && this.$element.hasClass('fade') ?
-          this.hideWithTransition() :
-          this.hideModal()
-      }
-
-    , enforceFocus: function () {
-        var that = this
-        $(document).on('focusin.modal', function (e) {
-          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
-            that.$element.focus()
-          }
-        })
-      }
-
-    , escape: function () {
-        var that = this
-        if (this.isShown && this.options.keyboard) {
-          this.$element.on('keyup.dismiss.modal', function ( e ) {
-            e.which == 27 && that.hide()
-          })
-        } else if (!this.isShown) {
-          this.$element.off('keyup.dismiss.modal')
-        }
-      }
-
-    , hideWithTransition: function () {
-        var that = this
-          , timeout = setTimeout(function () {
-              that.$element.off($.support.transition.end)
-              that.hideModal()
-            }, 500)
-
-        this.$element.one($.support.transition.end, function () {
-          clearTimeout(timeout)
-          that.hideModal()
-        })
-      }
-
-    , hideModal: function () {
-        var that = this
-        this.$element.hide()
-        this.backdrop(function () {
-          that.removeBackdrop()
-          that.$element.trigger('hidden')
-        })
-      }
-
-    , removeBackdrop: function () {
-        this.$backdrop && this.$backdrop.remove()
-        this.$backdrop = null
-      }
-
-    , backdrop: function (callback) {
-        var that = this
-          , animate = this.$element.hasClass('fade') ? 'fade' : ''
-
-        if (this.isShown && this.options.backdrop) {
-          var doAnimate = $.support.transition && animate
-
-          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
-            .appendTo(document.body)
-
-          this.$backdrop.click(
-            this.options.backdrop == 'static' ?
-              $.proxy(this.$element[0].focus, this.$element[0])
-            : $.proxy(this.hide, this)
-          )
-
-          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
-
-          this.$backdrop.addClass('in')
-
-          if (!callback) return
-
-          doAnimate ?
-            this.$backdrop.one($.support.transition.end, callback) :
-            callback()
-
-        } else if (!this.isShown && this.$backdrop) {
-          this.$backdrop.removeClass('in')
-
-          $.support.transition && this.$element.hasClass('fade')?
-            this.$backdrop.one($.support.transition.end, callback) :
-            callback()
-
-        } else if (callback) {
-          callback()
-        }
-      }
-  }
-
-
- /* MODAL PLUGIN DEFINITION
-  * ======================= */
-
-  var old = $.fn.modal
-
-  $.fn.modal = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('modal')
-        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
-      if (!data) $this.data('modal', (data = new Modal(this, options)))
-      if (typeof option == 'string') data[option]()
-      else if (options.show) data.show()
-    })
-  }
-
-  $.fn.modal.defaults = {
-      backdrop: true
-    , keyboard: true
-    , show: true
-  }
-
-  $.fn.modal.Constructor = Modal
-
-
- /* MODAL NO CONFLICT
-  * ================= */
-
-  $.fn.modal.noConflict = function () {
-    $.fn.modal = old
-    return this
-  }
-
-
- /* MODAL DATA-API
-  * ============== */
-
-  $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
-    var $this = $(this)
-      , href = $this.attr('href')
-      , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
-      , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
-
-    e.preventDefault()
-
-    $target
-      .modal(option)
-      .one('hide', function () {
-        $this.focus()
-      })
-  })
-
-}(window.jQuery);

+ 0 - 114
docs/assets/js/bootstrap-popover.js

@@ -1,114 +0,0 @@
-/* ===========================================================
- * bootstrap-popover.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#popovers
- * ===========================================================
- * 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 ;_;
-
-
- /* POPOVER PUBLIC CLASS DEFINITION
-  * =============================== */
-
-  var Popover = function (element, options) {
-    this.init('popover', element, options)
-  }
-
-
-  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
-     ========================================== */
-
-  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
-
-    constructor: Popover
-
-  , setContent: function () {
-      var $tip = this.tip()
-        , title = this.getTitle()
-        , content = this.getContent()
-
-      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
-      $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
-
-      $tip.removeClass('fade top bottom left right in')
-    }
-
-  , hasContent: function () {
-      return this.getTitle() || this.getContent()
-    }
-
-  , getContent: function () {
-      var content
-        , $e = this.$element
-        , o = this.options
-
-      content = (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
-        || $e.attr('data-content')
-
-      return content
-    }
-
-  , tip: function () {
-      if (!this.$tip) {
-        this.$tip = $(this.options.template)
-      }
-      return this.$tip
-    }
-
-  , destroy: function () {
-      this.hide().$element.off('.' + this.type).removeData(this.type)
-    }
-
-  })
-
-
- /* POPOVER PLUGIN DEFINITION
-  * ======================= */
-
-  var old = $.fn.popover
-
-  $.fn.popover = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('popover')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('popover', (data = new Popover(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.popover.Constructor = Popover
-
-  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
-    placement: 'right'
-  , trigger: 'click'
-  , content: ''
-  , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
-  })
-
-
- /* POPOVER NO CONFLICT
-  * =================== */
-
-  $.fn.popover.noConflict = function () {
-    $.fn.popover = old
-    return this
-  }
-
-}(window.jQuery);

+ 0 - 162
docs/assets/js/bootstrap-scrollspy.js

@@ -1,162 +0,0 @@
-/* =============================================================
- * bootstrap-scrollspy.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#scrollspy
- * =============================================================
- * 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 ;_;
-
-
- /* SCROLLSPY CLASS DEFINITION
-  * ========================== */
-
-  function ScrollSpy(element, options) {
-    var process = $.proxy(this.process, this)
-      , $element = $(element).is('body') ? $(window) : $(element)
-      , href
-    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
-    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
-    this.selector = (this.options.target
-      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
-      || '') + ' .nav li > a'
-    this.$body = $('body')
-    this.refresh()
-    this.process()
-  }
-
-  ScrollSpy.prototype = {
-
-      constructor: ScrollSpy
-
-    , refresh: function () {
-        var self = this
-          , $targets
-
-        this.offsets = $([])
-        this.targets = $([])
-
-        $targets = this.$body
-          .find(this.selector)
-          .map(function () {
-            var $el = $(this)
-              , href = $el.data('target') || $el.attr('href')
-              , $href = /^#\w/.test(href) && $(href)
-            return ( $href
-              && $href.length
-              && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null
-          })
-          .sort(function (a, b) { return a[0] - b[0] })
-          .each(function () {
-            self.offsets.push(this[0])
-            self.targets.push(this[1])
-          })
-      }
-
-    , process: function () {
-        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
-          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
-          , maxScroll = scrollHeight - this.$scrollElement.height()
-          , offsets = this.offsets
-          , targets = this.targets
-          , activeTarget = this.activeTarget
-          , i
-
-        if (scrollTop >= maxScroll) {
-          return activeTarget != (i = targets.last()[0])
-            && this.activate ( i )
-        }
-
-        for (i = offsets.length; i--;) {
-          activeTarget != targets[i]
-            && scrollTop >= offsets[i]
-            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
-            && this.activate( targets[i] )
-        }
-      }
-
-    , activate: function (target) {
-        var active
-          , selector
-
-        this.activeTarget = target
-
-        $(this.selector)
-          .parent('.active')
-          .removeClass('active')
-
-        selector = this.selector
-          + '[data-target="' + target + '"],'
-          + this.selector + '[href="' + target + '"]'
-
-        active = $(selector)
-          .parent('li')
-          .addClass('active')
-
-        if (active.parent('.dropdown-menu').length)  {
-          active = active.closest('li.dropdown').addClass('active')
-        }
-
-        active.trigger('activate')
-      }
-
-  }
-
-
- /* SCROLLSPY PLUGIN DEFINITION
-  * =========================== */
-
-  var old = $.fn.scrollspy
-
-  $.fn.scrollspy = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('scrollspy')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.scrollspy.Constructor = ScrollSpy
-
-  $.fn.scrollspy.defaults = {
-    offset: 10
-  }
-
-
- /* SCROLLSPY NO CONFLICT
-  * ===================== */
-
-  $.fn.scrollspy.noConflict = function () {
-    $.fn.scrollspy = old
-    return this
-  }
-
-
- /* SCROLLSPY DATA-API
-  * ================== */
-
-  $(window).on('load', function () {
-    $('[data-spy="scroll"]').each(function () {
-      var $spy = $(this)
-      $spy.scrollspy($spy.data())
-    })
-  })
-
-}(window.jQuery);

+ 0 - 144
docs/assets/js/bootstrap-tab.js

@@ -1,144 +0,0 @@
-/* ========================================================
- * bootstrap-tab.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#tabs
- * ========================================================
- * 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 ;_;
-
-
- /* TAB CLASS DEFINITION
-  * ==================== */
-
-  var Tab = function (element) {
-    this.element = $(element)
-  }
-
-  Tab.prototype = {
-
-    constructor: Tab
-
-  , show: function () {
-      var $this = this.element
-        , $ul = $this.closest('ul:not(.dropdown-menu)')
-        , selector = $this.attr('data-target')
-        , previous
-        , $target
-        , e
-
-      if (!selector) {
-        selector = $this.attr('href')
-        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-      }
-
-      if ( $this.parent('li').hasClass('active') ) return
-
-      previous = $ul.find('.active:last a')[0]
-
-      e = $.Event('show', {
-        relatedTarget: previous
-      })
-
-      $this.trigger(e)
-
-      if (e.isDefaultPrevented()) return
-
-      $target = $(selector)
-
-      this.activate($this.parent('li'), $ul)
-      this.activate($target, $target.parent(), function () {
-        $this.trigger({
-          type: 'shown'
-        , relatedTarget: previous
-        })
-      })
-    }
-
-  , activate: function ( element, container, callback) {
-      var $active = container.find('> .active')
-        , transition = callback
-            && $.support.transition
-            && $active.hasClass('fade')
-
-      function next() {
-        $active
-          .removeClass('active')
-          .find('> .dropdown-menu > .active')
-          .removeClass('active')
-
-        element.addClass('active')
-
-        if (transition) {
-          element[0].offsetWidth // reflow for transition
-          element.addClass('in')
-        } else {
-          element.removeClass('fade')
-        }
-
-        if ( element.parent('.dropdown-menu') ) {
-          element.closest('li.dropdown').addClass('active')
-        }
-
-        callback && callback()
-      }
-
-      transition ?
-        $active.one($.support.transition.end, next) :
-        next()
-
-      $active.removeClass('in')
-    }
-  }
-
-
- /* TAB PLUGIN DEFINITION
-  * ===================== */
-
-  var old = $.fn.tab
-
-  $.fn.tab = function ( option ) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('tab')
-      if (!data) $this.data('tab', (data = new Tab(this)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.tab.Constructor = Tab
-
-
- /* TAB NO CONFLICT
-  * =============== */
-
-  $.fn.tab.noConflict = function () {
-    $.fn.tab = old
-    return this
-  }
-
-
- /* TAB DATA-API
-  * ============ */
-
-  $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
-    e.preventDefault()
-    $(this).tab('show')
-  })
-
-}(window.jQuery);

+ 0 - 361
docs/assets/js/bootstrap-tooltip.js

@@ -1,361 +0,0 @@
-/* ===========================================================
- * bootstrap-tooltip.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#tooltips
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ===========================================================
- * 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 ;_;
-
-
- /* TOOLTIP PUBLIC CLASS DEFINITION
-  * =============================== */
-
-  var Tooltip = function (element, options) {
-    this.init('tooltip', element, options)
-  }
-
-  Tooltip.prototype = {
-
-    constructor: Tooltip
-
-  , init: function (type, element, options) {
-      var eventIn
-        , eventOut
-        , triggers
-        , trigger
-        , i
-
-      this.type = type
-      this.$element = $(element)
-      this.options = this.getOptions(options)
-      this.enabled = true
-
-      triggers = this.options.trigger.split(' ')
-
-      for (i = triggers.length; i--;) {
-        trigger = triggers[i]
-        if (trigger == 'click') {
-          this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
-        } else if (trigger != 'manual') {
-          eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
-          eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
-          this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
-          this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
-        }
-      }
-
-      this.options.selector ?
-        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
-        this.fixTitle()
-    }
-
-  , getOptions: function (options) {
-      options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)
-
-      if (options.delay && typeof options.delay == 'number') {
-        options.delay = {
-          show: options.delay
-        , hide: options.delay
-        }
-      }
-
-      return options
-    }
-
-  , enter: function (e) {
-      var defaults = $.fn[this.type].defaults
-        , options = {}
-        , self
-
-      this._options && $.each(this._options, function (key, value) {
-        if (defaults[key] != value) options[key] = value
-      }, this)
-
-      self = $(e.currentTarget)[this.type](options).data(this.type)
-
-      if (!self.options.delay || !self.options.delay.show) return self.show()
-
-      clearTimeout(this.timeout)
-      self.hoverState = 'in'
-      this.timeout = setTimeout(function() {
-        if (self.hoverState == 'in') self.show()
-      }, self.options.delay.show)
-    }
-
-  , leave: function (e) {
-      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
-
-      if (this.timeout) clearTimeout(this.timeout)
-      if (!self.options.delay || !self.options.delay.hide) return self.hide()
-
-      self.hoverState = 'out'
-      this.timeout = setTimeout(function() {
-        if (self.hoverState == 'out') self.hide()
-      }, self.options.delay.hide)
-    }
-
-  , show: function () {
-      var $tip
-        , pos
-        , actualWidth
-        , actualHeight
-        , placement
-        , tp
-        , e = $.Event('show')
-
-      if (this.hasContent() && this.enabled) {
-        this.$element.trigger(e)
-        if (e.isDefaultPrevented()) return
-        $tip = this.tip()
-        this.setContent()
-
-        if (this.options.animation) {
-          $tip.addClass('fade')
-        }
-
-        placement = typeof this.options.placement == 'function' ?
-          this.options.placement.call(this, $tip[0], this.$element[0]) :
-          this.options.placement
-
-        $tip
-          .detach()
-          .css({ top: 0, left: 0, display: 'block' })
-
-        this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
-
-        pos = this.getPosition()
-
-        actualWidth = $tip[0].offsetWidth
-        actualHeight = $tip[0].offsetHeight
-
-        switch (placement) {
-          case 'bottom':
-            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
-            break
-          case 'top':
-            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
-            break
-          case 'left':
-            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
-            break
-          case 'right':
-            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
-            break
-        }
-
-        this.applyPlacement(tp, placement)
-        this.$element.trigger('shown')
-      }
-    }
-
-  , applyPlacement: function(offset, placement){
-      var $tip = this.tip()
-        , width = $tip[0].offsetWidth
-        , height = $tip[0].offsetHeight
-        , actualWidth
-        , actualHeight
-        , delta
-        , replace
-
-      $tip
-        .offset(offset)
-        .addClass(placement)
-        .addClass('in')
-
-      actualWidth = $tip[0].offsetWidth
-      actualHeight = $tip[0].offsetHeight
-
-      if (placement == 'top' && actualHeight != height) {
-        offset.top = offset.top + height - actualHeight
-        replace = true
-      }
-
-      if (placement == 'bottom' || placement == 'top') {
-        delta = 0
-
-        if (offset.left < 0){
-          delta = offset.left * -2
-          offset.left = 0
-          $tip.offset(offset)
-          actualWidth = $tip[0].offsetWidth
-          actualHeight = $tip[0].offsetHeight
-        }
-
-        this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
-      } else {
-        this.replaceArrow(actualHeight - height, actualHeight, 'top')
-      }
-
-      if (replace) $tip.offset(offset)
-    }
-
-  , replaceArrow: function(delta, dimension, position){
-      this
-        .arrow()
-        .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
-    }
-
-  , setContent: function () {
-      var $tip = this.tip()
-        , title = this.getTitle()
-
-      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
-      $tip.removeClass('fade in top bottom left right')
-    }
-
-  , hide: function () {
-      var that = this
-        , $tip = this.tip()
-        , e = $.Event('hide')
-
-      this.$element.trigger(e)
-      if (e.isDefaultPrevented()) return
-
-      $tip.removeClass('in')
-
-      function removeWithAnimation() {
-        var timeout = setTimeout(function () {
-          $tip.off($.support.transition.end).detach()
-        }, 500)
-
-        $tip.one($.support.transition.end, function () {
-          clearTimeout(timeout)
-          $tip.detach()
-        })
-      }
-
-      $.support.transition && this.$tip.hasClass('fade') ?
-        removeWithAnimation() :
-        $tip.detach()
-
-      this.$element.trigger('hidden')
-
-      return this
-    }
-
-  , fixTitle: function () {
-      var $e = this.$element
-      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
-        $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
-      }
-    }
-
-  , hasContent: function () {
-      return this.getTitle()
-    }
-
-  , getPosition: function () {
-      var el = this.$element[0]
-      return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
-        width: el.offsetWidth
-      , height: el.offsetHeight
-      }, this.$element.offset())
-    }
-
-  , getTitle: function () {
-      var title
-        , $e = this.$element
-        , o = this.options
-
-      title = $e.attr('data-original-title')
-        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
-
-      return title
-    }
-
-  , tip: function () {
-      return this.$tip = this.$tip || $(this.options.template)
-    }
-
-  , arrow: function(){
-      return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
-    }
-
-  , validate: function () {
-      if (!this.$element[0].parentNode) {
-        this.hide()
-        this.$element = null
-        this.options = null
-      }
-    }
-
-  , enable: function () {
-      this.enabled = true
-    }
-
-  , disable: function () {
-      this.enabled = false
-    }
-
-  , toggleEnabled: function () {
-      this.enabled = !this.enabled
-    }
-
-  , toggle: function (e) {
-      var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this
-      self.tip().hasClass('in') ? self.hide() : self.show()
-    }
-
-  , destroy: function () {
-      this.hide().$element.off('.' + this.type).removeData(this.type)
-    }
-
-  }
-
-
- /* TOOLTIP PLUGIN DEFINITION
-  * ========================= */
-
-  var old = $.fn.tooltip
-
-  $.fn.tooltip = function ( option ) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('tooltip')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.tooltip.Constructor = Tooltip
-
-  $.fn.tooltip.defaults = {
-    animation: true
-  , placement: 'top'
-  , selector: false
-  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
-  , trigger: 'hover focus'
-  , title: ''
-  , delay: 0
-  , html: false
-  , container: false
-  }
-
-
- /* TOOLTIP NO CONFLICT
-  * =================== */
-
-  $.fn.tooltip.noConflict = function () {
-    $.fn.tooltip = old
-    return this
-  }
-
-}(window.jQuery);

+ 0 - 60
docs/assets/js/bootstrap-transition.js

@@ -1,60 +0,0 @@
-/* ===================================================
- * bootstrap-transition.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#transitions
- * ===================================================
- * 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 ;_;
-
-
-  /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
-   * ======================================================= */
-
-  $(function () {
-
-    $.support.transition = (function () {
-
-      var transitionEnd = (function () {
-
-        var el = document.createElement('bootstrap')
-          , transEndEventNames = {
-               'WebkitTransition' : 'webkitTransitionEnd'
-            ,  'MozTransition'    : 'transitionend'
-            ,  'OTransition'      : 'oTransitionEnd otransitionend'
-            ,  'transition'       : 'transitionend'
-            }
-          , name
-
-        for (name in transEndEventNames){
-          if (el.style[name] !== undefined) {
-            return transEndEventNames[name]
-          }
-        }
-
-      }())
-
-      return transitionEnd && {
-        end: transitionEnd
-      }
-
-    })()
-
-  })
-
-}(window.jQuery);

+ 0 - 335
docs/assets/js/bootstrap-typeahead.js

@@ -1,335 +0,0 @@
-/* =============================================================
- * bootstrap-typeahead.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#typeahead
- * =============================================================
- * 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 ;_;
-
-
- /* TYPEAHEAD PUBLIC CLASS DEFINITION
-  * ================================= */
-
-  var Typeahead = function (element, options) {
-    this.$element = $(element)
-    this.options = $.extend({}, $.fn.typeahead.defaults, options)
-    this.matcher = this.options.matcher || this.matcher
-    this.sorter = this.options.sorter || this.sorter
-    this.highlighter = this.options.highlighter || this.highlighter
-    this.updater = this.options.updater || this.updater
-    this.source = this.options.source
-    this.$menu = $(this.options.menu)
-    this.shown = false
-    this.listen()
-  }
-
-  Typeahead.prototype = {
-
-    constructor: Typeahead
-
-  , select: function () {
-      var val = this.$menu.find('.active').attr('data-value')
-      this.$element
-        .val(this.updater(val))
-        .change()
-      return this.hide()
-    }
-
-  , updater: function (item) {
-      return item
-    }
-
-  , show: function () {
-      var pos = $.extend({}, this.$element.position(), {
-        height: this.$element[0].offsetHeight
-      })
-
-      this.$menu
-        .insertAfter(this.$element)
-        .css({
-          top: pos.top + pos.height
-        , left: pos.left
-        })
-        .show()
-
-      this.shown = true
-      return this
-    }
-
-  , hide: function () {
-      this.$menu.hide()
-      this.shown = false
-      return this
-    }
-
-  , lookup: function (event) {
-      var items
-
-      this.query = this.$element.val()
-
-      if (!this.query || this.query.length < this.options.minLength) {
-        return this.shown ? this.hide() : this
-      }
-
-      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
-
-      return items ? this.process(items) : this
-    }
-
-  , process: function (items) {
-      var that = this
-
-      items = $.grep(items, function (item) {
-        return that.matcher(item)
-      })
-
-      items = this.sorter(items)
-
-      if (!items.length) {
-        return this.shown ? this.hide() : this
-      }
-
-      return this.render(items.slice(0, this.options.items)).show()
-    }
-
-  , matcher: function (item) {
-      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
-    }
-
-  , sorter: function (items) {
-      var beginswith = []
-        , caseSensitive = []
-        , caseInsensitive = []
-        , item
-
-      while (item = items.shift()) {
-        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
-        else if (~item.indexOf(this.query)) caseSensitive.push(item)
-        else caseInsensitive.push(item)
-      }
-
-      return beginswith.concat(caseSensitive, caseInsensitive)
-    }
-
-  , highlighter: function (item) {
-      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
-      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
-        return '<strong>' + match + '</strong>'
-      })
-    }
-
-  , render: function (items) {
-      var that = this
-
-      items = $(items).map(function (i, item) {
-        i = $(that.options.item).attr('data-value', item)
-        i.find('a').html(that.highlighter(item))
-        return i[0]
-      })
-
-      items.first().addClass('active')
-      this.$menu.html(items)
-      return this
-    }
-
-  , next: function (event) {
-      var active = this.$menu.find('.active').removeClass('active')
-        , next = active.next()
-
-      if (!next.length) {
-        next = $(this.$menu.find('li')[0])
-      }
-
-      next.addClass('active')
-    }
-
-  , prev: function (event) {
-      var active = this.$menu.find('.active').removeClass('active')
-        , prev = active.prev()
-
-      if (!prev.length) {
-        prev = this.$menu.find('li').last()
-      }
-
-      prev.addClass('active')
-    }
-
-  , listen: function () {
-      this.$element
-        .on('focus',    $.proxy(this.focus, this))
-        .on('blur',     $.proxy(this.blur, this))
-        .on('keypress', $.proxy(this.keypress, this))
-        .on('keyup',    $.proxy(this.keyup, this))
-
-      if (this.eventSupported('keydown')) {
-        this.$element.on('keydown', $.proxy(this.keydown, this))
-      }
-
-      this.$menu
-        .on('click', $.proxy(this.click, this))
-        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
-        .on('mouseleave', 'li', $.proxy(this.mouseleave, this))
-    }
-
-  , eventSupported: function(eventName) {
-      var isSupported = eventName in this.$element
-      if (!isSupported) {
-        this.$element.setAttribute(eventName, 'return;')
-        isSupported = typeof this.$element[eventName] === 'function'
-      }
-      return isSupported
-    }
-
-  , move: function (e) {
-      if (!this.shown) return
-
-      switch(e.keyCode) {
-        case 9: // tab
-        case 13: // enter
-        case 27: // escape
-          e.preventDefault()
-          break
-
-        case 38: // up arrow
-          e.preventDefault()
-          this.prev()
-          break
-
-        case 40: // down arrow
-          e.preventDefault()
-          this.next()
-          break
-      }
-
-      e.stopPropagation()
-    }
-
-  , keydown: function (e) {
-      this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
-      this.move(e)
-    }
-
-  , keypress: function (e) {
-      if (this.suppressKeyPressRepeat) return
-      this.move(e)
-    }
-
-  , keyup: function (e) {
-      switch(e.keyCode) {
-        case 40: // down arrow
-        case 38: // up arrow
-        case 16: // shift
-        case 17: // ctrl
-        case 18: // alt
-          break
-
-        case 9: // tab
-        case 13: // enter
-          if (!this.shown) return
-          this.select()
-          break
-
-        case 27: // escape
-          if (!this.shown) return
-          this.hide()
-          break
-
-        default:
-          this.lookup()
-      }
-
-      e.stopPropagation()
-      e.preventDefault()
-  }
-
-  , focus: function (e) {
-      this.focused = true
-    }
-
-  , blur: function (e) {
-      this.focused = false
-      if (!this.mousedover && this.shown) this.hide()
-    }
-
-  , click: function (e) {
-      e.stopPropagation()
-      e.preventDefault()
-      this.select()
-      this.$element.focus()
-    }
-
-  , mouseenter: function (e) {
-      this.mousedover = true
-      this.$menu.find('.active').removeClass('active')
-      $(e.currentTarget).addClass('active')
-    }
-
-  , mouseleave: function (e) {
-      this.mousedover = false
-      if (!this.focused && this.shown) this.hide()
-    }
-
-  }
-
-
-  /* TYPEAHEAD PLUGIN DEFINITION
-   * =========================== */
-
-  var old = $.fn.typeahead
-
-  $.fn.typeahead = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('typeahead')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.typeahead.defaults = {
-    source: []
-  , items: 8
-  , menu: '<ul class="typeahead dropdown-menu"></ul>'
-  , item: '<li><a href="#"></a></li>'
-  , minLength: 1
-  }
-
-  $.fn.typeahead.Constructor = Typeahead
-
-
- /* TYPEAHEAD NO CONFLICT
-  * =================== */
-
-  $.fn.typeahead.noConflict = function () {
-    $.fn.typeahead = old
-    return this
-  }
-
-
- /* TYPEAHEAD DATA-API
-  * ================== */
-
-  $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
-    var $this = $(this)
-    if ($this.data('typeahead')) return
-    $this.typeahead($this.data())
-  })
-
-}(window.jQuery);

File diff suppressed because it is too large
+ 0 - 2280
docs/assets/js/bootstrap.js


File diff suppressed because it is too large
+ 0 - 6
docs/assets/js/bootstrap.min.js


+ 0 - 30
docs/assets/js/google-code-prettify/prettify.css

@@ -1,30 +0,0 @@
-.com { color: #93a1a1; }
-.lit { color: #195f91; }
-.pun, .opn, .clo { color: #93a1a1; }
-.fun { color: #dc322f; }
-.str, .atv { color: #D14; }
-.kwd, .prettyprint .tag { color: #1e347b; }
-.typ, .atn, .dec, .var { color: teal; }
-.pln { color: #48484c; }
-
-.prettyprint {
-  padding: 8px;
-  background-color: #f7f7f9;
-  border: 1px solid #e1e1e8;
-}
-.prettyprint.linenums {
-  -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
-     -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
-          box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
-}
-
-/* Specify class=linenums on a pre to get line numbering */
-ol.linenums {
-  margin: 0 0 0 33px; /* IE indents via margin-left */
-}
-ol.linenums li {
-  padding-left: 12px;
-  color: #bebec5;
-  line-height: 20px;
-  text-shadow: 0 1px 0 #fff;
-}

File diff suppressed because it is too large
+ 0 - 28
docs/assets/js/google-code-prettify/prettify.js


File diff suppressed because it is too large
+ 0 - 401
docs/assets/js/holder/holder.js


File diff suppressed because it is too large
+ 0 - 8
docs/assets/js/html5shiv.js


File diff suppressed because it is too large
+ 0 - 5
docs/assets/js/jquery.js


+ 0 - 893
docs/extend.html

@@ -1,893 +0,0 @@
-<!DOCTYPE html>
-<!--
-
-    Metrix++, Copyright 2009-2013, Metrix++ Project
-    Link: http://metrixplusplus.sourceforge.net
-    
-    This file is part of Metrix++ Tool.
-    
-    Metrix++ is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, version 3 of the License.
-    
-    Metrix++ is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-    GNU General Public License for more details.
-    
-    You should have received a copy of the GNU General Public License
-    along with Metrix++.  If not, see <http://www.gnu.org/licenses/>.
-
--->
-<html lang="en">
-  <head>
-    <meta charset="utf-8">
-    <title>Metrix++ Project</title>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <meta name="description" content="">
-    <meta name="author" content="">
-
-    <!-- Le styles -->
-    <!--
-    <link href="../../style.css" rel="stylesheet">
-    -->
-    <link href="assets/css/bootstrap.css" rel="stylesheet">
-    <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
-    <link href="assets/css/docs.css" rel="stylesheet">
-    <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
-    
-    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
-    <!--[if lt IE 9]>
-      <script src="assets/js/html5shiv.js"></script>
-    <![endif]-->
-
-    <!-- Le fav and touch icons -->
-    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
-    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
-    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
-    <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
-    <link rel="shortcut icon" href="assets/ico/favicon.png">
-
-	<!--
-    <script type="text/javascript">
-      var _gaq = _gaq || [];
-      _gaq.push(['_setAccount', 'UA-146052-10']);
-      _gaq.push(['_trackPageview']);
-      (function() {
-        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
-      })();
-    </script>
-   -->
-  </head>
-
-  <body data-spy="scroll" data-target=".bs-docs-sidebar">
-
-    <!-- Navbar
-    ================================================== -->
-    <div class="navbar navbar-link navbar-fixed-top">
-      <div class="navbar-inner">
-        <div class="container">
-          <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-          </button>
-          <a class="brand" href="./index.html">Metrix++</a>
-          <div class="nav-collapse collapse">
-            <ul class="nav">
-              <li class="">
-                <a href="./index.html">Home</a>
-              </li>
-              <li class="">
-                <a href="./workflow.html">Workflow</a>
-              </li>
-              <li class="">
-                <a href="./extend.html">Create plugin</a>
-              </li>
-            </ul>
-          </div>
-        </div>
-      </div>
-    </div>
-
-    <!-- Subhead
-    ================================================== -->
-    <header class="jumbotron" id="overview">
-      <div class="container">
-        <div class="row">
-          <div class="span3"></div>
-          <div class="span9">
-            <h5 class="text-right">Management of source code quality is possible.</h5>
-            <p class="text-right">
-                <a href="https://sourceforge.net/projects/metrixplusplus/files/latest/download"
-                    ><button type="button"class="btn btn-danger">Download</button></a>
-                <!--
-                <button type="button"class="btn btn-warning">Donate</button>
-                -->
-            </p>
-          </div>
-        </div>
-      </div>
-    </header>
-
-    <div class="container"><div class="row">
-      
-      <!-- Docs nav
-	  ================================================== -->
-      <div class="span3 bs-docs-sidebar">
-        <ul class="nav nav-list bs-docs-sidenav">
-          <li><a href="#metric_plugin"><i class="icon-chevron-right"></i> Metric plugin</a></li>
-          <li><a href="#tool_plugin"><i class="icon-chevron-right"></i> Post-analysis tool</a></li>
-          <li><a href="#language_plugin"><i class="icon-chevron-right"></i> Language parser</a></li>
-        </ul>
-      </div>
-      
-      <!-- Sections
-	  ================================================== -->
-      <div class="span9">
-          <div class="page-header">
-            <h1>Create plugin</h1>
-          </div>
-            <p>There are 3 types of plugins considered in this chapter:</p>
-            <ul>
-            	<li>Metric plugin</li>
-            	<li>Language parser</li>
-            	<li>Post-processing / Analysis tool</li>
-            </ul>
-            <p>Tutorial for metric plugin is generic at the beginning and large portion of this is applied to
-            	all other plugins. You need to know python and python regular expressions library to write Metrix++ extensions.</p>
-        <section id="metric_plugin">
-          <h2>Metric plugin</h2>
-          <p>The tutorial will explain how to create a plugin to count magic numbers in source code.
-             It will be relatively simple at first and will be extended with additional configuration
-             options and smarter counting logic.</p>
-          <h4>Create placeholder for new plugin</h4>
-          <ol>
-             <li>All plugins are loaded by Metrix++ from standard places within the tool installation directory and
-                 from custom places specified in the METRIXPLUSPLUS_PATH environment variable.
-                 METRIXPLUSPLUS_PATH has got the same format as system PATH environment variable.
-                 So, the first step in plugin development is to set the METRIXPLUSPLUS_PATH to point out to
-                 the directory (or directories) where plugin is located.</li>
-             <li>Create new python package 'myext', python lib 'magic.py' and 'magic.ini' file.</li>
-             <pre>
-+ working_directory (set in METRIXPLUSPLUS_PATH variable)
-\--+ myext
-   \--- __init__.py
-   \--- magic.py
-   \--- magic.ini
-</pre>
-            <li>__init__.py is empty file to make myext considered by python as a package.</li>
-            <li>Edit magic.py to have the following content:
-             <pre class="prettyprint linenums">
-import mpp.api
-
-class Plugin(mpp.api.Plugin):
-    
-    def initialize(self):
-        print "Hello world"
-</pre>
-            mpp.api package include Metrix++ API classes. mpp.api.Plugin is the base class, which can be loaded
-            by Metrix++ engine and does nothing by default. In the code sample above it is extended to print
-            "Hello world" on initialization.</li>
-            <li>Edit magic.ini to have the following content:
-             <pre class="prettyprint linenums">
-[Plugin]
-version: 1.0
-package: myext
-module:  magic
-class:   Plugin
-depends: None
-actions: collect
-enabled: True
-</pre>
-            This file is a manifest for Metrix++ plugin loader. The fields in Plugin section are:
-            <dl class="dl-horizontal">
-            	<dt>version</dt>
-            	<dd>a string representing the version, step up it every time when behaviour of a plugin
-            		or backward compatibility in api or data scope is changed</dd>
-            	<dt>package</dt>
-            	<dd>python package name where to load from</dd>
-            	<dt>module</dt>
-            	<dd>python module name (filename of *.py file) to load</dd>
-            	<dt>class</dt>
-            	<dd>name of a plugin class to instanciate</dd>
-            	<dt>depends</dt>
-            	<dd>list of plugin names to load, if it this plugin is loaded</dd>
-            	<dt>actions</dt>
-            	<dd>list of Metrix++ actions affected by this plugin</dd>
-            	<dt>enabled</dt>
-            	<dd>True or False, working status of a plugin</dd>
-            </dl>
-            </li>
-            <li>Now run Metrix++ to see how this new plugin works:</li>
-          <pre>&gt; python "/path/to/metrix++.py" collect</pre>
-          <pre>Hello world</pre>
-          </ol>
-          <h4>Toogle option for the plugin</h4>
-          <ol>
-             <li>It is recommended to follow the convention for all plugins: 'run only if enabled'.
-             	So, let's extend the magic.py file to make it configurable
-             <pre class="prettyprint linenums">
-import mpp.api
-
-class Plugin(mpp.api.Plugin,
-             # make this instance configurable...
-             mpp.api.IConfigurable):
-    # ... and implement 2 interfaces
-    
-    def declare_configuration(self, parser):
-        parser.add_option("--myext.magic.numbers", "--mmn",
-            action="store_true", default=False,
-            help="Enables collection of magic numbers metric [default: %default]")
-        
-    def configure(self, options):
-        self.is_active_numbers = options.__dict__['myext.magic.numbers']
-    
-    def initialize(self):
-        # use configuration option here
-        if self.is_active_numbers == True:
-            print "Hello world"
-</pre>
-            parser argument is an instance of optparse.OptionParser class. It has got an extension to
-            accept multiple options of the same argument. Check std.tools.limit to see how to declare multiopt options, if you need.</li>
-            <li>Now run Metrix++ to see how this works:</li>
-          <pre>&gt; python "/path/to/metrix++.py" collect --myext.magic.numbers</pre>
-          <pre>Hello world</pre>
-          </ol>
-          <h4>Subscribe to notifications from parent plugins (or code parsers)</h4>
-          <ol>
-             <li>Every plugin works in a callback functions called by parent plugins.
-             	Callback receives a reference to parent plugin, data object where to store metrics data,
-             	and a flag indicating if there are changes in file or parent's settings since the previous collection.</li>
-             <pre class="prettyprint linenums">
-import mpp.api
-
-class Plugin(mpp.api.Plugin,
-             mpp.api.IConfigurable,
-             # declare that it can subscribe on notifications
-             mpp.api.Child):
-    
-    def declare_configuration(self, parser):
-        parser.add_option("--myext.magic.numbers", "--mmn",
-            action="store_true", default=False,
-            help="Enables collection of magic numbers metric [default: %default]")
-    
-    def configure(self, options):
-        self.is_active_numbers = options.__dict__['myext.magic.numbers']
-    
-    def initialize(self):
-        if self.is_active_numbers == True:
-            # subscribe to notifications from all code parsers
-            self.subscribe_by_parents_interface(mpp.api.ICode, 'callback')
-
-    # parents (code parsers) will call the callback declared
-    def callback(self, parent, data, is_updated):
-        print parent.get_name(), data.get_path(), is_updated
-</pre>
-            <li>Now run Metrix++ to see how this works. Try to do iterative scans (--db-file-prev option) to see how the
-            	state of arguments is changed</li>
-          <pre>&gt; python "/path/to/metrix++.py" collect --myext.magic.numbers</pre>
-          <pre>std.code.cpp ./test.cpp True</pre>
-          </ol>
-          <h4>Implement simple metric based on regular expression pattern</h4>
-          <ol>
-             <li>Callback may execute counting, searcing and additional parsing and store results, using data argument.
-             	'data' argument is an instance of mpp.api.FileData class.
-             	However, most metrics can be implemented
-             	simplier, if mpp.api.MetricPluginMixin routines are used. MetricPluginMixin implements
-             	declarative style for metrics based on searches by regular expression. It
-             	cares about initialisation of database fields and properties.
-             	It implements default callback which counts number of matches by regular expression for all
-             	active declared metrics. So, let's utilise that:
-             	</li>
-             <pre class="prettyprint linenums">
-import mpp.api
-import re
-
-class Plugin(mpp.api.Plugin,
-             mpp.api.IConfigurable,
-             mpp.api.Child,
-             # reuse by inheriting standard metric facilities
-             mpp.api.MetricPluginMixin):
-    
-    def declare_configuration(self, parser):
-        parser.add_option("--myext.magic.numbers", "--mmn",
-            action="store_true", default=False,
-            help="Enables collection of magic numbers metric [default: %default]")
-    
-    def configure(self, options):
-        self.is_active_numbers = options.__dict__['myext.magic.numbers']
-    
-    def initialize(self):
-        # declare metric rules
-        self.declare_metric(
-            self.is_active_numbers, # to count if active in callback
-            self.Field('numbers', int), # field name and type in the database
-            re.compile(r'''\b[0-9]+\b'''), # pattern to search
-            marker_type_mask=mpp.api.Marker.T.CODE, # search in code
-            region_type_mask=mpp.api.Region.T.ANY) # search in all types of regions
-        
-        # use superclass facilities to initialize everything from declared fields
-        super(Plugin, self).initialize(fields=self.get_fields())
-        
-        # subscribe to all code parsers if at least one metric is active
-        if self.is_active() == True:
-            self.subscribe_by_parents_interface(mpp.api.ICode)
-</pre>
-            <li>Now run Metrix++ to count numbers in code files.</li>
-          <pre>&gt; python "/path/to/metrix++.py" collect --myext.magic.numbers</pre>
-            <li>Now view the results. At this stage it is fully working simple metric.</li>
-          <pre>&gt; python "/path/to/metrix++.py" view</pre>
-          <pre>
-:: info: Overall metrics for 'myext.magic:numbers' metric
-	Average        : 2.75
-	Minimum        : 0
-	Maximum        : 7
-	Total          : 11.0
-	Distribution   : 4 regions in total (including 0 suppressed)
-	  Metric value : Ratio : R-sum : Number of regions
-	             0 : 0.250 : 0.250 : 1	|||||||||||||||||||||||||
-	             1 : 0.250 : 0.500 : 1	|||||||||||||||||||||||||
-	             3 : 0.250 : 0.750 : 1	|||||||||||||||||||||||||
-	             7 : 0.250 : 1.000 : 1	|||||||||||||||||||||||||
-
-:: info: Directory content:
-	Directory      : .
-</pre>
-          </ol>
-          <h4>Extend regular expression incremental counting by smarter logic</h4>
-          <ol>
-             <li>At this stage the metric counts every number in source code.
-                 However, we indent to spot only 'magic' numbers. Declared constant
-                 is not a magic number, so it is better to exclude constants from counting.
-                 It is easy to change default counter behaviour by implementing 
-                 a function with name '_&lt;metric_name&gt;_count'. </li>
-             <pre class="prettyprint linenums">
-import mpp.api
-import re
-
-class Plugin(mpp.api.Plugin,
-             mpp.api.IConfigurable,
-             mpp.api.Child,
-             mpp.api.MetricPluginMixin):
-    
-    def declare_configuration(self, parser):
-        parser.add_option("--myext.magic.numbers", "--mmn",
-            action="store_true", default=False,
-            help="Enables collection of magic numbers metric [default: %default]")
-    
-    def configure(self, options):
-        self.is_active_numbers = options.__dict__['myext.magic.numbers']
-    
-    def initialize(self):
-        # improve pattern to find declarations of constants
-        pattern_to_search = re.compile(
-            r'''((const(\s+[_a-zA-Z][_a-zA-Z0-9]*)+\s*[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
-        self.declare_metric(self.is_active_numbers,
-                            self.Field('numbers', int),
-                            # give a pair of pattern + custom counter logic class
-                            (pattern_to_search, self.NumbersCounter),
-                            marker_type_mask=mpp.api.Marker.T.CODE,
-                            region_type_mask=mpp.api.Region.T.ANY)
-        
-        super(Plugin, self).initialize(fields=self.get_fields())
-        
-        if self.is_active() == True:
-            self.subscribe_by_parents_interface(mpp.api.ICode)
-    
-    # implement custom counter behavior:
-    # increments counter by 1 only if single number spotted,
-    # but not declaration of a constant
-    class NumbersCounter(mpp.api.MetricPluginMixin.IterIncrementCounter):
-        def increment(self, match):
-            if match.group(0).startswith('const'):
-                return 0
-            return 1
-</pre>
-             <li>Initialy counter is initialized by zero, but it is possible to 
-             	change it as well by implementing a function with name '_&lt;metric_name&gt;_count_initialize'.
-             	Plugin we are implementing does not require this.</li>
-            <li>Now run Metrix++ to collect and view the results.</li>
-          <pre>&gt; python "/path/to/metrix++.py" collect --myext.magic.numbers</pre>
-          <pre>&gt; python "/path/to/metrix++.py" view</pre>
-          </ol>
-          <h4>Language specific regular expressions</h4>
-          <ol>
-             <li>In the previous step we added matching of constants assuming that identifiers
-             	may have symbols '_', 'a-z', 'A-Z' and '0-9'. It is true for C++ but it is not complete for Java.
-             	Java identifier may have '$' symbol in the identifier. So, let's add language specific pattern
-             	in the declaration of the metric:</li>
-             <pre class="prettyprint linenums">
-import mpp.api
-import re
-
-class Plugin(mpp.api.Plugin,
-             mpp.api.IConfigurable,
-             mpp.api.Child,
-             mpp.api.MetricPluginMixin):
-    
-    def declare_configuration(self, parser):
-        parser.add_option("--myext.magic.numbers", "--mmn",
-            action="store_true", default=False,
-            help="Enables collection of magic numbers metric [default: %default]")
-    
-    def configure(self, options):
-        self.is_active_numbers = options.__dict__['myext.magic.numbers']
-    
-    def initialize(self):
-        # specialized pattern for java
-        pattern_to_search_java = re.compile(
-            r'''((const(\s+[_$a-zA-Z][_$a-zA-Z0-9]*)+\s*[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
-        # pattern for C++ and C# languages
-        pattern_to_search_cpp_cs = re.compile(
-            r'''((const(\s+[_a-zA-Z][_a-zA-Z0-9]*)+\s*[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
-        # pattern for all other languages
-        pattern_to_search = re.compile(
-            r'''\b[0-9]+\b''')
-        self.declare_metric(self.is_active_numbers,
-                            self.Field('numbers', int),
-                            # dictionary of pairs instead of a single pair
-                            {
-                             'std.code.java': (pattern_to_search_java, self.NumbersCounter),
-                             'std.code.cpp': (pattern_to_search_cpp_cs, self.NumbersCounter),
-                             'std.code.cs': (pattern_to_search_cpp_cs, self.NumbersCounter),
-                             '*': pattern_to_search
-                            },
-                            marker_type_mask=mpp.api.Marker.T.CODE,
-                            region_type_mask=mpp.api.Region.T.ANY)
-        
-        super(Plugin, self).initialize(fields=self.get_fields())
-        
-        if self.is_active() == True:
-            self.subscribe_by_parents_interface(mpp.api.ICode)
-
-    class NumbersCounter(mpp.api.MetricPluginMixin.IterIncrementCounter):
-        def increment(self, match):
-            if match.group(0).startswith('const'):
-                return 0
-            return 1
-</pre>
-             <li>Keys in the dictionary of patterns are names of parent plugins (references to code parsers).
-             	The key '*' refers to any parser.</li>
-            <li>Now run Metrix++ to collect and view the results.</li>
-          <pre>&gt; python "/path/to/metrix++.py" collect --myext.magic.numbers</pre>
-          <pre>&gt; python "/path/to/metrix++.py" view</pre>
-          </ol>
-          <h4>Store only non-zero metric values</h4>
-          <ol>
-             <li>Most functions have the metric, which we are implemneting, equal to zero.
-             	However, we are interested in finding code blocks having this metric greater than zero.
-             	Zeros consumes the space in the data file. So, we can optimise the size of a data file,
-             	if we exclude zero metric values. Let's declare this behavior for the metric.</li>
-             <pre class="prettyprint linenums">
-import mpp.api
-import re
-
-class Plugin(mpp.api.Plugin,
-             mpp.api.IConfigurable,
-             mpp.api.Child,
-             mpp.api.MetricPluginMixin):
-    
-    def declare_configuration(self, parser):
-        parser.add_option("--myext.magic.numbers", "--mmn",
-            action="store_true", default=False,
-            help="Enables collection of magic numbers metric [default: %default]")
-    
-    def configure(self, options):
-        self.is_active_numbers = options.__dict__['myext.magic.numbers']
-    
-    def initialize(self):
-        pattern_to_search_java = re.compile(
-            r'''((const(\s+[_$a-zA-Z][_$a-zA-Z0-9]*)+\s*[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
-        pattern_to_search_cpp_cs = re.compile(
-            r'''((const(\s+[_a-zA-Z][_a-zA-Z0-9]*)+\s*[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
-        pattern_to_search = re.compile(
-            r'''\b[0-9]+\b''')
-        self.declare_metric(self.is_active_numbers,
-                            self.Field('numbers', int,
-                                # optimize the size of datafile:
-                                # store only non-zero results
-                                non_zero=True),
-                            {
-                             'std.code.java': (pattern_to_search_java, self.NumbersCounter),
-                             'std.code.cpp': (pattern_to_search_cpp_cs, self.NumbersCounter),
-                             'std.code.cs': (pattern_to_search_cpp_cs, self.NumbersCounter),
-                             '*': pattern_to_search
-                            },
-                            marker_type_mask=mpp.api.Marker.T.CODE,
-                            region_type_mask=mpp.api.Region.T.ANY)
-        
-        super(Plugin, self).initialize(fields=self.get_fields())
-        
-        if self.is_active() == True:
-            self.subscribe_by_parents_interface(mpp.api.ICode)
-
-    class NumbersCounter(mpp.api.MetricPluginMixin.IterIncrementCounter):
-        def increment(self, match):
-            if match.group(0).startswith('const'):
-                return 0
-            return 1
-</pre>
-            <li>Now run Metrix++ to collect and view the results.</li>
-          <pre>&gt; python "/path/to/metrix++.py" collect --myext.magic.numbers</pre>
-          <pre>&gt; python "/path/to/metrix++.py" view</pre>
-          </ol>
-          <h4>Additional per metric configuration options</h4>
-          <ol>
-             <li>It is typical that most numbers counted by the metric are equal to 0, -1 or 1.
-             	They are not necessary magic numbers. 0 or 1 are typical variable initializers.
-             	-1 is a typical negative return code. So, let's implement simplified version of the metric,
-             	which does not count 0, -1 and 1, if the specific new option is set.</li>
-             <pre class="prettyprint linenums">
-import mpp.api
-import re
-
-class Plugin(mpp.api.Plugin,
-             mpp.api.IConfigurable,
-             mpp.api.Child,
-             mpp.api.MetricPluginMixin):
-    
-    def declare_configuration(self, parser):
-        parser.add_option("--myext.magic.numbers", "--mmn",
-            action="store_true", default=False,
-            help="Enables collection of magic numbers metric [default: %default]")
-        # Add new option
-        parser.add_option("--myext.magic.numbers.simplier", "--mmns",
-            action="store_true", default=False,
-            help="Is set, 0, -1 and 1 numbers are not counted [default: %default]")
-    
-    def configure(self, options):
-        self.is_active_numbers = options.__dict__['myext.magic.numbers']
-        # remember the option here
-        self.is_active_numbers_simplier = options.__dict__['myext.magic.numbers.simplier']
-    
-    def initialize(self):
-        pattern_to_search_java = re.compile(
-            r'''((const(\s+[_$a-zA-Z][_$a-zA-Z0-9]*)+\s*[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
-        pattern_to_search_cpp_cs = re.compile(
-            r'''((const(\s+[_a-zA-Z][_a-zA-Z0-9]*)+\s*[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
-        pattern_to_search = re.compile(
-            r'''\b[0-9]+\b''')
-        self.declare_metric(self.is_active_numbers,
-                            self.Field('numbers', int,
-                                non_zero=True),
-                            {
-                             'std.code.java': (pattern_to_search_java, self.NumbersCounter),
-                             'std.code.cpp': (pattern_to_search_cpp_cs, self.NumbersCounter),
-                             'std.code.cs': (pattern_to_search_cpp_cs, self.NumbersCounter),
-                             '*': pattern_to_search
-                            },
-                            marker_type_mask=mpp.api.Marker.T.CODE,
-                            region_type_mask=mpp.api.Region.T.ANY)
-        
-        super(Plugin, self).initialize(fields=self.get_fields(),
-            # remember option settings in data file properties
-            # in order to detect changes in settings on iterative re-run
-            properties=[self.Property('number.simplier', self.is_active_numbers_simplier)])
-        
-        if self.is_active() == True:
-            self.subscribe_by_parents_interface(mpp.api.ICode)
-
-    class NumbersCounter(mpp.api.MetricPluginMixin.IterIncrementCounter):
-        def increment(self, match):
-            if (match.group(0).startswith('const') or
-                (self.plugin.is_active_numbers_simplier == True and
-                 match.group(0) in ['0', '1', '-1', '+1'])):
-                return 0
-            return 1
-</pre>
-            <li>Now run Metrix++ to collect and view the results.</li>
-          <pre>&gt; python "/path/to/metrix++.py" collect --myext.magic.numbers</pre>
-          <pre>&gt; python "/path/to/metrix++.py" view</pre>
-          <pre>
-:: info: Overall metrics for 'myext.magic:numbers' metric
-	Average        : 2.5 (excluding zero metric values)
-	Minimum        : 2
-	Maximum        : 3
-	Total          : 5.0
-	Distribution   : 2 regions in total (including 0 suppressed)
-	  Metric value : Ratio : R-sum : Number of regions
-	             2 : 0.500 : 0.500 : 1	||||||||||||||||||||||||||||||||||||||||||||||||||
-	             3 : 0.500 : 1.000 : 1	||||||||||||||||||||||||||||||||||||||||||||||||||
-
-:: info: Directory content:
-	Directory      : .
-</pre>
-          </ol>
-          <h4>Summary</h4>
-          <p>We have finished with the tutorial. The tutorial explained how to implement simple and advanced metric plugins.
-          	We used built-in Metrix++ base classes. If you need to more advanced plugin capabilities,
-          	override in your plugin class functions inherited from mpp.api base classes. Check code of standard plugins
-          	to learn more techniques.</p>
-          <p></p>
-        </section>
-        <section id="tool_plugin">
-          <h2>Analysis tool plugin</h2>
-          <p>This tutorial will explain how to build custom Metrix++ command, which is bound to custom post-analysis tool.
-          	We will implement the tool, which identifies all new and changed regions and counts number of added lines.
-          	We skip calculating number of deleted lines, but it is easy to extend from what we get finally in the tutorial.</p>
-          <h4>New Metrix++ command / action</h4>
-          <ol>
-             <li>As in the tutorial for metric plugin, set the environment and 
-             	create new python package 'myext', python lib 'compare.py' and 'compare.ini' file.</li>
-             <pre>
-+ working_directory (set in METRIXPLUSPLUS_PATH variable)
-\--+ myext
-   \--- __init__.py
-   \--- compare.py
-   \--- compare.ini
-</pre>
-            <li>__init__.py is empty file to make myext considered by python as a package.</li>
-            <li>Edit compare.py to have the following content:
-             <pre class="prettyprint linenums">
-import mpp.api
-
-class Plugin(mpp.api.Plugin, mpp.api.IRunable):
-    
-    def run(self, args):
-        print args
-        return 0
-</pre>
-            Inheritance from mpp.api.IRunable declares that the plugin is runable and requires implementation of 'run' interface.</li>
-            <li>Edit compare.ini to have the following content:
-             <pre class="prettyprint linenums">
-
-[Plugin]
-version: 1.0
-package: myext
-module:  compare
-class:   Plugin
-depends: None
-actions: compare
-enabled: True
-</pre>
-            This file is a manifest for Metrix++ plugin loader. Actions field has got new value 'compare'.
-            Metrix++ engine will automatically pick this action and will add it to the list of available commands.
-            This plugin will be loaded on 'compare' action.
-            </li>
-            <li>Now run Metrix++ to see how this new plugin works:</li>
-          <pre>&gt; python "/path/to/metrix++.py" compare -- path1 path2 path3</pre>
-          <pre>["path1", "path2", "path3"]</pre>
-          </ol>
-          <h4>Access data file loader and its' interfaces</h4>
-          <ol>
-             <li>By default, all post-analysis tools have got --db-file and --db-file-prev options. It is 
-             	because 'mpp.dbf' plugin is loaded for any action, including our new one 'compare'. In order to continue
-             	the tutorial, we need to have 2 data files with 'std.code.lines:total' metric collected.
-             	So, write to files by running:</li>
-             <pre>cd my_project_version_1
-&gt; python "/path/to/metrix++.py" collect --std.code.lines.total</pre>
-             <pre>cd my_project_version_2
-&gt; python "/path/to/metrix++.py" collect --std.code.lines.total</pre>
-            <li>Edit compare.py file to get the loader and iterate collected file paths:</li>
-             <pre class="prettyprint linenums">
-import mpp.api
-# load common utils for post processing tools
-import mpp.utils
-
-class Plugin(mpp.api.Plugin, mpp.api.IRunable):
-    
-    def run(self, args):
-        # get data file reader using standard metrix++ plugin
-        loader = self.get_plugin('mpp.dbf').get_loader()
-        
-        # iterate and print file length for every path in args
-        exit_code = 0
-        for path in (args if len(args) > 0 else [""]):
-            file_iterator = loader.iterate_file_data(path)
-            if file_iterator == None:
-                mpp.utils.report_bad_path(path)
-                exit_code += 1
-                continue
-            for file_data in file_iterator:
-                print file_data.get_path()
-        return exit_code
-</pre>
-            <li>Now run Metrix++ to see how it works:</li>
-          <pre>&gt; python "/path/to/metrix++.py" compare --db-file=my_project_version_2/metrixpp.db --db-file-prev=my_project_version_1/metrixpp.db</pre>
-          </ol>
-
-          <h4>Identify added, modified files/regions and read metric data</h4>
-          <ol>
-            <li>Let's extend the logic of the tool to compare files and regions, read 'std.code.lines:total' metric
-            	and calcuate the summary of number of added lines. mpp.utils.FileRegionsMatcher is helper class
-            	which does matching and comparison of regions for 2 given mpp.api.FileData objects.</li>
-             <pre class="prettyprint linenums">
-import mpp.api
-import mpp.utils
-import mpp.cout
-
-class Plugin(mpp.api.Plugin, mpp.api.IRunable):
-    
-    def run(self, args):
-        loader = self.get_plugin('mpp.dbf').get_loader()
-        # get previous db file loader
-        loader_prev = self.get_plugin('mpp.dbf').get_loader_prev()
-        
-        exit_code = 0
-        for path in (args if len(args) > 0 else [""]):
-            added_lines = 0
-            file_iterator = loader.iterate_file_data(path)
-            if file_iterator == None:
-                mpp.utils.report_bad_path(path)
-                exit_code += 1
-                continue
-            for file_data in file_iterator:
-                added_lines += self._compare_file(file_data, loader, loader_prev)
-            mpp.cout.notify(path, '', mpp.cout.SEVERITY_INFO,
-                            "Change trend report",
-                            [('Added lines', added_lines)])
-        return exit_code
-
-    def _compare_file(self, file_data, loader, loader_prev):
-        # compare file with previous and return number of new lines
-        file_data_prev = loader_prev.load_file_data(file_data.get_path())
-        if file_data_prev == None:
-            return self._sum_file_regions_lines(file_data)
-        elif file_data.get_checksum() != file_data_prev.get_checksum():
-            return self._compare_file_regions(file_data, file_data_prev)
-
-    def _sum_file_regions_lines(self, file_data):
-        # just sum up the metric for all regions
-        result = 0
-        for region in file_data.iterate_regions():
-            result += region.get_data('std.code.lines', 'total')
-    
-    def _compare_file_regions(self, file_data, file_data_prev):
-        # compare every region with previous and return number of new lines
-        matcher = mpp.utils.FileRegionsMatcher(file_data, file_data_prev)
-        result = 0
-        for region in file_data.iterate_regions():
-            if matcher.is_matched(region.get_id()) == False:
-                # if added region, just add the lines
-                result += region.get_data('std.code.lines', 'total')
-            elif matcher.is_modified(region.get_id()):
-                # if modified, add the difference in lines
-                region_prev = file_data_prev.get_region(
-                    matcher.get_prev_id(region.get_id()))
-                result += (region.get_data('std.code.lines', 'total') -
-                           region_prev.get_data('std.code.lines', 'total'))
-        return result
-</pre>
-            <li>Now run Metrix++ to see how it works:</li>
-          <pre>&gt; python "/path/to/metrix++.py" compare --db-file=my_project_version_2/metrixpp.db --db-file-prev=my_project_version_1/metrixpp.db</pre>
-          <pre>
-:: info: Change trend report
-	Added lines    : 7
-</pre>
-          </ol>
-
-          <h4>Summary</h4>
-          <p>We have finished with the tutorial. The tutorial explained how to read Metrix++ data files and 
-          	implement custom post-processing tools. Even if some existing Metrix++ code requires clean-up and refactoring,
-          	check code of standard tool plugins to learn more techniques.</p>
-        </section>
-        <section id="language_plugin">
-          <h2>Language parser plugin</h2>
-
-                <p>Unfortunately, there is no good documentation at this stage for this part.
-                Briefly, if metric plugin counts and stores data into FileData object,
-                tool plugin reads this data, language plugin construct the original structure of
-                FileData object. The orginal structure includes regions (like functions, classes, etc.)
-                 and markers (like comments, strings, preprocessor, etc.). 
-                 Check code of existing parsers.</p>
-                <ul>
-                  <li>a language parser plugin is registered in the same way as a metric plugin</li>
-                  <li>it registers parser's callback in 'std.tools.collect' plugin</li>
-                  <li>parses a file in a callback, called by 'std.tools.collect'</li>
-                  <li>parser needs to identify markers  and regions 
-                    and tell about this to file data object passed as an
-                    argument for the callback.</li>
-                </ul>
-
-                <p>There are useful options and tools avaialble for
-                trobuleshooting purposes during development:</p>
-                <ul>
-                  <li>metrix++.py debug generates html code showing parsed code structures and their boundaries</li>
-                  <li>--nest-regions for view tool forces the viewer to indent subregions.</li>
-                  <li>--log-level option is available for any command and is helpful to trace execution.</li>
-                </ul>
-
-                <p>Finally, if there are any questions or enquires, please,
-                feel free to <a href="https://sourceforge.net/p/metrixplusplus/tickets/new/">submit new question</a>.</p>
-
-        </section>
-      </div> <!-- end for sections -->
-    </div></div> <!-- end for row and container -->
-
-
-
-    <!-- Footer
-    ================================================== -->
-    <footer class="footer">
-      <div class="container">
-      	<div class="row">
-      		<div class="span3">
-      			<p><a href="http://sourceforge.net/projects/metrixplusplus/"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=275605&amp;type=3"
-		        	alt="Get Metrix++ at SourceForge.net. Fast, secure and Free Open Source software downloads" border="0"></a></p>
-		        <p>&middot;</p>
-		        <p>&middot; &middot;<script type="text/javascript" src="http://www.ohloh.net/p/485947/widgets/project_users_logo.js"></script></p>
-		        <p><a href="http://freecode.com/projects/metrix"><img src="assets/img/fm_logo.png" width="130"></a></p>
-		        <p>&middot;</p>
-		        <p><a href="http://www.softpedia.com/progClean/Metrix-Clean-241097.html"><img src="assets/img/softpedia_free_award_f.gif" width="147" /></a></p>
-      		</div>
-      		<div class="span9">
-		        <p>Copyright <strong>&copy;</strong> 2009 - 2013, <a href="mailto:avkonst@users.sourceforge.net"><span class="normalImportance">Metrix++</span> Project</a></p>
-		        <p>Code licensed under <a href="http://www.gnu.org/licenses/gpl.txt" target="_blank">GPL 3.0</a>, documentation under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
-		        <ul class="footer-links">
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/tickets/new/">Ask question</a></li>
-		          <li class="muted">&middot;</li>
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/tickets/new/">Report defect</a></li>
-		          <li class="muted">&middot;</li>
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/tickets/new/">Feature request</a></li>
-		          <li class="muted">&middot;</li>
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/tickets/search/?q=%21status%3Awont-fix+%26%26+%21status%3Aclosed">Open issues</a></li>
-		          <li class="muted">&middot;</li>
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/wiki/ChangeLog/">Changelog</a></li>
-		        </ul>
-            </div>
-        </div>
-      </div>
-    </footer>
-
-
-
-    <!-- Le javascript
-    ================================================== -->
-    <!-- Placed at the end of the document so the pages load faster -->
-    <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
-    <script src="assets/js/jquery.js"></script>
-    <script src="assets/js/bootstrap-transition.js"></script>
-    <script src="assets/js/bootstrap-alert.js"></script>
-    <script src="assets/js/bootstrap-modal.js"></script>
-    <script src="assets/js/bootstrap-dropdown.js"></script>
-    <script src="assets/js/bootstrap-scrollspy.js"></script>
-    <script src="assets/js/bootstrap-tab.js"></script>
-    <script src="assets/js/bootstrap-tooltip.js"></script>
-    <script src="assets/js/bootstrap-popover.js"></script>
-    <script src="assets/js/bootstrap-button.js"></script>
-    <script src="assets/js/bootstrap-collapse.js"></script>
-    <script src="assets/js/bootstrap-carousel.js"></script>
-    <script src="assets/js/bootstrap-typeahead.js"></script>
-    <script src="assets/js/bootstrap-affix.js"></script>
-
-    <script>
-      !function ($) {
-        $(function(){
-          // carousel demo
-          $('#myCarousel').carousel()
-        })
-      }(window.jQuery)
-    </script>
-
-    <script src="assets/js/holder/holder.js"></script>
-    <script src="assets/js/google-code-prettify/prettify.js"></script>
-
-    <script src="assets/js/application.js"></script>
-
-    <script>
-    
-    </script>
-
-
-    <!-- Analytics
-    ================================================== -->
-    <!--
-    <script>
-      var _gauges = _gauges || [];
-      (function() {
-        var t   = document.createElement('script');
-        t.type  = 'text/javascript';
-        t.async = true;
-        t.id    = 'gauges-tracker';
-        t.setAttribute('data-site-id', '4f0dc9fef5a1f55508000013');
-        t.src = '//secure.gaug.es/track.js';
-        var s = document.getElementsByTagName('script')[0];
-        s.parentNode.insertBefore(t, s);
-      })();
-    </script>
-	-->
-  </body>
-</html>

+ 0 - 614
docs/home.html

@@ -1,614 +0,0 @@
-<!DOCTYPE html>
-<!--
-
-    Metrix++, Copyright 2009-2013, Metrix++ Project
-    Link: http://metrixplusplus.sourceforge.net
-    
-    This file is part of Metrix++ Tool.
-    
-    Metrix++ is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, version 3 of the License.
-    
-    Metrix++ is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-    GNU General Public License for more details.
-    
-    You should have received a copy of the GNU General Public License
-    along with Metrix++.  If not, see <http://www.gnu.org/licenses/>.
-
--->
-<html lang="en">
-  <head>
-    <meta charset="utf-8">
-    <title>Metrix++ Project</title>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <meta name="description" content="">
-    <meta name="author" content="">
-
-    <!-- Le styles -->
-    <!--
-    <link href="../../style.css" rel="stylesheet">
-    -->
-    <link href="assets/css/bootstrap.css" rel="stylesheet">
-    <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
-    <link href="assets/css/docs.css" rel="stylesheet">
-    <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
-    
-    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
-    <!--[if lt IE 9]>
-      <script src="assets/js/html5shiv.js"></script>
-    <![endif]-->
-
-    <!-- Le fav and touch icons -->
-    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
-    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
-    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
-    <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
-    <link rel="shortcut icon" href="assets/ico/favicon.png">
-
-	<!--
-    <script type="text/javascript">
-      var _gaq = _gaq || [];
-      _gaq.push(['_setAccount', 'UA-146052-10']);
-      _gaq.push(['_trackPageview']);
-      (function() {
-        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
-      })();
-    </script>
-   -->
-  </head>
-
-  <body data-spy="scroll" data-target=".bs-docs-sidebar">
-
-    <!-- Navbar
-    ================================================== -->
-    <div class="navbar navbar-link navbar-fixed-top">
-      <div class="navbar-inner">
-        <div class="container">
-          <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-          </button>
-          <a class="brand" href="./index.html">Metrix++</a>
-          <div class="nav-collapse collapse">
-            <ul class="nav">
-              <li class="">
-                <a href="./index.html">Home</a>
-              </li>
-              <li class="">
-                <a href="./workflow.html">Workflow</a>
-              </li>
-              <li class="">
-                <a href="./extend.html">Create plugin</a>
-              </li>
-            </ul>
-          </div>
-        </div>
-      </div>
-    </div>
-
-    <!-- Subhead
-    ================================================== -->
-    <header class="jumbotron" id="overview">
-      <div id="myCarousel" class="carousel slide">
-        <div class="carousel-inner">
-          <div class="item active">
-            <img src="assets/img/slide-01.jpg" alt="">
-            <div class="container">
-              <div class="carousel-caption">
-                <h2>Multiple languages</h2>
-                <p class="lead">&middot; C/C++, C# and Java.</p>
-                <p class="lead">&middot; Recognises classes, interfaces, namespaces, functions, comments, preprocessor and much more.</p>
-              </div>
-            </div>
-          </div>
-          <div class="item">
-            <img src="assets/img/slide-02.jpg" alt="">
-            <div class="container">
-              <div class="carousel-caption">
-                <h2>Multiple metrics</h2>
-                <p class="lead">&middot; Complexity, size and other.</p>
-              </div>
-            </div>
-          </div>
-          <div class="item">
-            <img src="assets/img/slide-03.jpg" alt="">
-            <div class="container">
-              <div class="carousel-caption">
-                <h2>High performance and scalability</h2>
-                <p class="lead">&middot; Applicable to huge code bases: thousands of files per minute.</p>
-                <p class="lead">&middot; Ultra-fast feedback on iterative re-run.</p>
-              </div>
-            </div>
-          </div>
-          <div class="item">
-            <img src="assets/img/slide-01.jpg" alt="">
-            <div class="container">
-              <div class="carousel-caption">
-                <h2>Effortless application to legacy code</h2>
-                <p class="lead">&middot; Recognises legacy, modified and new code.</p>
-                <p class="lead">&middot; Prevents from negative trends. Encourages positive.</p>
-              </div>
-            </div>
-          </div>
-          <div class="item">
-            <img src="assets/img/slide-02.jpg" alt="">
-            <div class="container">
-              <div class="carousel-caption">
-                <h2>Configurable</h2>
-                <p class="lead">&middot; Define and apply your rules and policies.</p>
-                <p class="lead">&middot; Integrate with your workflow.</p>
-              </div>
-            </div>
-          </div>
-          <div class="item">
-            <img src="assets/img/slide-03.jpg" alt="">
-            <div class="container">
-              <div class="carousel-caption">
-                <h2>Extendable via plugins</h2>
-                <p class="lead">&middot; Define your custom metric.</p>
-                <p class="lead">&middot; Add new language parser.</p>
-                <p class="lead">&middot; Create advanced post-analysis tool.</p>
-              </div>
-            </div>
-          </div>
-        </div>
-        <a class="left carousel-control" href="#myCarousel" data-slide="prev">&lsaquo;</a>
-        <a class="right carousel-control" href="#myCarousel" data-slide="next">&rsaquo;</a>
-      </div>      
-      <div class="container">
-        <div class="row">
-          <div class="span3">
-          </div>
-          <div class="span9">
-            <h5 class="text-right">Management of source code quality is possible.</h5>
-            <p class="text-right">
-                <a href="https://sourceforge.net/projects/metrixplusplus/files/latest/download" target="blank"
-                    ><button type="button"class="btn btn-danger">Download</button></a>
-                <!--
-                <button type="button"class="btn btn-warning">Donate</button>
-                -->
-            </p>
-          </div>
-        </div>
-      </div>
-    </header>
-
-    <div class="container"><div class="row">
-      
-      <!-- Docs nav
-	  ================================================== -->
-      <div class="span3 bs-docs-sidebar">
-        <ul class="nav nav-list bs-docs-sidenav">
-          <!--<li><img src="../../logo_project.png"/><p>&nbsp;</p></li>-->
-          <li><a href="#overview_section"><i class="icon-chevron-right"></i> Overview</a></li>
-          <li><a href="#overview_languages_section"><i class="icon-hand-right"></i>  &middot; languages</a></li>
-          <li><a href="#overview_metrics_section"><i class="icon-hand-right"></i>  &middot; metrics</a></li>
-          <li><a href="#download_section"><i class="icon-chevron-right"></i> Download &amp; Install</a></li>
-          <li><a href="#workflow_section"><i class="icon-chevron-right"></i> Getting started</a></li>
-          <li><a href="#extend_section"><i class="icon-chevron-right"></i> Extending the tool</a></li>
-          <li><a href="#contribute_section"><i class="icon-chevron-right"></i> Feedback &amp; Contribute</a></li>
-        </ul>
-      </div>
-      
-      <!-- Sections
-	  ================================================== -->
-      <div class="span9">
-        <section id="overview_section">
-          <div class="page-header">
-            <h1>Overview</h1>
-          </div>
-
-          <h2>Highlights</h2>
-          <p>Metrix++ is a tool to collect and analyse code metrics. Any metric is useless if it is not used.
-             Metrix++ offers ease of introduction and integration with a variety of application use cases.</p>
-          <ul>
-            <li>Monitoring trends (eg. on <strong>daily</strong> basis. In order to take actions or make right decisions earlier.)</li>
-            <li>Enforcing trends (eg. on <strong>hourly</strong> basis, at every commit of code changes.)</li>
-            <li>Automated asistance to review agains standards (eg. on <strong>per minute</strong> basis during code refactoring and code development.)</li>
-          </ul>
-
-          <p>The workflow sections below demonstarate these basic application usecases.</p>
-
-        </section>
-        <section id="overview_languages_section">
-          <h2>Languages supported</h2>
-          <p>The tool can parse C/C++, C# and Java source code files. The parser identifies certain regions in the code,
-             such as classes, functions, namespaces, interfaces, etc. It detects comments, strings and code for the preprocessor.
-             The identified regions form a tree of nested source code blocks, which are subsequently refered to and scanned by metrics plugins.
-             Thus the tool attributes metrics to regions, which provides fine grained data to analysis tools.
-             The following example demonstrates the regions concept.</p>
-             
-          <table class="table">
-            <thead>
-              <tr>
-                <th>Source code</th>
-                <th>Regions tree [type: name: content type]</th>
-              </tr>
-            </thead>
-            <tbody>
-              <tr>
-                <td>
-<pre class="prettyprint linenums">
-// simple C++ code
-
-#include &lt;myapi.h&gt;
-
-// I explain the following class
-class MyClass {
-public:
-    int m_var; // some member
-
-    // I explain the following function
-    MyClass(): m_var(0) {
-        char str[] = "unused string"
-        
-        // nested region for good measure
-        struct MyStruct {};
-    }
-    
-    // Do not judge ugly code below
-#define get_max(a,b) ((a)>(b)?(a):(b))
-    set_max(int b) {
-        m_var = get_max(m_var, b);
-    }
-};
-// this is the last line
-</pre>
-                </td>
-                <td>
-<pre class="prettyprint linenums">
-file: __global__: comment
-file: __global__: code
-file: __global__: preprocessor
-file: __global__: code
-    class: MyClass: comment
-    class: MyClass: code
-    class: MyClass: code
-    class: MyClass: code, comment
-    class: MyClass: code
-        function: MyClass: comment
-        function: MyClass: code
-        function: MyClass: code, string
-        function: MyClass: code
-            struct: MyStruct: comment
-            struct: MyStruct: code
-        function: MyClass: code
-    class: MyClass: code
-        function: set_max: comment
-        function: set_max: preprocessor
-        function: set_max: code
-        function: set_max: code
-        function: set_max: code
-    class: MyClass: code
-file: __global__: comment
-</pre>
-                </td>
-              </tr>
-            </tbody>
-          </table>
-
-        </section>
-        <section id="overview_metrics_section">
-          <h2>Metrics</h2>
-          <p>The metrics highlighed in blue are <strong>per file</strong> metrics. The other metrics are <strong>per region</strong> metrics.</p>
-          <table class="table table-bordered">
-            <thead>
-              <tr>
-                <th>Metric (enable option)</th>
-                <th>Brief description</th>
-                <th>Motivation / Potential use</th>
-              </tr>
-            </thead>
-            <tbody>
-              <tr class="info">
-                <td>std.general.size</td>
-                <td>Size of a file in bytes.</td>
-                <td rowspan="6"><ul><li>Monitoring the growth of source code base.</li>
-                    <li>Normalizing other metrics.</li>
-                    <li>Preventing large files and regions (large things are difficult to maintain).</li>
-                    <li>Predicting delivery dates by comparing
-                        <a href="http://www.compaid.com/caiInternet/casestudies/kanarticle2.pdf" target="blank">S-shaped code base growth / change curves</a>.</li></ul></td>
-              </tr>
-              <tr>
-                <td>std.code.length.total</td>
-                <td>The same as 'std.general.size' metric, but attributed to code regions.</td>
-              </tr>
-              <tr class="info">
-                <td>std.code.filelines.total</td>
-                <td>Number of non-blank lines of code of any content type (exectuable, comments, etc.) per file</td>
-              </tr>
-              <tr>
-                <td>std.code.lines.total</td>
-                <td>Number of non-blank lines of code of any content type (exectuable, comments, etc.) per region</td>
-              </tr>
-              <tr class="info">
-                <td>std.code.filelines.code</td>
-                <td>Number of non-blank lines of code excluding preprocessor and comments per file.</td>
-              </tr>
-              <tr>
-                <td>std.code.lines.code</td>
-                <td>Number of non-blank lines of code excluding preprocessor and comments per region.</td>
-              </tr>
-              <tr class="info">
-                <td>std.code.filelines.preprocessor</td>
-                <td>Number of non-blank lines of preprocessor code per file.</td>
-                <td rowspan="2"><ul><li>Enforcing localisation of preprocessor code in a single place.</li>
-                    <li>Encouraging usage of safer code structures instead of the preprocessor.</li></ul></td>
-              </tr>
-              <tr>
-                <td>std.code.lines.preprocessor</td>
-                <td>Number of non-blank lines of preprocessor code per region.</td>
-              </tr>
-              <tr class="info">
-                <td>std.code.fileslines.comments</td>
-                <td>Number of non-blank lines of comments per file.</td>
-                <td rowspan="2"><ul><li>Low number of comments may indicate maintainability problems.</li></ul></td>
-              </tr>
-              <tr>
-                <td>std.code.lines.comments</td>
-                <td>Number of non-blank lines of comments per region.</td>
-              </tr>
-              <tr>
-                <td>std.code.complexity.cyclomatic</td>
-                <td>McCabe cyclomatic complexity metric.</td>
-                <td colspan="2"><ul><li>Identification of highly complex code for review and refactoring.</li>
-                    <li>Preventing complex functions (complexity is a reason of many defects and a reason of expensive maintaintenance).</li></ul></td>
-              </tr>
-              <tr>
-                <td>std.code.complexity.maxindent</td>
-                <td>Maximum level of indentation of blocks within a region. For example, the following class has got 
-                	the metric equal to 1 and the function has got it equal to 2:
-                	<pre class="prettyprint">
-class WeekClass {
-    int isWeekend(int day) {
-        if (day == SATURDAY ||
-            day == SUNDAY) {
-            return true;
-        }
-        return false;
-    }
-}
-</pre>
-                	</td>
-              </tr>
-              <tr>
-                <td>std.code.magic.numbers</td>
-                <td>Number of magic numbers. There is an option to exclude 0, -1 and 1 numbers from counting.</td>
-                <td>Magic numbers are dangerous.
-                	The <a href="http://stackoverflow.com/questions/47882/what-is-a-magic-number-and-why-is-it-bad" target="blank">
-                		discussion on stackoverflow</a> explains why.</td>
-              </tr>
-              <tr>
-                <td>std.code.todo.comments, std.code.todo.strings</td>
-                <td>Number of TODO/FIXME/etc markers in comments and strings accordingly.
-                	There is an option to configure a list of markers.</td>
-                <td>Manage potentially incomplete work. If project manager dispatches issues only in a tracker tool,
-                	todo markers are lost in the source code. The metric could make these 'lost' issues visible.</td>
-              </tr>
-              <tr>
-                <td>std.code.maintindex.simple</td>
-                <td>Simple variant of maintainability index - a measure of maintainability.
-                	It uses std.code.lines:code and std.code.complexity:cyclomatic
-                	metrics to evaluate level of maintainability. Lower value of this index indicates
-                	better level maintainability</td>
-                <td>Identify code, which may benefit the most from refactoring.</td>
-              </tr>
-              <tr>
-                <td>std.suppress</td>
-                <td>An option enables collection of Metrix++ suppressions and 2 metrics: 'std.suppress:count' and 
-                    'std.suppress.file:count'. The first is number of suppressions per region.
-                    The second is the same but applies for file-scope metrics.</td>
-                <td><ul><li>Suppressing false-positives.</li>
-                    <li>Managing the amount of suppressions. There should be no false-positives to suppress with the right metric,
-                        but there could be exceptions in specific cases. Managing suppressions is about managing exceptions.
-                        If there are many exceptional cases, maybe something is wrong with a metric or the application of a metric.</li></ul></td>
-              </tr>
-              <tr class="info">
-                <td>std.general.procerrors</td>
-                <td>Number of errors detected by Metrix++ code parser.</td>
-                <td><ul><li>Cleaning up errors to ensure reliable code scanning.</li>
-                	<li>Errors, like mismatched brackets, may result in bad identification of regions.</li>
-                </ul></td>
-              </tr>
-              <tr class="info">
-                <td>std.general.proctime</td>
-                <td>Seconds spent on processing a file.</td>
-                <td><ul><li>Monitor and profile Metrix++ tool's performance.</li></ul></td>
-              </tr>
-            </tbody>
-          </table>
-
-        </section>
-
-        <section id="download_section">
-          <div class="page-header">
-            <h1>Download &amp; Install</h1>
-          </div>
-
-          <p>In order to get the tool working, <a href="https://sourceforge.net/projects/metrixplusplus/files/latest/download" target="blank">dowload the archive</a> with the latest stable version
-             and unpack it to some folder. The first run of the tool will trigger the installation within the folder,
-             where it was launched.</p>
-
-          <p>In order to checkout the latest released version from the <a href="https://sourceforge.net/p/metrixplusplus/code" target="blank">version control system</a> use this command:</p>
-          <pre>svn checkout <a href="https://sourceforge.net/p/metrixplusplus/code" target="blank">svn://svn.code.sf.net/p/metrixplusplus/code</a>/releases/latest Metrix++</pre>
-
-          <p>In order to checkout the latest version under development, use this command:</p>
-          <pre>svn checkout <a href="https://sourceforge.net/p/metrixplusplus/code" target="blank">svn://svn.code.sf.net/p/metrixplusplus/code</a>/mainline Metrix++</pre>
-
-          <h4>Change and Release Notes</h4>
-          <p>Change and release notes are available <a href="https://sourceforge.net/p/metrixplusplus/wiki/ChangeLog/" target="blank">here</a>.</p>
-
-          <h4>Prerequisites</h4>
-          <p>Python Runtime Environment (version 2.7.* or later. Version 3.* has not been tested)</p>
-
-          <h4>License</h4>
-          <p>This program is free software; you can redistribute it and/or modify it
-             under the terms of the GNU General Public License as published by the
-             Free Software Foundation; version 3 of the License.</p>
-          <p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-             without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-             See the GNU General Public License for more details.</p>
-          <p>You should have received a copy of the GNU General Public License along with the Metrix++;
-             if not, contact <a href="mailto:avkonst@users.sourceforge.net?subject=Metrix%2B%2B License">Project Administrator</a></p>
-             
-        </section>
-
-        <section id="workflow_section">
-          <div class="page-header">
-            <h1>Getting started</h1>
-          </div>
-          <p>The tool is relatively simple to use. There are 3 fundamental steps:</p>
-          <ul>
-          	<li>Collect the data, for example:</li>
-          <pre>
-&gt; python "/path/to/metrix++.py" collect --std.code.lines.code --std.code.complexity.cyclomatic
-</pre>
-          </ul>
-          <ul>
-          	<li>View the data, for example:</li>
-          <pre>
-&gt; python "/path/to/metrix++.py" view
-</pre>
-          </ul>
-          <ul>
-          	<li>Apply thresholds, for example:</li>
-          <pre>
-&gt; python "/path/to/metrix++.py" limit --max-limit=std.code.complexity:cyclomatic:7
-</pre>
-          </ul>
-            <p>Please, check the advanced <a href="workflow.html">description of the workflow</a> with real examples.</p>
-        </section>
-
-        <section id="extend_section">
-          <div class="page-header">
-            <h1>Extending the tool</h1>
-          </div>
-            <p>Want to enable a new metric or a language, need advanced post-analysis tool?
-            	Please, check the <a href="extend.html">plugin development tutorial</a>.</p>
-
-        </section>
-
-        <section id="contribute_section">
-          <div class="page-header">
-            <h1>Feeback and contribute</h1>
-          </div>
-          <p>Now it is your turn. There are multiple ways how you can contribute and help to improve and progress Metrix++ project:</p>
-          <ul>
-          	<li>Try Metrix++ and <a href="https://sourceforge.net/projects/metrixplusplus/reviews/new">post review</a></li>
-          	<li><a href="https://sourceforge.net/p/metrixplusplus/tickets/new/">Submit new feature request or bug report</a></li>
-          	<li><a href="https://sourceforge.net/p/metrixplusplus/tickets/new/">Ask a question</a></li>
-          	<li>Share your patch files and ideas, colloborate by email to 
-          		<a href="mailto:avkonst@users.sourceforge.net?subject=Metrix%2B%2B Project Request" target="blank">project administrator</a></li>
-          	<li>Create and publish your plugin. 
-          		<a href="mailto:avkonst@users.sourceforge.net?subject=Metrix%2B%2B Plugin Reference" target="blank">Request to refer</a>
-          			 to it from Metrix++ project space.</li>
-          	<li><a href="mailto:avkonst@users.sourceforge.net?subject=Metrix%2B%2B Plugin Submission" target="blank">Submit your plugin</a>
-          		 to include to the standard set</li>
-          	<li>... and consider to
-          		<a href="mailto:avkonst@users.sourceforge.net?subject=Metrix%2B%2B Join Request" target="blank">join the project</a>!</li>
-          </ul>
-        </section>
-
-      </div> <!-- end for sections -->
-    </div></div> <!-- end for row and container -->
-
-
-
-    <!-- Footer
-    ================================================== -->
-    <footer class="footer">
-      <div class="container">
-      	<div class="row">
-      		<div class="span3">
-      			<p><a href="http://sourceforge.net/projects/metrixplusplus/"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=275605&amp;type=3"
-		        	alt="Get Metrix++ at SourceForge.net. Fast, secure and Free Open Source software downloads" border="0"></a></p>
-		        <p>&middot;</p>
-		        <p>&middot; &middot;<script type="text/javascript" src="http://www.ohloh.net/p/485947/widgets/project_users_logo.js"></script></p>
-		        <p><a href="http://freecode.com/projects/metrix"><img src="assets/img/fm_logo.png" width="130"></a></p>
-		        <p>&middot;</p>
-		        <p><a href="http://www.softpedia.com/progClean/Metrix-Clean-241097.html"><img src="assets/img/softpedia_free_award_f.gif" width="147" /></a></p>
-      		</div>
-      		<div class="span9">
-		        <p>Copyright <strong>&copy;</strong> 2009 - 2013, <a href="mailto:avkonst@users.sourceforge.net"><span class="normalImportance">Metrix++</span> Project</a></p>
-		        <p>Code licensed under <a href="http://www.gnu.org/licenses/gpl.txt" target="_blank">GPL 3.0</a>, documentation under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
-		        <ul class="footer-links">
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/tickets/new/">Ask question</a></li>
-		          <li class="muted">&middot;</li>
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/tickets/new/">Report defect</a></li>
-		          <li class="muted">&middot;</li>
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/tickets/new/">Feature request</a></li>
-		          <li class="muted">&middot;</li>
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/tickets/search/?q=%21status%3Awont-fix+%26%26+%21status%3Aclosed">Open issues</a></li>
-		          <li class="muted">&middot;</li>
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/wiki/ChangeLog/">Changelog</a></li>
-		        </ul>
-            </div>
-        </div>
-      </div>
-    </footer>
-
-
-
-    <!-- Le javascript
-    ================================================== -->
-    <!-- Placed at the end of the document so the pages load faster -->
-    <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
-    <script src="assets/js/jquery.js"></script>
-    <script src="assets/js/bootstrap-transition.js"></script>
-    <script src="assets/js/bootstrap-alert.js"></script>
-    <script src="assets/js/bootstrap-modal.js"></script>
-    <script src="assets/js/bootstrap-dropdown.js"></script>
-    <script src="assets/js/bootstrap-scrollspy.js"></script>
-    <script src="assets/js/bootstrap-tab.js"></script>
-    <script src="assets/js/bootstrap-tooltip.js"></script>
-    <script src="assets/js/bootstrap-popover.js"></script>
-    <script src="assets/js/bootstrap-button.js"></script>
-    <script src="assets/js/bootstrap-collapse.js"></script>
-    <script src="assets/js/bootstrap-carousel.js"></script>
-    <script src="assets/js/bootstrap-typeahead.js"></script>
-    <script src="assets/js/bootstrap-affix.js"></script>
-
-    <script>
-      !function ($) {
-        $(function(){
-          // carousel demo
-          $('#myCarousel').carousel()
-        })
-      }(window.jQuery)
-    </script>
-
-    <script src="assets/js/holder/holder.js"></script>
-    <script src="assets/js/google-code-prettify/prettify.js"></script>
-
-    <script src="assets/js/application.js"></script>
-
-    <script>
-    
-    </script>
-
-
-    <!-- Analytics
-    ================================================== -->
-    <!--
-    <script>
-      var _gauges = _gauges || [];
-      (function() {
-        var t   = document.createElement('script');
-        t.type  = 'text/javascript';
-        t.async = true;
-        t.id    = 'gauges-tracker';
-        t.setAttribute('data-site-id', '4f0dc9fef5a1f55508000013');
-        t.src = '//secure.gaug.es/track.js';
-        var s = document.getElementsByTagName('script')[0];
-        s.parentNode.insertBefore(t, s);
-      })();
-    </script>
-	-->
-  </body>
-</html>

+ 0 - 35
docs/index.html

@@ -1,35 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!--
-
-    Metrix++, Copyright 2009-2013, Metrix++ Project
-    Link: http://metrixplusplus.sourceforge.net
-    
-    This file is part of Metrix++ Tool.
-    
-    Metrix++ is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, version 3 of the License.
-    
-    Metrix++ is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-    GNU General Public License for more details.
-    
-    You should have received a copy of the GNU General Public License
-    along with Metrix++.  If not, see <http://www.gnu.org/licenses/>.
-
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="cache-control" content="max-age=0" />
-<meta http-equiv="cache-control" content="no-cache" />
-<meta http-equiv="expires" content="0" />
-<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
-<meta http-equiv="pragma" content="no-cache" />
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-5" />
-<meta http-equiv="REFRESH" content="0;url=./home.html">
-<title>Metrix++ Index Page</title>
-</head>
-<body>
-</body>
-</html>

+ 0 - 35
docs/project.html

@@ -1,35 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!--
-
-    Metrix++, Copyright 2009-2013, Metrix++ Project
-    Link: http://metrixplusplus.sourceforge.net
-    
-    This file is part of Metrix++ Tool.
-    
-    Metrix++ is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, version 3 of the License.
-    
-    Metrix++ is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-    GNU General Public License for more details.
-    
-    You should have received a copy of the GNU General Public License
-    along with Metrix++.  If not, see <http://www.gnu.org/licenses/>.
-
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="cache-control" content="max-age=0" />
-<meta http-equiv="cache-control" content="no-cache" />
-<meta http-equiv="expires" content="0" />
-<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
-<meta http-equiv="pragma" content="no-cache" />
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-5" />
-<meta http-equiv="REFRESH" content="0;url=./home.html">
-<title>Metrix++ Index Page</title>
-</head>
-<body>
-</body>
-</html>

+ 0 - 784
docs/workflow.html

@@ -1,784 +0,0 @@
-<!DOCTYPE html>
-<!--
-
-    Metrix++, Copyright 2009-2013, Metrix++ Project
-    Link: http://metrixplusplus.sourceforge.net
-    
-    This file is part of Metrix++ Tool.
-    
-    Metrix++ is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, version 3 of the License.
-    
-    Metrix++ is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-    GNU General Public License for more details.
-    
-    You should have received a copy of the GNU General Public License
-    along with Metrix++.  If not, see <http://www.gnu.org/licenses/>.
-
--->
-<html lang="en">
-  <head>
-    <meta charset="utf-8">
-    <title>Metrix++ Project</title>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <meta name="description" content="">
-    <meta name="author" content="">
-
-    <!-- Le styles -->
-    <!--
-    <link href="../../style.css" rel="stylesheet">
-    -->
-    <link href="assets/css/bootstrap.css" rel="stylesheet">
-    <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
-    <link href="assets/css/docs.css" rel="stylesheet">
-    <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
-    
-    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
-    <!--[if lt IE 9]>
-      <script src="assets/js/html5shiv.js"></script>
-    <![endif]-->
-
-    <!-- Le fav and touch icons -->
-    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
-    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
-    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
-    <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
-    <link rel="shortcut icon" href="assets/ico/favicon.png">
-
-	<!--
-    <script type="text/javascript">
-      var _gaq = _gaq || [];
-      _gaq.push(['_setAccount', 'UA-146052-10']);
-      _gaq.push(['_trackPageview']);
-      (function() {
-        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
-        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
-        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
-      })();
-    </script>
-   -->
-  </head>
-
-  <body data-spy="scroll" data-target=".bs-docs-sidebar">
-
-    <!-- Navbar
-    ================================================== -->
-    <div class="navbar navbar-link navbar-fixed-top">
-      <div class="navbar-inner">
-        <div class="container">
-          <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-          </button>
-          <a class="brand" href="./index.html">Metrix++</a>
-          <div class="nav-collapse collapse">
-            <ul class="nav">
-              <li class="">
-                <a href="./index.html">Home</a>
-              </li>
-              <li class="">
-                <a href="./workflow.html">Workflow</a>
-              </li>
-              <li class="">
-                <a href="./extend.html">Create plugin</a>
-              </li>
-            </ul>
-          </div>
-        </div>
-      </div>
-    </div>
-
-    <!-- Subhead
-    ================================================== -->
-    <header class="jumbotron" id="overview">
-      <div class="container">
-        <div class="row">
-          <div class="span3">
-          </div>
-          <div class="span9">
-            <h5 class="text-right">Management of source code quality is possible.</h5>
-            <p class="text-right">
-                <a href="https://sourceforge.net/projects/metrixplusplus/files/latest/download"
-                    ><button type="button"class="btn btn-danger">Download</button></a>
-                <!--
-                <button type="button"class="btn btn-warning">Donate</button>
-                -->
-            </p>
-          </div>
-        </div>
-      </div>
-    </header>
-
-    <div class="container"><div class="row">
-      
-      <!-- Docs nav
-	  ================================================== -->
-      <div class="span3 bs-docs-sidebar">
-        <ul class="nav nav-list bs-docs-sidenav">
-          <li><a href="#workflow_collect_section"><i class="icon-chevron-right"></i> Workflow: Collect data</a></li>
-          <li><a href="#workflow_view_section"><i class="icon-chevron-right"></i> Workflow: View data</a></li>
-          <li><a href="#workflow_view_summary_section"><i class="icon-hand-right"></i> &middot; summary &amp; distributions</a></li>
-          <li><a href="#workflow_view_details_section"><i class="icon-hand-right"></i> &middot; details per file/region</a></li>
-          <li><a href="#workflow_limit_section"><i class="icon-chevron-right"></i> Workflow: Apply thresholds</a></li>
-          <li><a href="#workflow_limit_hotspots_section"><i class="icon-hand-right"></i> &middot; hotspots</a></li>
-          <li><a href="#workflow_limit_control_section"><i class="icon-hand-right"></i> &middot; controlling trends</a></li>
-          <li><a href="#workflow_other_section"><i class="icon-chevron-right"></i> Workflow: Other applications</a></li>
-        </ul>
-      </div>
-      
-      <!-- Sections
-	  ================================================== -->
-      <div class="span9">
-        <div class="page-header">
-          <h1>Workflow</h1>
-        </div>
-        <p>The workflow and application usecases are demonstrated using source code from the 
-        	<a href="http://www.boost.org/doc/libs/1_54_0/doc/html/interprocess.html">boost/interprocess library</a>.
-        	Boost versions 1.52 and 1.54 are used and refered below as the 'previous' version and the 'current' version accordingly.</p>
-        <section id="workflow_collect_section">
-          <h2>Collect data</h2>
-          <p>The first step is to collect the data.
-             The 'collect' tool has got multiple options to enable various metrics plugins.
-             Let's collect the number of lines of code and cyclomatic complexity metrics
-             for the previous (1.52.0 version) boost interprocess library. Assuming that 2 versions of boost library
-             are unpacked in the current working directory:</p>
-          <pre>
-&gt; cd boost_1_52_0
-&gt; python "/path/to/metrix++.py" collect --std.code.lines.code --std.code.complexity.cyclomatic -- boost/interprocess
-&gt; cd ../ # return back to working directory
-</pre>
-          <p>The list of arguments after '--' enumerates the paths to read the source files.
-          	As a result of execution of this command, a file metrixpp.db will be written in the current working directory.
-          	It can be redefined using the --db-file option.</p>
-          <p>Metrix++ can compare code bases which reduces processing scope to the modified or new code.
-          	So, let's collect the same data for the current (1.54.0 version) boost interprocess library.</p>
-          <pre>
-&gt; cd boost_1_54_0
-&gt; python "/path/to/metrix++.py" collect --std.code.lines.code --std.code.complexity.cyclomatic -- boost/interprocess --db-file-prev=../boost_1_52_0/metrixpp.db
-&gt; cd ../ # return back to working directory
-</pre>
-          <p>The option --db-file-prev points to the file with the data collected in the previous step.
-          	So, eventually it executed iterative collection. It can speed up the exectuion significantly,
-          	depending on amount of changes between two version.</p>
-          <p>Check other options of the collect tool by executing:</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" collect --help
-</pre>
-        </section>
-        <section id="workflow_view_section">
-          <h2>View data</h2>
-        </section>
-        <section id="workflow_view_summary_section">
-          <h3>Summary metrics and distribution tables/graphs</h3>
-          <p>It is time to look at the data files collected (step above). The command:</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" view --db-file=boost_1_54_0/metrixpp.db
-</pre>
-          <p>prints summary metrics, like minimum/maximum, and distribution/frequency tables:</p>
-          <pre>
-:: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
-	Average        : 0.652902698283
-	Minimum        : 0
-	Maximum        : 37
-	Total          : 1597.0
-	Distribution   : 2446 regions in total (including 0 suppressed)
-	  Metric value : Ratio : R-sum : Number of regions
-	             0 : 0.771 : 0.771 : 1886	|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-	             1 : 0.110 : 0.881 :  268	|||||||||||
-	             2 : 0.044 : 0.925 :  108	||||
-	             3 : 0.025 : 0.949 :   60	||
-	             4 : 0.016 : 0.966 :   40	||
-	             5 : 0.007 : 0.973 :   18	|
-	             6 : 0.006 : 0.979 :   14	|
-	             7 : 0.004 : 0.983 :   10	
-	             8 : 0.003 : 0.986 :    8	
-	             9 : 0.002 : 0.988 :    4	
-	            10 : 0.004 : 0.991 :    9	
-	            11 : 0.002 : 0.993 :    4	
-	            12 : 0.001 : 0.994 :    3	
-	            13 : 0.001 : 0.995 :    2	
-	            14 : 0.001 : 0.996 :    2	
-	         15-16 : 0.001 : 0.997 :    3	
-	         17-18 : 0.001 : 0.998 :    3	
-	            20 : 0.000 : 0.999 :    1	
-	         23-25 : 0.001 : 1.000 :    2	
-	            37 : 0.000 : 1.000 :    1	
-
-:: info: Overall metrics for 'std.code.lines:code' metric
-	Average        : 6.64356984479
-	Minimum        : 0
-	Maximum        : 201
-	Total          : 23970.0
-	Distribution   : 3608 regions in total (including 0 suppressed)
-	  Metric value : Ratio : R-sum : Number of regions
-	           0-1 : 0.088 : 0.088 :  319	|||||||||
-	             2 : 0.320 : 0.409 : 1155	||||||||||||||||||||||||||||||||
-	             3 : 0.108 : 0.517 :  390	|||||||||||
-	             4 : 0.081 : 0.598 :  294	||||||||
-	             5 : 0.080 : 0.678 :  290	||||||||
-	             6 : 0.061 : 0.739 :  220	||||||
-	             7 : 0.049 : 0.788 :  176	|||||
-	             8 : 0.030 : 0.818 :  109	|||
-	             9 : 0.025 : 0.843 :   89	||
-	         10-11 : 0.032 : 0.876 :  117	|||
-	         12-13 : 0.020 : 0.895 :   71	||
-	            14 : 0.012 : 0.907 :   43	|
-	         15-16 : 0.017 : 0.924 :   61	||
-	         17-19 : 0.015 : 0.939 :   55	||
-	         20-22 : 0.013 : 0.952 :   46	|
-	         23-26 : 0.011 : 0.963 :   40	|
-	         27-30 : 0.009 : 0.972 :   33	|
-	         31-39 : 0.009 : 0.981 :   33	|
-	         40-65 : 0.009 : 0.991 :   34	|
-	        66-201 : 0.009 : 1.000 :   33	|
-
-:: info: Directory content:
-	Directory      : .
-</pre>
-          <p>The same command with --db-file-prev option enables comparision and change trends are shown in [] brackets:</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" view --db-file=boost_1_54_0/metrixpp.db --db-file-prev=boost_1_52_0/metrixpp.db
-</pre>
-          <pre>
-:: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
-	Average        : 0.652902698283 [+0.00362138411453]
-	Minimum        : 0 [+0]
-	Maximum        : 37 [+1]
-	Total          : 1597.0 [+16.0]
-	Distribution   : 2446 [+11] regions in total (including 0 [+0] suppressed)
-	  Metric value : Ratio : R-sum : Number of regions
-	             0 : 0.771 : 0.771 : 1886 [+5   ]	|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-	             1 : 0.110 : 0.881 :  268 [+4   ]	|||||||||||
-	             2 : 0.044 : 0.925 :  108 [+0   ]	||||
-	             3 : 0.025 : 0.949 :   60 [+2   ]	||
-	             4 : 0.016 : 0.966 :   40 [-1   ]	||
-	             5 : 0.007 : 0.973 :   18 [-1   ]	|
-	             6 : 0.006 : 0.979 :   14 [+1   ]	|
-	             7 : 0.004 : 0.983 :   10 [+1   ]	
-	             8 : 0.003 : 0.986 :    8 [+1   ]	
-	             9 : 0.002 : 0.988 :    4 [+0   ]	
-	            10 : 0.004 : 0.991 :    9 [-2   ]	
-	            11 : 0.002 : 0.993 :    4 [+1   ]	
-	            12 : 0.001 : 0.994 :    3 [+0   ]	
-	            13 : 0.001 : 0.995 :    2 [+0   ]	
-	            14 : 0.001 : 0.996 :    2 [+0   ]	
-	         15-16 : 0.001 : 0.997 :    3 [-1   ]	
-	         17-18 : 0.001 : 0.998 :    3 [+1   ]	
-	            20 : 0.000 : 0.999 :    1 [+0   ]	
-	         23-25 : 0.001 : 1.000 :    2 [+0   ]	
-	         36-37 : 0.000 : 1.000 :    1 [+0   ]	
-
-:: info: Overall metrics for 'std.code.lines:code' metric
-	Average        : 6.64356984479 [+0.012181964309]
-	Minimum        : 0 [+0]
-	Maximum        : 201 [+4]
-	Total          : 23970.0 [+223.0]
-	Distribution   : 3608 [+27] regions in total (including 0 [+0] suppressed)
-	  Metric value : Ratio : R-sum : Number of regions
-	           0-1 : 0.088 : 0.088 :  319 [+3   ]	|||||||||
-	             2 : 0.320 : 0.409 : 1155 [+9   ]	||||||||||||||||||||||||||||||||
-	             3 : 0.108 : 0.517 :  390 [-3   ]	|||||||||||
-	             4 : 0.081 : 0.598 :  294 [+7   ]	||||||||
-	             5 : 0.080 : 0.678 :  290 [+7   ]	||||||||
-	             6 : 0.061 : 0.739 :  220 [-1   ]	||||||
-	             7 : 0.049 : 0.788 :  176 [-2   ]	|||||
-	             8 : 0.030 : 0.818 :  109 [-1   ]	|||
-	             9 : 0.025 : 0.843 :   89 [+4   ]	||
-	         10-11 : 0.032 : 0.876 :  117 [+9   ]	|||
-	         12-13 : 0.020 : 0.895 :   71 [-9   ]	||
-	            14 : 0.012 : 0.907 :   43 [+0   ]	|
-	         15-16 : 0.017 : 0.924 :   61 [+0   ]	||
-	         17-19 : 0.015 : 0.939 :   55 [+6   ]	||
-	         20-22 : 0.013 : 0.952 :   46 [-3   ]	|
-	         23-26 : 0.011 : 0.963 :   40 [+2   ]	|
-	         27-30 : 0.009 : 0.972 :   33 [-3   ]	|
-	         31-39 : 0.009 : 0.981 :   33 [+0   ]	|
-	         40-65 : 0.009 : 0.991 :   34 [+1   ]	|
-	        66-201 : 0.009 : 1.000 :   33 [+1   ]	|
-
-:: info: Directory content:
-	Directory      : .
-</pre>
-          <h4>Reducing analysis scope</h4>
-          <p>There are two ways to reduce the analysis scope for the view tool. The first is to enumerate paths of interest.
-          	For example, the following command reduces scope to the 'allocators' sub-directory within the processed code.</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" view --db-file=boost_1_54_0/metrixpp.db -- ./boost/interprocess/allocators
-</pre>
-          <p>The second is to specify the --scope-mode option, which instructs the tool to process only modified and/or new files/regions.
-          	For example, to view the summary metrics for all modified and new regions:</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" view --db-file=boost_1_54_0/metrixpp.db  --db-file-prev=boost_1_52_0/metrixpp.db --scope-mode=touched
-</pre>
-          <pre>
-:: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
-	Average        : 1.84924623116 [-0.0230941943761]
-	Minimum        : 0 [+0]
-	Maximum        : 37 [+1]
-	Total          : 368.0 [+16.0]
-	Distribution   : 199 [+11] regions in total (including 0 [+0] suppressed)
-	  Metric value : Ratio : R-sum : Number of regions
-	             0 : 0.608 : 0.608 : 121 [+5  ]	|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-	             1 : 0.131 : 0.739 :  26 [+4  ]	|||||||||||||
-	             2 : 0.070 : 0.809 :  14 [+0  ]	|||||||
-	             3 : 0.060 : 0.869 :  12 [+2  ]	||||||
-	             4 : 0.015 : 0.884 :   3 [-1  ]	||
-	             5 : 0.015 : 0.899 :   3 [-1  ]	||
-	             6 : 0.005 : 0.905 :   1 [+1  ]	|
-	             7 : 0.015 : 0.920 :   3 [+1  ]	||
-	             8 : 0.015 : 0.935 :   3 [+1  ]	||
-	             9 : 0.010 : 0.945 :   2 [+0  ]	|
-	            10 : 0.010 : 0.955 :   2 [-2  ]	|
-	            11 : 0.005 : 0.960 :   1 [+1  ]	|
-	            12 : 0.005 : 0.965 :   1 [+0  ]	|
-	            13 : 0.005 : 0.970 :   1 [+0  ]	|
-	            16 : 0.005 : 0.975 :   1 [-1  ]	|
-	            17 : 0.005 : 0.980 :   1 [+0  ]	|
-	            18 : 0.010 : 0.990 :   2 [+1  ]	|
-	            20 : 0.005 : 0.995 :   1 [+0  ]	|
-	         36-37 : 0.005 : 1.000 :   1 [+0  ]	|
-
-:: info: Overall metrics for 'std.code.lines:code' metric
-	Average        : 15.9645390071 [-0.815853149771]
-	Minimum        : 0 [+0]
-	Maximum        : 201 [+6]
-	Total          : 4502.0 [+223.0]
-	Distribution   : 282 [+27] regions in total (including 0 [+0] suppressed)
-	  Metric value : Ratio : R-sum : Number of regions
-	           0-1 : 0.053 : 0.053 :  15 [+3  ]	|||||
-	             2 : 0.124 : 0.177 :  35 [+9  ]	||||||||||||
-	             3 : 0.053 : 0.230 :  15 [-3  ]	|||||
-	             4 : 0.060 : 0.291 :  17 [+7  ]	||||||
-	             5 : 0.089 : 0.379 :  25 [+7  ]	|||||||||
-	             6 : 0.060 : 0.440 :  17 [-1  ]	||||||
-	             7 : 0.050 : 0.489 :  14 [-2  ]	|||||
-	           8-9 : 0.074 : 0.564 :  21 [+3  ]	|||||||
-	            10 : 0.035 : 0.599 :  10 [+5  ]	||||
-	            11 : 0.082 : 0.681 :  23 [+4  ]	||||||||
-	         12-13 : 0.043 : 0.723 :  12 [-9  ]	||||
-	         14-15 : 0.039 : 0.762 :  11 [-1  ]	||||
-	         16-18 : 0.028 : 0.791 :   8 [+4  ]	|||
-	         19-22 : 0.039 : 0.830 :  11 [+0  ]	||||
-	         23-26 : 0.039 : 0.869 :  11 [+2  ]	||||
-	         27-32 : 0.028 : 0.897 :   8 [-3  ]	|||
-	         38-50 : 0.025 : 0.922 :   7 [+0  ]	||
-	         51-69 : 0.025 : 0.947 :   7 [+1  ]	||
-	        71-100 : 0.032 : 0.979 :   9 [+2  ]	|||
-	       101-201 : 0.021 : 1.000 :   6 [-1  ]	||
-
-:: info: Directory content:
-	Directory      : .
-</pre>
-        </section>
-        <section id="workflow_view_details_section">
-          <h3>Detailed metrics per file/region</h3>
-          <p>The same view tool can print detailed metrics per file and per every region in the specified file.
-          	In order to get detailed metrics, enumerate files of interest after '--'. For example:</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" view --db-file=boost_1_54_0/metrixpp.db --db-file-prev=boost_1_52_0/metrixpp.db -- ./boost/interprocess/detail/managed_open_or_create_impl.hpp
-</pre>
-          <p>produces output similar to this (truncated to make the page shorter):</p>
-          <pre>
-./interprocess/detail/managed_open_or_create_impl.hpp:302: info: Metrics per 'priv_open_or_create' region
-	Region name    : priv_open_or_create
-	Region type    : function
-	Offsets        : 8314-14526
-	Line numbers   : 301-467
-	Modified       : True
-	std.code.complexity:cyclomatic: 37 [+1]
-	std.code.lines:code: 148 [+4]
-</pre>
-        </section>
-        <section>
-          <h3>More about the viewer</h3>
-          <p>The 'view' command has got an option to alter the output format. It is possible to get the same data
-          	in xml or python dictionary formats. This can be particularly useful for integration of the tool with
-          	other applications. For example, an editor may re-collect and show context based metrics when a file is saved.</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" view --db-file=boost_1_54_0/metrixpp.db --format=xml
-</pre>
-          <p>Check other options of the view tool by executing:</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" view --help
-</pre>
-        </section>
-        <section id="workflow_limit_section">
-          <h2>Apply thresholds</h2>
-          <p>The viewer shows (above) that there are functions with quite large cyclomatic complexities.
-          	 Growth of this metric can be considered as negative trend. The Metrix++ 'limit' tool offers the capability
-          	 to manage control over trends by applying limits to metric values.
-          	 Exceeded limits could be raised as alarms by quality management and control.</p>
-        </section>
-        <section id="workflow_limit_hotspots_section">
-          <h3>Hotspots</h3>
-          <p>The hotspots mode of the limit tool helps to identify top files/regions exceeding a metric threshold.
-          	Let's identify the top 3 functions in the boost interprocess library, which exceed a limit of 15 points of
-          	cyclomatic complexity:</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" limit --db-file=boost_1_54_0/metrixpp.db --max-limit=std.code.complexity:cyclomatic:15 --hotspots=3
-</pre>
-          <pre>
-./interprocess/detail/managed_open_or_create_impl.hpp:302: warning: Metric 'std.code.complexity:cyclomatic' for region 'priv_open_or_create' exceeds the limit.
-	Metric name    : std.code.complexity:cyclomatic
-	Region name    : priv_open_or_create
-	Metric value   : 37
-	Modified       : None
-	Change trend   : None
-	Limit          : 15.0
-	Suppressed     : False
-
-./interprocess/streams/vectorstream.hpp:284: warning: Metric 'std.code.complexity:cyclomatic' for region 'seekoff' exceeds the limit.
-	Metric name    : std.code.complexity:cyclomatic
-	Region name    : seekoff
-	Metric value   : 25
-	Modified       : None
-	Change trend   : None
-	Limit          : 15.0
-	Suppressed     : False
-
-./interprocess/streams/bufferstream.hpp:174: warning: Metric 'std.code.complexity:cyclomatic' for region 'seekoff' exceeds the limit.
-	Metric name    : std.code.complexity:cyclomatic
-	Region name    : seekoff
-	Metric value   : 23
-	Modified       : None
-	Change trend   : None
-	Limit          : 15.0
-	Suppressed     : False
-</pre>
-        </section>
-        <section id="workflow_limit_control_section">
-          <h3>Controlling trends</h3>
-          <p>The exit code of the 'limit' tool is equal to the number of warnings printed. This supports use of the tool
-          	as a static analysis tool during the software build process. In this case, a non-zero exit code means
-          	that there are violations to the agreed standards and it may fail the build. The same command
-          	without --hotspots option will print all regions/files exceeding the specified limit:</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" limit --db-file=boost_1_54_0/metrixpp.db --max-limit=std.code.complexity:cyclomatic:15
-</pre>
-          <h4>Modes to exclude old code from the considiration</h4>
-          <p>However, it is likely there are many warnings printed in this mode, especially if very old or legacy code is profiled 
-          	against new metrics and coding rules. Although all warnings can be removed 
-          	by re-factoring as a big task force activity, it is where many tools are rejected,
-          	because it is difficult to justify the initial cost of applying and integrating them.
-          	The Metrix++ 'limit' tool has got an option --warn-mode, which helps to overcome this problem.</p>
-          <p>--warn-mode=touched encourages re-factoring only for new and modified regions. It enables
-          	continuous refactoring. It does not matter how late the rule is applied or the
-          	coding standard is modified. It is possible to do it anytime with zero initial investment.
-          	For example, applying it to the boost interprocess library for a changes between 1.52 and 1.54 versions
-          	results in only 6 warnings:</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" limit --db-file=boost_1_54_0/metrixpp.db --db-file-prev=boost_1_52_0/metrixpp.db --max-limit=std.code.complexity:cyclomatic:15 --warn-mode=touched
-</pre>
-          <pre>
-./interprocess/detail/managed_open_or_create_impl.hpp:302: warning: Metric 'std.code.complexity:cyclomatic' for region 'priv_open_or_create' exceeds the limit.
-	Metric name    : std.code.complexity:cyclomatic
-	Region name    : priv_open_or_create
-	Metric value   : 37
-	Modified       : True
-	Change trend   : +1
-	Limit          : 15.0
-	Suppressed     : False
-
-./interprocess/ipc/message_queue.hpp:375: warning: Metric 'std.code.complexity:cyclomatic' for region 'insert_at' exceeds the limit.
-	Metric name    : std.code.complexity:cyclomatic
-	Region name    : insert_at
-	Metric value   : 16
-	Modified       : True
-	Change trend   : 0
-	Limit          : 15.0
-	Suppressed     : False
-
-./interprocess/mapped_region.hpp:575: warning: Metric 'std.code.complexity:cyclomatic' for region 'mapped_region' exceeds the limit.
-	Metric name    : std.code.complexity:cyclomatic
-	Region name    : mapped_region
-	Metric value   : 18
-	Modified       : True
-	Change trend   : +2
-	Limit          : 15.0
-	Suppressed     : False
-
-./interprocess/mem_algo/detail/mem_algo_common.hpp:452: warning: Metric 'std.code.complexity:cyclomatic' for region 'priv_allocate_many' exceeds the limit.
-	Metric name    : std.code.complexity:cyclomatic
-	Region name    : priv_allocate_many
-	Metric value   : 20
-	Modified       : True
-	Change trend   : 0
-	Limit          : 15.0
-	Suppressed     : False
-
-./interprocess/mem_algo/rbtree_best_fit.hpp:787: warning: Metric 'std.code.complexity:cyclomatic' for region 'priv_expand_both_sides' exceeds the limit.
-	Metric name    : std.code.complexity:cyclomatic
-	Region name    : priv_expand_both_sides
-	Metric value   : 17
-	Modified       : True
-	Change trend   : 0
-	Limit          : 15.0
-	Suppressed     : False
-
-./interprocess/sync/windows/named_sync.hpp:98: warning: Metric 'std.code.complexity:cyclomatic' for region 'open_or_create' exceeds the limit.
-	Metric name    : std.code.complexity:cyclomatic
-	Region name    : open_or_create
-	Metric value   : 18
-	Modified       : True
-	Change trend   : 0
-	Limit          : 15.0
-	Suppressed     : False
-</pre>
-          <p>If it is challenging or of little benefit to refactor everything touched, 
-          	--warn-mode=trends simplifies the control over modified regions and only makes sure
-          	that there are no regressions in modified code. In other words, a warning is printed about a modified region/file
-          	only if a metric exceeds the specified limit and the value of the metric has got a negative trend due to the modification.
-          	It is possible to apply it anytime with zero initial investment and almost zero on-going investment around old code.
-          	For example, applying it to the boost interprocess library for a changes between 1.52 and 1.54 versions
-          	results in only 2 warnings:</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" limit --db-file=boost_1_54_0/metrixpp.db --db-file-prev=boost_1_52_0/metrixpp.db --max-limit=std.code.complexity:cyclomatic:15 --warn-mode=trend
-</pre>
-          <pre>
-./interprocess/detail/managed_open_or_create_impl.hpp:302: warning: Metric 'std.code.complexity:cyclomatic' for region 'priv_open_or_create' exceeds the limit.
-	Metric name    : std.code.complexity:cyclomatic
-	Region name    : priv_open_or_create
-	Metric value   : 37
-	Modified       : True
-	Change trend   : +1
-	Limit          : 15.0
-	Suppressed     : False
-
-./interprocess/mapped_region.hpp:575: warning: Metric 'std.code.complexity:cyclomatic' for region 'mapped_region' exceeds the limit.
-	Metric name    : std.code.complexity:cyclomatic
-	Region name    : mapped_region
-	Metric value   : 18
-	Modified       : True
-	Change trend   : +2
-	Limit          : 15.0
-	Suppressed     : False
-</pre>
-          <p>--warn-mode=new ignores existing code and ensures that warnings are only about new code.
-          	For example, applying it to the boost interprocess library for a changes between 1.52 and 1.54 versions
-          	results in 0 warnings, so it shows that the new code is totally compliant with the standard required in the example.</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" limit --db-file=boost_1_54_0/metrixpp.db --db-file-prev=boost_1_52_0/metrixpp.db --max-limit=std.code.complexity:cyclomatic:15 --warn-mode=new
-</pre>
-          <h4>Suppressions</h4>
-          <p>It is possible to suppress warnings. Suppressions are collected from comments in code
-             and used by the 'limit' tool to filter out suppressed warnings.
-             It supports fine grained control over false-positive warnings, if there are any.</p>
-          <p>In order to suppress a warning:</p>
-          <ul>
-          	<li>per region metrics: put the metrix++ instruction in the comments before the region, for example:</li>
-          <pre class="prettyprint linenums">
-// This function returns string typed
-// representation of a name of a color,
-// requested by color's id
-// metrix++: suppress std.code.complexity:cyclomatic
-std::string getColorName(int color_id)
-{
-	switch (color_id)
-	{
-	case COLOR_RED:
-		return std::string("red")
-	case COLOR_GREEN:
-		return std::string("green")
-	case COLOR_BLUE:
-		return std::string("blue")
-	/* and so on */
-	}
-}
-</pre>
-          	<li>per file metrics: put the metrix++ instruction in the comments at the beginning of a file, for example:</li>
-          <pre class="prettyprint linenums">
-//
-// This file does processing of colors and brushes
-// Copyright is my company, 2013
-// 
-// However, it is too long and big file, and there is no time
-// to split it into multiple file, so shut up the metrix++ warnings:
-// metrix++: suppress std.general:size
-//
-
-std::string getColorName(int color_id)
-{
-	...
-...
-</pre>
-          	<li>activate collection of suppressions:</li>
-          <pre>
-&gt; python "/path/to/metrix++.py" collect --std.suppress
-</pre>
-          	<li>run the 'limit' tool WITHOUT --disable-suppressions option:</li>
-          <pre>
-&gt; python "/path/to/metrix++.py" limit ...
-</pre>
-             </ul>
-          <h5>Important notice:</h5>
-             <ul><li>The --std.suppress option enables collection of 2 metrics as well: 'std.suppress:count' and 
-                'std.suppress.file:count'. The first is number of suppressions per region.
-                The second is the same but applies to file-scope metrics.
-                It supports management of the number of suppressions.
-                Usually there are no false-positives to suppress with the <strong>right</strong> metric,
-                but there could be exceptions in specific cases. Managing suppressions is about managing exceptions.
-                If there are many exceptional cases, maybe something is wrong with a metric or the application of a metric.
-                Two code examples about colors above do not demonstrate the technically exceptional case,
-                they likely demonstrate a case of a process exception, like "there is no time to do it properly now", or
-                a case of the wrong application of a metric, like "shut up the useless tool". So, be careful.
-                The 'view' tool shows the number of suppressions and its change trends on a per metric basis.</li></ul>
-        </section>
-
-        <section id="workflow_other_section">
-          <h2>Other applications</h2>
-          <h3>Checking data file properties</h3>
-          <p>The Metrix++ 'info' tool is helpful to check the properties of a data file, like the settings used to write it,  
-          	collected metrics and files processed. For example:</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" info --db-file=boost_1_54_0/metrixpp.db
-</pre>
-          <pre>
-boost_1_54_0/metrixpp.db:: info: Created using plugins and settings:
-	version        : 1.0
-	std.code.complexity:version: 1.1
-	std.code.cpp:version: 1.1
-	std.code.cpp:files: *.c,*.cc,*.cpp,*.cxx,*.h,*.hh,*.hpp,*.hxx
-	std.code.cs:version: 1.0
-	std.code.cs:files: *.cs
-	std.code.java:version: 1.1
-	std.code.java:files: *.java
-	std.code.lines:version: 1.1
-
-test_workflow.db:: info: Collected metrics:
-	std.code.complexity:cyclomatic: 
-	std.code.lines:code: 
-
-:: info: Processed files and checksums:
-	./interprocess/allocators/detail/node_pool.hpp: 0xb099a7c3
-	./interprocess/allocators/detail/node_tools.hpp: 0xaaf5044d
-	./interprocess/anonymous_shared_memory.hpp: 0x2bf06cb0
-	./interprocess/containers/allocation_type.hpp: 0x8e95cda0
-	./interprocess/containers/containers_fwd.hpp: 0xa4d0d9f7
-	./interprocess/containers/deque.hpp: 0x6dbb77af
-	./interprocess/containers/flat_map.hpp: 0x6750338c
-	...
-</pre>
-          <h3>Exporting results</h3>
-          <p>The Metrix++ 'export' tool exports data files to csv formated files. For example:</p>
-          <pre>
-&gt; python "/path/to/metrix++.py" export --db-file=boost_1_54_0/metrixpp.db > boost_1_54_0/metrixpp.csv
-</pre>
-          <pre>
-file,region,type,modified,line start,line end,std.code.complexity:cyclomatic,std.code.lines:code
-./interprocess/allocators/detail/node_pool.hpp,__global__,global,,1,110,,0
-./interprocess/allocators/detail/node_pool.hpp,boost,namespace,,33,105,,2
-./interprocess/allocators/detail/node_pool.hpp,interprocess,namespace,,34,104,,2
-./interprocess/allocators/detail/node_pool.hpp,ipcdetail,namespace,,35,103,,4
-./interprocess/allocators/detail/node_pool.hpp,SegmentManager,class,,39,72,,16
-...
-</pre>
-          <p>Files with csv format can be opened by applications, like Microsoft Office Excel, with advanced analysis capabilities.
-          	For example, to draw this distribution graph:</p>
-          <p align="center"><img src="assets/img/piechart.png"/></p>
-          <p>It is not recommended to use the export tool to implement custom post-analysis Metrix++ extensions.
-          	  The main reason is that granted backward compatibility support for csv columns is not granted.
-          	  Another main reason is that
-          	  exporting is relatively slow process. It is recommended to use Metrix++ extensions API instead.</p>
-        </section>
-
-      </div> <!-- end for sections -->
-    </div></div> <!-- end for row and container -->
-
-
-
-    <!-- Footer
-    ================================================== -->
-    <footer class="footer">
-      <div class="container">
-      	<div class="row">
-      		<div class="span3">
-      			<p><a href="http://sourceforge.net/projects/metrixplusplus/"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=275605&amp;type=3"
-		        	alt="Get Metrix++ at SourceForge.net. Fast, secure and Free Open Source software downloads" border="0"></a></p>
-		        <p>&middot;</p>
-		        <p>&middot; &middot;<script type="text/javascript" src="http://www.ohloh.net/p/485947/widgets/project_users_logo.js"></script></p>
-		        <p><a href="http://freecode.com/projects/metrix"><img src="assets/img/fm_logo.png" width="130"></a></p>
-		        <p>&middot;</p>
-		        <p><a href="http://www.softpedia.com/progClean/Metrix-Clean-241097.html"><img src="assets/img/softpedia_free_award_f.gif" width="147" /></a></p>
-      		</div>
-      		<div class="span9">
-		        <p>Copyright <strong>&copy;</strong> 2009 - 2013, <a href="mailto:avkonst@users.sourceforge.net"><span class="normalImportance">Metrix++</span> Project</a></p>
-		        <p>Code licensed under <a href="http://www.gnu.org/licenses/gpl.txt" target="_blank">GPL 3.0</a>, documentation under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
-		        <ul class="footer-links">
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/tickets/new/">Ask question</a></li>
-		          <li class="muted">&middot;</li>
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/tickets/new/">Report defect</a></li>
-		          <li class="muted">&middot;</li>
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/tickets/new/">Feature request</a></li>
-		          <li class="muted">&middot;</li>
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/tickets/search/?q=%21status%3Awont-fix+%26%26+%21status%3Aclosed">Open issues</a></li>
-		          <li class="muted">&middot;</li>
-		          <li><a href="https://sourceforge.net/p/metrixplusplus/wiki/ChangeLog/">Changelog</a></li>
-		        </ul>
-            </div>
-        </div>
-      </div>
-    </footer>
-
-
-
-    <!-- Le javascript
-    ================================================== -->
-    <!-- Placed at the end of the document so the pages load faster -->
-    <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
-    <script src="assets/js/jquery.js"></script>
-    <script src="assets/js/bootstrap-transition.js"></script>
-    <script src="assets/js/bootstrap-alert.js"></script>
-    <script src="assets/js/bootstrap-modal.js"></script>
-    <script src="assets/js/bootstrap-dropdown.js"></script>
-    <script src="assets/js/bootstrap-scrollspy.js"></script>
-    <script src="assets/js/bootstrap-tab.js"></script>
-    <script src="assets/js/bootstrap-tooltip.js"></script>
-    <script src="assets/js/bootstrap-popover.js"></script>
-    <script src="assets/js/bootstrap-button.js"></script>
-    <script src="assets/js/bootstrap-collapse.js"></script>
-    <script src="assets/js/bootstrap-carousel.js"></script>
-    <script src="assets/js/bootstrap-typeahead.js"></script>
-    <script src="assets/js/bootstrap-affix.js"></script>
-
-    <script>
-      !function ($) {
-        $(function(){
-          // carousel demo
-          $('#myCarousel').carousel()
-        })
-      }(window.jQuery)
-    </script>
-
-    <script src="assets/js/holder/holder.js"></script>
-    <script src="assets/js/google-code-prettify/prettify.js"></script>
-
-    <script src="assets/js/application.js"></script>
-
-    <script>
-    
-    </script>
-
-
-    <!-- Analytics
-    ================================================== -->
-    <!--
-    <script>
-      var _gauges = _gauges || [];
-      (function() {
-        var t   = document.createElement('script');
-        t.type  = 'text/javascript';
-        t.async = true;
-        t.id    = 'gauges-tracker';
-        t.setAttribute('data-site-id', '4f0dc9fef5a1f55508000013');
-        t.src = '//secure.gaug.es/track.js';
-        var s = document.getElementsByTagName('script')[0];
-        s.parentNode.insertBefore(t, s);
-      })();
-    </script>
-	-->
-  </body>
-</html>