Showing preview only (1,022K chars total). Download the full file or copy to clipboard to get everything.
Repository: sourcejs/Source
Branch: master
Commit: 6b3f8969b800
Files: 219
Total size: 959.3 KB
Directory structure:
gitextract_hig6wl4x/
├── .gitignore
├── .jshintrc
├── .travis.yml
├── CONTRIBUTING.md
├── Gruntfile.js
├── License.md
├── MAINTAINING.md
├── README.md
├── app.js
├── appveyor.yml
├── assets/
│ ├── css/
│ │ ├── base/
│ │ │ ├── buttons.less
│ │ │ ├── grids.less
│ │ │ ├── navigation.less
│ │ │ ├── ntf.less
│ │ │ └── togglers.less
│ │ ├── clarify.bundle.less
│ │ ├── cosmetic/
│ │ │ ├── helpers.less
│ │ │ ├── highlights.less
│ │ │ └── links.less
│ │ ├── defaults.less
│ │ ├── mixins.less
│ │ ├── project/
│ │ │ ├── auth.less
│ │ │ ├── autocomplete.less
│ │ │ ├── catalog.less
│ │ │ ├── clarify-in-spec.less
│ │ │ ├── clarify.less
│ │ │ ├── examples.less
│ │ │ ├── footer.less
│ │ │ ├── header.less
│ │ │ ├── info.less
│ │ │ ├── layout.less
│ │ │ ├── modal.less
│ │ │ ├── navigation.less
│ │ │ ├── search.less
│ │ │ ├── section.less
│ │ │ └── source-code.less
│ │ ├── reset.less
│ │ ├── source.css
│ │ └── variables.less
│ ├── fonts/
│ │ └── Webfont EULA 1.6.txt
│ ├── js/
│ │ ├── _require.bundle.js
│ │ ├── clarify.js
│ │ ├── enter-the-source.js
│ │ ├── lib/
│ │ │ ├── autocomplete.js
│ │ │ ├── codeFormat.js
│ │ │ ├── html5shiv.js
│ │ │ ├── jquery.autocomplete.js
│ │ │ ├── jquery.couch.js
│ │ │ ├── jquery.mb.browser.js
│ │ │ ├── lodash.js
│ │ │ ├── modalbox.js
│ │ │ ├── prism/
│ │ │ │ ├── prism.css
│ │ │ │ └── prism.js
│ │ │ ├── require.js
│ │ │ └── text.js
│ │ ├── load-options.js
│ │ ├── modules/
│ │ │ ├── auth.js
│ │ │ ├── browser.js
│ │ │ ├── clarifyInSpec.js
│ │ │ ├── codeSource.js
│ │ │ ├── couch.js
│ │ │ ├── css.js
│ │ │ ├── globalNav.js
│ │ │ ├── headerFooter.js
│ │ │ ├── htmlAPISync.js
│ │ │ ├── inlineOptions.js
│ │ │ ├── innerNavigation.js
│ │ │ ├── loadEvents.js
│ │ │ ├── module.js
│ │ │ ├── moduleLoader.js
│ │ │ ├── navHighlight.js
│ │ │ ├── ntf.js
│ │ │ ├── parseFileTree.js
│ │ │ ├── scrollToHash.js
│ │ │ ├── search.js
│ │ │ ├── sectionFolding.js
│ │ │ ├── sections.js
│ │ │ ├── sectionsParser.js
│ │ │ ├── specDecorations.js
│ │ │ ├── trimSpaces.js
│ │ │ └── utils.js
│ │ └── require-config.js
│ ├── templates/
│ │ ├── clarifyPanel.inc.html
│ │ ├── footer.inc.html
│ │ ├── header.inc.html
│ │ ├── nav.inc.html
│ │ ├── navActionItem.inc.html
│ │ └── navActionTumbler.inc.html
│ └── test/
│ ├── index.html
│ ├── jasmine/
│ │ ├── MIT.LICENSE
│ │ ├── jasmine-html.js
│ │ ├── jasmine.css
│ │ └── jasmine.js
│ ├── js/
│ │ └── tests.js
│ └── spec/
│ ├── innerNavigationSpec.js
│ ├── moduleSpec.js
│ └── sectionsSpec.js
├── core/
│ ├── api/
│ │ ├── index.js
│ │ └── optionsApi.js
│ ├── auth.js
│ ├── ejsWithHelpers.js
│ ├── file-tree/
│ │ └── index.js
│ ├── headerFooter.js
│ ├── html-tree/
│ │ ├── html-parser/
│ │ │ ├── index.js
│ │ │ └── phantomRunner.js
│ │ └── index.js
│ ├── lib/
│ │ ├── configUtils.js
│ │ ├── createLink.js
│ │ ├── extendTillSpec.js
│ │ ├── flattenTillSpec.js
│ │ ├── parseData.js
│ │ ├── pathResolver.js
│ │ ├── processMd.js
│ │ ├── specUtils.js
│ │ ├── translit.js
│ │ ├── utils.js
│ │ └── viewResolver.js
│ ├── loadOptions.js
│ ├── loadPlugins.js
│ ├── logger.js
│ ├── middlewares/
│ │ ├── clarify.js
│ │ ├── loader.js
│ │ ├── md.js
│ │ ├── mdTag.js
│ │ ├── read.js
│ │ ├── send.js
│ │ └── wrap.js
│ ├── postInstall.js
│ ├── routes/
│ │ ├── index.js
│ │ └── redirects.js
│ ├── trackInstall.js
│ ├── trackStats.js
│ ├── unflat.js
│ ├── views/
│ │ ├── 404.ejs
│ │ ├── auth-done.ejs
│ │ ├── clarify/
│ │ │ ├── clear.ejs
│ │ │ └── default.ejs
│ │ ├── clean-spec.ejs
│ │ ├── doc.ejs
│ │ ├── navigation.ejs
│ │ └── spec.ejs
│ └── watch/
│ ├── childWatch.js
│ └── index.js
├── docs/
│ ├── README.md
│ ├── api/
│ │ ├── index.src.html
│ │ ├── info.json
│ │ ├── load-events/
│ │ │ ├── info.json
│ │ │ └── readme.md
│ │ ├── plugins/
│ │ │ ├── info.json
│ │ │ └── readme.md
│ │ ├── readme.md
│ │ └── rest-api/
│ │ ├── info.json
│ │ └── readme.md
│ ├── auth/
│ │ ├── info.json
│ │ └── readme.md
│ ├── base/
│ │ ├── info.json
│ │ └── readme.md
│ ├── build-tasks/
│ │ ├── info.json
│ │ └── readme.md
│ ├── clarify/
│ │ ├── info.json
│ │ └── readme.md
│ ├── configuration/
│ │ ├── info.json
│ │ └── readme.md
│ ├── data/
│ │ └── bootstrap.css
│ ├── data-nav/
│ │ ├── example/
│ │ │ ├── info.json
│ │ │ └── readme.md
│ │ ├── info.json
│ │ └── readme.md
│ ├── index.src.html
│ ├── info-json/
│ │ ├── info.json
│ │ └── readme.md
│ ├── info.json
│ ├── markdown/
│ │ ├── info.json
│ │ └── readme.md
│ ├── migration/
│ │ ├── info.json
│ │ └── readme.md
│ ├── spec/
│ │ ├── css/
│ │ │ └── spec.css
│ │ ├── index.src.html
│ │ └── info.json
│ ├── spec-helpers/
│ │ ├── examples/
│ │ │ ├── buttons.html
│ │ │ ├── include.html
│ │ │ ├── markdown-file.md
│ │ │ ├── mask-one.html
│ │ │ ├── mask-two.html
│ │ │ └── three.html
│ │ ├── info.json
│ │ └── readme.md
│ ├── starting/
│ │ ├── css/
│ │ │ └── starting.css
│ │ ├── index.src.html
│ │ └── info.json
│ ├── starting-md/
│ │ ├── css/
│ │ │ └── starting.css
│ │ ├── info.json
│ │ └── readme.md
│ └── test-specs/
│ └── styles/
│ ├── includes/
│ │ └── all-tags.html
│ ├── index.src.html
│ └── info.json
├── options.js
├── package.json
├── source.sh
└── test/
├── data/
│ ├── api-test-html.json
│ └── api-test-specs.json
├── functional/
│ ├── common.js
│ ├── globalNav.js
│ ├── search.js
│ ├── snippets.md
│ └── specpage.js
└── unit/
├── api/
│ ├── html.js
│ └── specs.js
├── ejsHelpersSpec.js
├── lib/
│ ├── extendTillSpec.js
│ └── utils.js
├── middleware/
│ ├── clarify.js
│ └── md.js
└── partials/
├── markdown-ejs-nested.md
├── markdown-ejs.md
├── markdown.md
├── mask-one.html
├── mask-two.html
└── three.html
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.idea
*.iml
*.DS_Store
node_modules
npm-debug.log
# Generated data for API
/core/api/data
/log
# Generated JSdoc
/jsdoc
# Build folder for assets
/build
# Web server root, and your specs home
# You can store other repository in this path
/user
================================================
FILE: .jshintrc
================================================
{
"eqeqeq": true,
"expr": true,
"forin": true,
"immed": true,
"latedef": true,
"smarttabs": true,
"strict": true,
"sub": true,
"newcap": true,
"noarg": true,
"nonew": false,
"trailing": true,
"undef": true,
"unused": "vars",
"devel": true,
"laxbreak": true,
"node": true,
"browser": true,
"scripturl": true,
"jquery": true,
"predef": [ "define", "Prism", "SourceGetSections"]
}
================================================
FILE: .travis.yml
================================================
language: node_js
node_js:
- "0.10"
- "0.11"
- "0.12"
sudo: false
notifications:
email:
on_success: never
on_failure: always
before_script: "git clone https://github.com/sourcejs/init.git user"
script: npm run ci-test
================================================
FILE: CONTRIBUTING.md
================================================
# How to become a contributor and submit your own code
## Contributing A Patch
1. Submit an issue describing your proposed change to the repo in question.
1. The repo owner will respond to your issue promptly.
1. Fork the desired repo, develop and test your code changes.
1. Submit a pull request to next dev branch (for example 0.5.1-dev).
## Protocols for Collaborative Development
Please read [this doc](MAINTAINING.md) for information on how we're running development for the project.
# Additional Resources
* [@SourceJS](https://twitter.com/SourceJS)
* [Web site](http://sourcejs.com)
* [General documentation](http://sourcejs.com/docs/)
* [Quick Start guide](http://sourcejs.com/docs/base/)
* [More information on contributing](MAINTAINING.md)
## Team members
All inquiries should be forwarded to [Robert Haritonov](mailto:r@rhr.me).
Core contributors and maintainers:
* [Robert Haritonov](https://github.com/operatino)
* [Ilya Mikhailov](https://github.com/cheshirsky)
================================================
FILE: Gruntfile.js
================================================
'use strict';
var path = require('path');
var fs = require('fs');
var pathToApp = path.resolve('./');
global.pathToApp = pathToApp;
var loadOptions = require('./core/loadOptions');
// NPM 3 compatibility fix
var getLoaderPackageName = function() {
var packageName;
var parentFolderName = path.basename(path.resolve('..'));
var isSubPackage = parentFolderName === 'node_modules';
var isLocalDepsAvailable = fs.existsSync('node_modules/grunt-autoprefixer') && fs.existsSync('node_modules/grunt-contrib-cssmin');
if (isSubPackage && !isLocalDepsAvailable) {
packageName = 'load-grunt-parent-tasks';
} else {
packageName = 'load-grunt-tasks';
}
return packageName;
};
module.exports = function(grunt) {
var appPort = grunt.option('app-port') || 8080;
// load all grunt tasks matching the `grunt-*` pattern
require(getLoaderPackageName())(grunt);
// measuring processing time
require('time-grunt')(grunt);
grunt.initConfig({
options: loadOptions(pathToApp),
pathToUser: '<%= options.core.common.pathToUser %>',
banner:'/*!\n' +
'* SourceJS - Living Style Guides Engine and Integrated Maintenance Environment for Front-end Components.\n' +
'* @copyright 2013-2015 Sourcejs.com\n' +
'* @license MIT license: http://github.com/sourcejs/source/wiki/MIT-License\n' +
'* */\n',
// clean files after build
clean: {
build: [
'build'
]
},
jshint: {
options: {
jshintrc: ".jshintrc"
},
gruntfile: ["Gruntfile.js"],
modules: ["assets/js/modules/**/*.js"],
core: [
"app.js",
"core/**/*.js"
]
},
copy: {
js: {
expand: true,
dest: 'build',
src: [
'assets/js/**/*.js',
'<%= pathToUser %>/assets/js/**/*.js',
'!assets/js/**/_*.js',
'!<%= pathToUser %>/assets/js/**/_*.js'
]
}
},
uglify: {
main: {
options: {
preserveComments: 'some'
},
expand: true,
dest: './',
src: [
'build/**/*.js'
]
}
},
cssmin: {
user: {
options: {
noAdvanced: true
},
expand: true,
dest: 'build',
src: [
'<%= pathToUser %>/assets/**/*.css'
]
},
// For processing files after preprocessors
build: {
options: {
noAdvanced: true
},
expand: true,
dest: 'build',
cwd: 'build',
src: ['**/*.css']
}
},
htmlmin: {
main: {
options: {
removeComments: true,
collapseWhitespace: true
},
expand: true,
dest: 'build',
src: [
'assets/templates/**/*.html',
'<%= pathToUser %>/assets/templates/**/*.html'
]
}
},
less: {
main: {
files: {
"build/assets/css/defaults.css": "assets/css/defaults.less"
}
},
bundles: {
expand: true,
dest: 'build/assets/css',
cwd: 'assets/css',
src: ['**/*.bundle.less'],
ext: '.bundle.css'
}
},
jsdoc: {
core: {
src: ['core/**/*.js'],
options: {
destination: 'jsdoc/core'
}
},
assets: {
src: [
'assets/js/**/*.js',
'!assets/js/lib/**/*.js'
],
options: {
destination: 'jsdoc/assets'
}
}
},
watch: {
css: {
files: [
'assets/css/**/*.less'
],
tasks: ['less', 'autoprefixer'],
options: {
nospawn: true
}
},
js: {
files: [
'assets/js/**/*.js'
],
tasks: ['jshint:modules', 'resolve-js-bundles'],
options: {
nospawn: true
}
}
},
autoprefixer: {
options: {
cascade: false,
browsers: ['last 2 version']
},
main: {
expand: true,
dest: 'build',
cwd: 'build',
src: ['**/*.css']
}
},
mochaTest: {
test: {
src: ['test/unit/**/*.js']
},
noApp: {
src: ['test/unit/lib/**/*.js']
}
},
casperjs: {
options: {
casperjsOptions: ['--app-port='+appPort]
},
files: ['test/functional/**/*.js']
}
});
/*
*
* Custom tasks
*
* */
grunt.registerTask('clean-build', 'Cleaning build dir if running new type of task', function(){
if (
grunt.file.exists('build/last-run') &&
(grunt.task.current.args[0] === 'prod' && grunt.file.read('build/last-run') === 'dev' || grunt.task.current.args[0] === 'dev' && grunt.file.read('build/last-run') === 'prod')
) {
grunt.task.run('clean:build');
} else {
console.log('Skipping clean build dir');
}
});
grunt.registerTask('resolve-js-bundles', 'Resolving JS imports in _**.bundle.js', function(){
var gruntOpts = grunt.config.get('options');
// Setting custom delimiters for grunt.template
grunt.template.addDelimiters('customBundleDelimiter', '"{%', '%}"');
var files = grunt.file.expand([
'assets/js/**/_*.bundle.js',
'<%= pathToUser %>/assets/js/**/_*.bundle.js'
]);
files.map(function(pathToFile){
// **/_*.bundle.js -> build/**/*bundle.js
var outputName = path.basename(pathToFile).replace(/^\_/, "");
var outputDir = path.dirname(pathToFile);
var outputFullPath = path.join('build', outputDir, outputName);
grunt.file.write(
outputFullPath,
grunt.template.process(grunt.file.read(pathToFile), {
delimiters: 'customBundleDelimiter',
data: {
// npmPluginsEnabled object is filled from loadOptions.js
npmPluginsEnabled: JSON.stringify(gruntOpts.assets.npmPluginsEnabled, null, 4)
}
})
);
grunt.log.ok('Writing to '+outputFullPath);
});
});
grunt.registerTask('last-prod', 'Tag build: prod', function(){
grunt.file.write('build/last-run', 'prod');
});
grunt.registerTask('last-dev', 'Tag build: dev', function(){
grunt.file.write('build/last-run', 'dev');
});
/*
*
* Build tasks
*
* */
// Regular development update task
grunt.registerTask('update', [
'clean-build:dev',
'resolve-js-bundles',
'less',
'autoprefixer',
'last-dev'
]);
grunt.registerTask('default', ['jshint', 'update']);
// Prod build, path to minified resources is routed by nodejs server
grunt.registerTask('build', [
'clean-build:prod',
'less',
'autoprefixer',
'newer:cssmin:build',
'newer:cssmin:user',
'resolve-js-bundles',
'newer:copy:js',
'newer:uglify:main',
'newer:htmlmin:main',
'last-prod'
]);
grunt.registerTask('watch-css', ['update','watch:css']);
grunt.registerTask('watch-all', ['update','watch']);
grunt.registerTask('ci-pre-run', [
'jshint',
'build',
'update'
]);
grunt.registerTask('ci-post-run', [
'test',
'test-func'
]);
grunt.registerTask('ci-post-run-win', [
'test'
]);
/*
*
* Utils
*
* */
// Test task. Execute with running app
grunt.registerTask('test', 'Run ALL tests or specified by second param', function () {
// if custom mask set - `grunt test --spec=test/unit/middleware/**/*.js`
var spec = grunt.option('spec');
if (spec) {
grunt.config.set('mochaTest.test.src', [spec]);
grunt.task.run('mochaTest:test');
} else {
grunt.task.run('mochaTest');
}
});
// Test task. Execute with running app
grunt.registerTask('test-func', 'Run ALL functional tests or specified by second param', function () {
// if custom mask set - `grunt test --spec=test/unit/middleware/**/*.js`
var spec = grunt.option('spec');
if (spec) {
grunt.config.set('casperjs.files', [spec]);
}
grunt.task.run('casperjs');
});
};
================================================
FILE: License.md
================================================
# The MIT License
Copyright © 2013-2016 Sourcejs.com
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: MAINTAINING.md
================================================
# On Collaborative Development.
This document represents SourceJS team development agreements.
## Patches welcome
First of all: as a potential contributor, your changes and ideas are welcome. Please do not ever hesitate to ask a question or send a PR.
## Code reviews
All changes must be code reviewed. For non-maintainers this is obvious, since you can't commit anyway. But even for maintainers, we want all changes to get at least one review, preferably from someone who knows the areas the change touches. For non-trivial changes we may want two or even more reviewers. Most PRs will find reviewers organically. Except for rare cases, such as trivial changes (e.g. typos, comments) or emergencies (e.g. broken builds), maintainers should not merge their own changes.
Any maintainer or core contributor who wants to review a PR but does not have time immediately may put a kind of hold on a PR simply by saying so on the PR discussion and offering an ETA.
## Branches and versions
Stable project version is on master branch. Upcoming version is on release candidate (RC) branch, which is forked from master and is used to be a base for development. Each release bumps version according to [Semantic Versions specification](http://semver.org/).
## Single feature (issue, etc.) contribution guide for maintainers.
* Create new branch which is forked from current Release Candidate branch.
* Name it according to the next template:
`[developer second name | nickname]/[issue number | task | feature | changeslist name]`. E.g. `smith/search-redesign`.
* Develop and test your code changes. Atomic commits and informative commit messages are required.
E.g. If you decide to implement code linting task, the list of commit messages can looks like that:
- Code linting task configuration is added. Nested node modules are added (see package.json).
- Some fixes are implemented due to code linting result.
- A couple of additional options are added into linting config.
- * merge branch master into smith/code-linting.
- Missing parameter is added, some trivial fixes are implemented due to CR feedback.
* Merge RC branch into yours, if your changes are implemented.
* Create Pull Request from your branch into Release Candidate branch. Please don't forget that PR description should be useful and informative. It is very important for release notes.
* Approved PR should be merged into current RC branch. Squashed commits are possible but they aren't preferable.
* Merged feature branch should be removed from remote repo.
## Basic agreement points.
* Branch naming template: `[developers second name | nickname]/[issue number | task | feature | changes list name]`.
* Atomic commits and informative commit messages.
* Version bumps according to [specification](http://semver.org/).
* Using Pull Requests to apply changes.
* PR description should be useful and informative. It is very important for release notes.
* Release candidate branches usage for changes and tests.
* Github releases and tags usage for each changes list (for RC branches).
### Example:
* Current version is `0.4.0` (branch: `master`)
* Upcoming version is `0.4.1` (branch: `rc0.4.1`, initially forked from master).
* Several developers create their own feature-branches (`rc0.4.1` forks) to implement some features (resolve a couple of issues, etc.).E.g. `smith/code-linting`, `somePerson/middleware-polishing`.
* Then changes are implemented they create PR from `nickname/feature` branch to `rc0.4.1`. Last commit in each of brunches is the merge of the RC branch into current one.
* Accepted PRs are merged into rc0.4.1. After that merged features are removed from remote repo.
* Then the RC branch is ready it becomes a kind of beta, which can be tested or used to create some demos, etc. Some fixes are possible if needed.
* New release should be marked by tag with release notes. Release notes text can be formed from PR descriptions.
If you have any related questions, contact Robert Haritonov [@operatino](https://github.com/operatino) please.
================================================
FILE: README.md
================================================
# [ON HOLD] SourceJS - Living Style Guide Platform
[](https://www.npmjs.com/package/sourcejs)
[](https://travis-ci.org/sourcejs/Source)
[](https://ci.appveyor.com/project/operatino/source/branch/master)
**The project been stale for a while and currently is in the [ON HOLD] state until we find new maintainer or original author get's back to the design systems field. SourceJS been brought to the public ahead of it's time, and turned out to be too ambitious to handle by a small team of people.**
**Today, the ideas SourceJS surfaced are evolving in other open source projects, like [styleguidist](https://react-styleguidist.js.org) and [storybook](https://storybook.js.org).**
---
The most advanced tool for documenting, testing and managing Front-end Components achieving productive team work.
🚀 [**Quick Start**](http://sourcejs.com/docs/base)
SourceJS powered workflow allows developers to **code new components directly in the documentation.** Combining web components development with documentation and team communication processes, makes SourceJS a powerful tool for Front-end developers and designers.
🎥 Check out short video overview:
[](http://youtu.be/y4KHmX8vCc0)
Our main goal is to provide flexible, modular environment for managing reusable Front-end components library. We don't focus on specific technologies, allowing to seamlessly integrate SourceJS workflow with your existing codebase.
___
[**Source engine project page**](http://sourcejs.com) [**Documentation**](http://sourcejs.com/docs) [**Examples**](http://sourcejs.com/docs/base/#examples) [**How-to's**](https://github.com/sourcejs/blog-howto)
___
SourceJS component management engine was originally developed in [OK.ru](https://corp.mail.ru/en/company/social) front-end development team and is recommended for big and middle sized projects. Especially for fast growing web portals, outsource teams with similar project and companies with multiple services.
Have questions? Just reach our community through Gitter Chat:
[](https://gitter.im/sourcejs/Source)
## SourceJS is NOT
To clear some confusion around Living Style Guide Platforms comparison, let us define few main differences.
### Static site builder
**SourceJS is a dynamic Node.js application**, and does not build static website as Pattern Lab, KSS, StyleDocco are doing. Dynamic environment allows to connect unlimited number of plugins and middlewares for compiling docs, styles, text right on the flight.
### CSS Documentation parser
Engine is based on gathering special documentation templates (`index.src.html`, `readme.md` and others), where you leave your HTML examples, template includes and description. All Specs are located in `sourcejs/user/specs` folder, and could contain any catalogue structure, with focus on component folders.
**But you can use official SourceJS plugin based on DSS, CSS Documentation parser - [github.com/sourcejs/sourcejs-contrib-dss](https://github.com/sourcejs/sourcejs-contrib-dss).**
## Join the community
Many teams are already using SourceJS for building and managing Front-end components libraries for themselves and their clients. To join the community, you just need to follow few simple rules - check our docs about [Maintaining](MAINTAINING.md) and [Contribution](CONTRIBUTING.md).
If you notice some bugs, or need to help finding a better solution in your process, feel free to create an issue, and we will solve your problem together.
[Materials for presentations](https://github.com/sourcejs/pres).
## Updates
* 20.09.15 [0.5.6](https://github.com/sourcejs/Source/releases/tag/0.5.6) and [0.5.6-no-jsdom](https://github.com/sourcejs/Source/releases/tag/0.5.6-no-jsdom) with EJS helpers, NPM 3 support and navigation improvements
* 16.08.15 [0.5.5](https://github.com/sourcejs/Source/releases/tag/0.5.5) and [0.5.5-no-jsdom](https://github.com/sourcejs/Source/releases/tag/0.5.5-no-jsdom) patch release with `<markdown>` tag fix and set of functional tests
* 15.08.15 [0.5.4](https://github.com/sourcejs/Source/releases/tag/0.5.4) and [0.5.4-no-jsdom](https://github.com/sourcejs/Source/releases/tag/0.5.4-no-jsdom) with middleware loader, relative paths in navigation support and other improvements
* 28.05.15 [0.5.3](https://github.com/sourcejs/Source/releases/tag/0.5.3) context options support, source-as-npm package, CI integration, watcher stability improvements and other great features
* 28.05.15 [0.5.3-no-jsdom](https://github.com/sourcejs/Source/releases/tag/0.5.3-no-jsdom) special release without JSDom for Windows users
* 15.04.15 [0.5.2](https://github.com/sourcejs/Source/releases/tag/0.5.2) patch release with improved markdown support and `index.src.html`
* 28.03.15 [0.5.1](https://github.com/sourcejs/Source/releases/tag/0.5.1) patch release with EJS pre-rendering and various bugfixes
* 28.03.15. SourceJS [Bootstrap example bundle](https://github.com/sourcejs/example-bootstrap-bundle) and [How-to articles blog](https://github.com/sourcejs/blog-howto)
* 15.03.15. New example [Specs showcase](http://sourcejs.com/specs/) ([source code](https://github.com/sourcejs/example-specs-showcase))
* 15.03.15. CSS Documentation support with [SourceJS DSS plugin](https://github.com/sourcejs/sourcejs-contrib-dss)
* 12.03.15. **[0.5.0](https://github.com/sourcejs/Source/releases/tag/0.5.0) release** with full Markdown support, GitHub auth, `info.json` watchers and other improvements
* 24.02.15. [0.4.1](https://github.com/sourcejs/Source/releases/tag/0.4.1) patch release
* 05.02.15. Mentioned at in-depth [Style Guides Tools overview talk](http://youtu.be/Fr23VpM6wl4ds)
* 18.01.15. Published an [intro video about SourceJS](http://youtu.be/y4KHmX8vCc0)
* 07.01.15. **[0.4.0](https://github.com/sourcejs/Source/releases/tag/0.4.0) stable release.** From now, we move to fast, semantic release cycle. No globally breaking changes till 1.0.0
* 08.10.14. 0.4.0-rc release, migration [instructions](https://github.com/sourcejs/Source/tree/master/docs/migration)
* 01.08.14. [Video review](http://youtu.be/ukFeZnJjrLs?list=PL20zJcC2wnX7RY1CDrKLhSvYxEe6jtMbB) of SourceJS engine and workflow example (RU with EN subtitles)
* 31.07.14. 0.4.0-beta release
* 01.05.14. Engine presentation from [Front-end Ops Conf](http://www.feopsconf.com/), San Francisco - [Taking Development Tools To The Next Level](http://rhr.me/pres/ime/) with [video](https://www.youtube.com/watch?v=cMIad0zl00I)
* 31.01.14. [Preview](http://youtu.be/cefy_U5NU4o) of Source companion tool for prototyping interfaces using existing components
* 31.12.13. **0.3.2 release**
* 09.10.13. Engine [presentation](http://rhr.me/pres/source-min/) on [Fronteers Jam](http://fronteers.nl/congres/2013/jam-session) ([video](https://vimeo.com/77989211))
* 23.09.13. Published [video recording](http://www.youtube.com/watch?v=3HNW5Bru0Ws) of Source engine presentation from [RIT++](http://ritconf.ru/) 2013 (RU)
## Upcoming updates
Respecting open source community, we track all our tasks publicly on GitHub. Follow our [milestones](https://github.com/sourcejs/example-bootstrap-bundle) and twitter announcements [@SourceJS](http://sourcejs.com) to keep in sync with latest plans.
List of few global upcoming features
* Remove JSDom dependency, for making engine faster and easier to install
* SourceJS as npm module official support
* Refactored code snippets API and tab view
* Integrations with JSDoc and drop-in replacement setup for other Style Guide tools like KSS/Pattern Lab
* More screencasts and engine usage demos
SourceJS follows semantic versioning and we do our best to keep as less breaking changes as possible.
Preparing to 1.0 release, we plan to keep migration path very smooth and painless. So if you will keep in sync with minor releases and API deprecation announcements, you won't face any problems setting up major release updates.
## Useful information
### Browser support
SourceJS client-side part is supported in all latest major browsers and IE8+ in [Clarify](http://sourcejs.com/docs/clarify) for testing components.
___
Copyright © 2013-2016 [SourceJS](http://sourcejs.com)
Licensed under [MIT License](http://en.wikipedia.org/wiki/MIT_License), read more at [license page](http://github.com/sourcejs/source/wiki/MIT-License).
================================================
FILE: app.js
================================================
/*!
* SourceJS - Living Style Guides Engine and Integrated Maintenance Environment for Front-end Components
* @copyright 2013-2015 Sourcejs.com
* @license MIT license: http://github.com/sourcejs/source/wiki/MIT-License
* */
'use strict';
var express = require('express');
var colors = require('colors'); // jshint ignore:line
var fs = require('fs-extra');
var path = require('path');
var commander = require('commander');
var bodyParser = require('body-parser');
var favicon = require('serve-favicon');
/* Globals */
// Define absolute path to app, normalizing windows disk name
global.pathToApp = __dirname.replace(/^\w:\\/, function (match) {
return match.toLowerCase();
});
var app = global.app = express();
var loadOptions = require('./core/loadOptions');
global.opts = loadOptions();
// Arguments parse */
commander
.option('-l, --log [string]', 'Log level (default: ' + global.opts.core.common.defaultLogLevel + ').', global.opts.core.common.defaultLogLevel)
.option('-p, --port [number]', 'Server port (default: ' + global.opts.core.server.port + ').')
.option('--hostname [string]', 'Server hostname (default: ' + global.opts.core.server.hostname + ').')
.option('--html', 'Turn on HTML parser on app start (requires installed and enabled parser).')
.option('--test', 'Run app with tests.')
.option('--no-watch', 'Run with disabled watcher.')
.option('--post-grunt [string]', 'Define Grunt command to run after app start', 'ci-post-run')
.parse(process.argv);
global.commander = commander;
var trackStats = require(path.join(global.pathToApp, 'core/trackStats'));
app.set('views', path.join(__dirname, 'core/views'));
app.set('user', path.join(__dirname, global.opts.core.common.pathToUser));
// We support `development` (default), `production` and `presentation` (for demos)
var MODE = global.MODE = process.env.NODE_ENV || 'development';
global.engineVersion = fs.readJsonSync(path.join(global.pathToApp, '/package.json'), {throws: false}).version;
// Default logger
var logger = require('./core/logger');
var log = logger.log;
global.log = log;
if (commander.html) {
trackStats.event({
group: 'features',
event: 'enabled html parser'
});
global.opts.plugins.htmlParser.enabled = true;
global.opts.plugins.htmlParser.onStart = true;
}
if (commander.port) global.opts.core.server.port = parseInt(commander.port);
if (commander.hostname) global.opts.core.server.hostname = commander.hostname;
if (!commander.watch) {
trackStats.event({
group: 'features',
event: 'disabled watch'
});
global.opts.core.watch.enabled = false;
}
/* /Globals */
/* App config */
// Version
app.use(function (req, res, next) {
res.header('X-powered-by', 'SourceJS ' + global.engineVersion);
next();
});
// Optimization
app.use(require('compression')());
// Cookies
app.use(require('cookie-parser')());
app.use(require('express-session')({
secret: (function() {
var d = new Date().getTime();
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
})(),
resave: false,
saveUninitialized: true
}));
app.use(function (req, res, next) {
if (req.cookies) { req.cookies['source-mode'] = global.MODE; }
res.cookie('source-mode', global.MODE, { maxAge: 3600000, httpOnly: false });
next();
});
var shortid = require('shortid');
app.use(function (req, res, next) {
if (req.cookies && !req.cookies['source-track']) {
var id = shortid.generate();
req.cookies['source-track'] = id;
res.cookie('source-track', id, { maxAge: 3600000, httpOnly: true });
}
next();
});
// Favicon
var faviconPath = path.join(app.get('user'), 'favicon.ico');
if (fs.existsSync(faviconPath)){
app.use(favicon(faviconPath));
}
app.use(bodyParser.json());
/* /App config */
/* Includes */
// Middlewares
require('./core/middlewares/loader').process(app, global.opts);
// Auth initializing
var auth = require('./core/auth')(app);
app.use(auth.everyauth.middleware());
// File tree module
var fileTree = require('./core/file-tree');
// Run file tree scan on start
fileTree.scan();
// Run file tree scan on main page visit
if (global.opts.core.fileTree.mainPageTrigger && global.MODE !== 'presentation') {
app.use(function(req, res, next){
// Updating navigation on each main page visit
if (req.url === '/') fileTree.scan();
next();
});
}
// Update file tree via api
app.use('/api/updateFileTree', function(req, res){
fileTree.scan();
res.jsonp({
message: 'Navigation succesfully updated.'
});
});
// Routes
require('./core/routes');
// API
require('./core/api');
require('./core/api/optionsApi');
// User extenstions
require("./core/loadPlugins.js");
try {
// User additional functionality
require(app.get('user') + "/core/app.js");
} catch(e){}
// Watchers
if (global.opts.core.watch.enabled && global.MODE === 'development') {
if (global.opts.core.watch.foreverWatchEnabled) {
require('./core/watch');
} else {
require('./core/watch/childWatch');
}
}
/* /Includes */
/* Serving content */
var headerFooter = require('./core/headerFooter');
// Static content
app.use(express.static(app.get('user')));
// Page 404
app.use(function(req, res){
if (req.accepts('html')) {
if (req.url === '/') {
res.redirect('/docs');
return;
}
var headerFooterHTML = headerFooter.getHeaderAndFooter();
res.status(404).render(path.join(__dirname, '/core/views/404.ejs'), {
header: headerFooterHTML.header,
footer: headerFooterHTML.footer
});
}
});
/* /Serving content */
/* Error handling */
var logErrors = function(err, req, res, next) {
if (err) {
var url = req.url || '';
log.debug(req.method, req.headers);
log.error(('Requested url: ' + url).red, ('Error: ' + err.stack).red);
if (req.xhr) {
res.status(500).json({msg: 'Server error'});
} else {
res.status(500).send('Server error');
}
} else {
next();
}
};
app.use(logErrors);
/* /Error handling */
/* Server start */
if (!module.parent) {
var serverOpts = global.opts.core.server;
var port = serverOpts.port;
app.listen(port, serverOpts.hostname, serverOpts.backlog, serverOpts.callback);
log.info('[SOURCEJS] launched on http://127.0.0.1:'.blue + (port.toString()).red + ' in '.blue + MODE.blue + ' mode...'.blue);
if (commander.test) {
var spawn = require('cross-spawn');
spawn('./node_modules/grunt-cli/bin/grunt', [commander.postGrunt, '--port='+port], {stdio: 'inherit'})
.on('close', function (code) {
if (code === 0) {
log.info('Test successful');
process.exit(0);
} else {
log.error('Test failed');
process.exit(1);
}
});
} else {
if (global.opts.core.tracking.enabled) {
trackStats.event({
group: 'start',
event: 'default'
});
} else {
trackStats.event({
group: 'start',
event: 'disabled tracking'
}, true);
}
}
}
/* Server start */
================================================
FILE: appveyor.yml
================================================
# AppVeyor file
# http://www.appveyor.com/docs/appveyor-yml
environment:
matrix:
- nodejs_version: 0.10
- nodejs_version: 0.12
install:
- ps: Install-Product node $env:nodejs_version
- npm install
build: off
before_test: "git clone https://github.com/sourcejs/init.git user"
test_script:
- node --version && npm --version
- ps: "npm run ci-test-win # PowerShell" # Pass comment to PS for easier debugging
- cmd: "npm run ci-test-win" # Run without watch because of CI bug
matrix:
fast_finish: true
cache:
- C:\Users\appveyor\AppData\Roaming\npm\node_modules -> package.json # global npm modules
- C:\Users\appveyor\AppData\Roaming\npm-cache -> package.json # npm cache
- node_modules -> package.json # local npm modules
================================================
FILE: assets/css/base/buttons.less
================================================
/* Buttons
---------------------------------------------------------------------------------- */
/* TODO: cosmetic changes needed */
.source_btn {
position:relative;
display: inline-block;
padding: 4px 17px;
background-color:#65A7D6;
border: #5B9ECB solid 1px;
border-radius:3px;
color:#fff;
font-weight:normal;
text-decoration:none;
font-size: 12px;
&:hover {
background-color: #5B9ECB;
}
&:active {
top:1px;
}
}
/* /Buttons
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/base/grids.less
================================================
/* Grids
---------------------------------------------------------------------------------- */
.source_col-main {
margin: 0 auto;
padding: 0 @layout_col-main--padding;
max-width: @layout_col-main--max-width;
box-sizing: content-box;
}
.source_col {
display: inline-block;
vertical-align: top;
width: 33%;
padding-right: 25px;
box-sizing: border-box;
&.__15 {
width: 20%;
}
&.__14 {
width: 24.5%;
}
&__23 {
width: 66.2%;
}
&.__right {
float: right;
padding-right: 0;
}
}
/* Justified layout
-------------------------------------------------- */
/* justified inline data */
.jcol-l,
.jcol-r {
display: inline-block;
width: 50%;
vertical-align: middle;
text-align: left;
}
.jcol-r {
text-align: right;
}
/* /Justified layout */
/* /Grids
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/base/navigation.less
================================================
/* Navigation
---------------------------------------------------------------------------------- */
.source_nav {
white-space: nowrap;
display: none;
font-family: @font-family-main;
color: @color-main;
&.__loaded {
display: block;
}
&:empty {
display: none;
}
}
@media all and (min-width: 990px) {
.source_nav:before {
content: '';
display: inline-block;
vertical-align: middle;
height: 100%;
}
}
.source_nav_c {
display: inline-block;
vertical-align: top;
border-radius: 10px;
width: 100%;
box-sizing: border-box;
padding: 20px 21px 10px;
background-color: @light-gray;
}
.source_nav_ul {
list-style: none;
margin: 0;
padding: 0;
li:first-child {
margin-top: 0;
}
a {
display: block;
line-height: inherit;
}
}
.source_main_nav_ul2 {
margin: 0;
}
/* /Navigation
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/base/ntf.less
================================================
.source_ntf {
position: fixed; z-index: 50;
top: 50px; /* toolbar height */
left: 0; right: 0;
font-size: @fz-size-m;
font-family: @font-family-main;
color: #333;
text-align: center;
height: 50px;
line-height: 48px;
white-space: nowrap;
overflow: hidden;
background: #FFF6DD;
border-bottom: 1px solid #ccc;
box-shadow: 0 0 6px -2px rgba(0, 0, 0, .3);
opacity: 0;
visibility: hidden;
transition: opacity .2s, visibility .2s;
}
.source_ntf.__active {
opacity: 1;
visibility: visible;
}
================================================
FILE: assets/css/base/togglers.less
================================================
/* Togglers
---------------------------------------------------------------------------------- */
.source_slider_frame {
position: absolute;
right: 0;
top: 0;
display: block;
margin: 0 auto;
width: 50px;
height: 20px;
background-color: rgb(246, 249, 251);
border-radius: 4px;
box-shadow: inset 0px 0px 4px 0 rgba(0, 0, 0, 0.25);
-webkit-touch-callout: none;
user-select: none;
}
.source_slider_button {
display: block;
width: 30px;
height: 20px;
line-height: 20px;
background: #EDF2F7;
border-radius: 4px;
transition: all 0.25s ease-in-out;
color: #000;
font-family: sans-serif;
font-size: 9px;
text-align: center;
cursor: pointer;
box-shadow: inset 0px 0px 4px 0 rgba(0, 0, 0, 0.25);
}
.source_slider_frame__on .source_slider_button {
margin-left: 20px;
background: #EDF2F7;
}
.source_slider_frame .source_slider_text_on { display: none; }
.source_slider_frame__on .source_slider_text_off { display: none; }
.source_slider_frame__on .source_slider_text_on { display: block; }
.source_slider_frame__on .source_slider_button {
background: #73c051;
color: #fff;
}
/* /Togglers
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/clarify.bundle.less
================================================
/*
*
* Clarify styles
*
*/
//Based on rhr.me/MCSS methodology
@import url('variables.less');
@import url('mixins.less');
@import url('reset.less');
//Project
@import url('project/clarify.less');
================================================
FILE: assets/css/cosmetic/helpers.less
================================================
/* Helpers
---------------------------------------------------------------------------------- */
.source_delim {
background: none;
border: 0 none;
border-top: 1px dotted @black;
height: 0; padding: 0;
margin: 20px 0;
}
.source_clear {
width: 100%;
clear: both;
height: 0;
font-size:0;
line-height:0;
}
.source_tx {
margin: 5px 0 20px;
}
.source_huge {
font-size: 1.2em;
}
.source_ul {
margin: 0; padding: 0;
margin-left: 18px;
list-style: outside disc;
}
.source_ul li {
margin: 5px 0;
}
/* /Helpers
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/cosmetic/highlights.less
================================================
/* Highlights
---------------------------------------------------------------------------------- */
.source_code {
background: @light-gray;
font-family: Menlo, Monaco, Consolas, monospace;
font-size: .85em;
padding: 0 3px;
border-radius: 3px;
border: 1px solid #dfe2e4;
white-space: normal;
color: #07A;
}
.source-only(code,{
.source_code;
});
.source-main-only(code,{
.source_code;
});
.lang-source_wide-code {
padding: 10px !important;
font-size: @fz-size-xs !important;
display: inline-block;
}
.source_hl {
background: #ceeeff;
font-family: @font-family-main;
font-size: 1em;
padding: 1px 3px 2px;
border: none;
border-radius: 3px;
color: @black;
}
/* /Highlights
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/cosmetic/links.less
================================================
/* Links
---------------------------------------------------------------------------------- */
// common link mixin
.source-link(@color, @hover, @active : lighten(@hover, 10%)) {
color: @color;
&:link,
&:visited {
text-decoration: none;
}
&:hover {
color: @hover;
text-decoration: underline;
}
&:active {
color: @active;
}
&:focus {
outline: 2px solid @color-primary;
outline-offset: 2px;
}
}
// primary link / action link
.source-a_a {
.source-link(@color-primary, lighten(@color-primary, 10%));
}
// secondary link / object link
.source-a_o {
.source-link(@color-secondary, lighten(@color-secondary, 10%));
}
/* TODO: rename classes */
.source_a_hl, /* Higlight link */
.source_a_o { /* Regular link */
&:link,
&:visited {
text-decoration:none;
color: lighten(@blue, 10%);
}
&:hover {
color: @blue;
text-decoration: underline;
}
}
.source_a_bl { /* Emphasized link */
&:link,
&:visited {
color: @black;
}
}
.source_a_l { /* Inverted link */
&:link,
&:visited {
color: lighten(@black, 40%);
text-decoration: none;
line-height: 1.5;
}
&:hover {
color: #fff;
}
}
.source_a_g { /* Object link */
&:link,
&:visited {
color: @blue;
text-decoration: none;
}
&:hover {
color: @blue;
text-decoration: underline;
}
}
.source_a_hl { /* Higlight link */
font-size: 16px !important;
line-height: 2;
&:after {
content:"\A";
white-space:pre;
}
}
.source_a_d { /* Design link */
&:link,
&:visited {
color: @green !important;
font-size: 16px;
}
&:hover {
color: @green;
text-decoration: underline;
}
&:before {
content: '';
display: inline;
padding-right: 25px;
background: url(/source/assets/i/spec_design_link.svg) 50% no-repeat;
}
}
.source_a_s { /* Spec link */
&:link,
&:visited {
color: @green !important;
font-size: 16px;
}
&:hover {
color: @green;
text-decoration: underline;
}
&:before {
content: '';
display: inline;
padding-right: 25px;
background: url(/source/assets/i/spec_link.svg) 50% no-repeat;
}
}
.source_a_fs-m { /* medium font-size */
&:link,
&:visited {
font-size: @fz-size-m;
}
}
/* /Links
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/defaults.less
================================================
/*
*
* Core styles
*
* ! Modify with caution or use /user/assets/css/defaults.css to override core styles !
*
*/
//Based on rhr.me/MCSS methodology
@import url('variables.less');
@import url('mixins.less');
@import url('reset.less');
//Base
@import url('base/togglers.less');
@import url('base/buttons.less');
@import url('base/navigation.less');
@import url('base/grids.less');
@import url('base/ntf.less');
//Project
@import url('project/layout.less');
@import url('project/header.less');
@import url('project/footer.less');
@import url('project/catalog.less');
@import url('project/navigation.less');
@import url('project/info.less');
@import url('project/section.less');
@import url('project/examples.less');
@import url('project/source-code.less');
@import url('project/search.less');
@import url('project/modal.less');
@import url('project/autocomplete.less');
@import url('project/clarify-in-spec.less');
@import url('project/auth.less');
//Cosmetic
@import url('cosmetic/highlights.less');
@import url('cosmetic/links.less');
@import url('cosmetic/helpers.less');
/*# sourceMappingURL=defaults.css.map */
================================================
FILE: assets/css/mixins.less
================================================
/* Mixins and functions
---------------------------------------------------------------------------------- */
/**
* Mixin for applying styles everywhere except .source_example
*
* @Params: @selector - String (div, a, etc)
* @rules - css properties ({border: 1px; color: red;})
* @reset - Boolean enable of disable reset (enabled by default) [true | false]
*/
.source-only(@selector, @rules, @reset: true) {
.source_section > @{selector}@{notCleaningClasses}:not(.source_section_h):not(h2):not(h3):not(h4):not(.source_note):not(.source_data):not(.source_doc):not(.source_warn):not(.source_info),
.source_section > *@{notCleaningClasses} > @{selector},
.source_section > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_section > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_section > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_info > @{selector},
.source_info > *@{notCleaningClasses} > @{selector},
.source_info > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_info > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_info > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_note > @{selector},
.source_note > *@{notCleaningClasses} > @{selector},
.source_note > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_note > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_note > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_doc > @{selector},
.source_doc > *@{notCleaningClasses} > @{selector},
.source_doc > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_doc > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_doc > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_warn > @{selector},
.source_warn > *@{notCleaningClasses} > @{selector},
.source_warn > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_warn > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_warn > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_deps > @{selector},
.source_deps > *@{notCleaningClasses} > @{selector},
.source_deps > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_deps > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_deps > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector} {
& when (@reset = true) {
.reset();
}
@rules();
}
}
.source-main-only(@selector, @rules, @reset: true) {
.source_main > @{selector},
.source_main > *@{notCleaningClasses} > @{selector},
.source_main > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_main > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector},
.source_main > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > *@{notCleaningClasses} > @{selector} {
& when (@reset = true) {
.reset();
}
@rules();
}
}
/* /Mixins and functions
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/project/auth.less
================================================
.source_login {
display: inline-block;
height: 40px;
float: right;
margin-top: 2px;
vertical-align: top;
}
.source_login-avatar {
width: 25px;
height: 25px;
border-radius: 50%;
border: 1px solid #FFF;
cursor: pointer;
}
.source_login-avatar.anonymous {
border: 1px solid #333;
}
.source_login-button {
display: inline-block;
color: #999;
text-decoration: none;
line-height: 1;
cursor: pointer;
vertical-align: top;
margin: 5px 0px 0px 10px;
}
.source_login-button:hover {
color: #FFF
}
================================================
FILE: assets/css/project/autocomplete.less
================================================
/* Autocomplete
---------------------------------------------------------------------------------- */
.autocomplete-wrapper {
border: 1px solid #ccc;
border-radius: 4px;
background: #FFF;
font-size: 12px;
font-family: @font-family-main;
line-height: 1.5;
}
.autocomplete-suggestions {
overflow: auto;
margin-top: 1px;
}
.autocomplete-suggestions strong {
font-weight: normal;
text-shadow: 0 0 1px @light-gray;
color: #00A0FE;
}
.autocomplete-suggestions span {
color: @gray;
}
.autocomplete-suggestion {
padding: 4px 8px;
padding-left: 28px;
white-space: nowrap;
overflow: hidden;
max-width: 100%;
text-overflow: ellipsis;
cursor: pointer;
}
.autocomplete-suggestion > a {
color: @black;
text-decoration: none;
}
.autocomplete-selected {
background: @light-gray;
}
.autocomplete-selected:before,
.autocomplete-show-all:hover:before,
.autocomplete-show-all.__active:before {
content: "►";
color: @gray;
margin: 0 6px 0 -18px;
}
.autocomplete-show-all {
background: @light-gray;
}
.autocomplete-show-all:hover,
.autocomplete-show-all.__active {
background: #d1d2d3;
}
/* /Autocomplete
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/project/catalog.less
================================================
/* Catalog
---------------------------------------------------------------------------------- */
.source_section .source_catalog {
padding: 0 20px 20px;
border:1px solid #dfe2e4;
border-radius:10px;
}
.source_catalog {
position: relative;
margin-bottom: 20px;
font-family: @font-family-main;
font-size: @fz-size-m;
line-height: 1.5;
color: @gray !important;
&_h2,
h2 {
line-height: 1.5 !important;
font-size: 22px !important;
color: @black !important;
margin: 20px 0 5px 0 !important;
font-weight: normal !important;
a {
color: @black;
text-decoration: underline;
&:hover {
text-decoration: none;
}
}
}
&.__show-preview {
.source_catalog_img {
display: block;
}
.source_catalog_list_i {
margin-bottom: 30px;
}
}
}
.source_catalog_title {
line-height: 1.5;
a {
text-decoration: underline;
font-size: inherit;
&:hover {
color: @blue;
}
}
}
.source_catalog_a:hover {
text-decoration: none !important;
.source_catalog_title {
color: #fff;
}
}
.source_catalog > p,
.source_catalog_tx {
margin: 0 0 20px !important;
color: @gray !important;
font-size: @fz-size-s !important;
&.__2l { /* 2 line */
min-height: 36px;
}
p {
margin: 0 0 10px;
}
}
.source_subhead > p,
.source_subhead .source_catalog_tx {
margin: 0 0 10px !important;
min-height: 0;
}
.source_catalog_list {
list-style: none;
margin: 0;
padding: 0;
}
.source_catalog_list_i {
width: 30%;
margin-right: 3% !important;
display: inline-block;
vertical-align: top;
}
.source_catalog.__show-preview .source_catalog_list_i {
vertical-align: baseline;
}
@media (min-width: 1200px) {
.source_catalog_list_i {
width: 22%;
margin-right: 3% !important;
}
}
.source_col .source_catalog_list_i { /* Context */
width: 100%;
display: block;
}
.source_section .source_catalog_list_i {
width: 47% !important;
}
.source_catalog_a {
position: relative;
display: block;
margin-left: -10px;
padding: 5px 10px;
font-size: @fz-size-m;
text-decoration: none;
a&:hover { //tag for weight
text-decoration: none;
background-color: @blue__hover !important;
color: #fff;
border-radius: 5px;
.source_catalog_footer {
color: #fff;
}
}
}
.source_catalog_update-button,
.source_catalog_image-tumbler {
// Reset
background: none;
border: none;
padding: 0;
display: inline;
cursor: pointer;
font-size: @fz-size-s;
text-decoration: none;
border-bottom: 1px dotted;
color: #808080;
&:hover {
color: #303030;
text-decoration: none;
}
}
.source_catalog_img {
display: none;
max-width: 100%;
max-height: 60px;
margin-bottom: 5px;
border-radius: 2px;
}
.source_catalog_footer {
color: @gray;
font-size: 11px;
line-height: 1.5;
text-decoration: none !important;
}
.source_catalog_all {
margin: 20px 0 0 0;
a.source_a_bl {
color: @gray;
text-decoration: underline;
&:hover {
color: @black;
}
}
}
.source_catalog-filter {
float: right;
margin-top: 10px;
width: 24.5%;
}
.source_sort-list {
list-style-type: none;
margin: 0;
padding: 0;
color: #808080;
}
.source_sort-list_li {
display: inline-block;
line-height: 1.5;
font-size: @fz-size-s;
}
.source_sort-list_a {
font-size: @fz-size-s;
text-decoration: none;
border-bottom: 1px dotted;
color: #808080;
&:hover {
color: #303030;
text-decoration: none;
}
}
.source_sort-list_li.__active {
color: #303030;
&:after {
content: "\25B2";
font-size: 11px;
display: inline-block;
padding-left: 3px;
}
&.__forward:after {
content: "\25BC";
}
.source_sort-list_a {
color: #303030;
}
}
/* /Catalog
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/project/clarify-in-spec.less
================================================
.source_clarify-in-spec_link {
display: block !important;
width: 18px;
height: 18px;
background: url("/source/assets/i/link-external.svg") 50% no-repeat !important;
background-size: contain !important;
float: right !important;
margin-right: -15px !important;
margin-top: 5px !important;
}
.source_section > h3 > .source_clarify-in-spec_link {
width: 27px;
margin-top: 3px !important;
margin-right: -19px !important;
background-color: #fff !important;
z-index: 1 !important;
position: relative !important;
}
================================================
FILE: assets/css/project/clarify.less
================================================
/* Context
-------------------------------------------------- */
.source_clarify {
}
.source_clarify .source_section_h {
margin-bottom: 10px;
margin-top: 20px;
}
.source_clarify.__clear .source_clarify_content {
padding: 0;
}
.source_clarify.__clear .source_clarify_panel {
margin: 20px 0 0 0;
}
/* /Context */
/* Layout
-------------------------------------------------- */
.source_clarify_content {
padding: 0 20px 20px;
}
/* /Layout */
/* Panel
-------------------------------------------------- */
.source_clarify_panel {
.reset();
width: 608px;
max-width: calc(100% - 40px);
box-sizing: border-box;
border-radius: 10px;
margin: 0 20px 20px;
padding: 20px 21px 10px;
background-color: #f1f2f3;
font-family: @font-family-main;
font-size: @fz-size-m;
line-height: 1.5;
}
.source_clarify_panel_i {
margin-bottom: 15px;
}
.source_clarify_panel_i label {
.reset();
}
.source_clarify_panel_h2 {
.reset();
font-family: @font-family-main;
font-size: @fz-size-m;
color: #333333;
margin: 0 0 5px;
line-height: 1.5;
text-rendering: auto;
}
.source_clarify_panel_sections {
width: 100%;
min-height: 120px;
border-color: #dfe2e4;
padding: 5px;
}
.source_clarify_panel_sections > option {
.reset();
font-family: @font-family-main;
font-size: @fz-size-xs;
line-height: 1.5;
}
.source_clarify_panel_option-list,
.source_clarify_panel_option-list li {
.reset();
font-family: @font-family-main;
font-size: @fz-size-s;
line-height: 1.5;
}
.source_clarify_panel_go {
font-size: 14px;
padding: 7px;
& + .source_clarify_panel_return-link {
display: inline-block;
margin-left: 10px;
}
}
.source_clarify_panel_return-link {
.reset();
text-decoration: underline;
&:hover {
text-decoration: none;
}
}
/* /Panel */
================================================
FILE: assets/css/project/examples.less
================================================
/* Code examples
---------------------------------------------------------------------------------- */
.source_example {
position: relative;
display: inline-block;
vertical-align: top;
padding: 20px;
min-width: 500px;
border: 5px solid #f0f0f0;
margin: 10px 0 15px;
background: none;
}
.source_example:hover {
z-index: 20;
}
.source_example:empty {
display: none;
}
.source_example__2 { width: 215px; }
.source_example__3 { width: 730px; }
.source_example__4 { width: 980px; }
.source_example__5 { width: 1200px; }
.source_example__auto { width: auto; }
.source_example__full {
width: 100%;
box-sizing: border-box;
}
.source_example__2,
.source_example__3,
.source_example__4,
.source_example__5,
.source_example__auto,
.source_example__full {
min-width: 0;
}
.source_example__3,
.source_example__4,
.source_example__5,
.source_example__full {
margin-right: 0;
}
/* /Code examples
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/project/footer.less
================================================
/* Footer
---------------------------------------------------------------------------------- */
.source_footer {
position: relative;
z-index: 11; /* Higher than nav */
margin: 0 -25px;
-ms-flex-preferred-size: auto;
border-top: 1px solid #eee;
padding: 30px 0;
background: @black;
box-sizing: border-box;
font-family: @font-family-main;
font-size: @fz-size-xs;
line-height: 1.5;
color: @gray;
}
.source_footer h2 {
.reset();
margin-bottom: 10px;
font-weight: normal;
font-size: 15px;
color: #666;
}
.source_footer .source_ul {
color: @gray;
margin: 0;
list-style: none;
}
.source_footer_copy {
margin-top: 40px;
line-height: 2;
}
.source_footer_version {
color: @color-aux2;
}
/* /Footer
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/project/header.less
================================================
/* Header
---------------------------------------------------------------------------------- */
.source_header {
position: relative;
margin: -50px -25px 0;
height: 50px;
min-width: 990px;
padding-top: 11px;
padding-bottom: 10px;
z-index: 9999; /* overlap all */
top: 0; left: 0; right: 0;
background: @black;
box-sizing: border-box;
transition: opacity .2s;
white-space: nowrap;
font-family: @font-family-main;
font-size: @fz-size-m;
@media @media_min-step-m {
position: fixed;
margin: 0;
}
.source__scrolled-down & {
opacity: 1;
@media @media_min-step-m {opacity: .1;}
}
.source__scrolled-down &:hover {
opacity: 1;
}
}
.source__scrolled-down .source_header__focus,
.source_header__focus {
opacity: 1;
}
.source_header .source_logo {
display: inline-block;
vertical-align: baseline;
margin-right: 25px;
line-height: 30px !important;
color: #67a9d4;
font-size: 24px !important;
font-family: 'Museo', Arial;
text-decoration: none;
&:hover {
color: #67a9d4;
text-decoration: underline;
}
}
/* Navigation
-------------------------------------------------- */
.source_header_nav {
display: inline-block;
vertical-align: 1px;
}
.source_header_nav_lst {
margin: 0;
padding: 0;
list-style: none;
}
.source_header_nav_i {
display: inline-block;
margin-left: 20px;
/* Reset */
line-height: 1.5;
&:first-child {
margin-left: 0;
}
}
/* /Navigation */
/* /Header
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/project/info.less
================================================
/* Info blocks
---------------------------------------------------------------------------------- */
// !important next to rules are intended solution till we will use shadow DOM or iframes for source_examples
.source_data,
.source_doc,
.source_note,
.source_warn,
.source_info {
display: block;
position: relative;
box-sizing: content-box !important;
margin-top: 20px !important;
margin-bottom: 20px !important;
line-height: 1.5;
border-radius: @border-radius !important;
@media @media_min-step-m {
// Legacy
margin-right: @layout_spec--inner-margin-right !important;
// New spec page modifier
.source_page.__spec & { margin-right: 0 !important;}
}
.source_section & {
margin-right: 0 !important;
}
.source_section & {
font-size: @fz-size-s !important;
}
&:empty {
display: none;
}
p {
margin: 0 0 10px !important;
&:last-child {
margin-bottom: 0 !important;
}
}
th, td {
border-color: #868686 !important;
}
> *:last-child {
margin-bottom: 0 !important;
}
}
.source_info {
background: #FFF6DD !important;
padding: 15px 25px !important;
min-height: 50px !important;
margin-top: 15px !important;
margin-bottom: 15px !important;
}
.source_warn {
padding: 10px 10px 10px 35px !important;
background: #ffe2e5 url(/source/assets/i/warn.png) no-repeat 13px 13px !important;
.source_section & {
margin-right: 0 !important;
}
}
.source_note {
padding: 10px 10px 10px 35px !important;
background: #DCF1FA url(/source/assets/i/note.png) no-repeat 13px 13px !important;
}
.source_doc {
padding: 10px 25px !important;
background: #DCFCDA !important;
font-family: Menlo, Monaco, Consolas, monospace !important;
& code,
& p {
font-family: Menlo, Monaco, Consolas, monospace !important;
}
}
.source_data {
padding: 10px 25px !important;
border: 1px dotted #ccc !important;
background: #f9f9f9 !important;
font-size: 11px !important;
}
/* /Info blocks
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/project/layout.less
================================================
/* Layout
---------------------------------------------------------------------------------- */
.source_container {
position: relative;
padding: 50px 25px 0; /*350px; /* Footer height + margin */
min-height: 100vh;
overflow-x: hidden;
width: 100%;
display: flex;
flex-direction: column;
box-sizing: border-box;
.opera12 & {
display: block;
}
@media @media_min-step-m {
min-width: 990px;
}
}
.source_main {
position: relative;
padding: 35px 0 120px;
margin-bottom: 40px;
flex: 1;
-ms-flex: none;
width: 100%;
box-sizing: border-box;
counter-reset: h2;
@media @media_min-step-m {
.source_page.__spec & {
padding-right: @layout_spec--inner-margin-right;
}
}
&.__loading:after {
content: '';
position: absolute;
width: 100%;
height: 90px;
left: 0;
bottom: 15px;
background-image: url(data:image/gif;base64,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);
background-repeat: no-repeat;
background-position: 50% 0;
}
}
.source_main_h1 {
margin: 0;
padding: 10px 0 0 0;
font-size: 36px;
font-weight: normal;
font-family: 'Museo', Arial;
/* reset */
line-height: 1.5;
color: @black;
}
.source_header-meta {
font-size: @fz-size-xs !important;
line-height: 1.2 !important;
color: @color-aux;
margin-bottom: 20px;
}
.source-main-only(h1,{
.source_main_h1;
});
/* for custom cases */
.source_subhead {
position: relative;
margin: -35px -100% 20px;
padding: 0 100% 10px;
background-color: #f2f2f2;
font-family: @font-family-main;
font-size: @fz-size-m;
color: @gray;
line-height: 1.5;
// Clearfix
&:before,
&:after {
content: " "; /* 1 */
display: table; /* 2 */
}
&:after {
clear: both;
}
}
.source_main_descr > ul,
.source_main_descr > p,
.source_main_descr {
margin-bottom: 20px;
font-size: @fz-size-m;
}
/* /Layout
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/project/modal.less
================================================
/* Modalbox
---------------------------------------------------------------------------------- */
.source_modal_box {
background: #fff;
}
.source_modal_title {
font-size: 22px;
margin: 20px 0 5px 0;
}
.source_modal_close {
position: absolute;
top: 10px;
right: 10px;
color: #fff;
border-radius: 30px;
background: #605F61;
font-size: 20px !important;
display: inline-block;
line-height: 0px !important;
padding: 9px 3px;
cursor: pointer;
}
.source_modal_close:before {
content: "×";
}
/* /Modalbox
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/project/navigation.less
================================================
/* Navigation
---------------------------------------------------------------------------------- */
.source_main_nav {
margin-top: 40px;
@media @media_min-step-m {
position: fixed;
z-index: 10;
top: 170px; //@source_main_nav--top;
right: @layout_col-main--padding;
bottom: 40px;
width: @source_main_nav--width;
margin-top: 0; //reset
margin-right: 0; //reset
transition: top 0.3s;
.source__scrolled-down & {
top: 70px;
}
}
@media @media_min-step-l {
position: fixed;
z-index: 10;
left: 50%;
top: @source_main_nav--top;
width: @source_main_nav--width;
margin-left: @layout_col-main--max-width / 2 - @source_main_nav--width;
margin-top: 0; //reset
margin-right: 0; //reset
}
}
.source_main_nav:hover {
z-index: 20; /* Higher than any other elements */
}
.source_main_nav h2 {
font-weight: normal;
font-size: 15px;
color: @black;
margin: 0 0 5px;
line-height: 1.5;
font-family: inherit;
text-rendering: auto;
}
.source_main_nav.__menuScroll {
overflow-x: hidden;
overflow-y: auto;
bottom: 15px;
}
.source_main_nav_i {
margin: 10px 0;
font-size: @fz-size-xs;
}
.source_main_nav_i:first-child {
margin-top: 0;
}
.source_main_nav_i + .source_main_nav_i {
padding-top: 10px;
border-top: 1px solid #dfe2e4;
}
.source_main_nav_ul {
margin-left: -21px; /* menu padding compensation */
margin-right: -21px;
}
.source_main_nav_li {
line-height: 20px;
margin-bottom: 2px;
}
.source_main_nav_ul2 {
padding: 0;
}
.source_main_nav_li2 {
color: #666;
overflow: hidden;
display: none;
text-overflow: ellipsis;
white-space: nowrap;
}
.source_main_nav_li.__active .source_main_nav_li2 {
display: block;
}
.source_nav_ul .source_main_nav_a {
overflow: hidden;
text-overflow: ellipsis;
text-decoration: none;
padding: 0 21px;
color: #4792D2;
&:hover {
color: #1c76c2;
text-decoration: underline;
}
}
.source_main_nav_li2 .source_main_nav_a {
padding: 0 37px;
}
.source_main_nav .source_main_nav_a.__active { /* for weight */
background-color: #8AB5D6;
color: #F9FBFD;
}
.source_main_nav_ac_item {
position: relative;
line-height: 24px;
&.__simple {
text-align: right;
}
}
.source_main_nav_ac_tx {
line-height: 24px;
}
.source_main_nav_ac_item.__simple {
text-align: right;
white-space: normal;
}
.source_main_nav_ac_item.__simple .source_main_nav_ac_tx {
float: left;
}
/* /Navigation
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/project/search.less
================================================
/* Search
---------------------------------------------------------------------------------- */
.source_search {
display: inline-block;
overflow: hidden;
height: 28px;
width: 100%;
border: 1px solid #444;
border-radius: 5px;
vertical-align: top;
}
.source_search.__light {
border-color: #ccc;
}
.source_search.__light input.source_search_it { /* Cascade for weight */
background-color: #FFF;
}
.source_container input.source_search_it { /* Cascade for weight */
padding: 6px 8px;
padding-left: 28px;
height: 30px;
margin: -1px 0 0 -1px;
width: 101%;
border: 0 none;
line-height: 15px;
background: #000 url(/source/assets/i/search.png) no-repeat 8px 50%;
box-sizing: border-box;
color: @gray;
/* Resets */
display: block;
box-shadow: none;
border-radius: 0;
transition: none;
font-weight: 400;
font-family: @font-family-main;
font-size: @fz-size-m;
line-height: 1.5;
vertical-align: middle;
}
.source_container input.source_search_it:focus {
background: #fff url(/source/assets/i/search.png) no-repeat 8px 50%;
color: @black;
}
/* /Search
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/project/section.less
================================================
/* Section
---------------------------------------------------------------------------------- */
.source_section {
padding-left: @layout_spec--inner-padding;
counter-reset: h3;
@media @media_min-step-m {
// Legacy
margin-right: @layout_spec--inner-margin-right;
// New spec page modifier
.source_page.__spec & { margin-right: 0; }
}
& > h2:first-child {
margin-left: -@layout_spec--inner-padding !important;
&:before {
counter-increment: h2 1;
content: counter(h2)". ";
color: #666;
}
}
/* Error detection */
& > h2:not(:first-child) {
.reset();
background-color: rgba(250, 0, 0, .2);
outline: 3px solid red;
outline-offset: 3px;
&:after {
content: " error - duplicate h2 or not first tag in section";
font-weight: normal;
color: @black;
}
}
& > h3 {
position: relative;
margin: 30px 0 15px -25px;
padding: 0 25px;
font-size: 16px;
color: #000;
font-weight: normal;
line-height: 1.5;
font-family: inherit;
counter-reset: h4;
&:after {
content: "";
border-bottom: 1px dotted #666;
position: absolute;
left: 0; right: 0; top: 50%;
}
}
& > h3 > span {
position: relative; z-index: 1;
display: inline-block;
padding: 0 5px; background: #fff;
&:before {
color: @gray;
counter-increment: h3 1;
content: counter(h2)"."counter(h3)". ";
}
}
& > h4 {
margin: 30px 0 10px;
padding: 0;
font-size: @fz-size-m;
font-family: @font-family-main;
color: @black;
font-weight: normal;
text-indent: .5ex;
line-height: 1.5;
&:before {
color: @gray;
counter-increment: h4 1;
content: counter(h2)"."counter(h3)"."counter(h4)". ";
}
}
& > p {
margin: 15px 0;
}
& > pre {
.reset();
}
}
/* Dynamics
-------------------------------------------------- */
/* Everything closed by default */
.source_section {
position: absolute;
height: 0;
width: 0;
top: -9999px;
overflow: hidden;
&.__loaded {
position: relative;
height: auto;
width: auto;
overflow: visible;
top: 0;
margin-top: 20px;
margin-bottom: 40px;
}
& > script,
& > style {
display: none !important;
}
body & > * { //body for weihgt
display: none;
}
body & > h2:first-child { //body for weihgt
display: block;
}
}
.source_section__open {
& > *:not(.source_example) {
display: block;
}
& > .source_a_hl {
display: inline;
}
.source_example {
display: inline-block;
}
.spoiler-cont_css_w,
.spoiler-cont_js_w,
.spoiler-cont_xml_w {
display: none !important;
}
.source_section_h_expand:after {
content: "▼";
}
.source_source-code__show, .source_source-code__static, .source_context.__show {
display: block !important;
}
.source_context {
display: none !important;
}
}
/* Header actions */
.source_section > h2:first-child,
.source_section_h {
.reset();
position: relative;
margin: 0 0 25px;
padding: 5px @layout_spec--inner-padding;
line-height: 28px;
color: @black;
border-radius: 10px;
background-color: @light-gray;
font-size: @fz-size-l;
font-family: @font-family-main;
&:hover .source_section_h_expand {
color:#4792D2 !important; //important to override link style
}
}
.source_subsection_h {
background-color: #fff !important;
padding: 0 5px !important;
}
.source_section_h_expand {
position: absolute;
top: 0; left: -20px;
width: 20px;
height: 38px;
margin: 0 10px 0 0;
font-size: 12px !important; //override reset styles
text-decoration: none;
color: @gray !important; //important to override link style
&:after {
content: "►";
position: absolute;
top: 0; left: 0;
width: 100%;
text-align: left;
line-height: 38px;
}
}
/* /Header actions */
/* /Dynamics */
/* /Section
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/project/source-code.less
================================================
/* Code highlighting
---------------------------------------------------------------------------------- */
.source_source-code,
code.brush {
display: none !important; /* Hide all code source by default */
}
.source_source-code {
font-size: @fz-size-m;
}
.source_source-code .source_source-code_toggle .source_show {display: none;} /* Default maximazed */
.source_source-code__min .source_source-code_toggle .source_hide {display: none;} /* minimized */
.source_source-code__min .source_source-code_toggle .source_show {display: inline;}
.source_source-code__min .source_source-code_cnt {
display: none;
}
.source_source-code_toggle {
display: inline-block;
height: 14px;
margin-bottom: 10px;
border-bottom: #25588D dashed 1px !important;
font-size: 10px !important;
text-decoration: none;
& span {
color: inherit !important;
}
}
.source_source-code_toggle:hover {
border-bottom: none !important;
text-decoration: none !important;
padding-bottom: 1px;
}
.source_source-code_toggle__css .source_show:after,
.source_source-code_toggle__css .source_hide:after {
content: " CSS";
}
.source_source-code_toggle__html .source_show:after,
.source_source-code_toggle__html .source_hide:after {
content: " HTML";
}
.source_source-code_toggle__js .source_show:after,
.source_source-code_toggle__js .source_hide:after {
content: " JavaScript";
}
.source_source-code_toggle-all .source_hide {display: none;} /* Default hidden */
.source_source-code_toggle-all__hide .source_show {display: none;}
.source_source-code_toggle-all__hide .source_hide {display: inline;}
/* /Code highlighting
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/reset.less
================================================
/* Reset
---------------------------------------------------------------------------------- */
.reset() {
margin: 0;
padding: 0;
border: 0;
border-radius: 0;
font-size: 100%;
font-family: @font-family-main;
font-weight: normal;
vertical-align: baseline;
background: none;
outline: none;
text-align: left;
text-decoration: none;
z-index: 1;
line-height: 1;
list-style: none;
quotes: none;
content: none;
border-collapse: collapse;
border-spacing: 0;
box-sizing: border-box;
box-shadow: none;
color: #333;
}
/* Fonts
-------------------------------------------------- */
/*
* Web Fonts from fontspring.com
*
* All OpenType features and all extended glyphs have been removed.
* Fully installable fonts can be purchased at http://www.fontspring.com
*
* The fonts included in this stylesheet are subject to the End User License you purchased
* from Fontspring. The fonts are protected under domestic and international trademark and
* copyright law. You are prohibited from modifying, reverse engineering, duplicating, or
* distributing this font software.
*
* (c) 2010-2014 Fontspring
*
*
*
*
* The fonts included are copyrighted by the vendor listed below.
*
* Vendor: exljbris Font Foundry
* License URL: http://www.fontspring.com/licenses/exljbris/webfont
*
*
*/
@media @media_min-step-m {
/* A font by Jos Buivenga (exljbris) -> www.exljbris.com */
@font-face {
font-family: 'Museo';
src: url('/source/assets/fonts/MuseoCyrl_500-webfont.woff2') format('woff2'),
url('/source/assets/fonts/MuseoCyrl_500-webfont.woff') format('woff');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Museo Sans';
src: url('/source/assets/fonts/MuseoSansCyrl_500-webfont.woff2') format('woff2'),
url('/source/assets/fonts/MuseoSansCyrl_500-webfont.woff') format('woff');
font-weight: normal;
font-style: normal;
}
}
/* /Fonts */
/* Spec page resets
-------------------------------------------------- */
html,
body {
margin: 0;
padding: 0;
min-width: none;
max-width: none;
}
@{cleaningClasses} {
background: none;
}
.source-only(a,{
color: #4792D2;
text-decoration: none;
font-size: @fz-size-m;
line-height: 1.5;
&:hover {
color: #1c76c2;
text-decoration: underline;
}
});
.source-only(div,{
line-height: 1.5;
});
.source-only(p,{
font-family: @font-family-main;
font-size: @fz-size-m;
line-height: 1.5;
margin: 15px 0;
});
.source-only(ul,{
margin: 25px 0 25px 22px;
});
.source-only(ul ul,{
margin-top: 0 !important;
});
.source-only(li,{
font-size: @fz-size-m;
line-height: 1.5;
list-style: disc inside;
});
.source-only(ol,{
margin: 25px 0 25px 22px;
});
.source-only(ol li,{
font-size: @fz-size-m;
line-height: 1.5;
list-style: decimal inside !important;
});
.source-only(ol ol,{
margin-top: 0 !important;
});
.source-only(ul ol,{
margin-top: 0 !important;
});
.source-only(ol ul,{
margin-top: 0 !important;
});
.source-only(h2,{});
.source-only(h3,{});
.source-only(h4,{});
.source-only(h5,{});
.source-only(h6,{});
.source-only(span,{});
.source-only(label,{});
.source-only(q,{});
.source-only(blockquote,{});
.source-only(strong,{
font-weight: 700;
});
.source-only(b,{
font-weight: 700;
});
.source-only(em,{});
.source-only(i,{});
.source-only(section,{});
.source-only(table,{
margin: 20px 0 30px;
border-collapse: collapse;
border-spacing: 0;
font-size: @fz-size-m;
font-family: @font-family-main;
line-height: 1.5;
});
.source-only(td,{
padding: 0;
});
.source-only(th,{
padding: 6px 13px;
border: 1px solid #ddd;
font-weight: 700;
});
.source-only(td,{
padding: 6px 13px;
border: 1px solid #ddd;
});
.source-only(tr,{
padding: 6px 13px;
border: 1px solid #ddd;
});
.source-only(nav,{});
.source-only(aside,{});
.source_main > .source_main_nav,
.source_main > .source_deps,
.source_main > .source_warn,
.source_main > .source_info,
.source_main > .source_doc,
.source_main > p:not(.source_section),
.source_main > section:not(.source_section),
.source_main > div:not(.source_section),
.source_main > a:not(.source_section) {
font-family: @font-family-main;
font-size: @fz-size-m;
line-height: 1.5;
}
.source_header a,
.source_footer a,
.source_main_nav a,
.source_main > p > a{
.reset();
}
/* /Spec page resets */
/* /Reset
---------------------------------------------------------------------------------- */
================================================
FILE: assets/css/source.css
================================================
/*!
* SourceJS - Living Style Guides Engine and Integrated Maintenance Environment for Front-end Components
* @copyright 2013-2015 SourceJS.com
* @license MIT license: http://github.com/sourcejs/source/wiki/MIT-License
* */
/* Default core styles */
@import url('/source/assets/css/defaults.css');
/* Users override */
@import url('/assets/css/defaults.css');
================================================
FILE: assets/css/variables.less
================================================
/* Variables
---------------------------------------------------------------------------------- */
@max-width: 1400px;
/* Media
-------------------------------------------------- */
//Mobile first
@media_min-step-m: ~'all and (min-width: 990px)';
@media_min-step-l: ~'all and (min-width: 1400px)';
/* /Media */
/* Layout
-------------------------------------------------- */
@border-radius: 10px;
@layout_col-main--padding: 25px;
@layout_col-main--max-width: @max-width - @layout_col-main--padding * 2;
@layout_spec--inner-padding: 25px;
@layout_spec--inner-margin-right: 32%;
/* /Layout */
/* Navigation
-------------------------------------------------- */
@source_main_nav--width: 280px;
@source_main_nav--top: 163px;
/* /Navigation */
/* Colors
-------------------------------------------------- */
// primary
@color-primary : #4593D5;
@blue : @color-primary;
@color-highlight : #7EB6D9;
@blue__hover: @color-highlight;
// secondary
@color-secondary : #1b9b19;
@green: @color-secondary;
// main
@color-main : #333;
@black: @color-main;
// aux
@color-aux : #999;
@gray: @color-aux;
// aux level2
@color-aux2 : #696969;
@dark-gray: @color-aux2;
// utility
@color-utility: #f1f2f3;
@light-gray: @color-utility;
/* /Colors */
/* Fonts
-------------------------------------------------- */
@font-family-main : Arial, Helvetica, sans-serif;
/* /Fonts */
/* Sizes
-------------------------------------------------- */
@fz-size-l : 16px;
@fz-size-m : 15px;
@fz-size-s : 14px;
@fz-size-xs : 13px;
/* /Fonts */
/* Extras
-------------------------------------------------- */
@cleaningClasses: ~'.source_example, .source_clean';
@notCleaningClasses: ~':not(.source_example):not(.source_clean):not(.dataTables_wrapper):not(.source_status-controls):not(.source_catalog):not(.source_source-code_cnt)'; // TODO: generate automatically
/* /Extras */
/* /Variables
---------------------------------------------------------------------------------- */
================================================
FILE: assets/fonts/Webfont EULA 1.6.txt
================================================
The Fontspring Webfont End User License Agreement
Version 1.6.0 - March 13, 2014
By downloading, installing and/or embedding font software (“Webfont”) offered by Fontspring or its distributors, you (“Licensee”) agree to be bound by the following terms and conditions of this End User Licensing Agreement (“EULA”):
1. Right Granted
Fontspring grants Licensee a perpetual, worldwide, non-exclusive and non-transferrable license to link the Webfont to Websites using the @font-face selector in CSS files.
2. Requirements and Restrictions
Licensee agrees to abide by the following requirements and restrictions:
a. Licensee must use the Webfont provided by Fontspring under this EULA. Licensee may not link to the full, CFF OpenType or TrueType font designed for desktop installation.
b. Licensee must include the entire commented header in the provided CSS file.
c. The total traffic of the Website(s), measured in pageviews per month, may be no greater than the number of pageviews specified in the Receipt.
d. Licensee may only install the Webfont on Websites that it owns or controls.
e. Licensee may embed Webfont in reports generated by the Website(s), provided that Licensee does not sell the reports for profit.
3. Provision to Third Parties
Licensee may temporarily provide the Webfont to a website developer, agent or independent contractor, who is working on behalf of the Licensee, ONLY IF the developer, agent or independent contractor (1) agrees in writing to use the Font exclusively for Licensee’s work, according to the terms of this EULA, and (2) retains no copies of the Font upon completion of the work.
Licensee may not otherwise distribute the Webfont to third parties or make the Webfont publicly accessible or available except by embedding or linking in accordance with this EULA.
4. Term
This EULA grants a perpetual license for the rights set forth in Paragraph 1 unless and until the EULA terminates under Paragraph 8. Fontspring will not charge additional fees post purchase, annually or otherwise.
5. Other Usage
Licenses for desktop use, computer applications and games, installable interactive books, software, mobile applications and games, Ebooks and Epubs, product creation websites, website template distribution, website templates, and other uses not allowed by this EULA may be available for an additional fee. Contact Fontspring at support@fontspring.com for more information.
6. Modifications
Licensee may not modify the Webfont or create derivative works based upon the Webfont without prior written consent from Fontspring or the owning foundry EXCEPT THAT Licensee may generate files necessary for embedding or linking in accordance with this EULA.
7. Copyright
The Webfont is protected by copyright law. The Foundry is the sole, exclusive owner of all intellectual property rights, including rights under copyright and trademark law. Licensee agrees not to use the Webfont in any manner that infringes the intellectual property rights of the Foundry or violates the terms of this EULA. Licensee will be held legally responsible, and indemnifies Fontspring, for any infringements on the foundry's rights caused by failure to abide by the terms of this EULA.
8. Termination
This EULA is effective until terminated. If Licensee fails to comply with any term of this EULA, Fontspring may terminate the EULA with 30 days notice. This EULA will terminate automatically 30 days after the issuance of such notice.
9. Disclaimer and Limited Warranty
Fontspring warrants the Product to be free from defects in materials and workmanship under normal use for a period of twenty one (21) days from the date of delivery as shown on Receipt. Fontspring's entire liability, and Licensee’s exclusive remedy, for a defective product shall be, at Fontspring's election, either (1) return of purchase price or (2) replacement of any such product that is returned to Fontspring with a copy of the Receipt. Fontspring shall have no responsibility to replace the product or refund the purchase price if failure results from accident, abuse or misapplication, or if any product is lost or damaged due to theft, fire, or negligence. Any replacement product will be warranted for twenty one (21) days. This warranty gives Licensee specific legal rights. Licensee may have other rights, which vary from state to state.
EXCEPT AS EXPRESSLY PROVIDED ABOVE, THE PRODUCT, IS PROVIDED “AS IS”. FONTSPRING MAKES NO WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
The entire risk as to the quality and performance of the Product rests upon Licensee. Neither Fontspring nor the Foundry warrants that the functions contained in the Product will meet Licensee’s requirements or that the operation of the software will be uninterrupted or error free.
FONTSPRING SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, OR INCIDENTAL DAMAGES (INCLUDING DAMAGES FROM LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, AND THE LIKE) ARISING OUT OF THE USE OF OR INABILITY TO USE THE PRODUCT EVEN IF FONTSPRING OR THE FOUNDRY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
Because some states do not allow the exclusion or limitation of liability for consequential or incidental damages, the above limitation may not apply to Licensee.
10. Governing Law
This EULA is governed by the laws of the United States of America and the State of Delaware.
11. Entire Agreement
This EULA, in conjunction with the receipt (“Receipt”) that accompanies each Font licensed from Fontspring or its distributors, constitutes the entire agreement between Fontspring and Licensee.
12. Modification
The Parties may modify or amend this EULA in writing.
13. Waiver. The waiver of one breach or default hereunder shall not constitute the waiver of any subsequent breach or default.
================================================
FILE: assets/js/_require.bundle.js
================================================
"{%= grunt.file.read('assets/js/lib/require.js') %}"
"{%= grunt.file.read('assets/js/lib/jquery-2.1.4.min.js') %}"
"{%= grunt.file.read('assets/js/require-config.js') %}"
// Extending base js config with npm packages list
requirejs.config({
// Create shorthands routes to clint-side npm plugins
packages: function () {
var modulesList = "{%= npmPluginsEnabled %}";
var npmPackages = [];
for (var module in modulesList) {
npmPackages.push({
name: module,
location: '/node_modules/' + module + '/assets',
main: 'index'
})
}
return npmPackages;
}()
});
================================================
FILE: assets/js/clarify.js
================================================
/*!
* SourceJS - Front-end documentation engine
* @copyright 2013-2015 Sourcejs.com
* @license MIT license: http://github.com/sourcejs/source/wiki/MIT-License
* */
require([
"jquery",
'text!/api/options',
"sourceModules/utils",
"sourceLib/lodash",
"text!sourceTemplates/clarifyPanel.inc.html"
], function ($, options, u, _, clarifyPanelTpl){
// If we have data from Clarify output
if (window.sourceClarifyData){
var _options = JSON.parse(options);
var htmlParser = _options.plugins && _options.plugins.htmlParser && _options.plugins.htmlParser.enabled;
var $panelTemplate = $(_.template(clarifyPanelTpl, {
htmlParser: htmlParser,
showApiTargetOption: window.sourceClarifyData.showApiTargetOption,
specUrl: window.sourceClarifyData.specUrl,
tplList: window.sourceClarifyData.tplList,
sectionsIDList: window.sourceClarifyData.sectionsIDList || []
}));
var enableCheckboxes = function(param){
if (u.getUrlParameter(param)) {
$panelTemplate.find('.js-source_clarify_panel_option-checkbox[name="'+param+'"]').attr('checked', true);
}
};
// Restoring options from URL
var checkboxes = ['nojs','fromApi','apiUpdate'];
checkboxes.forEach(function(item){
enableCheckboxes(item);
});
var template = u.getUrlParameter('tpl') ? u.getUrlParameter('tpl') : 'default';
$panelTemplate.find('.js-source_clarify_panel_select-tpl').val(template);
var sections = u.getUrlParameter('sections') ? u.getUrlParameter('sections').split(',') : undefined;
if (sections) {
sections.forEach(function(item){
$panelTemplate.find('.js-source_clarify_panel_sections > option[data-section="' + item + '"]').attr('selected', true);
});
}
// Import template
$('.js-source_clarify_panel').replaceWith($panelTemplate);
// Activating changes
$('.js-source_clarify_panel_go').on('click', function(e){
e.preventDefault();
var currentUrl = window.location.href.split('?')[0];
var clarifyBaseUrl = currentUrl + '?clarify=true';
var constructedParams = '';
$('.js-source_clarify_panel_option-checkbox').each(function(){
var t = $(this);
if (t.is(':checked')){
constructedParams += '&' + t.attr('name') + '=true'
}
});
var selectedTpl = $('.js-source_clarify_panel_select-tpl').val();
if (selectedTpl !== 'default'){
constructedParams += '&tpl=' + selectedTpl;
}
var selectedSections = [];
$('.js-source_clarify_panel_sections > option:selected').each(function(){
var t = $(this);
selectedSections.push(t.attr('data-section'));
});
if (selectedSections.length > 0){
constructedParams += '§ions=' + selectedSections.join(',');
}
location.href = clarifyBaseUrl + constructedParams;
});
} else {
console.log('Clarify panel failed to receive expected data from clarify, check your tpl.');
}
});
================================================
FILE: assets/js/enter-the-source.js
================================================
/*!
* SourceJS - Front-end documentation engine
* @copyright 2013-2015 Sourcejs.com
* @license MIT license: http://github.com/sourcejs/source/wiki/MIT-License
* */
require([
"jquery",
"source/load-options", // TODO: remove when all modules inherit Module()
"sourceModules/browser",
"sourceModules/moduleLoader",
'sourceModules/auth'
], function ($, options, browser, Loader, Auth) {
if (options && options.modulesEnabled && options.modulesEnabled.auth === true) {
new Auth({
target: $('.js-hook.source_login')
});
}
});
================================================
FILE: assets/js/lib/autocomplete.js
================================================
"use strict";
(function(module) {
if (typeof(define) === "function" && define.amd) {
define(["jquery"], module);
} else {
module(jquery);
}
})(function($) {
var Autocomplete = function(target, options) {
if (!target) return;
this.init(target, options);
};
var keys = { "ESC": 27, "TAB": 9, "RETURN": 13, "UP": 38, "DOWN": 40, "CTRL": 17, "CMD": 91 };
var transliteration = {
'ЗГ':'ZGH', 'Зг':'Zgh', 'зг':'zgh',
'А':'A', 'а':'a',
'Б':'B', 'б':'b',
'В':'V', 'в':'v',
'Г':'G', 'г':'g',
'Д':'D', 'д':'d',
'Е':'E', 'е':'e',
'Ж':'Zh', 'ж':'zh',
'З':'Z', 'з':'z',
'И':'I', 'и':'i',
'ї':'i',
'Й':'I', 'й':'i',
'К':'K', 'к':'k',
'Л':'L', 'л':'l',
'М':'M', 'м':'m',
'Н':'N', 'н':'n',
'О':'O', 'о':'o',
'П':'P', 'п':'p',
'Р':'R', 'р':'r',
'С':'S', 'с':'s',
'Т':'T', 'т':'t',
'У':'U', 'у':'u',
'Ф':'F', 'ф':'f',
'Х':'Kh', 'х':'kh',
'Ц':'Ts', 'ц':'ts',
'Ч':'Ch', 'ч':'ch',
'Ш':'Sh', 'ш':'sh',
'Щ':'Shch', 'щ':'shch',
'Ы':'Y', 'ы':'y',
'Э':'E', 'э':'e',
'Ю':'Yu', 'ю':'iu',
'Я':'Ya', 'я':'ia',
'Ь': '`', 'ь': '`',
'Ъ': '`', 'ъ': '`'
};
Autocomplete.prototype = {
config : {
"lookup": [],
"transliteration": true,
"autoSelectFirst": true,
"caseSensetive": false,
"classes": {
"container": "autocomplete-suggestions",
"selected": "autocomplete-selected",
"suggestion": "autocomplete-suggestion",
"wrapper": "autocomplete-wrapper",
"showAll": "autocomplete-show-all autocomplete-suggestion",
"active": "__active"
},
"containerParent": "body",
"containerHeight": 500, // px
"showAll": undefined, // e.g. function(data) { <do smth> }
"labels": {
"showAllButtonText": "Show all"
},
"suggestionsLimit": 0
},
init: function(target, options) {
this.$target = $(target);
this.visible = false;
this.resultsCount = 0;
this.cachedSearchResults = this.cachedSearchResults || {};
$.extend(true, this.config, options);
this.initContainer();
this.initHandlers();
},
/**
* @function initContainer. It initializes search results box,
* its position and size.
*/
initContainer: function() {
var config = this.config;
var $target = this.$target;
var $container = this.$container = $('<div>').addClass(config.classes.container);
var rootElement = $container;
var containerHeight = this.config.containerHeight;
if (typeof(config.showAll) === "function") {
var showAllLabel = this.resultsCount > 0
? config.labels.showAllButtonText + ' (' + this.resultsCount +')'
: config.labels.showAllButtonText;
var $showAll = this.$showAll = $("<div>")
.addClass(config.classes.showAll)
.html("<a href=\"#\">" + showAllLabel + "</a>");
var $wrapper = $("<div>").addClass(config.classes.wrapper)
.append($container)
.append($showAll);
rootElement = $wrapper;
}
this.$root = rootElement.css({
"position": "fixed",
"display": "none",
"z-index": 9999
});
rootElement.appendTo(config.containerParent);
var _this = this;
var relocateContainer = function() {
var offset = _this.$target.position();
var bottomOffset = 75; // px
var headerPadding
var wHeight = $(window).height();
rootElement.css({
"top": (offset.top + _this.$target.outerHeight(true)) + "px",
"left": offset.left + "px"
});
$container.css("max-height", (wHeight < containerHeight ? wHeight - bottomOffset : containerHeight) + "px");
var width = $target.outerWidth(true) - 2;
rootElement.width(width);
};
$(window).resize(relocateContainer);
relocateContainer();
},
/**
* @function initHandlers. It initializes handlers for search items & container events
*
* N.B.
* To implement new handler you need to add it in "handlers" object below
* To use implemented event handler you can recieve it by getHandler(<handlerName>) method.
*
* JFYI: Implemented handlers are binded (by jQuery.proxy) to Autocomplete instance,
* due to that, "this" in handlers body is a pointer to Autocomplete instance.
*/
initHandlers: function() {
var _this = this;
this.keyMap = []; // this array helps to catch keys combination.
this.$target.on(window.opera ? "keypress" : "keydown", this.getHandler("onKeyPress"))
.on('keyup', this.getHandler("onKeyUp"))
.on('input', this.getHandler("onValueChanged"));
this.$target.on("blur", function(e) {
$(document).one("click", function(e) {
if (!$(e.target).is(_this.$target) && !$.contains(_this.$container.get(0), e.target)) {
if ($(e.target).is(_this.$showAll) || $.contains(_this.$showAll.get(0), e.target)) {
_this.visible = false;
_this.$root.hide();
_this.flushSelection();
} else {
_this.flush();
}
}
});
});
var containerSelector = "." + this.config.classes.container;
var itemSelector = "." + this.config.classes.suggestion;
var callback = this.config.onSelect;
this.$container.on("mouseenter", itemSelector, function() {
_this.select($(this).data("index"));
});
this.$container.on("mouseleave", itemSelector, function() {
_this.selectedIndex = -1;
_this.select();
});
if (this.$showAll) {
this.$showAll.on('click', this.getHandler("onShowAllClick"));
}
},
getHandler: function(name) {
return $.proxy(handlers[name], this);
},
createResultRow: function(index, item) {
return $("<div>")
.addClass(this.config.classes.suggestion)
.data("index", index)
.html('<a href="' + item.data + '">' + item.value + '</a>').get(0);
},
wrapItems: function(data) {
var result = document.createDocumentFragment();
var _this = this;
var limit = this.config.suggestionsLimit;
var max = limit > 0 && limit < data.length ? limit : data.length;
for (var i = 0; i < max; i++) {
result.appendChild(_this.createResultRow(i, data[i]));
}
return result;
},
getSearchQuery: function() {
var inputText = this.$target.val();
if (!inputText || !inputText.length) {
return;
}
var isTranslitEnabled = this.config.transliteration;
var transliterated = inputText;
// TODO: make sure that we realy need it
inputText = inputText.replace(/[\{\}\[\]\(\)\\\.\*\?\+]{1}/g, "");
inputText = this.config.caseSensetive ? inputText : inputText.toLowerCase();
var cyrillic = /[\u0400-\u04FF]/gi;
if (isTranslitEnabled) {
if (transliterated.search(cyrillic) >= 0) {
transliterated = transliterated.replace(cyrillic, function(ch) {
return transliteration[ch];
});
} else {
$.each(transliteration, function(cyr, lat) {
transliterated = transliterated.replace(new RegExp(lat,["g"]), cyr);
});
}
}
return isTranslitEnabled ? transliterated + "|" + inputText : inputText;
},
getSearchResults: function(searchQuery) {
var data = [];
var caseSensetive = this.config.caseSensetive;
var replacementExpr = "<strong>$1</strong>";
$.map(this.config.lookup, function(item) {
var pattern = caseSensetive ? item.value : item.value.toLowerCase();
var substrStartPos = pattern.search(new RegExp(searchQuery));
if (substrStartPos < 0) return true;
data.push({
"value": item.value.replace(new RegExp("(" + searchQuery + ")",'gi'), replacementExpr),
"data": item.data
});
});
if (data.length && searchQuery) {
this.cachedSearchResults[searchQuery] = data;
}
return data;
},
formatSearchResult: function() {
var searchQuery = this.getSearchQuery();
if (!searchQuery || !searchQuery.length) {
this.flush();
} else {
var cachedResult = this.cachedSearchResults[searchQuery];
var searchResult = cachedResult && cachedResult.length
? cachedResult
: this.getSearchResults(searchQuery);
this.resultsCount = searchResult.length;
this.refreshItemsCount();
return searchResult;
}
},
flush: function() {
this.visible = false;
this.$target.val("");
this.$container.empty()
this.$root.hide();
this.flushSelection();
},
refreshItemsCount: function() {
var showAllLabel = this.resultsCount > 0
? this.config.labels.showAllButtonText + ' (' + this.resultsCount +')'
: this.config.labels.showAllButtonText;
this.$showAll.find('a').html(showAllLabel);
},
/**
* selection handlers for search results
*/
selectNext: function() {
var $container = this.$container;
var itemsLength = $container.children().length;
if ((this.selectedIndex < 0) || (this.selectedIndex + 1 >= itemsLength)) {
this.$showAll.addClass(this.config.classes.active);
var selectedClass = this.config.classes.selected;
$container.children("." + selectedClass).removeClass(selectedClass);
return;
}
this.selectedIndex += 1;
var newItem = $(this.$container.children().get(this.selectedIndex));
var outerHeight = newItem.outerHeight();
var viewPortBottom = $container.scrollTop() + $container.height();
var itemBottom = (1 + this.selectedIndex) * outerHeight;
if (viewPortBottom <= itemBottom) {
$container.scrollTop($container.scrollTop() + outerHeight);
}
this.select();
},
selectPrev: function() {
var $container = this.$container;
var itemsLength = $container.children().length;
if (!this.$showAll.hasClass(this.config.classes.active)) {
this.selectedIndex = this.selectedIndex < 0
? 0
: this.selectedIndex === 0 ? 0 : this.selectedIndex - 1;
}
var newItem = $(this.$container.children().get(this.selectedIndex));
var viewPortTop = $container.scrollTop();
var outerHeight = newItem.outerHeight();
var itemTop = (this.selectedIndex) * outerHeight;
if (viewPortTop >= itemTop) {
$container.scrollTop($container.scrollTop() - outerHeight);
}
this.select();
},
select: function(index) {
this.$showAll.removeClass(this.config.classes.active);
var selectionIndex = this.selectedIndex = index >= 0 ? index : this.selectedIndex;
var $container = this.$container;
var selectedClass = this.config.classes.selected;
if (selectionIndex < 0) {
$container.children("." + selectedClass).removeClass(selectedClass);
return;
}
var items = this.$container.children();
if (!items || !items.length) return;
setTimeout(function() {
$container.children("." + selectedClass).removeClass(selectedClass);
$(items.get(selectionIndex)).addClass(selectedClass);
}, 1);
},
flushSelection: function() {
this.selectedIndex = this.config.autoSelectFirst ? 0 : -1;
this.select();
},
openSelected: function(inNewTab) {
var selectedItem = this.$container.children().get(this.selectedIndex);
if (!selectedItem) return;
var link = $(selectedItem).find("a").attr("href");
if (!link) return;
// we should check if origin exists (in case of IE)
var winLocation = window.location;
var isOriginExists = winLocation && winLocation.origin;
var url = isOriginExists
? winLocation.origin + link
: winLocation.protocol + "//" + winLocation.hostname + (winLocation.port ? ":" + winLocation.port : "") + link;
window.open(url, inNewTab ? "_blank" : "_self");
window.focus();
}
};
// We use setTimeout here to prevent huge number of handlers calls
var searchQueryTimeout;
Autocomplete.prototype.getSearchData = function() {
if (!searchQueryTimeout) {
var _this = this;
searchQueryTimeout = setTimeout(function() {
var dataSubset = _this.formatSearchResult();
if (dataSubset && dataSubset.length) {
_this.$container.html(_this.wrapItems(dataSubset));
_this.$root.show();
_this.visible = true;
} else {
_this.visible = false;
_this.$container.empty();
_this.$root.hide();
}
searchQueryTimeout = 0;
_this.flushSelection();
}, 50);
}
};
// this for handlers is Autocomplete object instance
var handlers = {
"onKeyPress": function(e) {
e = e || event; //to make a deal with old IE
this.keyMap.push(e.keyCode);
switch(e.keyCode) {
case (keys.ESC) :
this.flush();
break;
case (keys.UP):
this.selectPrev();
break;
case (keys.DOWN):
this.selectNext();
break;
case (keys.TAB):
this.selectNext();
break;
case (keys.RETURN):
break;
default:
return;
}
},
"onKeyUp": function(e) {
e = e || event; // to make a deal with IE
if (~$.inArray(keys.RETURN, this.keyMap)) {
if (this.$showAll.hasClass(this.config.classes.active)) {
this.$showAll.trigger("click");
this.visible = false;
this.$root.hide();
this.flushSelection();
this.keyMap = [];
return;
}
var isModifierPressed = ~$.inArray(keys.CTRL, this.keyMap) || ~$.inArray(keys.CMD, this.keyMap);
this.openSelected(isModifierPressed);
}
this.keyMap = [];
},
"onValueChanged": function(e) {
this.getSearchData();
},
"onShowAllClick": function(e) {
var callback = this.config.showAll;
if (typeof(callback) !== "function") return false;
callback.call(this, this.formatSearchResult());
}
};
$.fn.autocomplete = function(options, args) {
return this.each(function () {
var searchInstance = new Autocomplete(this, options);
});
};
});
================================================
FILE: assets/js/lib/codeFormat.js
================================================
/*
*
* HTML Code Formatter
*
* @author Dennis Przendzinski
*
* */
define([
"jquery"
], function($) {
return function($el, options) {
var selfClosing = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; // list of self-closing tags
return $el.each(function() {
var settings = $.extend({
escape:true // escape HTML symbols (<,>,&)
,log:false // console log source code
}, options)
, tabs = 0
, code = $(this).html()
;
var indentCode = function (line) {
var _tabs = tabs < 0 ? 0 : tabs;
return new Array(_tabs + 1).join(' ') + line;
};
if (code.length > 0) {
code = code.trim()
.replace(/[\n\t\r]/g, '') // strip all tabs, carriage returns and new lines
.replace(/\s{2,}/g, ' ') // strip extra (2+) white spaces
.replace(/< /g, "<") // remove spaces after "<"
.replace(new RegExp('<(\\b(' + selfClosing.join("|") + ')\\b[^>]*?)>', "g"), '<$1/>') // create regex from inline array or self-closing tags and close them if required
.replace(/<(?!\/)/g, "\n<") // start each tag from new line
.match(/<(?!\/)[^>].+?\/>|<!--.*?-->|<(?!\/)[^>]+?>.*?<\/[^>]+?>.*?(?=<)|<(?!\/)[^>]+?>*?<\/[^>]+?>|<(?!\/)[^>]+?>.+?<\/[^>]+?>|<(?!\/)[^>]+>.*|<(?=\/)[^>].+?>|[^<\r\n]+/g) // combine into array
;
for (var i=0; i< code.length; i++) {
if (code[i].match(/<(?!\/)/) && !(code[i].match(/<(?=\/)/)) && !(code[i].match(/<!-.*?-->/))) { // if the string contains opening tag and doesn't contain closing tag...
var tag = code[i].match(/<([^ \/>]+)/)[1]; // ...strip the tag (<img class="foo"> -> img) to check against the array of self-closing tags and increase indentation
code[i] = indentCode(code[i]);
if (selfClosing.indexOf(tag) === -1) {
tabs +=2;
}
}
else if (!(code[i].match(/<(?!\/)/)) && code[i].match(/<(?=\/)/)) { // if the string contains closing tag and doesn't contain opening tag, decrease indentation
tabs -=2;
code[i] = indentCode(code[i]);
}
else { // otherwise just keep current indentation
code[i] = indentCode(code[i]);
}
if (settings.escape) { code[i] = code[i].replace(/&/g, "&").replace(/</g, "<").replace(/>/g,">"); }
if (settings.log) { console.log(code[i]); }
}
$(this).html(code.join('\n'));
}
});
}
});
================================================
FILE: assets/js/lib/html5shiv.js
================================================
/*! HTML5 Shiv vpre3.6 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */
(function(g,i){var l=g.html5||{};var c=/^<|^(?:button|form|map|select|textarea|object|iframe|option|optgroup)$/i;var j=/^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i;var b;var d;(function(){var m=i.createElement("a");m.innerHTML="<xyz></xyz>";b=("hidden" in m);if(b&&typeof injectElementWithStyles=="function"){injectElementWithStyles("#modernizr{}",function(n){n.hidden=true;b=(g.getComputedStyle?getComputedStyle(n,null):n.currentStyle).display=="none"})}d=m.childNodes.length==1||(function(){try{(i.createElement)("a")}catch(n){return true}var o=i.createDocumentFragment();return(typeof o.cloneNode=="undefined"||typeof o.createDocumentFragment=="undefined"||typeof o.createElement=="undefined")}())}());function k(m,o){var q=m.createElement("p"),n=m.getElementsByTagName("head")[0]||m.documentElement;q.innerHTML="x<style>"+o+"</style>";return n.insertBefore(q.lastChild,n.firstChild)}function f(){var m=e.elements;return typeof m=="string"?m.split(" "):m}function h(n){var m={},q=n.createElement,o=n.createDocumentFragment,p=o();n.createElement=function(s){if(!e.shivMethods){return q(s)}var r;if(m[s]){r=m[s].cloneNode()}else{if(j.test(s)){r=(m[s]=q(s)).cloneNode()}else{r=q(s)}}return r.canHaveChildren&&!c.test(s)?p.appendChild(r):r};n.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+f().join().replace(/\w+/g,function(r){q(r);p.createElement(r);return'c("'+r+'")'})+");return n}")(e,p)}function a(n){var m;if(n.documentShived){return n}if(e.shivCSS&&!b){m=!!k(n,"article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio{display:none}canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}mark{background:#FF0;color:#000}")}if(!d){m=!h(n)}if(m){n.documentShived=m}return n}var e={elements:l.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:!(l.shivCSS===false),shivMethods:!(l.shivMethods===false),type:"default",shivDocument:a};g.html5=e;a(i)}(this,document));
================================================
FILE: assets/js/lib/jquery.autocomplete.js
================================================
/**
* Ajax Autocomplete for jQuery, version 1.2.4
* (c) 2013 Tomas Kirda
*
* Ajax Autocomplete for jQuery is freely distributable under the terms of an MIT-style license.
* For details, see the web site: http://www.devbridge.com/projects/autocomplete/jquery/
*
*/
/*jslint browser: true, white: true, plusplus: true */
/*global define, window, document, jQuery */
// Expose plugin as an AMD module if AMD loader is present:
(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
'use strict';
var
utils = (function () {
return {
extend: function (target, source) {
return $.extend(target, source);
},
addEvent: function (element, eventType, handler) {
if (element.addEventListener) {
element.addEventListener(eventType, handler, false);
} else if (element.attachEvent) {
element.attachEvent('on' + eventType, handler);
} else {
throw new Error('Browser doesn\'t support addEventListener or attachEvent');
}
},
removeEvent: function (element, eventType, handler) {
if (element.removeEventListener) {
element.removeEventListener(eventType, handler, false);
} else if (element.detachEvent) {
element.detachEvent('on' + eventType, handler);
}
},
createNode: function (html) {
var div = document.createElement('div');
div.innerHTML = html;
return div.firstChild;
}
};
}()),
keys = {
ESC: 27,
TAB: 9,
RETURN: 13,
UP: 38,
DOWN: 40
};
function Autocomplete(el, options) {
var noop = function () { },
that = this,
defaults = {
autoSelectFirst: false,
appendTo: 'body',
serviceUrl: null,
lookup: null,
onSelect: null,
width: 'auto',
minChars: 1,
maxHeight: 300,
deferRequestBy: 0,
params: {},
formatResult: Autocomplete.formatResult,
delimiter: null,
zIndex: 9999,
type: 'GET',
noCache: false,
onSearchStart: noop,
onSearchComplete: noop,
containerClass: 'autocomplete-suggestions',
tabDisabled: false,
dataType: 'text',
lookupFilter: function (suggestion, originalQuery, queryLowerCase) {
return suggestion.value.toLowerCase().indexOf(queryLowerCase) !== -1;
},
paramName: 'query',
transformResult: function (response, originalQuery) {
var result = typeof response === 'string' ? $.parseJSON(response) : response;
result.query = originalQuery;
return result;
}
};
// Shared variables:
that.element = el;
that.el = $(el);
that.suggestions = [];
that.badQueries = [];
that.selectedIndex = -1;
that.currentValue = that.element.value;
that.intervalId = 0;
that.cachedResponse = [];
that.onChangeInterval = null;
that.onChange = null;
that.ignoreValueChange = false;
that.isLocal = false;
that.suggestionsContainer = null;
that.options = $.extend({}, defaults, options);
that.classes = {
selected: 'autocomplete-selected',
suggestion: 'autocomplete-suggestion'
};
// Initialize and set options:
that.initialize();
that.setOptions(options);
}
Autocomplete.utils = utils;
$.Autocomplete = Autocomplete;
Autocomplete.formatResult = function (suggestion, currentValue) {
var reEscape = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g'),
pattern = '(' + currentValue.replace(reEscape, '\\$1') + ')';
return suggestion.value.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>');
};
Autocomplete.prototype = {
killerFn: null,
initialize: function () {
var that = this,
suggestionSelector = '.' + that.classes.suggestion,
selected = that.classes.selected,
options = that.options,
container;
// Remove autocomplete attribute to prevent native suggestions:
that.element.setAttribute('autocomplete', 'off');
that.killerFn = function (e) {
if ($(e.target).closest('.' + that.options.containerClass).length === 0) {
that.killSuggestions();
that.disableKillerFn();
}
};
// Determine suggestions width:
if (!options.width || options.width === 'auto') {
options.width = that.el.outerWidth(true) - 2;
}
that.suggestionsContainer = Autocomplete.utils.createNode('<div class="' + options.containerClass + '" style="position: absolute; display: none;"></div>');
container = $(that.suggestionsContainer);
container.appendTo(options.appendTo).width(options.width);
// Listen for mouse over event on suggestions list:
container.on('mouseover', suggestionSelector, function () {
that.activate($(this).data('index'));
});
// Deselect active element when mouse leaves suggestions container:
container.on('mouseout', function () {
that.selectedIndex = -1;
container.children('.' + selected).removeClass(selected);
});
// Listen for click event on suggestions list:
container.on('click', suggestionSelector, function () {
that.select($(this).data('index'), false);
});
that.fixPosition();
// Opera does not like keydown:
if (window.opera) {
that.el.on('keypress', function (e) { that.onKeyPress(e); });
} else {
that.el.on('keydown', function (e) { that.onKeyPress(e); });
}
that.el.on('keyup', function (e) { that.onKeyUp(e); });
that.el.on('blur', function () { that.onBlur(); });
that.el.on('focus', function () { that.fixPosition(); });
$(window).resize(function(){
that.fixPosition();
$(that.suggestionsContainer).css({
'width': that.el.outerWidth(true) - 2 + 'px'
});
});
},
onBlur: function () {
this.enableKillerFn();
},
setOptions: function (suppliedOptions) {
var that = this,
options = that.options;
utils.extend(options, suppliedOptions);
that.isLocal = $.isArray(options.lookup);
if (that.isLocal) {
options.lookup = that.verifySuggestionsFormat(options.lookup);
}
// Adjust height, width and z-index:
$(that.suggestionsContainer).css({
'max-height': options.maxHeight + 'px',
'width': options.width + 'px',
'z-index': options.zIndex
});
},
clearCache: function () {
this.cachedResponse = [];
this.badQueries = [];
},
disable: function () {
this.disabled = true;
},
enable: function () {
this.disabled = false;
},
fixPosition: function () {
var that = this,
offset;
// Don't adjsut position if custom container has been specified:
if (that.options.appendTo !== 'body') {
return;
}
offset = that.el.offset();
$(that.suggestionsContainer).css({
top: (offset.top + that.el.outerHeight(true)) + 'px',
left: offset.left + 'px'
});
},
enableKillerFn: function () {
var that = this;
$(document).on('click', that.killerFn);
},
disableKillerFn: function () {
var that = this;
$(document).off('click', that.killerFn);
},
killSuggestions: function () {
var that = this;
that.stopKillSuggestions();
that.intervalId = window.setInterval(function () {
that.hide();
that.stopKillSuggestions();
}, 300);
},
stopKillSuggestions: function () {
window.clearInterval(this.intervalId);
},
onKeyPress: function (e) {
var that = this;
// If suggestions are hidden and user presses arrow down, display suggestions:
if (!that.disabled && !that.visible && e.keyCode === keys.DOWN && that.currentValue) {
that.suggest();
return;
}
if (that.disabled || !that.visible) {
return;
}
switch (e.keyCode) {
case keys.ESC:
that.el.val(that.currentValue);
that.hide();
break;
case keys.TAB:
case keys.RETURN:
if (that.selectedIndex === -1) {
that.hide();
return;
}
that.select(that.selectedIndex, e.keyCode === keys.RETURN);
if (e.keyCode === keys.TAB && this.options.tabDisabled === false) {
return;
}
break;
case keys.UP:
that.moveUp();
break;
case keys.DOWN:
that.moveDown();
break;
default:
return;
}
// Cancel event if function did not return:
e.stopImmediatePropagation();
e.preventDefault();
},
onKeyUp: function (e) {
var that = this;
if (that.disabled) {
return;
}
switch (e.keyCode) {
case keys.UP:
case keys.DOWN:
return;
}
clearInterval(that.onChangeInterval);
if (that.currentValue !== that.el.val()) {
if (that.options.deferRequestBy > 0) {
// Defer lookup in case when value changes very quickly:
that.onChangeInterval = setInterval(function () {
that.onValueChange();
}, that.options.deferRequestBy);
} else {
that.onValueChange();
}
}
},
onValueChange: function () {
var that = this,
q;
clearInterval(that.onChangeInterval);
that.currentValue = that.element.value;
q = that.getQuery(that.currentValue);
that.selectedIndex = -1;
if (that.ignoreValueChange) {
that.ignoreValueChange = false;
return;
}
if (q.length < that.options.minChars) {
that.hide();
} else {
that.getSuggestions(q);
}
},
getQuery: function (value) {
var delimiter = this.options.delimiter,
parts;
if (!delimiter) {
return $.trim(value);
}
parts = value.split(delimiter);
return $.trim(parts[parts.length - 1]);
},
getSuggestionsLocal: function (query) {
var that = this,
queryLowerCase = query.toLowerCase(),
filter = that.options.lookupFilter;
return {
suggestions: $.grep(that.options.lookup, function (suggestion) {
return filter(suggestion, query, queryLowerCase);
})
};
},
getSuggestions: function (q) {
var response,
that = this,
options = that.options;
response = that.isLocal ? that.getSuggestionsLocal(q) : that.cachedResponse[q];
if (response && $.isArray(response.suggestions)) {
that.suggestions = response.suggestions;
that.suggest();
} else if (!that.isBadQuery(q)) {
options.params[options.paramName] = q;
options.onSearchStart.call(that.element, options.params);
$.ajax({
url: options.serviceUrl,
data: options.params,
type: options.type,
dataType: options.dataType
}).done(function (data) {
that.processResponse(data, q);
options.onSearchComplete.call(that.element, q);
});
}
},
isBadQuery: function (q) {
var badQueries = this.badQueries,
i = badQueries.length;
while (i--) {
if (q.indexOf(badQueries[i]) === 0) {
return true;
}
}
return false;
},
hide: function () {
var that = this;
that.visible = false;
that.selectedIndex = -1;
$(that.suggestionsContainer).hide();
},
suggest: function () {
if (this.suggestions.length === 0) {
this.hide();
return;
}
var that = this,
formatResult = that.options.formatResult,
value = that.getQuery(that.currentValue),
className = that.classes.suggestion,
classSelected = that.classes.selected,
container = $(that.suggestionsContainer),
html = '';
// Build suggestions inner HTML:
$.each(that.suggestions, function (i, suggestion) {
html += '<div class="' + className + '" data-index="' + i + '">' + formatResult(suggestion, value) + '</div>';
});
container.html(html).show();
that.visible = true;
// Select first value by default:
if (that.options.autoSelectFirst) {
that.selectedIndex = 0;
container.children().first().addClass(classSelected);
}
},
verifySuggestionsFormat: function (suggestions) {
// If suggestions is string array, convert them to supported format:
if (suggestions.length && typeof suggestions[0] === 'string') {
return $.map(suggestions, function (value) {
return { value: value, data: null };
});
}
return suggestions;
},
processResponse: function (response, originalQuery) {
var that = this,
options = that.options,
result = that.options.transformResult(response, originalQuery);
result.suggestions = that.verifySuggestionsFormat(result.suggestions);
// Cache results if cache is not disabled:
if (!options.noCache) {
that.cachedResponse[result[options.paramName]] = result;
if (result.suggestions.length === 0) {
that.badQueries.push(result[options.paramName]);
}
}
// Display suggestions only if returned query matches current value:
if (result.query === that.getQuery(that.currentValue)) {
that.suggestions = result.suggestions;
that.suggest();
}
},
activate: function (index) {
var that = this,
activeItem,
selected = that.classes.selected,
container = $(that.suggestionsContainer),
children = container.children();
container.children('.' + selected).removeClass(selected);
that.selectedIndex = index;
if (that.selectedIndex !== -1 && children.length > that.selectedIndex) {
activeItem = children.get(that.selectedIndex);
$(activeItem).addClass(selected);
return activeItem;
}
return null;
},
select: function (i, shouldIgnoreNextValueChange) {
var that = this,
selectedValue = that.suggestions[i];
if (selectedValue) {
that.el.val(selectedValue);
that.ignoreValueChange = shouldIgnoreNextValueChange;
that.hide();
that.onSelect(i);
}
},
moveUp: function () {
var that = this;
if (that.selectedIndex === -1) {
return;
}
if (that.selectedIndex === 0) {
$(that.suggestionsContainer).children().first().removeClass(that.classes.selected);
that.selectedIndex = -1;
that.el.val(that.currentValue);
return;
}
that.adjustScroll(that.selectedIndex - 1);
},
moveDown: function () {
var that = this;
if (that.selectedIndex === (that.suggestions.length - 1)) {
return;
}
that.adjustScroll(that.selectedIndex + 1);
},
adjustScroll: function (index) {
var that = this,
activeItem = that.activate(index),
offsetTop,
upperBound,
lowerBound,
heightDelta = 25;
if (!activeItem) {
return;
}
offsetTop = activeItem.offsetTop;
upperBound = $(that.suggestionsContainer).scrollTop();
lowerBound = upperBound + that.options.maxHeight - heightDelta;
if (offsetTop < upperBound) {
$(that.suggestionsContainer).scrollTop(offsetTop);
} else if (offsetTop > lowerBound) {
$(that.suggestionsContainer).scrollTop(offsetTop - that.options.maxHeight + heightDelta);
}
that.el.val(that.getValue(that.suggestions[index].value));
},
onSelect: function (index) {
var that = this,
onSelectCallback = that.options.onSelect,
suggestion = that.suggestions[index];
that.el.val(that.getValue(suggestion.value));
if ($.isFunction(onSelectCallback)) {
onSelectCallback.call(that.element, suggestion);
}
},
getValue: function (value) {
var that = this,
delimiter = that.options.delimiter,
currentValue,
parts;
if (!delimiter) {
return value;
}
currentValue = that.currentValue;
parts = currentValue.split(delimiter);
if (parts.length === 1) {
return value;
}
return currentValue.substr(0, currentValue.length - parts[parts.length - 1].length) + value;
}
};
// Create chainable jQuery plugin:
$.fn.autocomplete = function (options, args) {
return this.each(function () {
var dataKey = 'autocomplete',
inputElement = $(this),
instance;
if (typeof options === 'string') {
instance = inputElement.data(dataKey);
if (typeof instance[options] === 'function') {
instance[options](args);
}
} else {
instance = new Autocomplete(this, options);
inputElement.data(dataKey, instance);
}
});
};
}));
================================================
FILE: assets/js/lib/jquery.couch.js
================================================
// 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.
/**
* @namespace
* $.couch is used to communicate with a CouchDB server, the server methods can
* be called directly without creating an instance. Typically all methods are
* passed an <code>options</code> object which defines a success callback which
* is called with the data returned from the http request to CouchDB, you can
* find the other settings that can be used in the <code>options</code> object
* from <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
* jQuery.ajax settings</a>
* <pre><code>$.couch.activeTasks({
* success: function (data) {
* console.log(data);
* }
* });</code></pre>
* Outputs (for example):
* <pre><code>[
* {
* "pid" : "<0.11599.0>",
* "status" : "Copied 0 of 18369 changes (0%)",
* "task" : "recipes",
* "type" : "Database Compaction"
* }
*]</code></pre>
*/
(function($) {
$.couch = $.couch || {};
/** @lends $.couch */
/**
* @private
*/
function encodeDocId(docID) {
var parts = docID.split("/");
if (parts[0] == "_design") {
parts.shift();
return "_design/" + encodeURIComponent(parts.join('/'));
}
return encodeURIComponent(docID);
}
/**
* @private
*/
var uuidCache = [];
$.extend($.couch, {
urlPrefix: '',
/**
* You can obtain a list of active tasks by using the /_active_tasks URL.
* The result is a JSON array of the currently running tasks, with each task
* being described with a single object.
* @see <a href="http://techzone.couchbase.com/sites/default/files/uploads/
* all/documentation/couchbase-api-misc.html#couchbase-api-misc_active-task
* s_get">docs for /_active_tasks</a>
* @param {ajaxSettings} options <a href="http://api.jquery.com/jQuery.ajax
* /#jQuery-ajax-settings">jQuery ajax settings</a>
*/
activeTasks: function(options) {
ajax(
{url: this.urlPrefix + "/_active_tasks"},
options,
"Active task status could not be retrieved"
);
},
/**
* Returns a list of all the databases in the CouchDB instance
* @see <a href="http://techzone.couchbase.com/sites/default/files/uploads/
* all/documentation/couchbase-api-misc.html#couchbase-api-misc_active-task
* s_get">docs for /_all_dbs</a>
* @param {ajaxSettings} options <a href="http://api.jquery.com/jQuery.ajax
* /#jQuery-ajax-settings">jQuery ajax settings</a>
*/
allDbs: function(options) {
ajax(
{url: this.urlPrefix + "/_all_dbs"},
options,
"An error occurred retrieving the list of all databases"
);
},
/**
* View and edit the CouchDB configuration, called with just the options
* parameter the entire config is returned, you can be more specific by
* passing the section and option parameters, if you specify a value that
* value will be stored in the configuration.
* @see <a href="http://techzone.couchbase.com/sites/default/files/uploads/
* all/documentation/couchbase-api-config.html#couchbase-api-config_config
* -section-key_put">docs for /_config</a>
* @param {ajaxSettings} options
* <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
* jQuery ajax settings</a>
* @param {String} [section] the section of the config
* @param {String} [option] the particular config option
* @param {String} [value] value to be set
*/
config: function(options, section, option, value) {
var req = {url: this.urlPrefix + "/_config/"};
if (section) {
req.url += encodeURIComponent(section) + "/";
if (option) {
req.url += encodeURIComponent(option);
}
}
if (value === null) {
req.type = "DELETE";
} else if (value !== undefined) {
req.type = "PUT";
req.data = toJSON(value);
req.contentType = "application/json";
req.processData = false
}
ajax(req, options,
"An error occurred retrieving/updating the server configuration"
);
},
/**
* Returns the session information for the currently logged in user.
* @param {ajaxSettings} options
* <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
* jQuery ajax settings</a>
*/
session: function(options) {
options = options || {};
ajax({
type: "GET", url: this.urlPrefix + "/_session",
beforeSend: function(xhr) {
xhr.setRequestHeader('Accept', 'application/json');
},
complete: function(req) {
var resp = $.parseJSON(req.responseText);
if (req.status == 200) {
if (options.success) options.success(resp);
} else if (options.error) {
options.error(req.status, resp.error, resp.reason);
} else {
throw "An error occurred getting session info: " + resp.reason;
}
}
});
},
/**
* @private
*/
userDb : function(callback) {
$.couch.session({
success : function(resp) {
var userDb = $.couch.db(resp.info.authentication_db);
callback(userDb);
}
});
},
/**
* Create a new user on the CouchDB server, <code>user_doc</code> is an
* object with a <code>name</code> field and other information you want
* to store relating to that user, for example
* <code>{"name": "daleharvey"}</code>
* @param {Object} user_doc Users details
* @param {String} password Users password
* @param {ajaxSettings} options
* <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
* jQuery ajax settings</a>
*/
signup: function(user_doc, password, options) {
options = options || {};
user_doc.password = password;
user_doc.roles = user_doc.roles || [];
user_doc.type = user_doc.type = "user" || [];
var user_prefix = "org.couchdb.user:";
user_doc._id = user_doc._id || user_prefix + user_doc.name;
$.couch.userDb(function(db) {
db.saveDoc(user_doc, options);
});
},
/**
* Authenticate against CouchDB, the <code>options</code> parameter is
*expected to have <code>name</code> and <code>password</code> fields.
* @param {ajaxSettings} options
* <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
* jQuery ajax settings</a>
*/
login: function(options) {
options = options || {};
$.ajax({
type: "POST", url: this.urlPrefix + "/_session", dataType: "json",
data: {name: options.name, password: options.password},
beforeSend: function(xhr) {
xhr.setRequestHeader('Accept', 'application/json');
},
complete: function(req) {
var resp = $.parseJSON(req.responseText);
if (req.status == 200) {
if (options.success) options.success(resp);
} else if (options.error) {
options.error(req.status, resp.error, resp.reason);
} else {
throw 'An error occurred logging in: ' + resp.reason;
}
}
});
},
/**
* Delete your current CouchDB user session
* @param {ajaxSettings} options
* <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
* jQuery ajax settings</a>
*/
logout: function(options) {
options = options || {};
$.ajax({
type: "DELETE", url: this.urlPrefix + "/_session", dataType: "json",
username : "_", password : "_",
beforeSend: function(xhr) {
xhr.setRequestHeader('Accept', 'application/json');
},
complete: function(req) {
var resp = $.parseJSON(req.responseText);
if (req.status == 200) {
if (options.success) options.success(resp);
} else if (options.error) {
options.error(req.status, resp.error, resp.reason);
} else {
throw 'An error occurred logging out: ' + resp.reason;
}
}
});
},
/**
* @namespace
* $.couch.db is used to communicate with a specific CouchDB database
* <pre><code>var $db = $.couch.db("mydatabase");
*$db.allApps({
* success: function (data) {
* ... process data ...
* }
*});
* </code></pre>
*/
db: function(name, db_opts) {
db_opts = db_opts || {};
var rawDocs = {};
function maybeApplyVersion(doc) {
if (doc._id && doc._rev && rawDocs[doc._id] &&
rawDocs[doc._id].rev == doc._rev) {
// todo: can we use commonjs require here?
if (typeof Base64 == "undefined") {
throw 'Base64 support not found.';
} else {
doc._attachments = doc._attachments || {};
doc._attachments["rev-"+doc._rev.split("-")[0]] = {
content_type :"application/json",
data : Base64.encode(rawDocs[doc._id].raw)
};
return true;
}
}
};
return /** @lends $.couch.db */{
name: name,
uri: this.urlPrefix + "/" + encodeURIComponent(name) + "/",
/**
* Request compaction of the specified database.
* @see <a href="http://techzone.couchbase.com/sites/default/files/
* uploads/all/documentation/couchbase-api-db.html#couchbase-api-db_
* db-compact_post">docs for /db/_compact</a>
* @param {ajaxSettings} options
* <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
* jQuery ajax settings</a>
*/
compact: function(options) {
$.extend(options, {successStatus: 202});
ajax({
type: "POST", url: this.uri + "_compact",
data: "", processData: false
},
options,
"The database could not be compacted"
);
},
/**
* Cleans up the cached view output on disk for a given view.
* @see <a href="http://techzone.couchbase.com/sites/default/files/
* uploads/all/documentation/couchbase-api-db.html#couchbase-api-db
* _db-view-cleanup_post">docs for /db/_compact</a>
* @param {ajaxSettings} options <a href="http://api.jquery.com/
* jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
*/
viewCleanup: function(options) {
$.extend(options, {successStatus: 202});
ajax({
type: "POST", url: this.uri + "_view_cleanup",
data: "", processData: false
},
options,
"The views could not be cleaned up"
);
},
/**
* Compacts the view indexes associated with the specified design
* document. You can use this in place of the full database compaction
* if you know a specific set of view indexes have been affected by a
* recent database change.
* @see <a href="http://techzone.couchbase.com/sites/default/files/upl
* oads/all/documentation/couchbase-api-db.html#couchbase-api-db_db-
* compact-design-doc_post">docs for /db/_compact/design-doc</a>
* @param {String} groupname Name of design-doc to compact
* @param {ajaxSettings} options <a href="http://api.jquery.com/
* jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
*/
compactView: function(groupname, options) {
$.extend(options, {successStatus: 202});
ajax({
type: "POST", url: this.uri + "_compact/" + groupname,
data: "", processData: false
},
options,
"The view could not be compacted"
);
},
/**
* Create a new database
* @see <a href="http://techzone.couchbase.com/sites/default/files/
* uploads/all/documentation/couchbase-api-db.html#couchbase-api-db_
* db_put">docs for PUT /db/</a>
* @param {ajaxSettings} options <a href="http://api.jquery.com/
* jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
*/
create: function(options) {
$.extend(options, {successStatus: 201});
ajax({
type: "PUT", url: this.uri, contentType: "application/json",
data: "", processData: false
},
options,
"The database could not be created"
);
},
/**
* Deletes the specified database, and all the documents and
* attachments contained within it.
* @see <a href="http://techzone.couchbase.com/sites/default/files/
* uploads/all/documentation/couchbase-api-db.html#couchbase-api-db_
* db_delete">docs for DELETE /db/</a>
* @param {ajaxSettings} options <a href="http://api.jquery.com/
* jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
*/
drop: function(options) {
ajax(
{type: "DELETE", url: this.uri},
options,
"The database could not be deleted"
);
},
/**
* Gets information about the specified database.
* @see <a href="http://techzone.couchbase.com/sites/default/files/
* uploads/all/documentation/couchbase-api-db.html#couchbase-api-db
* _db_get">docs for GET /db/</a>
* @param {ajaxSettings} options <a href="http://api.jquery.com/
* jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
*/
info: function(options) {
ajax(
{url: this.uri},
options,
"Database information could not be retrieved"
);
},
/**
* @namespace
* $.couch.db.changes provides an API for subscribing to the changes
* feed
* <pre><code>var $changes = $.couch.db("mydatabase").changes();
*$changes.onChange = function (data) {
* ... process data ...
* }
* $changes.stop();
* </code></pre>
*/
changes: function(since, options) {
options = options || {};
// set up the promise object within a closure for this handler
var timeout = 100, db = this, active = true,
listeners = [],
promise = /** @lends $.couch.db.changes */ {
/**
* Add a listener callback
* @see <a href="http://techzone.couchbase.com/sites/default/
* files/uploads/all/documentation/couchbase-api-db.html#couch
* base-api-db_db-changes_get">docs for /db/_changes</a>
* @param {Function} fun Callback function to run when
* notified of changes.
*/
onChange : function(fun) {
listeners.push(fun);
},
/**
* Stop subscribing to the changes feed
*/
stop : function() {
active = false;
}
};
// call each listener when there is a change
function triggerListeners(resp) {
$.each(listeners, function() {
this(resp);
});
};
// when there is a change, call any listeners, then check for
// another change
options.success = function(resp) {
timeout = 100;
if (active) {
since = resp.last_seq;
triggerListeners(resp);
getChangesSince();
};
};
options.error = function() {
if (active) {
setTimeout(getChangesSince, timeout);
timeout = timeout * 2;
}
};
// actually make the changes request
function getChangesSince() {
var opts = $.extend({heartbeat : 10 * 1000}, options, {
feed : "longpoll",
since : since
});
ajax(
{url: db.uri + "_changes"+encodeOptions(opts)},
options,
"Error connecting to "+db.uri+"/_changes."
);
}
// start the first request
if (since) {
getChangesSince();
} else {
db.info({
success : function(info) {
since = info.update_seq;
getChangesSince();
}
});
}
return promise;
},
/**
* Fetch all the docs in this db, you can specify an array of keys to
* fetch by passing the <code>keys</code> field in the
* <code>options</code>
* parameter.
* @see <a href="http://techzone.couchbase.com/sites/default/files/
* uploads/all/documentation/couchbase-api-db.html#couchbase-api-db_
* db-all-docs_get">docs for /db/all_docs/</a>
* @param {ajaxSettings} options <a href="http://api.jquery.com/
* jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
*/
allDocs: function(options) {
var type = "GET";
var data = null;
if (options["keys"]) {
type = "POST";
var keys = options["keys"];
delete options["keys"];
data = toJSON({ "keys": keys });
}
ajax({
type: type,
data: data,
url: this.uri + "_all_docs" + encodeOptions(options)
},
options,
"An error occurred retrieving a list of all documents"
);
},
/**
* Fetch all the design docs in this db
* @param {ajaxSettings} options <a href="http://api.jquery.com/
* jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
*/
allDesignDocs: function(options) {
this.allDocs($.extend(
{startkey:"_design", endkey:"_design0"}, options));
},
/**
* Fetch all the design docs with an index.html, <code>options</code>
* parameter expects an <code>eachApp</code> field which is a callback
* called on each app found.
* @param {ajaxSettings} options <a href="http://api.jquery.com/
* jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
*/
allApps: function(options) {
options = options || {};
var self = this;
if (options.eachApp) {
this.allDesignDocs({
success: function(resp) {
$.each(resp.rows, function() {
self.openDoc(this.id, {
success: function(ddoc) {
var index, appPath, appName = ddoc._id.split('/');
appName.shift();
appName = appName.join('/');
index = ddoc.couchapp && ddoc.couchapp.index;
if (index) {
appPath = ['', name, ddoc._id, index].join('/');
} else if (ddoc._attachments &&
ddoc._attachments["index.html"]) {
appPath = ['', name, ddoc._id, "index.html"].join('/');
}
if (appPath) options.eachApp(appName, appPath, ddoc);
}
});
});
}
});
} else {
throw 'Please provide an eachApp function for allApps()';
}
},
/**
* Returns the specified doc from the specified db.
* @see <a href="http://techzone.couchbase.com/sites/default/files/
* uploads/all/documentation/couchbase-api-dbdoc.html#couchbase-api-
* dbdoc_db-doc_get">docs for GET /db/doc</a>
* @param {String} docId id of document to fetch
* @param {ajaxSettings} options <a href="http://api.jquery.com/
* jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
* @param {ajaxSettings} ajaxOptions <a href="http://api.jquery.com/
* jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
*/
openDoc: function(docId, options, ajaxOptions) {
options = options || {};
if (db_opts.attachPrevRev || options.attachPrevRev) {
$.extend(options, {
beforeSuccess : function(req, doc) {
rawDocs[doc._id] = {
rev : doc._rev,
raw : req.responseText
};
}
});
} else {
$.extend(options, {
beforeSuccess : function(req, doc) {
if (doc["jquery.couch.attachPrevRev"]) {
rawDocs[doc._id] = {
rev : doc._rev,
raw : req.responseText
};
}
}
});
}
ajax({url: this.uri + encodeDocId(docId) + encodeOptions(options)},
options,
"The document could not be retrieved",
ajaxOptions
);
},
/**
* Create a new document in the specified database, using the supplied
* JSON document structure. If the JSON structure includes the _id
* field, then the document will be created with the specified document
* ID. If the _id field is not specified, a new unique ID will be
* generated.
* @see <a href="http://techzone.couchbase.com/sites/default/files/
* uploads/all/documentation/couchbase-api-dbdoc.html#couchbase-api-
* dbdoc_db_post">docs for GET /db/doc</a>
* @param {String} doc document to save
* @param {ajaxSettings} options <a href="http://api.jquery.com/
* jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
*/
saveDoc: function(doc, options) {
options = options || {};
var db = this;
var beforeSend = fullCommit(options);
if (doc._id === undefined) {
var method = "POST";
var uri = this.uri;
} else {
var method = "PUT";
var uri = this.uri + encodeDocId(doc._id);
}
var versioned = maybeApplyVersion(doc);
$.ajax({
type: method, url: uri + encodeOptions(options),
contentType: "application/json",
dataType: "json", data: toJSON(doc),
beforeSend : beforeSend,
complete: function(req) {
var resp = $.parseJSON(req.responseText);
if (req.status == 200 || req.status == 201 || req.status == 202) {
doc._id = resp.id;
doc._rev = resp.rev;
if (versioned) {
db.openDoc(doc._id, {
attachPrevRev : true,
success : function(d) {
doc._attachments = d._attachments;
if (options.success) options.success(resp);
}
});
} else {
if (options.success) options.success(resp);
}
} else if (options.error) {
options.error(req.status, resp.error, resp.reason);
} else {
throw "The document could not be saved: " + resp.reason;
}
}
});
},
/**
* Save a list of documents
* @see <a href="http://techzone.couchbase.com/sites/default/files/
* uploads/all/documentation/couchbase-api-db.html#couchbase-api-db_
* db-bulk-docs_post">docs for /db/_bulk_docs</a>
* @param {Object[]} docs List of documents to save
* @param {ajaxSettings} options <a href="http://api.jquery.com/
* jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
*/
bulkSave: function(docs, options) {
var beforeSend = fullCommit(options);
$.extend(options, {successStatus: 201, beforeSend : beforeSend});
ajax({
type: "POST",
url: this.uri + "_bulk_docs" + encodeOptions(options),
contentType: "application/json", data: toJSON(docs)
},
options,
"The documents could not be saved"
);
},
/**
* Deletes the specified document from the database. You must supply
* the current (latest) revision and <code>id</code> of the document
* to delete eg <code>removeDoc({_id:"mydoc", _rev: "1-2345"})</code>
* @see <a href="http://techzone.couchbase.com/sites/default/files/
* uploads/all/documentation/couchbase-api-dbdoc.html#couchbase-api
* -dbdoc_db-doc_delete">docs for DELETE /db/doc</a>
* @param {Object} doc Document to delete
* @param {ajaxSettings} options <a href="http://api.jquery.com/
* jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
*/
removeDoc: function(doc, options) {
ajax({
type: "DELETE",
url: this.uri +
encodeDocId(doc._id) +
encodeOptions({rev: doc._rev})
},
options,
"The document could not be deleted"
);
},
/**
* Remove a set of documents
* @see <a href="http://techzone.couchbase.com/sites/default/files/
* uploads/all/documentation/couchbase-api-db
gitextract_hig6wl4x/
├── .gitignore
├── .jshintrc
├── .travis.yml
├── CONTRIBUTING.md
├── Gruntfile.js
├── License.md
├── MAINTAINING.md
├── README.md
├── app.js
├── appveyor.yml
├── assets/
│ ├── css/
│ │ ├── base/
│ │ │ ├── buttons.less
│ │ │ ├── grids.less
│ │ │ ├── navigation.less
│ │ │ ├── ntf.less
│ │ │ └── togglers.less
│ │ ├── clarify.bundle.less
│ │ ├── cosmetic/
│ │ │ ├── helpers.less
│ │ │ ├── highlights.less
│ │ │ └── links.less
│ │ ├── defaults.less
│ │ ├── mixins.less
│ │ ├── project/
│ │ │ ├── auth.less
│ │ │ ├── autocomplete.less
│ │ │ ├── catalog.less
│ │ │ ├── clarify-in-spec.less
│ │ │ ├── clarify.less
│ │ │ ├── examples.less
│ │ │ ├── footer.less
│ │ │ ├── header.less
│ │ │ ├── info.less
│ │ │ ├── layout.less
│ │ │ ├── modal.less
│ │ │ ├── navigation.less
│ │ │ ├── search.less
│ │ │ ├── section.less
│ │ │ └── source-code.less
│ │ ├── reset.less
│ │ ├── source.css
│ │ └── variables.less
│ ├── fonts/
│ │ └── Webfont EULA 1.6.txt
│ ├── js/
│ │ ├── _require.bundle.js
│ │ ├── clarify.js
│ │ ├── enter-the-source.js
│ │ ├── lib/
│ │ │ ├── autocomplete.js
│ │ │ ├── codeFormat.js
│ │ │ ├── html5shiv.js
│ │ │ ├── jquery.autocomplete.js
│ │ │ ├── jquery.couch.js
│ │ │ ├── jquery.mb.browser.js
│ │ │ ├── lodash.js
│ │ │ ├── modalbox.js
│ │ │ ├── prism/
│ │ │ │ ├── prism.css
│ │ │ │ └── prism.js
│ │ │ ├── require.js
│ │ │ └── text.js
│ │ ├── load-options.js
│ │ ├── modules/
│ │ │ ├── auth.js
│ │ │ ├── browser.js
│ │ │ ├── clarifyInSpec.js
│ │ │ ├── codeSource.js
│ │ │ ├── couch.js
│ │ │ ├── css.js
│ │ │ ├── globalNav.js
│ │ │ ├── headerFooter.js
│ │ │ ├── htmlAPISync.js
│ │ │ ├── inlineOptions.js
│ │ │ ├── innerNavigation.js
│ │ │ ├── loadEvents.js
│ │ │ ├── module.js
│ │ │ ├── moduleLoader.js
│ │ │ ├── navHighlight.js
│ │ │ ├── ntf.js
│ │ │ ├── parseFileTree.js
│ │ │ ├── scrollToHash.js
│ │ │ ├── search.js
│ │ │ ├── sectionFolding.js
│ │ │ ├── sections.js
│ │ │ ├── sectionsParser.js
│ │ │ ├── specDecorations.js
│ │ │ ├── trimSpaces.js
│ │ │ └── utils.js
│ │ └── require-config.js
│ ├── templates/
│ │ ├── clarifyPanel.inc.html
│ │ ├── footer.inc.html
│ │ ├── header.inc.html
│ │ ├── nav.inc.html
│ │ ├── navActionItem.inc.html
│ │ └── navActionTumbler.inc.html
│ └── test/
│ ├── index.html
│ ├── jasmine/
│ │ ├── MIT.LICENSE
│ │ ├── jasmine-html.js
│ │ ├── jasmine.css
│ │ └── jasmine.js
│ ├── js/
│ │ └── tests.js
│ └── spec/
│ ├── innerNavigationSpec.js
│ ├── moduleSpec.js
│ └── sectionsSpec.js
├── core/
│ ├── api/
│ │ ├── index.js
│ │ └── optionsApi.js
│ ├── auth.js
│ ├── ejsWithHelpers.js
│ ├── file-tree/
│ │ └── index.js
│ ├── headerFooter.js
│ ├── html-tree/
│ │ ├── html-parser/
│ │ │ ├── index.js
│ │ │ └── phantomRunner.js
│ │ └── index.js
│ ├── lib/
│ │ ├── configUtils.js
│ │ ├── createLink.js
│ │ ├── extendTillSpec.js
│ │ ├── flattenTillSpec.js
│ │ ├── parseData.js
│ │ ├── pathResolver.js
│ │ ├── processMd.js
│ │ ├── specUtils.js
│ │ ├── translit.js
│ │ ├── utils.js
│ │ └── viewResolver.js
│ ├── loadOptions.js
│ ├── loadPlugins.js
│ ├── logger.js
│ ├── middlewares/
│ │ ├── clarify.js
│ │ ├── loader.js
│ │ ├── md.js
│ │ ├── mdTag.js
│ │ ├── read.js
│ │ ├── send.js
│ │ └── wrap.js
│ ├── postInstall.js
│ ├── routes/
│ │ ├── index.js
│ │ └── redirects.js
│ ├── trackInstall.js
│ ├── trackStats.js
│ ├── unflat.js
│ ├── views/
│ │ ├── 404.ejs
│ │ ├── auth-done.ejs
│ │ ├── clarify/
│ │ │ ├── clear.ejs
│ │ │ └── default.ejs
│ │ ├── clean-spec.ejs
│ │ ├── doc.ejs
│ │ ├── navigation.ejs
│ │ └── spec.ejs
│ └── watch/
│ ├── childWatch.js
│ └── index.js
├── docs/
│ ├── README.md
│ ├── api/
│ │ ├── index.src.html
│ │ ├── info.json
│ │ ├── load-events/
│ │ │ ├── info.json
│ │ │ └── readme.md
│ │ ├── plugins/
│ │ │ ├── info.json
│ │ │ └── readme.md
│ │ ├── readme.md
│ │ └── rest-api/
│ │ ├── info.json
│ │ └── readme.md
│ ├── auth/
│ │ ├── info.json
│ │ └── readme.md
│ ├── base/
│ │ ├── info.json
│ │ └── readme.md
│ ├── build-tasks/
│ │ ├── info.json
│ │ └── readme.md
│ ├── clarify/
│ │ ├── info.json
│ │ └── readme.md
│ ├── configuration/
│ │ ├── info.json
│ │ └── readme.md
│ ├── data/
│ │ └── bootstrap.css
│ ├── data-nav/
│ │ ├── example/
│ │ │ ├── info.json
│ │ │ └── readme.md
│ │ ├── info.json
│ │ └── readme.md
│ ├── index.src.html
│ ├── info-json/
│ │ ├── info.json
│ │ └── readme.md
│ ├── info.json
│ ├── markdown/
│ │ ├── info.json
│ │ └── readme.md
│ ├── migration/
│ │ ├── info.json
│ │ └── readme.md
│ ├── spec/
│ │ ├── css/
│ │ │ └── spec.css
│ │ ├── index.src.html
│ │ └── info.json
│ ├── spec-helpers/
│ │ ├── examples/
│ │ │ ├── buttons.html
│ │ │ ├── include.html
│ │ │ ├── markdown-file.md
│ │ │ ├── mask-one.html
│ │ │ ├── mask-two.html
│ │ │ └── three.html
│ │ ├── info.json
│ │ └── readme.md
│ ├── starting/
│ │ ├── css/
│ │ │ └── starting.css
│ │ ├── index.src.html
│ │ └── info.json
│ ├── starting-md/
│ │ ├── css/
│ │ │ └── starting.css
│ │ ├── info.json
│ │ └── readme.md
│ └── test-specs/
│ └── styles/
│ ├── includes/
│ │ └── all-tags.html
│ ├── index.src.html
│ └── info.json
├── options.js
├── package.json
├── source.sh
└── test/
├── data/
│ ├── api-test-html.json
│ └── api-test-specs.json
├── functional/
│ ├── common.js
│ ├── globalNav.js
│ ├── search.js
│ ├── snippets.md
│ └── specpage.js
└── unit/
├── api/
│ ├── html.js
│ └── specs.js
├── ejsHelpersSpec.js
├── lib/
│ ├── extendTillSpec.js
│ └── utils.js
├── middleware/
│ ├── clarify.js
│ └── md.js
└── partials/
├── markdown-ejs-nested.md
├── markdown-ejs.md
├── markdown.md
├── mask-one.html
├── mask-two.html
└── three.html
SYMBOL INDEX (79 symbols across 29 files)
FILE: assets/js/lib/html5shiv.js
function k (line 2) | function k(m,o){var q=m.createElement("p"),n=m.getElementsByTagName("hea...
function f (line 2) | function f(){var m=e.elements;return typeof m=="string"?m.split(" "):m}
function h (line 2) | function h(n){var m={},q=n.createElement,o=n.createDocumentFragment,p=o(...
function a (line 2) | function a(n){var m;if(n.documentShived){return n}if(e.shivCSS&&!b){m=!!...
FILE: assets/js/lib/jquery.autocomplete.js
function Autocomplete (line 69) | function Autocomplete(el, options) {
FILE: assets/js/lib/jquery.couch.js
function encodeDocId (line 45) | function encodeDocId(docID) {
function maybeApplyVersion (line 266) | function maybeApplyVersion(doc) {
function triggerListeners (line 437) | function triggerListeners(resp) {
function getChangesSince (line 459) | function getChangesSince() {
function ajax (line 986) | function ajax(obj, options, errorMessage, ajaxOptions) {
function fullCommit (line 1038) | function fullCommit(options) {
function encodeOptions (line 1055) | function encodeOptions(options) {
function toJSON (line 1075) | function toJSON(obj) {
FILE: assets/js/lib/lodash.js
function n (line 6) | function n(n,t,e){e=(e||0)-1;for(var r=n?n.length:0;++e<r;)if(n[e]===t)r...
function t (line 6) | function t(t,e){var r=typeof e;if(t=t.l,"boolean"==r||null==e)return t[e...
function e (line 6) | function e(n){var t=this.l,e=typeof n;if("boolean"==e||null==n)t[n]=true...
function r (line 7) | function r(n){return n.charCodeAt(0)}
function u (line 7) | function u(n,t){for(var e=n.m,r=t.m,u=-1,o=e.length;++u<o;){var i=e[u],a...
function o (line 7) | function o(n){var t=-1,r=n.length,u=n[0],o=n[r/2|0],i=n[r-1];if(u&&typeo...
function i (line 7) | function i(n){return"\\"+U[n]
function a (line 8) | function a(){return h.pop()||[]}
function f (line 8) | function f(){return g.pop()||{k:null,l:null,m:null,"false":false,n:0,"nu...
function l (line 8) | function l(n){n.length=0,h.length<_&&h.push(n)}
function c (line 8) | function c(n){var t=n.l;t&&c(t),n.k=n.l=n.m=n.object=n.number=n.string=n...
function p (line 8) | function p(n,t,e){t||(t=0),typeof e=="undefined"&&(e=n?n.length:0);var r...
function s (line 8) | function s(e){function h(n,t,e){if(!n||!V[typeof n])return n;
FILE: assets/js/lib/require.js
function isFunction (line 41) | function isFunction(it) {
function isArray (line 45) | function isArray(it) {
function each (line 53) | function each(ary, func) {
function eachReverse (line 68) | function eachReverse(ary, func) {
function hasProp (line 79) | function hasProp(obj, prop) {
function getOwn (line 83) | function getOwn(obj, prop) {
function eachProp (line 92) | function eachProp(obj, func) {
function mixin (line 107) | function mixin(target, source, force, deepStringMixin) {
function bind (line 130) | function bind(obj, fn) {
function scripts (line 136) | function scripts() {
function defaultOnError (line 140) | function defaultOnError(err) {
function getGlobal (line 146) | function getGlobal(value) {
function makeError (line 165) | function makeError(id, msg, err, requireModules) {
function newContext (line 197) | function newContext(contextName) {
function getInteractiveScript (line 1930) | function getInteractiveScript() {
FILE: assets/js/modules/auth.js
function Auth (line 39) | function Auth(config) {
FILE: assets/js/modules/clarifyInSpec.js
function ClarifyInSpec (line 18) | function ClarifyInSpec() {
FILE: assets/js/modules/couch.js
function Couch (line 19) | function Couch() {
FILE: assets/js/modules/css.js
function Css (line 4) | function Css (url, cat) {
FILE: assets/js/modules/globalNav.js
function GlobalNav (line 67) | function GlobalNav() {
FILE: assets/js/modules/htmlAPISync.js
function HtmlAPiSync (line 11) | function HtmlAPiSync() {
FILE: assets/js/modules/innerNavigation.js
function InnerNavigation (line 13) | function InnerNavigation() {
FILE: assets/js/modules/loadEvents.js
function LoadEvents (line 11) | function LoadEvents() {}
function checkPluginsDefinition (line 36) | function checkPluginsDefinition() {
function phantomHook (line 42) | function phantomHook(event) {
function generateSuccessEvent (line 50) | function generateSuccessEvent(eventName) {
function checkPlugins (line 83) | function checkPlugins() {
FILE: assets/js/modules/module.js
function Module (line 5) | function Module() {
FILE: assets/js/modules/moduleLoader.js
function ModuleLoader (line 7) | function ModuleLoader() {
FILE: assets/js/modules/navHighlight.js
function NavHighlight (line 15) | function NavHighlight() {
FILE: assets/js/modules/ntf.js
function Notification (line 8) | function Notification() {
FILE: assets/js/modules/parseFileTree.js
function ParseFileTree (line 19) | function ParseFileTree() {
FILE: assets/js/modules/scrollToHash.js
function showSections (line 19) | function showSections() {
FILE: assets/js/modules/search.js
function getActivationHandler (line 134) | function getActivationHandler(ctx) {
FILE: assets/js/modules/sections.js
function Sections (line 16) | function Sections() {
FILE: assets/js/modules/sectionsParser.js
function SourceGetSections (line 11) | function SourceGetSections() {
FILE: assets/js/modules/utils.js
function Utils (line 14) | function Utils() {}
FILE: assets/test/jasmine/jasmine-html.js
function focusedSpecName (line 126) | function focusedSpecName() {
function createReporterDom (line 148) | function createReporterDom(version) {
function noTryCatch (line 165) | function noTryCatch() {
function searchWithCatch (line 169) | function searchWithCatch() {
function setExceptionHandling (line 188) | function setExceptionHandling() {
function showDetails (line 363) | function showDetails() {
function isUndefined (line 369) | function isUndefined(obj) {
function isDefined (line 373) | function isDefined(obj) {
function specPluralizedFor (line 377) | function specPluralizedFor(count) {
FILE: assets/test/jasmine/jasmine.js
function getGlobal (line 55) | function getGlobal() {
function tryIt (line 621) | function tryIt(f) {
FILE: assets/test/spec/moduleSpec.js
function NewObject (line 48) | function NewObject(){
function NewObject (line 68) | function NewObject(){}
FILE: core/lib/createLink.js
function createLink (line 11) | function createLink(src, dst, type) {
FILE: core/lib/parseData.js
function ParseData (line 17) | function ParseData(config) {
FILE: core/unflat.js
function unflatten (line 3) | function unflatten(target, opts) {
Condensed preview — 219 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,035K chars).
[
{
"path": ".gitignore",
"chars": 248,
"preview": "*.idea\n*.iml\n*.DS_Store\nnode_modules\nnpm-debug.log\n\n# Generated data for API\n/core/api/data\n/log\n\n# Generated JSdoc\n/jsd"
},
{
"path": ".jshintrc",
"chars": 399,
"preview": "{\n\t\"eqeqeq\": true,\n\t\"expr\": true,\n\t\"forin\": true,\n\t\"immed\": true,\n\t\"latedef\": true,\n\t\"smarttabs\": true,\n\t\"strict\": true,"
},
{
"path": ".travis.yml",
"chars": 233,
"preview": "language: node_js\nnode_js:\n - \"0.10\"\n - \"0.11\"\n - \"0.12\"\nsudo: false\nnotifications:\n email:\n on_success: never\n "
},
{
"path": "CONTRIBUTING.md",
"chars": 985,
"preview": "# How to become a contributor and submit your own code\n\n## Contributing A Patch\n\n1. Submit an issue describing your prop"
},
{
"path": "Gruntfile.js",
"chars": 9647,
"preview": "'use strict';\nvar path = require('path');\nvar fs = require('fs');\n\nvar pathToApp = path.resolve('./');\nglobal.pathToApp "
},
{
"path": "License.md",
"chars": 1078,
"preview": "# The MIT License\n\nCopyright © 2013-2016 Sourcejs.com\n\nPermission is hereby granted, free of charge, to any person obtai"
},
{
"path": "MAINTAINING.md",
"chars": 4037,
"preview": "# On Collaborative Development.\n\nThis document represents SourceJS team development agreements.\n\n## Patches welcome\n\nFir"
},
{
"path": "README.md",
"chars": 8649,
"preview": "# [ON HOLD] SourceJS - Living Style Guide Platform\n\n[](https://www."
},
{
"path": "app.js",
"chars": 7559,
"preview": "/*!\n* SourceJS - Living Style Guides Engine and Integrated Maintenance Environment for Front-end Components\n* @copyright"
},
{
"path": "appveyor.yml",
"chars": 802,
"preview": "# AppVeyor file\n# http://www.appveyor.com/docs/appveyor-yml\n\nenvironment:\n matrix:\n - nodejs_version: 0.10\n - nod"
},
{
"path": "assets/css/base/buttons.less",
"chars": 568,
"preview": "/* Buttons\n---------------------------------------------------------------------------------- */\n\n/* TODO: cosmetic chan"
},
{
"path": "assets/css/base/grids.less",
"chars": 889,
"preview": "/* Grids\n---------------------------------------------------------------------------------- */\n\n.source_col-main {\n\tmarg"
},
{
"path": "assets/css/base/navigation.less",
"chars": 941,
"preview": "/* Navigation\n---------------------------------------------------------------------------------- */\n\n.source_nav {\n\twhit"
},
{
"path": "assets/css/base/ntf.less",
"chars": 517,
"preview": ".source_ntf {\n\tposition: fixed; z-index: 50;\n\ttop: 50px; /* toolbar height */\n left: 0; right: 0;\n\n\tfont-size: @fz-si"
},
{
"path": "assets/css/base/togglers.less",
"chars": 1213,
"preview": "/* Togglers\n---------------------------------------------------------------------------------- */\n\n.source_slider_frame "
},
{
"path": "assets/css/clarify.bundle.less",
"chars": 196,
"preview": "/*\n*\n* Clarify styles\n*\n*/\n\n//Based on rhr.me/MCSS methodology\n@import url('variables.less');\n@import url('mixins.less')"
},
{
"path": "assets/css/cosmetic/helpers.less",
"chars": 617,
"preview": "/* Helpers\n---------------------------------------------------------------------------------- */\n\n.source_delim {\n\tbackg"
},
{
"path": "assets/css/cosmetic/highlights.less",
"chars": 861,
"preview": "/* Highlights\n---------------------------------------------------------------------------------- */\n\n.source_code {\n "
},
{
"path": "assets/css/cosmetic/links.less",
"chars": 2540,
"preview": "/* Links\n---------------------------------------------------------------------------------- */\n\n// common link mixin\n.so"
},
{
"path": "assets/css/defaults.less",
"chars": 1117,
"preview": "/*\n*\n* Core styles\n*\n* ! Modify with caution or use /user/assets/css/defaults.css to override core styles !\n*\n*/\n\n//Base"
},
{
"path": "assets/css/mixins.less",
"chars": 3839,
"preview": "/* Mixins and functions\n---------------------------------------------------------------------------------- */\n\n/**\n * Mi"
},
{
"path": "assets/css/project/auth.less",
"chars": 521,
"preview": ".source_login {\n\tdisplay: inline-block;\n\theight: 40px;\n\tfloat: right;\n\n\tmargin-top: 2px;\n\tvertical-align: top;\n\t}\n\n.sour"
},
{
"path": "assets/css/project/autocomplete.less",
"chars": 1251,
"preview": "/* Autocomplete\n---------------------------------------------------------------------------------- */\n.autocomplete-wrap"
},
{
"path": "assets/css/project/catalog.less",
"chars": 4399,
"preview": "/* Catalog\n---------------------------------------------------------------------------------- */\n\n.source_section .sourc"
},
{
"path": "assets/css/project/clarify-in-spec.less",
"chars": 571,
"preview": ".source_clarify-in-spec_link {\n display: block !important;\n width: 18px;\n height: 18px;\n background: url(\"/s"
},
{
"path": "assets/css/project/clarify.less",
"chars": 1986,
"preview": "/* Context\n-------------------------------------------------- */\n\n.source_clarify {\n }\n\n.source_clarify .source_secti"
},
{
"path": "assets/css/project/examples.less",
"chars": 1001,
"preview": "/* Code examples\n---------------------------------------------------------------------------------- */\n\n.source_example "
},
{
"path": "assets/css/project/footer.less",
"chars": 857,
"preview": "/* Footer\n---------------------------------------------------------------------------------- */\n\n.source_footer {\n\tposit"
},
{
"path": "assets/css/project/header.less",
"chars": 1607,
"preview": "/* Header\n---------------------------------------------------------------------------------- */\n\n.source_header {\n po"
},
{
"path": "assets/css/project/info.less",
"chars": 2227,
"preview": "/* Info blocks\n---------------------------------------------------------------------------------- */\n\n// !important next"
},
{
"path": "assets/css/project/layout.less",
"chars": 34616,
"preview": "/* Layout\n---------------------------------------------------------------------------------- */\n\n.source_container {\n\tpo"
},
{
"path": "assets/css/project/modal.less",
"chars": 756,
"preview": "/* Modalbox\n---------------------------------------------------------------------------------- */\n\n.source_modal_box {\n "
},
{
"path": "assets/css/project/navigation.less",
"chars": 2743,
"preview": "/* Navigation\n---------------------------------------------------------------------------------- */\n\n.source_main_nav {\n"
},
{
"path": "assets/css/project/search.less",
"chars": 1184,
"preview": "/* Search\n---------------------------------------------------------------------------------- */\n\n.source_search {\n\tdispl"
},
{
"path": "assets/css/project/section.less",
"chars": 3999,
"preview": "/* Section\n---------------------------------------------------------------------------------- */\n\n.source_section {\n\tpad"
},
{
"path": "assets/css/project/source-code.less",
"chars": 1720,
"preview": "/* Code highlighting\n---------------------------------------------------------------------------------- */\n\n.source_sour"
},
{
"path": "assets/css/reset.less",
"chars": 4789,
"preview": "/* Reset\n---------------------------------------------------------------------------------- */\n.reset() {\n margin: 0;"
},
{
"path": "assets/css/source.css",
"chars": 361,
"preview": "/*!\n* SourceJS - Living Style Guides Engine and Integrated Maintenance Environment for Front-end Components\n* @copyright"
},
{
"path": "assets/css/variables.less",
"chars": 1963,
"preview": "/* Variables\n---------------------------------------------------------------------------------- */\n@max-width: 1400px;\n\n"
},
{
"path": "assets/fonts/Webfont EULA 1.6.txt",
"chars": 5938,
"preview": "The Fontspring Webfont End User License Agreement\nVersion 1.6.0 - March 13, 2014\n\nBy downloading, installing and/or embe"
},
{
"path": "assets/js/_require.bundle.js",
"chars": 677,
"preview": "\"{%= grunt.file.read('assets/js/lib/require.js') %}\"\n\"{%= grunt.file.read('assets/js/lib/jquery-2.1.4.min.js') %}\"\n\"{%= "
},
{
"path": "assets/js/clarify.js",
"chars": 3340,
"preview": "/*!\n* SourceJS - Front-end documentation engine\n* @copyright 2013-2015 Sourcejs.com\n* @license MIT license: http://githu"
},
{
"path": "assets/js/enter-the-source.js",
"chars": 601,
"preview": "/*!\n* SourceJS - Front-end documentation engine\n* @copyright 2013-2015 Sourcejs.com\n* @license MIT license: http://githu"
},
{
"path": "assets/js/lib/autocomplete.js",
"chars": 17080,
"preview": "\"use strict\";\n(function(module) {\n if (typeof(define) === \"function\" && define.amd) {\n define([\"jquery\"], modu"
},
{
"path": "assets/js/lib/codeFormat.js",
"chars": 3008,
"preview": "/*\n *\n * HTML Code Formatter\n *\n * @author Dennis Przendzinski\n *\n * */\n\n\ndefine([\n \"jquery\"\n], function($) {\n\n re"
},
{
"path": "assets/js/lib/html5shiv.js",
"chars": 2410,
"preview": "/*! HTML5 Shiv vpre3.6 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */\n(function(g,i){var l=g.html5||{};var c="
},
{
"path": "assets/js/lib/jquery.autocomplete.js",
"chars": 20903,
"preview": "/**\n* Ajax Autocomplete for jQuery, version 1.2.4\n* (c) 2013 Tomas Kirda\n*\n* Ajax Autocomplete for jQuery is freely d"
},
{
"path": "assets/js/lib/jquery.couch.js",
"chars": 40470,
"preview": "// Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n// use this file except in compliance wit"
},
{
"path": "assets/js/lib/jquery.mb.browser.js",
"chars": 4174,
"preview": "/*\n * ******************************************************************************\n * jquery.mb.components\n * file: "
},
{
"path": "assets/js/lib/lodash.js",
"chars": 28151,
"preview": "/**\n * @license\n * Lo-Dash 2.4.1 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE\n * Bui"
},
{
"path": "assets/js/lib/modalbox.js",
"chars": 2925,
"preview": "\"use strict\";\ndefine([\n 'jquery',\n 'sourceModules/module',\n 'sourceLib/lodash'\n ], function($, module, _) {\n"
},
{
"path": "assets/js/lib/prism/prism.css",
"chars": 2813,
"preview": "/**\n * prism.js default theme for JavaScript, CSS and HTML\n * Based on dabblet (http://dabblet.com)\n * @author Lea Verou"
},
{
"path": "assets/js/lib/prism/prism.js",
"chars": 15418,
"preview": "/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n * MIT license http://www.opensource.org/licenses/mit-lic"
},
{
"path": "assets/js/lib/require.js",
"chars": 83082,
"preview": "/** vim: et:ts=4:sw=4:sts=4\n * @license RequireJS 2.1.14 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserve"
},
{
"path": "assets/js/lib/text.js",
"chars": 15611,
"preview": "/**\n * @license RequireJS text 2.0.12 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.\n * Available via"
},
{
"path": "assets/js/load-options.js",
"chars": 396,
"preview": "/*\n *\n * Assets options\n *\n * */\n\ndefine([\n 'jquery',\n 'text!/api/options',\n 'sourceModules/inlineOptions'\n "
},
{
"path": "assets/js/modules/auth.js",
"chars": 4508,
"preview": "define([\n 'jquery',\n 'sourceModules/module'\n], function($, Module) {\n \n 'use strict';\n\n /**\n * @Objec"
},
{
"path": "assets/js/modules/browser.js",
"chars": 992,
"preview": "\"use strict\";\n\ndefine([\"sourceLib/jquery.mb.browser\"], function() {\n //Browser context classes\n var browserClasses"
},
{
"path": "assets/js/modules/clarifyInSpec.js",
"chars": 2299,
"preview": "/*\n*\n* Clarify helpers on spec page\n*\n* @author Robert Haritonov http://rhr.me\n*\n* */\n\n'use strict';\n\ndefine([\n 'jque"
},
{
"path": "assets/js/modules/codeSource.js",
"chars": 9549,
"preview": "/*\n *\n * View demo-examples source code\n *\n * */\n\ndefine([\n \"jquery\",\n \"source/load-options\",\n \"sourceModules/u"
},
{
"path": "assets/js/modules/couch.js",
"chars": 3892,
"preview": "/*\n*\n* Couch module and utils\n*\n* jquery.cocuh docs http://daleharvey.github.io/jquery.couch.js-docs/symbols/\n* jquery.c"
},
{
"path": "assets/js/modules/css.js",
"chars": 518,
"preview": "'use strict';\n\ndefine([\"source/load-options\"], function(options) {\n function Css (url, cat) {\n this.url = url;"
},
{
"path": "assets/js/modules/globalNav.js",
"chars": 22062,
"preview": "/*\n*\n* @author Robert Haritonov (http://rhr.me)\n*\n* */\n\ndefine([\n \"jquery\",\n \"sourceModules/module\",\n \"sourceMo"
},
{
"path": "assets/js/modules/headerFooter.js",
"chars": 3100,
"preview": "define(['source/load-options'], function(options) {\n\n 'use strict';\n\n var $header = $(\".source_header\");\n var $"
},
{
"path": "assets/js/modules/htmlAPISync.js",
"chars": 1890,
"preview": "'use strict';\n\ndefine([\n \"jquery\",\n \"sourceModules/module\",\n \"sourceModules/utils\",\n \"sourceModules/innerNav"
},
{
"path": "assets/js/modules/inlineOptions.js",
"chars": 130,
"preview": "define(function() {\n\n 'use strict';\n\n // empty array for cases where `properties` is not defined in-page\n retur"
},
{
"path": "assets/js/modules/innerNavigation.js",
"chars": 7019,
"preview": "'use strict';\n\ndefine([\n \"jquery\",\n \"sourceModules/module\",\n \"sourceModules/utils\",\n \"sourceModules/sections"
},
{
"path": "assets/js/modules/loadEvents.js",
"chars": 5729,
"preview": "/**\n*\n* Register any plugins and emit their finish events\n*\n*/\n\ndefine([\"sourceModules/module\", \"sourceModules/utils\"], "
},
{
"path": "assets/js/modules/module.js",
"chars": 680,
"preview": "define([\"source/load-options\"], function (options) {\n\n 'use strict';\n\n function Module() {\n this.options = "
},
{
"path": "assets/js/modules/moduleLoader.js",
"chars": 1629,
"preview": "define([\n\t'sourceModules/module'\n\t], function (module) {\n\n 'use strict';\n\n function ModuleLoader() {\n this."
},
{
"path": "assets/js/modules/navHighlight.js",
"chars": 5433,
"preview": "/*\n*\n* Navigation scroll highlighter\n*\n* @author Ivan Metelev (http://welovehtml.ru)\n*\n* */\n\n\"use strict\";\n\ndefine([\n "
},
{
"path": "assets/js/modules/ntf.js",
"chars": 767,
"preview": "'use strict';\n\ndefine([\n 'jquery',\n 'sourceModules/module'\n], function($, module) {\n\n function Notification() {"
},
{
"path": "assets/js/modules/parseFileTree.js",
"chars": 10750,
"preview": "/*\n*\n* Module for parsing Source file tree data\n*\n* @author Robert Haritonov (http://rhr.me)\n* @author Ivan Metelev\n*\n* "
},
{
"path": "assets/js/modules/scrollToHash.js",
"chars": 1513,
"preview": "//In separate module, to trace script ready state\ndefine([\n \"jquery\",\n \"sourceModules/utils\",\n \"sourceModules/l"
},
{
"path": "assets/js/modules/search.js",
"chars": 5433,
"preview": "/*\n*\n* @author Ilya Mikhailov\n*\n* */\n\ndefine([\n 'jquery',\n 'sourceModules/module',\n 'sourceLib/autocomplete',\n "
},
{
"path": "assets/js/modules/sectionFolding.js",
"chars": 7798,
"preview": "/*\n*\n* Fold sections to optimize page load\n*\n* @author Robert Haritonov (http://rhr.me)\n*\n* */\n\ndefine([\n \"jquery\",\n "
},
{
"path": "assets/js/modules/sections.js",
"chars": 2239,
"preview": "/*\n *\n * Sections modules\n *\n * @author Alexey Ostrovsky\n *\n * */\n\ndefine([\n \"jquery\",\n \"sourceModules/module\"\n "
},
{
"path": "assets/js/modules/sectionsParser.js",
"chars": 11964,
"preview": "/*\n *\n * Spec HTML parser for API\n *\n * @author Dmitry Lapynow\n *\n * */\n\n// TODO: wrap as requirejs module, and combine "
},
{
"path": "assets/js/modules/specDecorations.js",
"chars": 913,
"preview": "define([\n \"jquery\",\n \"source/load-options\",\n \"sourceModules/browser\"\n ], function($, options, browser) {\n\n "
},
{
"path": "assets/js/modules/trimSpaces.js",
"chars": 1171,
"preview": "/*\n*\n* Media-queries helper\n*\n* @author Evgeniy Khoroshilov\n*\n* */\n\ndefine([\n \"source/load-options\",\n \"sourceModul"
},
{
"path": "assets/js/modules/utils.js",
"chars": 3967,
"preview": "/*\n*\n* Utils core for all modules\n*\n* */\n\ndefine([\n 'jquery',\n 'sourceModules/module'\n ], function ($, module) "
},
{
"path": "assets/js/require-config.js",
"chars": 518,
"preview": "// Joined to require.bundle.js\n\nrequirejs.config({\n paths: {\n // /source/assets requests are routed to /assets"
},
{
"path": "assets/templates/clarifyPanel.inc.html",
"chars": 2529,
"preview": "<div class=\"source_clarify_panel\">\n <div class=\"source_clarify_panel_i\">\n <h2 class=\"source_clarify_panel_h2\">"
},
{
"path": "assets/templates/footer.inc.html",
"chars": 595,
"preview": "<!-- Core footer, just for example, use /public/assets/templates/footer.inc.html -->\n\n<footer class=\"source_footer\">\n "
},
{
"path": "assets/templates/header.inc.html",
"chars": 801,
"preview": "<!-- Core header, just for example, use /public/assets/templates/header.inc.html -->\n\n<header class=\"source_header\">\n\n "
},
{
"path": "assets/templates/nav.inc.html",
"chars": 337,
"preview": "<nav class=\"source_main_nav source_nav\">\n\t<div class=\"source_nav_c\">\n\t\t<div class=\"source_main_nav_i\">\n\t\t\t<h2>Table of c"
},
{
"path": "assets/templates/navActionItem.inc.html",
"chars": 158,
"preview": "<div class=\"source_main_nav_ac_item __simple\">\n <div class=\"source_main_nav_ac_tx\">Option</div>\n <div class=\"sourc"
},
{
"path": "assets/templates/navActionTumbler.inc.html",
"chars": 361,
"preview": "<div class=\"source_main_nav_ac_item\">\n <div class=\"source_main_nav_ac_tx\">Option</div>\n <div class=\"source_slider_"
},
{
"path": "assets/test/index.html",
"chars": 600,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n "
},
{
"path": "assets/test/jasmine/MIT.LICENSE",
"chars": 1061,
"preview": "Copyright (c) 2008-2011 Pivotal Labs\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of th"
},
{
"path": "assets/test/jasmine/jasmine-html.js",
"chars": 20765,
"preview": "jasmine.HtmlReporterHelpers = {};\n\njasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) {\n va"
},
{
"path": "assets/test/jasmine/jasmine.css",
"chars": 6537,
"preview": "body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; }\n\n#HTMLReporter { font-size: 11px; font-"
},
{
"path": "assets/test/jasmine/jasmine.js",
"chars": 70892,
"preview": "var isCommonJS = typeof window == \"undefined\" && typeof exports == \"object\";\n\n/**\n * Top level namespace for Jasmine, a "
},
{
"path": "assets/test/js/tests.js",
"chars": 1226,
"preview": "/*!\n * SourceJS - Living Style Guides Engine and Integrated Maintenance Environment for Front-end Components\n * @copyrig"
},
{
"path": "assets/test/spec/innerNavigationSpec.js",
"chars": 1066,
"preview": "/**\n * Created by Alexey Ostrovsky.\n * Date: 04.04.13\n * Time: 14:33\n */\n\ndefine(['sourceModules/innerNavigation'], func"
},
{
"path": "assets/test/spec/moduleSpec.js",
"chars": 2400,
"preview": "/**\n * Created by Alexey Ostrovsky.\n * Date: 04.04.13\n * Time: 14:33\n */\n\ndefine(['sourceModules/module', 'source/load-o"
},
{
"path": "assets/test/spec/sectionsSpec.js",
"chars": 1947,
"preview": "/**\n * Created by Alexey Ostrovsky.\n * Date: 04.04.13\n * Time: 14:33\n */\n\ndefine(['sourceModules/sections'], function (s"
},
{
"path": "core/api/index.js",
"chars": 9169,
"preview": "'use strict';\n\nvar express = require('express');\nvar path = require('path');\nvar parseData = require(path.join(global.pa"
},
{
"path": "core/api/optionsApi.js",
"chars": 770,
"preview": "'use strict';\n\nvar path = require('path');\nvar configUtils = require(path.join(global.pathToApp,'core/lib/configUtils'))"
},
{
"path": "core/auth.js",
"chars": 2054,
"preview": "var everyauth = require('everyauth');\nvar fs = require('fs');\nvar ejs = require('./ejsWithHelpers.js');\nvar path = requi"
},
{
"path": "core/ejsWithHelpers.js",
"chars": 3422,
"preview": "'use strict';\n\nvar ejs = require('ejs');\nvar fs = require('fs');\nvar glob = require('glob');\nvar path = require('path');"
},
{
"path": "core/file-tree/index.js",
"chars": 11840,
"preview": "'use strict';\n\nvar fs = require('fs-extra');\nvar extend = require('extend');\nvar deepExtend = require('deep-extend');\nva"
},
{
"path": "core/headerFooter.js",
"chars": 913,
"preview": "'use strict';\n\nvar fs = require('fs');\nvar path = require('path');\n\nexports.getHeaderAndFooter = function () {\n var d"
},
{
"path": "core/html-tree/html-parser/index.js",
"chars": 6432,
"preview": "'use strict';\n\nvar path = require('path');\nvar async = require('async');\nvar ParseData = require(path.join(global.pathTo"
},
{
"path": "core/html-tree/html-parser/phantomRunner.js",
"chars": 2379,
"preview": "/*\n *\n * This script is executed in separate process from main app and runs in PhantomJS context\n *\n * */\n\n'use strict';"
},
{
"path": "core/html-tree/index.js",
"chars": 7475,
"preview": "'use strict';\n\nvar path = require('path');\nvar fs = require('fs-extra');\n\nvar extendTillSpec = require(path.join(global."
},
{
"path": "core/lib/configUtils.js",
"chars": 6672,
"preview": "'use strict';\n\nvar fs = require('fs-extra');\nvar path = require('path');\nvar finder = require('fs-finder');\nvar nodeUtil"
},
{
"path": "core/lib/createLink.js",
"chars": 1612,
"preview": "// Modified lib from Bower\n\n'use strict';\n\nvar fs = require('fs-extra');\nvar path = require('path');\nvar Q = require('q'"
},
{
"path": "core/lib/extendTillSpec.js",
"chars": 934,
"preview": "'use strict';\n\n/**\n * Extend object till \"specFile\" key\n *\n * @param {Object} target - Target data that will be extended"
},
{
"path": "core/lib/flattenTillSpec.js",
"chars": 770,
"preview": "'use strict';\n\n/**\n * Flatten given data\n *\n * @param {Object} [data] - Data object wil all specs/html\n *\n * @returns {O"
},
{
"path": "core/lib/parseData.js",
"chars": 9384,
"preview": "'use strict';\n\nvar fs = require('fs');\nvar util = require('util');\nvar path = require('path');\nvar flattenTillSpec = req"
},
{
"path": "core/lib/pathResolver.js",
"chars": 2031,
"preview": "'use strict';\n\nvar path = require('path');\nvar fs = require('fs');\nvar util = require('util');\n\n/**\n * Replace stubs in "
},
{
"path": "core/lib/processMd.js",
"chars": 3226,
"preview": "'use strict';\n\nvar path = require('path');\nvar marked = require('marked');\nvar cheerio = require('cheerio');\nvar deepExt"
},
{
"path": "core/lib/specUtils.js",
"chars": 3533,
"preview": "'use strict';\n\nvar path = require('path');\nvar fs = require('fs-extra');\nvar parseData = require(path.join(global.pathTo"
},
{
"path": "core/lib/translit.js",
"chars": 4882,
"preview": "/* jshint -W089 */\n/* global XRegExp */\n\nvar char_map = {\n\t/* jshint ignore:start */\n\n\t// Latin\n\t'À': 'A', 'Á': 'A', 'Â'"
},
{
"path": "core/lib/utils.js",
"chars": 463,
"preview": "'use strict';\n\nvar _ = require('lodash');\n\nmodule.exports.requireUncached = function (module) {\n delete require.cache"
},
{
"path": "core/lib/viewResolver.js",
"chars": 1468,
"preview": "'use strict';\n\nvar path = require('path');\nvar pathResolver = require(path.join(global.pathToApp + '/core/lib/pathResolv"
},
{
"path": "core/loadOptions.js",
"chars": 3743,
"preview": "'use strict';\n\nvar fs = require('fs');\nvar path = require('path');\nvar configUtils = require('./lib/configUtils');\nvar u"
},
{
"path": "core/loadPlugins.js",
"chars": 810,
"preview": "'use strict';\n\n/*\n *\n * Loading SourceJS plugins\n *\n * */\n\nvar fs = require('fs');\nvar path = require('path');\nvar pathT"
},
{
"path": "core/logger.js",
"chars": 3268,
"preview": "'use strict';\n\nvar path = require('path');\nvar log4js = require('log4js');\nvar utils = require('./lib/utils');\nvar fs = "
},
{
"path": "core/middlewares/clarify.js",
"chars": 10961,
"preview": "'use strict';\n\nvar path = require('path');\nvar fs = require('fs-extra');\nvar url = require('url');\nvar Q = require('q');"
},
{
"path": "core/middlewares/loader.js",
"chars": 5137,
"preview": "'use strict';\n\nvar _ = require('lodash');\nvar fs = require('fs');\nvar path = require('path');\n\nvar appRoot = global.path"
},
{
"path": "core/middlewares/md.js",
"chars": 907,
"preview": "'use strict';\n\nvar path = require('path');\nvar prettyHrtime = require('pretty-hrtime');\nvar processMd = require(path.joi"
},
{
"path": "core/middlewares/mdTag.js",
"chars": 957,
"preview": "'use strict';\n\nvar path = require('path');\nvar processMd = require(path.join(global.pathToApp,'core/lib/processMd'));\n\n/"
},
{
"path": "core/middlewares/read.js",
"chars": 3714,
"preview": "'use strict';\n\nvar fs = require('fs-extra');\nvar path = require('path');\n\nvar ejs = require(path.join(global.pathToApp, "
},
{
"path": "core/middlewares/send.js",
"chars": 731,
"preview": "'use strict';\n\nvar path = require('path');\nvar prettyHrtime = require('pretty-hrtime');\nvar trackStats = require(path.jo"
},
{
"path": "core/middlewares/wrap.js",
"chars": 3997,
"preview": "'use strict';\n\nvar fs = require('fs-extra');\nvar path = require('path');\nvar cheerio = require('cheerio');\n\nvar ejs = re"
},
{
"path": "core/postInstall.js",
"chars": 696,
"preview": "'use strict';\n\nvar path = require('path');\nvar fs = require('fs');\nvar link = require('./lib/createLink');\n\nvar pathToAp"
},
{
"path": "core/routes/index.js",
"chars": 152,
"preview": "'use strict';\n\n// Core routes\nrequire(\"./redirects.js\");\n\n// User custom routes\ntry {\n require(global.app.get('user')"
},
{
"path": "core/routes/redirects.js",
"chars": 1517,
"preview": "'use strict';\n\n/*\n*\n* This file contains default redirects, to add custom redirects user /user/core/routes/index.js\n*\n* "
},
{
"path": "core/trackInstall.js",
"chars": 858,
"preview": "'use strict';\n\nvar path = require('path');\n\nvar rootPath = __dirname.replace(/^\\w:\\\\/, function (match) {\n return mat"
},
{
"path": "core/trackStats.js",
"chars": 3535,
"preview": "'use strict';\n\nvar url = require('url');\nvar _ = require('lodash');\nvar path = require('path');\nvar device = require('de"
},
{
"path": "core/unflat.js",
"chars": 1426,
"preview": "'use strict';\n\nfunction unflatten(target, opts) {\n opts = opts || {};\n\n var delimiter = opts.delimiter || '.',\n "
},
{
"path": "core/views/404.ejs",
"chars": 921,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <"
},
{
"path": "core/views/auth-done.ejs",
"chars": 793,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <title>Github OAuth</title>\n <style type=\"text/css\">\n body { overflow: hidde"
},
{
"path": "core/views/clarify/clear.ejs",
"chars": 978,
"preview": "<!DOCTYPE html>\n<!--[if IE 7]> <html class=\"ie7\"> <![endif]-->\n<!--[if IE 8]> <html class=\"ie8\"> <![endi"
},
{
"path": "core/views/clarify/default.ejs",
"chars": 1496,
"preview": "<!DOCTYPE html>\n<!--[if IE 7]> <html class=\"ie7\"> <![endif]-->\n<!--[if IE 8]> <html class=\"ie8\"> <![endi"
},
{
"path": "core/views/clean-spec.ejs",
"chars": 901,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <"
},
{
"path": "core/views/doc.ejs",
"chars": 1173,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <"
},
{
"path": "core/views/navigation.ejs",
"chars": 824,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <"
},
{
"path": "core/views/spec.ejs",
"chars": 1046,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <"
},
{
"path": "core/watch/childWatch.js",
"chars": 2846,
"preview": "// Runs as a child process through forever-monitor\n\n'use strict';\n\nvar path = require('path');\nvar watch = require('gulp"
},
{
"path": "core/watch/index.js",
"chars": 1106,
"preview": "'use strict';\n\nvar forever = require('tinyforever');\nvar path = require('path');\nvar utils = require(path.join(global.pa"
},
{
"path": "docs/README.md",
"chars": 124,
"preview": "Engine documentation comes packed to every SourceJS instance, run `/docs` section locally or visit http://sourcejs.com/d"
},
{
"path": "docs/api/index.src.html",
"chars": 214,
"preview": "<div class=\"source_subhead\">\n <h1>API documentation</h1>\n</div>\n\n<div class=\"source_catalog\" data-nav=\"/docs/api\" dat"
},
{
"path": "docs/api/info.json",
"chars": 62,
"preview": "{\n \"title\": \"API documentation\",\n \"role\": \"navigation\"\n}"
},
{
"path": "docs/api/load-events/info.json",
"chars": 97,
"preview": "{\n \"keywords\": \"events, spec loaded\",\n \"title\": \"Spec Load Event\",\n \"template\": \"doc\"\n}\n"
},
{
"path": "docs/api/load-events/readme.md",
"chars": 3776,
"preview": "Spec load event API helps to organize Spec loading flow, and define the final load event of all content, modules and pl"
},
{
"path": "docs/api/plugins/info.json",
"chars": 122,
"preview": "{\n \"keywords\": \"plugins, middlewares\",\n \"title\": \"Writing SourceJS Plugins and Middlewares\",\n \"template\": \"doc\""
},
{
"path": "docs/api/plugins/readme.md",
"chars": 6251,
"preview": "SourceJS core contains only default APIs for most common use cases, all specific features we move to plugins, that could"
},
{
"path": "docs/api/readme.md",
"chars": 27,
"preview": "Internal API documentation."
},
{
"path": "docs/api/rest-api/info.json",
"chars": 80,
"preview": "{\n \"keywords\": \"api, rest\",\n \"title\": \"REST API\",\n \"template\": \"doc\"\n}\n"
},
{
"path": "docs/api/rest-api/readme.md",
"chars": 3651,
"preview": "From 0.4.0 version, SourceJS started to grow own REST API for flexible plugins development and easy side services integ"
},
{
"path": "docs/auth/info.json",
"chars": 92,
"preview": "{\n \"keywords\": \"auth, github\",\n \"title\": \"Using Github Auth\",\n \"template\": \"doc\"\n}\n"
},
{
"path": "docs/auth/readme.md",
"chars": 2334,
"preview": "## Quick Start\n\nBefore you start, please make sure that you have referenced GitHub App registered. Please visit [this li"
},
{
"path": "docs/base/info.json",
"chars": 68,
"preview": "{\n \"title\": \"Main Engine Documentation\",\n \"template\": \"doc\"\n}\n"
},
{
"path": "docs/base/readme.md",
"chars": 9779,
"preview": "This page contains main information about SourceJS engine and it's set-up.\n\nSourceJS documentation is rendered by the en"
},
{
"path": "docs/build-tasks/info.json",
"chars": 54,
"preview": "{\n \"title\": \"Build Tasks\",\n \"template\": \"doc\"\n}\n"
},
{
"path": "docs/build-tasks/readme.md",
"chars": 728,
"preview": "Note that these commands are related only to SourceJS engine build and development cycle.\n\nFor building specs and other "
},
{
"path": "docs/clarify/info.json",
"chars": 84,
"preview": "{\n \"title\": \"Clarify - Spec Section Testing Environment\",\n \"template\": \"doc\"\n}"
},
{
"path": "docs/clarify/readme.md",
"chars": 2091,
"preview": "SourceJS middleware, that allows to open separate documentation examples in custom or clean environment for component te"
},
{
"path": "docs/configuration/info.json",
"chars": 129,
"preview": "{\n \"title\": \"Engine Configuration\",\n \"keywords\": \"options, options.js, sourcejs-options, context\",\n \"template\":"
},
{
"path": "docs/configuration/readme.md",
"chars": 3284,
"preview": "SourceJS engine is highly configurable and allows to override almost any options for your special needs.\n\n## Configurati"
},
{
"path": "docs/data/bootstrap.css",
"chars": 141622,
"preview": "/*!\n * Bootstrap v3.3.4 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://gi"
},
{
"path": "docs/data-nav/example/info.json",
"chars": 104,
"preview": "{\n \"title\": \"Example Title\",\n \"info\": \"Example description text from `info.json` `info` field.\"\n}\n"
},
{
"path": "docs/data-nav/example/readme.md",
"chars": 28,
"preview": "# Some page\n\nWith some text."
},
{
"path": "docs/data-nav/info.json",
"chars": 68,
"preview": "{\n \"title\": \"Auto-generated Navigation\",\n \"template\": \"doc\"\n}\n"
},
{
"path": "docs/data-nav/readme.md",
"chars": 2903,
"preview": "Navigation blocks in SourceJS are automatically generated on client-side, replacing a defined HTML hook with hand-crafte"
},
{
"path": "docs/index.src.html",
"chars": 249,
"preview": "<div class=\"source_subhead\">\n <h1>Documentation and Examples</h1>\n</div>\n\n<div class=\"source_catalog\" data-nav=\"/docs"
},
{
"path": "docs/info-json/info.json",
"chars": 120,
"preview": "{\n \"title\": \"Info.json - Spec Description\",\n \"keywords\": \"spec meta, template, specFile\",\n \"template\": \"doc\"\n}\n"
},
{
"path": "docs/info-json/readme.md",
"chars": 1975,
"preview": "`info.json` file in spec folder is used for defining page meta information and local options set-up. Use it for customiz"
},
{
"path": "docs/info.json",
"chars": 144,
"preview": "{\n \"title\": \"Documentation and Examples\",\n \"role\": \"navigation\",\n \"info\": \"Every SourceJS instance is packed wi"
},
{
"path": "docs/markdown/info.json",
"chars": 54,
"preview": "{\n \"title\": \"Markdown Support\",\n \"template\": \"doc\"\n}"
},
{
"path": "docs/markdown/readme.md",
"chars": 1308,
"preview": "SourceJS supports markdown as pure `.md` files and renders it in any other extension files using `<markdown>` HTML tag.\n"
},
{
"path": "docs/migration/info.json",
"chars": 57,
"preview": "{\n \"title\": \"Migration Notes\",\n \"template\": \"doc\"\n}"
},
{
"path": "docs/migration/readme.md",
"chars": 459,
"preview": "Here you will find migration instructions from different Source versions\n\n## From 0.4.0-beta to 0.4.0-rc\n\n* Update engin"
},
{
"path": "docs/spec/css/spec.css",
"chars": 260,
"preview": "/* Spec page block styles\n---------------------------------------------------------------------------------- */\n\n.some-c"
},
{
"path": "docs/spec/index.src.html",
"chars": 6199,
"preview": "<div class=\"source_info\">\n <p>This page highlights the basic features of SourceJS documentation pages that we call S"
},
{
"path": "docs/spec/info.json",
"chars": 109,
"preview": "{\n \"keywords\": \"create spec, spec markup\",\n \"template\": \"doc\",\n \"title\": \"Spec Page Documentation\"\n}"
},
{
"path": "docs/spec-helpers/examples/buttons.html",
"chars": 464,
"preview": "<h2><%- info.title %></h2>\n\n<% var buttons = ['btn-group-lg', '', 'btn-group-sm', 'btn-group-xs'] %>\n\n<% buttons.forEach"
},
{
"path": "docs/spec-helpers/examples/include.html",
"chars": 56,
"preview": "Included file from `spec-helpers/examples/include.html`."
},
{
"path": "docs/spec-helpers/examples/markdown-file.md",
"chars": 28,
"preview": "Processed **Markdown** file."
},
{
"path": "docs/spec-helpers/examples/mask-one.html",
"chars": 7,
"preview": "one<br>"
},
{
"path": "docs/spec-helpers/examples/mask-two.html",
"chars": 41,
"preview": "two<br>\n<%- includeFiles('three.html') %>"
},
{
"path": "docs/spec-helpers/examples/three.html",
"chars": 9,
"preview": "three<br>"
},
{
"path": "docs/spec-helpers/info.json",
"chars": 97,
"preview": "{\n \"keywords\": \"ejs, include\",\n \"title\": \"Spec Rendering Helpers\",\n \"template\": \"doc\"\n}\n"
},
{
"path": "docs/spec-helpers/readme.md",
"chars": 4286,
"preview": "## Intro\n\nSpec pages in SourceJS engine are the main content units. They provide a proper sandbox for demoing rendered c"
},
{
"path": "docs/starting/css/starting.css",
"chars": 217,
"preview": "/* Starting template\n---------------------------------------------------------------------------------- */\n\n\n\n/* /Starti"
},
{
"path": "docs/starting/index.src.html",
"chars": 670,
"preview": "<link rel=\"stylesheet\" href=\"css/starting.css\">\n\n<h1>Starting Spec Page Template</h1>\n\n<div class=\"source_info\">\n <p"
},
{
"path": "docs/starting/info.json",
"chars": 101,
"preview": "{\n \"author\": \"Spec author\",\n \"title\": \"Starting Spec Page Template\",\n \"tag\": [\"templates\"]\n}"
},
{
"path": "docs/starting-md/css/starting.css",
"chars": 217,
"preview": "/* Starting template\n---------------------------------------------------------------------------------- */\n\n\n\n/* /Starti"
},
{
"path": "docs/starting-md/info.json",
"chars": 101,
"preview": "{\n \"author\": \"Spec author\",\n \"title\": \"Markdown Spec Page Template\",\n \"tag\": [\"templates\"]\n}"
},
{
"path": "docs/starting-md/readme.md",
"chars": 443,
"preview": "<link rel=\"stylesheet\" href=\"css/starting.css\">\n\n# Markdown Spec Page Template\n\nDeveloper: Name<br>\nDesigner: Name\n\nUse"
},
{
"path": "docs/test-specs/styles/includes/all-tags.html",
"chars": 1810,
"preview": "Some text <a href=\"/docs/base#creating-first-spec\">some link</a>. <strong>Strong</strong>, <b>b</b>, <em>em</em>, <i>i</"
},
{
"path": "docs/test-specs/styles/index.src.html",
"chars": 4084,
"preview": "<div class=\"source_warn\">\n <%- include('includes/all-tags.html') %>\n</div>\n\n<div class=\"source_doc\">\n <%- include"
},
{
"path": "docs/test-specs/styles/info.json",
"chars": 98,
"preview": "{\n \"template\": \"doc\",\n \"title\": \"Spec Styles Test Page (кириллица)\",\n \"tag\": [\"hidden\"]\n}"
},
{
"path": "options.js",
"chars": 6223,
"preview": "// Default SourceJS engine configuration\n\nmodule.exports = {\n\n // Restart the app after changing core (back-end) opti"
},
{
"path": "package.json",
"chars": 2652,
"preview": "{\n \"name\": \"sourcejs\",\n \"description\": \"Living Style Guide Engine for Managing and Developing Front-end Components.\",\n"
},
{
"path": "source.sh",
"chars": 1632,
"preview": "#!/bin/bash\n#\n# description: SourceJS service, for managing production server, using node-forever.\n# processname: node\n#"
},
{
"path": "test/data/api-test-html.json",
"chars": 3540,
"preview": "{\n \"base-test\": {\n \"button\": {\n \"specFile\": {\n \"id\": \"base-test/button\",\n "
}
]
// ... and 19 more files (download for full content)
About this extraction
This page contains the full source code of the sourcejs/Source GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 219 files (959.3 KB), approximately 258.5k tokens, and a symbol index with 79 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.