Lorem
17 |Hello friend, how are you.
18 | Lipsum text 19 |├── .gitignore
├── .nojekyll
├── LICENSE
├── README.md
├── example
├── as-gulp-plugin
│ ├── .gitignore
│ ├── custommethod.techy.js
│ ├── dest
│ │ ├── A
│ │ │ └── lorem.html
│ │ ├── B
│ │ │ └── lipsum.html
│ │ ├── feed.xml
│ │ └── index.html
│ ├── gulpfile.js
│ ├── package.json
│ ├── src
│ │ ├── A
│ │ │ └── lorem.md
│ │ ├── B
│ │ │ └── lipsum.md
│ │ ├── feed.xml.rss
│ │ └── index.md
│ └── themes
│ │ ├── default
│ │ ├── css
│ │ │ ├── basic.js
│ │ │ ├── common
│ │ │ │ ├── base.js
│ │ │ │ ├── code.js
│ │ │ │ ├── grids.js
│ │ │ │ ├── list.js
│ │ │ │ ├── scroller.js
│ │ │ │ └── titles.js
│ │ │ └── styles.js
│ │ ├── js
│ │ │ └── scripts.js
│ │ ├── public
│ │ │ ├── absurd.min.js
│ │ │ ├── absurd.organic.min.js
│ │ │ ├── font-awesome-4.0.3
│ │ │ │ ├── css
│ │ │ │ │ ├── font-awesome.css
│ │ │ │ │ └── font-awesome.min.css
│ │ │ │ ├── fonts
│ │ │ │ │ ├── FontAwesome.otf
│ │ │ │ │ ├── fontawesome-webfont.eot
│ │ │ │ │ ├── fontawesome-webfont.svg
│ │ │ │ │ ├── fontawesome-webfont.ttf
│ │ │ │ │ └── fontawesome-webfont.woff
│ │ │ │ ├── less
│ │ │ │ │ ├── bordered-pulled.less
│ │ │ │ │ ├── core.less
│ │ │ │ │ ├── fixed-width.less
│ │ │ │ │ ├── font-awesome.less
│ │ │ │ │ ├── icons.less
│ │ │ │ │ ├── larger.less
│ │ │ │ │ ├── list.less
│ │ │ │ │ ├── mixins.less
│ │ │ │ │ ├── path.less
│ │ │ │ │ ├── rotated-flipped.less
│ │ │ │ │ ├── spinning.less
│ │ │ │ │ ├── stacked.less
│ │ │ │ │ └── variables.less
│ │ │ │ └── scss
│ │ │ │ │ ├── _bordered-pulled.scss
│ │ │ │ │ ├── _core.scss
│ │ │ │ │ ├── _fixed-width.scss
│ │ │ │ │ ├── _icons.scss
│ │ │ │ │ ├── _larger.scss
│ │ │ │ │ ├── _list.scss
│ │ │ │ │ ├── _mixins.scss
│ │ │ │ │ ├── _path.scss
│ │ │ │ │ ├── _rotated-flipped.scss
│ │ │ │ │ ├── _spinning.scss
│ │ │ │ │ ├── _stacked.scss
│ │ │ │ │ ├── _variables.scss
│ │ │ │ │ └── font-awesome.scss
│ │ │ ├── prism
│ │ │ │ ├── prism.css
│ │ │ │ └── prism.js
│ │ │ ├── scripts.js
│ │ │ └── styles.css
│ │ └── tpl
│ │ │ └── layouts
│ │ │ └── basic.html
│ │ └── empty
│ │ ├── css
│ │ ├── basic.js
│ │ └── styles.js
│ │ ├── js
│ │ └── scripts.js
│ │ ├── public
│ │ ├── scripts.js
│ │ └── styles.css
│ │ └── tpl
│ │ └── layouts
│ │ └── basic.html
└── trivial
│ ├── _tpl
│ └── layout.html
│ ├── index.md
│ ├── inner
│ ├── A
│ │ └── A.md
│ ├── B
│ │ └── B.md
│ ├── _filewithundescore.txt
│ ├── _markdown.md
│ └── _underscore
│ │ └── test.txt
│ └── public
│ ├── absurd.min.js
│ ├── absurd.organic.min.js
│ ├── css
│ └── styles.css
│ ├── font-awesome-4.0.3
│ ├── css
│ │ ├── font-awesome.css
│ │ └── font-awesome.min.css
│ ├── fonts
│ │ ├── FontAwesome.otf
│ │ ├── fontawesome-webfont.eot
│ │ ├── fontawesome-webfont.svg
│ │ ├── fontawesome-webfont.ttf
│ │ └── fontawesome-webfont.woff
│ ├── less
│ │ ├── bordered-pulled.less
│ │ ├── core.less
│ │ ├── fixed-width.less
│ │ ├── font-awesome.less
│ │ ├── icons.less
│ │ ├── larger.less
│ │ ├── list.less
│ │ ├── mixins.less
│ │ ├── path.less
│ │ ├── rotated-flipped.less
│ │ ├── spinning.less
│ │ ├── stacked.less
│ │ └── variables.less
│ └── scss
│ │ ├── _bordered-pulled.scss
│ │ ├── _core.scss
│ │ ├── _fixed-width.scss
│ │ ├── _icons.scss
│ │ ├── _larger.scss
│ │ ├── _list.scss
│ │ ├── _mixins.scss
│ │ ├── _path.scss
│ │ ├── _rotated-flipped.scss
│ │ ├── _spinning.scss
│ │ ├── _stacked.scss
│ │ ├── _variables.scss
│ │ └── font-awesome.scss
│ ├── img
│ └── favicon.png
│ ├── js
│ └── scripts.js
│ └── prism
│ ├── prism.css
│ └── prism.js
├── lib
├── Factory.js
├── GulpEnd.js
├── Page.js
├── api
│ ├── linkto.techy.js
│ ├── numofpages.techy.js
│ ├── page.techy.js
│ ├── pages.techy.js
│ └── template.techy.js
├── helpers
│ ├── extend.js
│ └── queue.js
├── index.js
└── themes
│ └── default
│ ├── _tpl
│ └── layout.html
│ └── public
│ ├── absurd.min.js
│ ├── absurd.organic.min.js
│ ├── css
│ └── styles.css
│ ├── font-awesome-4.0.3
│ ├── css
│ │ ├── font-awesome.css
│ │ └── font-awesome.min.css
│ ├── fonts
│ │ ├── FontAwesome.otf
│ │ ├── fontawesome-webfont.eot
│ │ ├── fontawesome-webfont.svg
│ │ ├── fontawesome-webfont.ttf
│ │ └── fontawesome-webfont.woff
│ ├── less
│ │ ├── bordered-pulled.less
│ │ ├── core.less
│ │ ├── fixed-width.less
│ │ ├── font-awesome.less
│ │ ├── icons.less
│ │ ├── larger.less
│ │ ├── list.less
│ │ ├── mixins.less
│ │ ├── path.less
│ │ ├── rotated-flipped.less
│ │ ├── spinning.less
│ │ ├── stacked.less
│ │ └── variables.less
│ └── scss
│ │ ├── _bordered-pulled.scss
│ │ ├── _core.scss
│ │ ├── _fixed-width.scss
│ │ ├── _icons.scss
│ │ ├── _larger.scss
│ │ ├── _list.scss
│ │ ├── _mixins.scss
│ │ ├── _path.scss
│ │ ├── _rotated-flipped.scss
│ │ ├── _spinning.scss
│ │ ├── _stacked.scss
│ │ ├── _variables.scss
│ │ └── font-awesome.scss
│ ├── img
│ └── favicon.png
│ ├── js
│ └── scripts.js
│ └── prism
│ ├── prism.css
│ └── prism.js
├── package.json
├── tests
├── access-page-by-name
│ ├── A
│ │ └── index.md
│ ├── B
│ │ └── index.md
│ ├── expected.html
│ └── page.md
├── basic
│ ├── _donttouch
│ │ └── file.txt
│ ├── _expects
│ │ ├── A.html
│ │ └── page.html
│ ├── _lib
│ │ └── awesome.techy.js
│ ├── _tpl
│ │ └── layout.html
│ ├── css
│ │ └── styles.css
│ ├── inner
│ │ └── A.md
│ ├── js
│ │ └── scripts.js
│ └── page.md
├── copy-non-underscore
│ ├── _file.md
│ ├── _file.txt
│ ├── _folder
│ │ └── file.txt
│ ├── copythis
│ │ ├── _butnotthis
│ │ │ └── file.txt
│ │ ├── _copyme.md
│ │ └── somefile.txt
│ └── page.md
├── css_absurd
│ ├── TechyFile.js
│ ├── _absurd
│ │ └── styles.js
│ └── expected_styles.css
├── css_css
│ ├── TechyFile.js
│ ├── _css
│ │ ├── a.css
│ │ ├── b.css
│ │ └── custom
│ │ │ └── c.css
│ └── expected_styles.css
├── css_less
│ ├── TechyFile.js
│ ├── _less
│ │ └── styling.less
│ └── expected_styles.css
├── css_less_watch_dir
│ ├── TechyFile.js
│ ├── _less
│ │ ├── include
│ │ │ └── other.less
│ │ ├── other.less
│ │ └── style.less
│ ├── expected_style.css
│ └── expected_style_changed.css
├── custom-layout
│ ├── _my-templates
│ │ ├── footer.html
│ │ └── layout.html
│ ├── expected.html
│ └── page.md
├── custom-master-config
│ ├── expected.html
│ ├── options.js
│ └── page.md
├── custom-method
│ ├── _libs
│ │ └── myown.techy.js
│ ├── expected.html
│ └── page.md
├── custom-templates
│ ├── _data
│ │ └── custom
│ │ │ └── part.html
│ ├── expected.html
│ └── page.md
├── draft-pages
│ ├── A.md
│ ├── B.md
│ ├── C.md
│ ├── expected.html
│ └── page.md
├── get-pages-from-dir
│ ├── D.md
│ ├── articles
│ │ ├── C.md
│ │ ├── awesome.article.300.md
│ │ └── today
│ │ │ ├── A.html
│ │ │ ├── A.md
│ │ │ ├── B.html
│ │ │ └── B.md
│ ├── expected.html
│ └── page.md
├── html-usage
│ ├── expected.html
│ └── page.md
├── js
│ ├── TechyFile.js
│ ├── _src
│ │ ├── A.js
│ │ └── B.js
│ └── expected.js
├── linkto
│ ├── A
│ │ └── B
│ │ │ ├── custom-page.html
│ │ │ └── custom-page.md
│ ├── C
│ │ └── D
│ │ │ ├── d-page.html
│ │ │ └── d-page.md
│ ├── expected.html
│ └── page.md
├── markdown-partials
│ ├── A.md
│ ├── B.md
│ ├── C.md
│ ├── expected.html
│ └── page.md
├── master-config-with-dest-folder
│ ├── .gitignore
│ ├── TechyFile.js
│ ├── _in
│ │ └── page.md
│ └── _out
│ │ └── page.html
├── master-config
│ ├── TechyFile.js
│ ├── expected.html
│ └── page.md
├── md-to-html
│ ├── expected.html
│ └── page.md
├── num-of-pages
│ ├── expected.html
│ ├── page.md
│ └── posts
│ │ └── article99.md
├── process-other-files
│ ├── A
│ │ ├── C
│ │ │ ├── noprocess.css
│ │ │ ├── styles.css.expected
│ │ │ └── styles.css.ttt
│ │ ├── custom.html.expected
│ │ └── custom.html.techy
│ ├── B
│ │ └── log.txt.blah
│ ├── TechyFile.js
│ └── rss.xml.techy
├── set-get
│ ├── .gitignore
│ ├── expected.html
│ └── page.md
├── should-use-src-dest
│ ├── .gitignore
│ ├── _out
│ │ ├── A.html
│ │ └── page.html
│ ├── _pages
│ │ └── src
│ │ │ ├── A.md
│ │ │ └── page.md
│ └── expected.html
├── sort-by
│ ├── D.md
│ ├── articles
│ │ ├── C.html
│ │ ├── C.md
│ │ ├── awesome.article.300.html
│ │ ├── awesome.article.300.md
│ │ └── today
│ │ │ ├── A.html
│ │ │ ├── A.md
│ │ │ ├── B.html
│ │ │ └── B.md
│ ├── expected.html
│ ├── page.md
│ └── showsorting.techy.js
├── tests.js
├── using-path
│ ├── expected.html
│ ├── inner
│ │ ├── A
│ │ │ └── index.md
│ │ └── index.md
│ └── page.md
├── using-theme
│ ├── TechyFile.js
│ ├── _tpl
│ │ └── layout.html
│ ├── expected.html
│ ├── page.md
│ └── public
│ │ ├── absurd.min.js
│ │ ├── absurd.organic.min.js
│ │ ├── css
│ │ └── styles.css
│ │ ├── font-awesome-4.0.3
│ │ ├── css
│ │ │ ├── font-awesome.css
│ │ │ └── font-awesome.min.css
│ │ ├── fonts
│ │ │ ├── FontAwesome.otf
│ │ │ ├── fontawesome-webfont.eot
│ │ │ ├── fontawesome-webfont.svg
│ │ │ ├── fontawesome-webfont.ttf
│ │ │ └── fontawesome-webfont.woff
│ │ ├── less
│ │ │ ├── bordered-pulled.less
│ │ │ ├── core.less
│ │ │ ├── fixed-width.less
│ │ │ ├── font-awesome.less
│ │ │ ├── icons.less
│ │ │ ├── larger.less
│ │ │ ├── list.less
│ │ │ ├── mixins.less
│ │ │ ├── path.less
│ │ │ ├── rotated-flipped.less
│ │ │ ├── spinning.less
│ │ │ ├── stacked.less
│ │ │ └── variables.less
│ │ └── scss
│ │ │ ├── _bordered-pulled.scss
│ │ │ ├── _core.scss
│ │ │ ├── _fixed-width.scss
│ │ │ ├── _icons.scss
│ │ │ ├── _larger.scss
│ │ │ ├── _list.scss
│ │ │ ├── _mixins.scss
│ │ │ ├── _path.scss
│ │ │ ├── _rotated-flipped.scss
│ │ │ ├── _spinning.scss
│ │ │ ├── _stacked.scss
│ │ │ ├── _variables.scss
│ │ │ └── font-awesome.scss
│ │ ├── img
│ │ └── favicon.png
│ │ ├── js
│ │ └── scripts.js
│ │ └── prism
│ │ ├── prism.css
│ │ └── prism.js
├── using-yaml
│ ├── A
│ │ └── a.md
│ ├── expected.html
│ └── page.md
└── with-layout
│ ├── custom-layout.html
│ ├── expected.html
│ └── page.md
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | examples/
3 | _dist
4 | *.swp
5 |
--------------------------------------------------------------------------------
/.nojekyll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/.nojekyll
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014 Krasimir Tsonev
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of
6 | this software and associated documentation files (the "Software"), to deal in
7 | the Software without restriction, including without limitation the rights to
8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9 | the Software, and to permit persons to whom the Software is furnished to do so,
10 | subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Hello, I'm Techy
The geeky way of writing
2 |
3 | I'm a super simple Flat CMS based on [Node.js](http://nodejs.org) ([Gulp.js](http://gulpjs.com/) and [AbsurdJS](http://absurdjs.com/)). If you don't want to use a database to store your content I could help you. Write everything in [Markdown](https://daringfireball.net/projects/markdown/) format and I'll convert it to HTML.
4 |
5 | ## The concept
6 |
7 | In the content driven web site (like a blog for example) the writing should be really easy. Markdown language gives us the simplicity which we need. However, sometimes converting *.md* files to *.html* files is not enough. Techy is an instrument which uses Markdown as a base but also makes your pages programmable. For example:
8 |
9 | <% set('name', 'Big Joe') %>
10 |
11 | # Article title
12 |
13 | > author: <% get('name') %>
14 |
15 | Hello, my name is <% get('name') %>. I'm a web developer.
16 |
17 | is transformed to:
18 | ``` html
19 |
21 |23 |author: Big Joe
22 |
Hello, my name is Big Joe. I'm a web developer.
24 | ``` 25 | 26 | In other words, there are JavaScript expressions which you may write between `<%` and `%>` and basically fetch information based on other files in your codebase. For example generating a site map or showing the latest added Markdowns. 27 | 28 | ## Simple usage 29 | 30 | Install Techy from the command line onto your system by running the following command: 31 | 32 | npm install -g techy 33 | 34 | Aaaand ... that's it. Create an empty directory and put your Markdown files inside. If you type `techy` and press *Enter* in the same folder you will see all the materials converted to HTML. 35 | 36 | Techy is not only generating HTML markup. It puts your writings into a nicely formatted layout. 37 | 38 | --- 39 | 40 | Checkout the full documentation [here](http://krasimir.github.io/techy/docs). 41 | -------------------------------------------------------------------------------- /example/as-gulp-plugin/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /example/as-gulp-plugin/custommethod.techy.js: -------------------------------------------------------------------------------- 1 | module.exports = function() { 2 | return 'The title of page B is ' + this.page('B').get('title'); 3 | } -------------------------------------------------------------------------------- /example/as-gulp-plugin/dest/A/lorem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |Hello friend, how are you.
18 | Lipsum text 19 |/ The title of page B is Lipsum text /
18 |');
71 | // html tags
72 | content = content.replace(/\.(.+)<\/p>/g, '
');
73 | content = content.replace(/\.<\/p>/g, '
');
74 |
75 | content = entities.decode(content);
76 |
77 | var re = /<%( )?([^%>]*)%>/g, str = content;
78 | while(match = re.exec(content)) {
79 | var code = match[0], src = match[0], result = '', allowedMethods = /(set|get)\(('|")/g;
80 | code = code.replace('', '').replace('
', '').replace('@techy', 'techy').replace(/<% ?/g, '').replace(/ ?%>/g, '');
81 | code = 'with(techy) { return ' + code + '; }';
82 | if(!noMarkdown) {
83 | code = code.replace(/(\t|\r|\n| )/g, '');
84 | }
85 | if(infoPass && code.indexOf(allowedMethods) >= 0) {
86 | console.log('skipped', code);
87 | // skipping the code execution if the method is not allowed during the info pass phase
88 | } else {
89 | try {
90 | var codeResult = (new Function('techy', code)).apply(this, [this]);
91 | result = typeof codeResult === 'string' || typeof codeResult === 'number' ? codeResult : '';
92 | } catch(e) {
93 | if(!infoPass) {
94 | console.log('\n\n', e, '\nCode: ', code, '\n\n');
95 | }
96 | result = src;
97 | }
98 | }
99 | str = str.replace('' + src + '
', result || '').replace(src, result || '');
100 | }
101 | // console.log('\n\n', page.build(str));
102 | this.set('content', str);
103 | return this;
104 | }
105 |
106 | return api;
107 | }
108 |
109 | module.exports = Page;
--------------------------------------------------------------------------------
/lib/api/linkto.techy.js:
--------------------------------------------------------------------------------
1 | module.exports = function(name) {
2 | var page, paths, result;
3 | if(typeof name == 'object') {
4 | page = name;
5 | } else {
6 | page = this.page(name);
7 | }
8 | paths = page.get('paths');
9 | result = this.get('paths').root + paths.self + (paths.self == '' ? '' : '/') + paths.file.replace(/.md/, '.html');
10 | return result;
11 | }
--------------------------------------------------------------------------------
/lib/api/numofpages.techy.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | var info = this.get('info');
3 | if(info && info.pages) {
4 | return info.pages.length;
5 | } else {
6 | return '';
7 | }
8 | }
--------------------------------------------------------------------------------
/lib/api/page.techy.js:
--------------------------------------------------------------------------------
1 | module.exports = function(name) {
2 | var info = this.get('info');
3 | if(info && info.pages) {
4 | for(var i=0; i= 0) || pageFile.match(path)) {
15 | add = true;
16 | }
17 | } else {
18 | add = true;
19 | }
20 |
21 | // filtering by draft
22 | if(add && typeof draft !== 'undefined' && draft === 'yes') {
23 | add = false;
24 | }
25 |
26 | if(add) {
27 | pages.push(page);
28 | }
29 | }
30 |
31 | // sorting
32 | if(sortby) {
33 | var strToDate = function(str) {
34 | var d = new Date(str);
35 | return isNaN(d) ? false : d;
36 | }
37 | var tmp, a, b;
38 | for(var i=0; i strToDate(b.get(sortby))) {
44 | tmp = a;
45 | pages[i] = b;
46 | pages[j] = tmp;
47 | }
48 | } else {
49 | if((a.get(sortby) > b.get(sortby)) || (typeof a.get(sortby) == 'undefined' || typeof b.get(sortby) == 'undefined')) {
50 | tmp = a;
51 | pages[i] = b;
52 | pages[j] = tmp;
53 | }
54 | }
55 | }
56 | }
57 | pages = pages.reverse();
58 | }
59 |
60 | return pages;
61 | }
--------------------------------------------------------------------------------
/lib/api/template.techy.js:
--------------------------------------------------------------------------------
1 | var fs = require('fs');
2 | var absurd = require('absurd')();
3 | module.exports = function(file, data) {
4 | file = file.indexOf('.html') > 0 || file.indexOf('.md') > 0 || file.indexOf('.markdown') > 0 ? file : file + '.html';
5 | var process = function(template) {
6 | var ext = template.split('.').pop().toLowerCase();
7 | if(ext == 'md' || ext == 'markdown') {
8 | data = data || {};
9 | data.paths = this.get('paths');
10 | if(this.parseMarkdownFile) {
11 | return this.parseMarkdownFile({
12 | path: template
13 | }, null, true, data);
14 | }
15 | return '';
16 | } else {
17 | template = fs.readFileSync(template).toString();
18 | var result = '';
19 | absurd.flush().morph('html').add(template).compile(function(err, html) {
20 | result = html;
21 | }, data);
22 | return result;
23 | }
24 | }.bind(this);
25 | var src = this.get('src');
26 | if(fs.existsSync(this.root + '/_tpl/' + file)) {
27 | return process(this.root + '/_tpl/' + file);
28 | } else if(fs.existsSync(this.root + '/' + file)) {
29 | return process(this.root + '/' + file);
30 | } else if(src && fs.existsSync(src + '/' + file)) {
31 | return process(src + '/' + file);
32 | } else {
33 | throw new Error('There is no \'' + file + '\' in \'' + this.root + '/_tpl/\' directory.');
34 | }
35 | }
--------------------------------------------------------------------------------
/lib/helpers/extend.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | var process = function(destination, source) {
3 | for (var key in source) {
4 | if (hasOwnProperty.call(source, key)) {
5 | destination[key] = source[key];
6 | }
7 | }
8 | return destination;
9 | };
10 | var result = arguments[0];
11 | for(var i=1; i 0) {
4 | funcs.shift().apply(scope || {}, [next].concat(Array.prototype.slice.call(arguments, 0)));
5 | }
6 | })();
7 | };
--------------------------------------------------------------------------------
/lib/themes/default/_tpl/layout.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | <% this.title %>
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | <% get('content') %>
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/lib/themes/default/public/css/styles.css:
--------------------------------------------------------------------------------
1 | /* misc */
2 |
3 | body, html {
4 | width: 100%;
5 | height: 100%;
6 | padding: 0;
7 | margin: 0;
8 | font-size: 20px;
9 | line-height: 34px;
10 | font-family: 'Average Sans', sans-serif;
11 | background: #FFF;
12 | color: #313131;
13 | }
14 | a {
15 | font-weight: bold;
16 | border-bottom: dotted 1px #c7c7c7;
17 | text-decoration: none;
18 | color: #313131;
19 | }
20 | a:hover {
21 | border-bottom: dotted 1px #999;
22 | color: #DC4141;
23 | }
24 | p {
25 | font-size: 20px;
26 | line-height: 34px;
27 | }
28 | hr {
29 | border-bottom: none;
30 | border-top: solid 4px #e6e6e6;
31 | }
32 | blockquote {
33 | border-left: solid 4px #999;
34 | padding: 0 0 0 20px;
35 | margin: 0;
36 | }
37 | blockquote p {
38 | color: #999;
39 | }
40 | table {
41 | border-spacing: 0;
42 | }
43 | table td {
44 | border-top: solid 1px #B3B3B3;
45 | border-left: solid 1px #B3B3B3;
46 | padding: 6px;
47 | word-wrap: break-word;
48 | }
49 | .left {
50 | float: left;
51 | }
52 | .right {
53 | float: right;
54 | }
55 |
56 | /* headings */
57 |
58 | h1 {
59 | font-size: 60px;
60 | line-height: 70px;
61 | padding: 0 0 40px 0;
62 | margin: 50px 0 30px 0;
63 | }
64 | h2 {
65 | font-size: 36px;
66 | line-height: 40px;
67 | }
68 | h3 {
69 | font-size: 36px;
70 | line-height: 40px;
71 | font-weight: normal;
72 | }
73 | h4 {
74 | font-size: 30px;
75 | line-height: 34px;
76 | font-weight: normal;
77 | }
78 | h5 {
79 | font-size: 24px;
80 | line-height: 28px;
81 | font-weight: normal;
82 | }
83 | h6 {
84 | font-size: 20px;
85 | line-height: 24px;
86 | }
87 |
88 | /* scroller */
89 |
90 | ::-webkit-scrollbar {
91 | width: 8px;
92 | }
93 | ::-webkit-scrollbar-track {
94 | webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
95 | -webkit-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
96 | -moz-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
97 | -ms-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
98 | -o-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
99 | border-radius: 2px;
100 | -webkit-border-radius: 2px;
101 | }
102 | ::-webkit-scrollbar-thumb {
103 | background: rgba(150,150,150,0.8);
104 | border-radius: 2px;
105 | -webkit-border-radius: 2px;
106 | webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
107 | -webkit-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
108 | -moz-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
109 | -ms-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
110 | -o-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
111 | }
112 | ::-webkit-scrollbar-thumb:window-inactive {
113 | background: rgba(150,150,150,0.4);
114 | }
115 |
116 | /* lists */
117 |
118 | ul {
119 | margin: 30px 0 30px 22px;
120 | padding: 0;
121 | list-style-type: circle;
122 | }
123 | ul li {
124 | margin: 0;
125 | padding: 0;
126 | }
127 | ol {
128 | margin: 30px 0 30px 22px;
129 | padding: 0;
130 | list-style-type: circle;
131 | }
132 | ol li {
133 | margin: 0;
134 | padding: 0;
135 | }
136 |
137 | /* code */
138 |
139 | code[class*="language-"] {
140 | font-size: 14px;
141 | line-height: 20px;
142 | }
143 | p code[class*="language-"] {
144 | font-size: 18px;
145 | border: solid 1px #D8D8D8;
146 | display: inline-block;
147 | padding: 0 10px 0 10px;
148 | }
149 | pre[class*="language-"] {
150 | font-size: 14px;
151 | line-height: 20px;
152 | }
153 | p pre[class*="language-"] {
154 | font-size: 18px;
155 | border: solid 1px #D8D8D8;
156 | display: inline-block;
157 | padding: 0 10px 0 10px;
158 | }
159 | pre {
160 | box-shadow: 0 0 2px 1px #ccc;
161 | -webkit-box-shadow: 0 0 2px 1px #ccc;
162 | -moz-box-shadow: 0 0 2px 1px #ccc;
163 | }
164 |
165 | /* grids */
166 |
167 | .grid-2:before {
168 | content: " ";
169 | display: table;
170 | clear: both;
171 | }
172 | .grid-2:after {
173 | content: " ";
174 | display: table;
175 | clear: both;
176 | }
177 | .grid-2 .grid-column {
178 | float: left;
179 | box-sizing: border-box;
180 | -webkit-box-sizing: border-box;
181 | -moz-box-sizing: border-box;
182 | width: 50.00%;
183 | }
184 | .grid-2 .grid-column p {
185 | padding-left: 0;
186 | pd: 0;
187 | }
188 | .grid-3:before {
189 | content: " ";
190 | display: table;
191 | clear: both;
192 | }
193 | .grid-3:after {
194 | content: " ";
195 | display: table;
196 | clear: both;
197 | }
198 | .grid-3 .grid-column {
199 | float: left;
200 | box-sizing: border-box;
201 | -webkit-box-sizing: border-box;
202 | -moz-box-sizing: border-box;
203 | width: 33.33%;
204 | }
205 | .grid-3 .grid-column p {
206 | padding-left: 0;
207 | pd: 0;
208 | }
209 | .grid-4:before {
210 | content: " ";
211 | display: table;
212 | clear: both;
213 | }
214 | .grid-4:after {
215 | content: " ";
216 | display: table;
217 | clear: both;
218 | }
219 | .grid-4 .grid-column {
220 | float: left;
221 | box-sizing: border-box;
222 | -webkit-box-sizing: border-box;
223 | -moz-box-sizing: border-box;
224 | width: 25.00%;
225 | }
226 | .grid-4 .grid-column p {
227 | padding-left: 0;
228 | pd: 0;
229 | }
230 |
231 | /* main container */
232 |
233 | .content {
234 | max-width: 650px;
235 | margin: 40px auto;
236 | }
237 |
238 | /* responsive */
239 |
240 | @media all and (max-width: 600px) {
241 | p {
242 | font-size: 18px;
243 | line-height: 28px;
244 | }
245 | h1 {
246 | font-size: 40px;
247 | line-height: 40px;
248 | margin: 20px 0 10px 0;
249 | padding: 0 0 20px 0;
250 | }
251 | h2 {
252 | font-size: 30px;
253 | line-height: 30px;
254 | }
255 | h3 {
256 | font-size: 26px;
257 | line-height: 26px;
258 | }
259 | h4 {
260 | font-size: 22px;
261 | line-height: 22px;
262 | }
263 | h5 {
264 | font-size: 18px;
265 | line-height: 18px;
266 | }
267 | h6 {
268 | font-size: 18px;
269 | line-height: 18px;
270 | }
271 | .grid-2 .grid-column {
272 | float: none;
273 | width: 100%;
274 | }
275 | }
276 | @media all and (max-width: 670px) {
277 | .grid-3 .grid-column {
278 | float: none;
279 | width: 100%;
280 | }
281 | }
282 | @media all and (max-width: 700px) {
283 | .grid-4 .grid-column {
284 | float: none;
285 | width: 100%;
286 | }
287 | }
288 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/lib/themes/default/public/font-awesome-4.0.3/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/lib/themes/default/public/font-awesome-4.0.3/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/lib/themes/default/public/font-awesome-4.0.3/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/lib/themes/default/public/font-awesome-4.0.3/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/less/bordered-pulled.less:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-border {
5 | padding: .2em .25em .15em;
6 | border: solid .08em @fa-border-color;
7 | border-radius: .1em;
8 | }
9 |
10 | .pull-right { float: right; }
11 | .pull-left { float: left; }
12 |
13 | .@{fa-css-prefix} {
14 | &.pull-left { margin-right: .3em; }
15 | &.pull-right { margin-left: .3em; }
16 | }
17 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/less/core.less:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .@{fa-css-prefix} {
5 | display: inline-block;
6 | font-family: FontAwesome;
7 | font-style: normal;
8 | font-weight: normal;
9 | line-height: 1;
10 | -webkit-font-smoothing: antialiased;
11 | -moz-osx-font-smoothing: grayscale;
12 | }
13 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/less/fixed-width.less:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .@{fa-css-prefix}-fw {
4 | width: (18em / 14);
5 | text-align: center;
6 | }
7 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/less/font-awesome.less:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | @import "variables";
7 | @import "mixins";
8 | @import "path";
9 | @import "core";
10 | @import "larger";
11 | @import "fixed-width";
12 | @import "list";
13 | @import "bordered-pulled";
14 | @import "spinning";
15 | @import "rotated-flipped";
16 | @import "stacked";
17 | @import "icons";
18 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/less/larger.less:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | /* makes the font 33% larger relative to the icon container */
5 | .@{fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -15%;
9 | }
10 | .@{fa-css-prefix}-2x { font-size: 2em; }
11 | .@{fa-css-prefix}-3x { font-size: 3em; }
12 | .@{fa-css-prefix}-4x { font-size: 4em; }
13 | .@{fa-css-prefix}-5x { font-size: 5em; }
14 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/less/list.less:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-ul {
5 | padding-left: 0;
6 | margin-left: @fa-li-width;
7 | list-style-type: none;
8 | > li { position: relative; }
9 | }
10 | .@{fa-css-prefix}-li {
11 | position: absolute;
12 | left: -@fa-li-width;
13 | width: @fa-li-width;
14 | top: (2em / 14);
15 | text-align: center;
16 | &.@{fa-css-prefix}-lg {
17 | left: -@fa-li-width + (4em / 14);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/less/mixins.less:
--------------------------------------------------------------------------------
1 | // Mixins
2 | // --------------------------
3 |
4 | .fa-icon-rotate(@degrees, @rotation) {
5 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);
6 | -webkit-transform: rotate(@degrees);
7 | -moz-transform: rotate(@degrees);
8 | -ms-transform: rotate(@degrees);
9 | -o-transform: rotate(@degrees);
10 | transform: rotate(@degrees);
11 | }
12 |
13 | .fa-icon-flip(@horiz, @vert, @rotation) {
14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1);
15 | -webkit-transform: scale(@horiz, @vert);
16 | -moz-transform: scale(@horiz, @vert);
17 | -ms-transform: scale(@horiz, @vert);
18 | -o-transform: scale(@horiz, @vert);
19 | transform: scale(@horiz, @vert);
20 | }
21 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/less/path.less:
--------------------------------------------------------------------------------
1 | /* FONT PATH
2 | * -------------------------- */
3 |
4 | @font-face {
5 | font-family: 'FontAwesome';
6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
8 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
9 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
10 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
11 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
12 | font-weight: normal;
13 | font-style: normal;
14 | }
15 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/less/rotated-flipped.less:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
7 |
8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
10 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/less/spinning.less:
--------------------------------------------------------------------------------
1 | // Spinning Icons
2 | // --------------------------
3 |
4 | .@{fa-css-prefix}-spin {
5 | -webkit-animation: spin 2s infinite linear;
6 | -moz-animation: spin 2s infinite linear;
7 | -o-animation: spin 2s infinite linear;
8 | animation: spin 2s infinite linear;
9 | }
10 |
11 | @-moz-keyframes spin {
12 | 0% { -moz-transform: rotate(0deg); }
13 | 100% { -moz-transform: rotate(359deg); }
14 | }
15 | @-webkit-keyframes spin {
16 | 0% { -webkit-transform: rotate(0deg); }
17 | 100% { -webkit-transform: rotate(359deg); }
18 | }
19 | @-o-keyframes spin {
20 | 0% { -o-transform: rotate(0deg); }
21 | 100% { -o-transform: rotate(359deg); }
22 | }
23 | @-ms-keyframes spin {
24 | 0% { -ms-transform: rotate(0deg); }
25 | 100% { -ms-transform: rotate(359deg); }
26 | }
27 | @keyframes spin {
28 | 0% { transform: rotate(0deg); }
29 | 100% { transform: rotate(359deg); }
30 | }
31 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/less/stacked.less:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-stack {
5 | position: relative;
6 | display: inline-block;
7 | width: 2em;
8 | height: 2em;
9 | line-height: 2em;
10 | vertical-align: middle;
11 | }
12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
13 | position: absolute;
14 | left: 0;
15 | width: 100%;
16 | text-align: center;
17 | }
18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; }
19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; }
20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; }
21 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/scss/_bordered-pulled.scss:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-border {
5 | padding: .2em .25em .15em;
6 | border: solid .08em $fa-border-color;
7 | border-radius: .1em;
8 | }
9 |
10 | .pull-right { float: right; }
11 | .pull-left { float: left; }
12 |
13 | .#{$fa-css-prefix} {
14 | &.pull-left { margin-right: .3em; }
15 | &.pull-right { margin-left: .3em; }
16 | }
17 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/scss/_core.scss:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix} {
5 | display: inline-block;
6 | font-family: FontAwesome;
7 | font-style: normal;
8 | font-weight: normal;
9 | line-height: 1;
10 | -webkit-font-smoothing: antialiased;
11 | -moz-osx-font-smoothing: grayscale;
12 | }
13 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/scss/_fixed-width.scss:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .#{$fa-css-prefix}-fw {
4 | width: (18em / 14);
5 | text-align: center;
6 | }
7 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/scss/_larger.scss:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | /* makes the font 33% larger relative to the icon container */
5 | .#{$fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -15%;
9 | }
10 | .#{$fa-css-prefix}-2x { font-size: 2em; }
11 | .#{$fa-css-prefix}-3x { font-size: 3em; }
12 | .#{$fa-css-prefix}-4x { font-size: 4em; }
13 | .#{$fa-css-prefix}-5x { font-size: 5em; }
14 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/scss/_list.scss:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-ul {
5 | padding-left: 0;
6 | margin-left: $fa-li-width;
7 | list-style-type: none;
8 | > li { position: relative; }
9 | }
10 | .#{$fa-css-prefix}-li {
11 | position: absolute;
12 | left: -$fa-li-width;
13 | width: $fa-li-width;
14 | top: (2em / 14);
15 | text-align: center;
16 | &.#{$fa-css-prefix}-lg {
17 | left: -$fa-li-width + (4em / 14);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/scss/_mixins.scss:
--------------------------------------------------------------------------------
1 | // Mixins
2 | // --------------------------
3 |
4 | @mixin fa-icon-rotate($degrees, $rotation) {
5 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);
6 | -webkit-transform: rotate($degrees);
7 | -moz-transform: rotate($degrees);
8 | -ms-transform: rotate($degrees);
9 | -o-transform: rotate($degrees);
10 | transform: rotate($degrees);
11 | }
12 |
13 | @mixin fa-icon-flip($horiz, $vert, $rotation) {
14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);
15 | -webkit-transform: scale($horiz, $vert);
16 | -moz-transform: scale($horiz, $vert);
17 | -ms-transform: scale($horiz, $vert);
18 | -o-transform: scale($horiz, $vert);
19 | transform: scale($horiz, $vert);
20 | }
21 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/scss/_path.scss:
--------------------------------------------------------------------------------
1 | /* FONT PATH
2 | * -------------------------- */
3 |
4 | @font-face {
5 | font-family: 'FontAwesome';
6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
8 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
9 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
10 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
11 | //src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
12 | font-weight: normal;
13 | font-style: normal;
14 | }
15 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/scss/_rotated-flipped.scss:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
7 |
8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
10 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/scss/_spinning.scss:
--------------------------------------------------------------------------------
1 | // Spinning Icons
2 | // --------------------------
3 |
4 | .#{$fa-css-prefix}-spin {
5 | -webkit-animation: spin 2s infinite linear;
6 | -moz-animation: spin 2s infinite linear;
7 | -o-animation: spin 2s infinite linear;
8 | animation: spin 2s infinite linear;
9 | }
10 |
11 | @-moz-keyframes spin {
12 | 0% { -moz-transform: rotate(0deg); }
13 | 100% { -moz-transform: rotate(359deg); }
14 | }
15 | @-webkit-keyframes spin {
16 | 0% { -webkit-transform: rotate(0deg); }
17 | 100% { -webkit-transform: rotate(359deg); }
18 | }
19 | @-o-keyframes spin {
20 | 0% { -o-transform: rotate(0deg); }
21 | 100% { -o-transform: rotate(359deg); }
22 | }
23 | @-ms-keyframes spin {
24 | 0% { -ms-transform: rotate(0deg); }
25 | 100% { -ms-transform: rotate(359deg); }
26 | }
27 | @keyframes spin {
28 | 0% { transform: rotate(0deg); }
29 | 100% { transform: rotate(359deg); }
30 | }
31 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/scss/_stacked.scss:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-stack {
5 | position: relative;
6 | display: inline-block;
7 | width: 2em;
8 | height: 2em;
9 | line-height: 2em;
10 | vertical-align: middle;
11 | }
12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
13 | position: absolute;
14 | left: 0;
15 | width: 100%;
16 | text-align: center;
17 | }
18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; }
19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; }
20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; }
21 |
--------------------------------------------------------------------------------
/lib/themes/default/public/font-awesome-4.0.3/scss/font-awesome.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | @import "variables";
7 | @import "mixins";
8 | @import "path";
9 | @import "core";
10 | @import "larger";
11 | @import "fixed-width";
12 | @import "list";
13 | @import "bordered-pulled";
14 | @import "spinning";
15 | @import "rotated-flipped";
16 | @import "stacked";
17 | @import "icons";
18 |
--------------------------------------------------------------------------------
/lib/themes/default/public/img/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/lib/themes/default/public/img/favicon.png
--------------------------------------------------------------------------------
/lib/themes/default/public/js/scripts.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/lib/themes/default/public/js/scripts.js
--------------------------------------------------------------------------------
/lib/themes/default/public/prism/prism.css:
--------------------------------------------------------------------------------
1 | /**
2 | * prism.js default theme for JavaScript, CSS and HTML
3 | * Based on dabblet (http://dabblet.com)
4 | * @author Lea Verou
5 | */
6 |
7 | code[class*="language-"],
8 | pre[class*="language-"] {
9 | color: black;
10 | text-shadow: 0 1px white;
11 | font-family: Consolas, Monaco, 'Andale Mono', monospace;
12 | direction: ltr;
13 | text-align: left;
14 | white-space: pre;
15 | word-spacing: normal;
16 | word-break: normal;
17 |
18 |
19 | -moz-tab-size: 4;
20 | -o-tab-size: 4;
21 | tab-size: 4;
22 |
23 | -webkit-hyphens: none;
24 | -moz-hyphens: none;
25 | -ms-hyphens: none;
26 | hyphens: none;
27 | }
28 |
29 | pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
30 | code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
31 | text-shadow: none;
32 | background: #b3d4fc;
33 | }
34 |
35 | pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
36 | code[class*="language-"]::selection, code[class*="language-"] ::selection {
37 | text-shadow: none;
38 | background: #b3d4fc;
39 | }
40 |
41 | @media print {
42 | code[class*="language-"],
43 | pre[class*="language-"] {
44 | text-shadow: none;
45 | }
46 | }
47 |
48 | /* Code blocks */
49 | pre[class*="language-"] {
50 | padding: 1em;
51 | margin: .5em 0;
52 | overflow: auto;
53 | }
54 |
55 | :not(pre) > code[class*="language-"],
56 | pre[class*="language-"] {
57 | background: #f5f2f0;
58 | }
59 |
60 | /* Inline code */
61 | :not(pre) > code[class*="language-"] {
62 | padding: .1em;
63 | border-radius: .3em;
64 | }
65 |
66 | .token.comment,
67 | .token.prolog,
68 | .token.doctype,
69 | .token.cdata {
70 | color: slategray;
71 | }
72 |
73 | .token.punctuation {
74 | color: #999;
75 | }
76 |
77 | .namespace {
78 | opacity: .7;
79 | }
80 |
81 | .token.property,
82 | .token.tag,
83 | .token.boolean,
84 | .token.number,
85 | .token.constant,
86 | .token.symbol {
87 | color: #905;
88 | }
89 |
90 | .token.selector,
91 | .token.attr-name,
92 | .token.string,
93 | .token.builtin {
94 | color: #690;
95 | }
96 |
97 | .token.operator,
98 | .token.entity,
99 | .token.url,
100 | .language-css .token.string,
101 | .style .token.string,
102 | .token.variable {
103 | color: #a67f59;
104 | background: hsla(0,0%,100%,.5);
105 | }
106 |
107 | .token.atrule,
108 | .token.attr-value,
109 | .token.keyword {
110 | color: #07a;
111 | }
112 |
113 |
114 | .token.regex,
115 | .token.important {
116 | color: #e90;
117 | }
118 |
119 | .token.important {
120 | font-weight: bold;
121 | }
122 |
123 | .token.entity {
124 | cursor: help;
125 | }
126 |
127 |
--------------------------------------------------------------------------------
/lib/themes/default/public/prism/prism.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Prism: Lightweight, robust, elegant syntax highlighting
3 | * MIT license http://www.opensource.org/licenses/mit-license.php/
4 | * @author Lea Verou http://lea.verou.me
5 | */(function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=self.Prism={util:{type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},clone:function(e){var n=t.util.type(e);switch(n){case"Object":var r={};for(var i in e)e.hasOwnProperty(i)&&(r[i]=t.util.clone(e[i]));return r;case"Array":return e.slice()}return e}},languages:{extend:function(e,n){var r=t.util.clone(t.languages[e]);for(var i in n)r[i]=n[i];return r},insertBefore:function(e,n,r,i){i=i||t.languages;var s=i[e],o={};for(var u in s)if(s.hasOwnProperty(u)){if(u==n)for(var a in r)r.hasOwnProperty(a)&&(o[a]=r[a]);o[u]=s[u]}return i[e]=o},DFS:function(e,n){for(var r in e){n.call(e,r,e[r]);t.util.type(e)==="Object"&&t.languages.DFS(e[r],n)}}},highlightAll:function(e,n){var r=document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code');for(var i=0,s;s=r[i++];)t.highlightElement(s,e===!0,n)},highlightElement:function(r,i,s){var o,u,a=r;while(a&&!e.test(a.className))a=a.parentNode;if(a){o=(a.className.match(e)||[,""])[1];u=t.languages[o]}if(!u)return;r.className=r.className.replace(e,"").replace(/\s+/g," ")+" language-"+o;a=r.parentNode;/pre/i.test(a.nodeName)&&(a.className=a.className.replace(e,"").replace(/\s+/g," ")+" language-"+o);var f=r.textContent;if(!f)return;f=f.replace(/&/g,"&").replace(/e.length)break e;if(p instanceof i)continue;a.lastIndex=0;var d=a.exec(p);if(d){l&&(c=d[1].length);var v=d.index-1+c,d=d[0].slice(c),m=d.length,g=v+m,y=p.slice(0,v+1),b=p.slice(g+1),w=[h,1];y&&w.push(y);var E=new i(u,f?t.tokenize(d,f):d);w.push(E);b&&w.push(b);Array.prototype.splice.apply(s,w)}}}return s},hooks:{all:{},add:function(e,n){var r=t.hooks.all;r[e]=r[e]||[];r[e].push(n)},run:function(e,n){var r=t.hooks.all[e];if(!r||!r.length)return;for(var i=0,s;s=r[i++];)s(n)}}},n=t.Token=function(e,t){this.type=e;this.content=t};n.stringify=function(e,r,i){if(typeof e=="string")return e;if(Object.prototype.toString.call(e)=="[object Array]")return e.map(function(t){return n.stringify(t,r,e)}).join("");var s={type:e.type,content:n.stringify(e.content,r,i),tag:"span",classes:["token",e.type],attributes:{},language:r,parent:i};s.type=="comment"&&(s.attributes.spellcheck="true");t.hooks.run("wrap",s);var o="";for(var u in s.attributes)o+=u+'="'+(s.attributes[u]||"")+'"';return"<"+s.tag+' class="'+s.classes.join(" ")+'" '+o+">"+s.content+""+s.tag+">"};if(!self.document){self.addEventListener("message",function(e){var n=JSON.parse(e.data),r=n.language,i=n.code;self.postMessage(JSON.stringify(t.tokenize(i,t.languages[r])));self.close()},!1);return}var r=document.getElementsByTagName("script");r=r[r.length-1];if(r){t.filename=r.src;document.addEventListener&&!r.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)}})();;
6 | Prism.languages.markup={comment:/<!--[\w\W]*?-->/g,prolog:/<\?.+?\?>/,doctype:/<!DOCTYPE.+?>/,cdata:/<!\[CDATA\[[\w\W]*?]]>/i,tag:{pattern:/<\/?[\w:-]+\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|\w+))?\s*)*\/?>/gi,inside:{tag:{pattern:/^<\/?[\w:-]+/i,inside:{punctuation:/^<\/?/,namespace:/^[\w-]+?:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/gi,inside:{punctuation:/=|>|"/g}},punctuation:/\/?>/g,"attr-name":{pattern:/[\w:-]+/g,inside:{namespace:/^[\w-]+?:/}}}},entity:/&#?[\da-z]{1,8};/gi};Prism.hooks.add("wrap",function(e){e.type==="entity"&&(e.attributes.title=e.content.replace(/&/,"&"))});;
7 | Prism.languages.css={comment:/\/\*[\w\W]*?\*\//g,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*{))/gi,inside:{punctuation:/[;:]/g}},url:/url\((["']?).*?\1\)/gi,selector:/[^\{\}\s][^\{\};]*(?=\s*\{)/g,property:/(\b|\B)[\w-]+(?=\s*:)/ig,string:/("|')(\\?.)*?\1/g,important:/\B!important\b/gi,ignore:/&(lt|gt|amp);/gi,punctuation:/[\{\};:]/g};Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{style:{pattern:/(<|<)style[\w\W]*?(>|>)[\w\W]*?(<|<)\/style(>|>)/ig,inside:{tag:{pattern:/(<|<)style[\w\W]*?(>|>)|(<|<)\/style(>|>)/ig,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.css}}});;
8 | Prism.languages.clike={comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|(^|[^:])\/\/.*?(\r?\n|$))/g,lookbehind:!0},string:/("|')(\\?.)*?\1/g,"class-name":{pattern:/((?:(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/ig,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/g,"boolean":/\b(true|false)\b/g,"function":{pattern:/[a-z0-9_]+\(/ig,inside:{punctuation:/\(/}}, number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/g,operator:/[-+]{1,2}|!|<=?|>=?|={1,3}|(&){1,2}|\|?\||\?|\*|\/|\~|\^|\%/g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\];(),.:]/g};
9 | ;
10 | Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(var|let|if|else|while|do|for|return|in|instanceof|function|new|with|typeof|try|throw|catch|finally|null|break|continue)\b/g,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?|NaN|-?Infinity)\b/g});Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,lookbehind:!0}});Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/(<|<)script[\w\W]*?(>|>)[\w\W]*?(<|<)\/script(>|>)/ig,inside:{tag:{pattern:/(<|<)script[\w\W]*?(>|>)|(<|<)\/script(>|>)/ig,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.javascript}}});
11 | ;
12 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "techy",
3 | "version": "1.2.5",
4 | "homepage": "http://krasimir.github.io/techy",
5 | "description": "Flat CMS based on Gulp and AbsurdJS",
6 | "main": "./lib/index.js",
7 | "author": {
8 | "name": "Krasimir Tsonev",
9 | "email": "info@krasimirtsonev.com",
10 | "url": "http://krasimirtsonev.com"
11 | },
12 | "license": "MIT",
13 | "dependencies": {
14 | "absurd": "~0.3.146",
15 | "gulp": "3.6.0",
16 | "gulp-absurd": "0.0.1",
17 | "gulp-concat": "2.2.0",
18 | "gulp-jshint": "1.5.3",
19 | "gulp-uglify": "0.2.1",
20 | "through2": "0.4.1",
21 | "gulp-util": "2.2.14",
22 | "marked": "0.3.1",
23 | "minimist": "0.0.8",
24 | "html-entities": "1.0.10",
25 | "glob": "3.2.9",
26 | "glob-expand": "*",
27 | "ncp": "0.5.0",
28 | "colors": "0.6.2",
29 | "yaml-front-matter": "3.0.1"
30 | },
31 | "devDependencies": {
32 | "expect.js": "0.3.1",
33 | "gulp-less": "1.2.3"
34 | },
35 | "keywords": [
36 | "flat",
37 | "cms",
38 | "gulp",
39 | "absurdjs"
40 | ],
41 | "repository": {
42 | "type": "git",
43 | "url": "https://github.com/krasimir/techy.git"
44 | },
45 | "bin": {
46 | "techy": "./lib/index.js"
47 | },
48 | "scripts": {
49 | "test": "mocha ./tests --reporter spec"
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/tests/access-page-by-name/A/index.md:
--------------------------------------------------------------------------------
1 | # I'm a page A
2 |
3 | <% set('name', 'pageA') %>
--------------------------------------------------------------------------------
/tests/access-page-by-name/B/index.md:
--------------------------------------------------------------------------------
1 | # I'm a page B
2 |
3 | <% set('name', 'pageB') %>
4 | <% set('wow', 'What\'s up! (from page B)') %>
--------------------------------------------------------------------------------
/tests/access-page-by-name/expected.html:
--------------------------------------------------------------------------------
1 | There are 3 pages.
2 | Page A's self path is A.
3 | Here is a message from page B: What's up! (from page B)
4 |
--------------------------------------------------------------------------------
/tests/access-page-by-name/page.md:
--------------------------------------------------------------------------------
1 | There are <% numofpages() %> pages.
2 |
3 | Page A's self path is <% page('pageA').get('paths').self %>.
4 |
5 | Here is a message from page B: <% page('pageB').get('wow') %>
--------------------------------------------------------------------------------
/tests/basic/_donttouch/file.txt:
--------------------------------------------------------------------------------
1 | test
--------------------------------------------------------------------------------
/tests/basic/_expects/A.html:
--------------------------------------------------------------------------------
1 | That's a simple web page
2 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptates, dolorem, dolore adipisci consectetur expedita numquam necessitatibus distinctio maxime architecto doloribus ipsa sed consequuntur odit vel nisi repellat cum asperiores voluptatum.
3 |
--------------------------------------------------------------------------------
/tests/basic/_expects/page.html:
--------------------------------------------------------------------------------
1 |
2 | This is a title
3 | There are 2 pages in the site. That's AWESOME.
4 |
--------------------------------------------------------------------------------
/tests/basic/_lib/awesome.techy.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | return 'AWESOME';
3 | }
--------------------------------------------------------------------------------
/tests/basic/_tpl/layout.html:
--------------------------------------------------------------------------------
1 |
2 | <% content %>
3 |
--------------------------------------------------------------------------------
/tests/basic/css/styles.css:
--------------------------------------------------------------------------------
1 | body {
2 | width: 100%;
3 | }
--------------------------------------------------------------------------------
/tests/basic/inner/A.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: A
3 | title: That's a simple web page
4 | ---
5 |
6 | # <% title %>
7 |
8 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptates, dolorem, dolore adipisci consectetur expedita numquam necessitatibus distinctio maxime architecto doloribus ipsa sed consequuntur odit vel nisi repellat cum asperiores voluptatum.
--------------------------------------------------------------------------------
/tests/basic/js/scripts.js:
--------------------------------------------------------------------------------
1 | var App = {};
--------------------------------------------------------------------------------
/tests/basic/page.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: home
3 | layout: _tpl/layout.html
4 | ---
5 |
6 | ## This is a title
7 |
8 | There are <% numofpages() %> pages in the site. That's <% awesome() %>.
--------------------------------------------------------------------------------
/tests/copy-non-underscore/_file.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/copy-non-underscore/_file.md
--------------------------------------------------------------------------------
/tests/copy-non-underscore/_file.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/copy-non-underscore/_file.txt
--------------------------------------------------------------------------------
/tests/copy-non-underscore/_folder/file.txt:
--------------------------------------------------------------------------------
1 | A
--------------------------------------------------------------------------------
/tests/copy-non-underscore/copythis/_butnotthis/file.txt:
--------------------------------------------------------------------------------
1 | B
--------------------------------------------------------------------------------
/tests/copy-non-underscore/copythis/_copyme.md:
--------------------------------------------------------------------------------
1 | # Copy me
--------------------------------------------------------------------------------
/tests/copy-non-underscore/copythis/somefile.txt:
--------------------------------------------------------------------------------
1 | blah
--------------------------------------------------------------------------------
/tests/copy-non-underscore/page.md:
--------------------------------------------------------------------------------
1 | # Hello world
--------------------------------------------------------------------------------
/tests/css_absurd/TechyFile.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | return {
3 | css: {
4 | preprocessor: 'absurd',
5 | index: '_absurd/styles.js'
6 | }
7 | }
8 | }
--------------------------------------------------------------------------------
/tests/css_absurd/_absurd/styles.js:
--------------------------------------------------------------------------------
1 | module.exports = function(api) {
2 | api.add({
3 | body: {
4 | fz: '42em'
5 | }
6 | })
7 | }
--------------------------------------------------------------------------------
/tests/css_absurd/expected_styles.css:
--------------------------------------------------------------------------------
1 | body{font-size: 42em;}
--------------------------------------------------------------------------------
/tests/css_css/TechyFile.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | return {
3 | css: {
4 | preprocessor: 'none',
5 | index: '_css/**/*.css'
6 | }
7 | }
8 | }
--------------------------------------------------------------------------------
/tests/css_css/_css/a.css:
--------------------------------------------------------------------------------
1 | .content-site {
2 | margin: 0;
3 | }
--------------------------------------------------------------------------------
/tests/css_css/_css/b.css:
--------------------------------------------------------------------------------
1 | a:hover {
2 | line-height: 20px;
3 | }
--------------------------------------------------------------------------------
/tests/css_css/_css/custom/c.css:
--------------------------------------------------------------------------------
1 | p { test: 10; }
--------------------------------------------------------------------------------
/tests/css_css/expected_styles.css:
--------------------------------------------------------------------------------
1 | .content-site {
2 | margin: 0;
3 | }
4 | a:hover {
5 | line-height: 20px;
6 | }
7 | p { test: 10; }
--------------------------------------------------------------------------------
/tests/css_less/TechyFile.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | return {
3 | css: {
4 | preprocessor: 'less',
5 | index: '_less/styling.less'
6 | }
7 | }
8 | }
--------------------------------------------------------------------------------
/tests/css_less/_less/styling.less:
--------------------------------------------------------------------------------
1 | @base: #f938ab;
2 |
3 | .box-shadow(@style, @c) when (iscolor(@c)) {
4 | -webkit-box-shadow: @style @c;
5 | box-shadow: @style @c;
6 | }
7 | .box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) {
8 | .box-shadow(@style, rgba(0, 0, 0, @alpha));
9 | }
10 | .box {
11 | color: saturate(@base, 5%);
12 | border-color: lighten(@base, 30%);
13 | div { .box-shadow(0 0 5px, 30%) }
14 | }
--------------------------------------------------------------------------------
/tests/css_less/expected_styles.css:
--------------------------------------------------------------------------------
1 | .box {
2 | color: #fe33ac;
3 | border-color: #fdcdea;
4 | }
5 | .box div {
6 | -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
7 | box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
8 | }
9 |
--------------------------------------------------------------------------------
/tests/css_less_watch_dir/TechyFile.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | return {
3 | css: {
4 | preprocessor: 'less',
5 | index: '_less/style.less',
6 | out: '_dist/css/',
7 | watch: '_less/**/*.less'
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/tests/css_less_watch_dir/_less/include/other.less:
--------------------------------------------------------------------------------
1 | @color1: #ff00ff;
--------------------------------------------------------------------------------
/tests/css_less_watch_dir/_less/other.less:
--------------------------------------------------------------------------------
1 | @color2: #00ff00;
--------------------------------------------------------------------------------
/tests/css_less_watch_dir/_less/style.less:
--------------------------------------------------------------------------------
1 | @import "include/other.less";
2 | @import "other.less";
3 |
4 | .box {
5 | background-color: @color1;
6 | border-color: @color2;
7 | }
--------------------------------------------------------------------------------
/tests/css_less_watch_dir/expected_style.css:
--------------------------------------------------------------------------------
1 | .box {
2 | background-color: #ff00ff;
3 | border-color: #00ff00;
4 | }
5 |
--------------------------------------------------------------------------------
/tests/css_less_watch_dir/expected_style_changed.css:
--------------------------------------------------------------------------------
1 | .box {
2 | background-color: #000000;
3 | border-color: #ffffff;
4 | }
5 |
--------------------------------------------------------------------------------
/tests/custom-layout/_my-templates/footer.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/custom-layout/_my-templates/layout.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | <% title %>
6 |
7 |
8 | <% content %>
9 | <% template('_my-templates/footer') %>
10 |
11 |
--------------------------------------------------------------------------------
/tests/custom-layout/expected.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Page with custom layout
7 |
8 |
9 |
10 |
11 |
12 | Hello!
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/tests/custom-layout/page.md:
--------------------------------------------------------------------------------
1 | <% set('layout', '_my-templates/layout') %>
2 | <% set('title', 'Page with custom layout') %>
3 |
4 | Hello!
--------------------------------------------------------------------------------
/tests/custom-master-config/expected.html:
--------------------------------------------------------------------------------
1 | The value of the global setting is I'm a global
.
2 |
--------------------------------------------------------------------------------
/tests/custom-master-config/options.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | return {
3 | globalSetting: 'I\'m a global'
4 | }
5 | }
--------------------------------------------------------------------------------
/tests/custom-master-config/page.md:
--------------------------------------------------------------------------------
1 | The value of the global setting is `<% globalSetting %>`.
--------------------------------------------------------------------------------
/tests/custom-method/_libs/myown.techy.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | return 'My Name';
3 | }
--------------------------------------------------------------------------------
/tests/custom-method/expected.html:
--------------------------------------------------------------------------------
1 | Hi, how are you My Name!
2 |
--------------------------------------------------------------------------------
/tests/custom-method/page.md:
--------------------------------------------------------------------------------
1 | # Hi, how are you <% myown() %>!
--------------------------------------------------------------------------------
/tests/custom-templates/_data/custom/part.html:
--------------------------------------------------------------------------------
1 | I'm a custom template.
--------------------------------------------------------------------------------
/tests/custom-templates/expected.html:
--------------------------------------------------------------------------------
1 | Hello, how are you!
2 | Here is a custom template:
3 | I'm a custom template.
4 |
--------------------------------------------------------------------------------
/tests/custom-templates/page.md:
--------------------------------------------------------------------------------
1 | # Hello, how are you!
2 |
3 | Here is a custom template:
4 |
5 | <% template('_data/custom/part') %>
--------------------------------------------------------------------------------
/tests/draft-pages/A.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: A page
3 | ---
4 |
5 | # A page
--------------------------------------------------------------------------------
/tests/draft-pages/B.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: B page
3 | draft: no
4 | ---
5 |
6 | # B page
--------------------------------------------------------------------------------
/tests/draft-pages/C.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: C page
3 | draft: yes
4 | ---
5 |
6 | # C page
--------------------------------------------------------------------------------
/tests/draft-pages/expected.html:
--------------------------------------------------------------------------------
1 | There are 3 pages.
2 |
--------------------------------------------------------------------------------
/tests/draft-pages/page.md:
--------------------------------------------------------------------------------
1 | There are <% pages().length %> pages.
--------------------------------------------------------------------------------
/tests/get-pages-from-dir/D.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/get-pages-from-dir/D.md
--------------------------------------------------------------------------------
/tests/get-pages-from-dir/articles/C.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/get-pages-from-dir/articles/C.md
--------------------------------------------------------------------------------
/tests/get-pages-from-dir/articles/awesome.article.300.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/get-pages-from-dir/articles/awesome.article.300.md
--------------------------------------------------------------------------------
/tests/get-pages-from-dir/articles/today/A.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/get-pages-from-dir/articles/today/A.html
--------------------------------------------------------------------------------
/tests/get-pages-from-dir/articles/today/A.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/get-pages-from-dir/articles/today/A.md
--------------------------------------------------------------------------------
/tests/get-pages-from-dir/articles/today/B.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/get-pages-from-dir/articles/today/B.html
--------------------------------------------------------------------------------
/tests/get-pages-from-dir/articles/today/B.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/get-pages-from-dir/articles/today/B.md
--------------------------------------------------------------------------------
/tests/get-pages-from-dir/expected.html:
--------------------------------------------------------------------------------
1 | Num of today pages: 2
2 | Num of pages matching pattern: 1
3 |
--------------------------------------------------------------------------------
/tests/get-pages-from-dir/page.md:
--------------------------------------------------------------------------------
1 | Num of today pages: <% pages('articles/today').length %>
2 | Num of pages matching pattern: <% pages(/article\.300/).length %>
--------------------------------------------------------------------------------
/tests/html-usage/expected.html:
--------------------------------------------------------------------------------
1 | Title
2 |
3 | This is a markdown
4 |
5 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. In, ab, nobis dolorum molestias blanditiis debitis iure earum sed vel illo voluptatibus possimus placeat doloremque non totam nihil ut nisi ratione!
6 |
7 |
8 |
--------------------------------------------------------------------------------
/tests/html-usage/page.md:
--------------------------------------------------------------------------------
1 | # Title
2 |
3 | .custom-class and another one
4 |
5 | ## This is a markdown
6 |
7 | > Lorem ipsum dolor sit amet, consectetur adipisicing elit. In, ab, nobis dolorum molestias blanditiis debitis iure earum sed vel illo voluptatibus possimus placeat doloremque non totam nihil ut nisi ratione!
8 |
9 | .
--------------------------------------------------------------------------------
/tests/js/TechyFile.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | return {
3 | js: {
4 | src: '_src/**/*.js',
5 | dest: '_dist/public/js/file.js'
6 | }
7 | }
8 | }
--------------------------------------------------------------------------------
/tests/js/_src/A.js:
--------------------------------------------------------------------------------
1 | var a = 10;
--------------------------------------------------------------------------------
/tests/js/_src/B.js:
--------------------------------------------------------------------------------
1 | var b = 20;
--------------------------------------------------------------------------------
/tests/js/expected.js:
--------------------------------------------------------------------------------
1 | var a = 10;
2 | var b = 20;
--------------------------------------------------------------------------------
/tests/linkto/A/B/custom-page.html:
--------------------------------------------------------------------------------
1 |
2 | Hello world
3 | Link to D page.
4 | to home
5 |
6 |
--------------------------------------------------------------------------------
/tests/linkto/A/B/custom-page.md:
--------------------------------------------------------------------------------
1 | <% set('name', 'custom-page') %>
2 |
3 | # Hello world
4 |
5 | Link to D page.
6 | to home
--------------------------------------------------------------------------------
/tests/linkto/C/D/d-page.html:
--------------------------------------------------------------------------------
1 |
2 | D page
3 | Link to B page.
4 | to home
5 |
6 |
--------------------------------------------------------------------------------
/tests/linkto/C/D/d-page.md:
--------------------------------------------------------------------------------
1 | <% set('name', 'd-page') %>
2 |
3 | # D page
4 |
5 | Link to B page.
6 | to home
--------------------------------------------------------------------------------
/tests/linkto/expected.html:
--------------------------------------------------------------------------------
1 |
2 | B page.
3 | D page.
4 | D page.
5 |
--------------------------------------------------------------------------------
/tests/linkto/page.md:
--------------------------------------------------------------------------------
1 | <% set('name', 'home') %>
2 |
3 | B page.
4 | D page.
5 | D page.
--------------------------------------------------------------------------------
/tests/markdown-partials/A.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: A
3 | aValue: 1
4 | noSave: true
5 | ---
6 | # I'm page A
7 |
8 | value: <% page('C').cValue %>.
--------------------------------------------------------------------------------
/tests/markdown-partials/B.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: B
3 | bValue: 2
4 | noSave: true
5 | ---
6 | # I'm page B
7 |
8 | value: <% page('A').aValue %>.
9 |
10 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloremque, eveniet, voluptates, cum voluptatem tenetur assumenda sit repellat illo tempore amet deleniti a itaque quos corrupti quasi maiores ea distinctio reiciendis?
11 |
12 | <% get('customvar') %>
13 |
14 | <% get('inner') %>
--------------------------------------------------------------------------------
/tests/markdown-partials/C.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: C
3 | cValue: 3
4 | ---
5 | # I'm page C
6 |
7 | value: <% page('B').bValue %>.
8 |
9 | <% template('A.md') %>
--------------------------------------------------------------------------------
/tests/markdown-partials/expected.html:
--------------------------------------------------------------------------------
1 | The value of B:
2 | I'm page B
3 | value: 1.
4 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloremque, eveniet, voluptates, cum voluptatem tenetur assumenda sit repellat illo tempore amet deleniti a itaque quos corrupti quasi maiores ea distinctio reiciendis?
5 | 42
6 | 52
7 |
8 |
--------------------------------------------------------------------------------
/tests/markdown-partials/page.md:
--------------------------------------------------------------------------------
1 | The value of B:
2 |
3 | <% template('B.md', { customvar: 42, inner: 52}) %>
--------------------------------------------------------------------------------
/tests/master-config-with-dest-folder/.gitignore:
--------------------------------------------------------------------------------
1 | public/
2 | themes/
--------------------------------------------------------------------------------
/tests/master-config-with-dest-folder/TechyFile.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | return {
3 | src: './_in',
4 | dest: './_out'
5 | }
6 | }
--------------------------------------------------------------------------------
/tests/master-config-with-dest-folder/_in/page.md:
--------------------------------------------------------------------------------
1 | # Hello world
--------------------------------------------------------------------------------
/tests/master-config-with-dest-folder/_out/page.html:
--------------------------------------------------------------------------------
1 | Hello world
2 |
--------------------------------------------------------------------------------
/tests/master-config/TechyFile.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | return {
3 | globalSetting: 'I\'m a global'
4 | }
5 | }
--------------------------------------------------------------------------------
/tests/master-config/expected.html:
--------------------------------------------------------------------------------
1 | The value of the global setting is I'm a global
.
2 |
--------------------------------------------------------------------------------
/tests/master-config/page.md:
--------------------------------------------------------------------------------
1 | The value of the global setting is `<% globalSetting %>`.
--------------------------------------------------------------------------------
/tests/md-to-html/expected.html:
--------------------------------------------------------------------------------
1 | A title here
2 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id, nulla, alias rerum et odio dolores sequi pariatur fuga error suscipit facilis fugit non ducimus numquam voluptas porro doloremque beatae modi.
3 | Second title
4 |
5 | - bullet 1
6 | - bullet 2
7 | - bullet 3
8 | - bullet 4
9 |
10 |
11 |
12 | quote
13 |
14 |
--------------------------------------------------------------------------------
/tests/md-to-html/page.md:
--------------------------------------------------------------------------------
1 | # A title here
2 |
3 | Lorem ipsum dolor [sit amet](github.com), consectetur adipisicing elit. Id, nulla, alias rerum et odio dolores sequi pariatur fuga error suscipit facilis fugit non ducimus numquam voluptas porro doloremque beatae modi.
4 |
5 | ## Second title
6 |
7 | * bullet 1
8 | * bullet 2
9 | * bullet 3
10 | * bullet 4
11 |
12 | - - -
13 |
14 | > quote
--------------------------------------------------------------------------------
/tests/num-of-pages/expected.html:
--------------------------------------------------------------------------------
1 | My blog post
2 | This blog contains 2 pages.
3 |
--------------------------------------------------------------------------------
/tests/num-of-pages/page.md:
--------------------------------------------------------------------------------
1 | # My blog post
2 |
3 | This blog contains <% numofpages() == 1 ? '1 page' : numofpages() + ' pages' %>.
--------------------------------------------------------------------------------
/tests/num-of-pages/posts/article99.md:
--------------------------------------------------------------------------------
1 | # That's my article
--------------------------------------------------------------------------------
/tests/process-other-files/A/C/noprocess.css:
--------------------------------------------------------------------------------
1 | header {
2 | font-size: 20px;
3 | }
--------------------------------------------------------------------------------
/tests/process-other-files/A/C/styles.css.expected:
--------------------------------------------------------------------------------
1 | .content {
2 | width: 240px;
3 | }
--------------------------------------------------------------------------------
/tests/process-other-files/A/C/styles.css.ttt:
--------------------------------------------------------------------------------
1 | .content {
2 | width: 240px;
3 | }
--------------------------------------------------------------------------------
/tests/process-other-files/A/custom.html.expected:
--------------------------------------------------------------------------------
1 |
2 | # Custom page
3 |
4 | which is not a Markdown.
5 |
6 | Lorem ipsum
7 |
--------------------------------------------------------------------------------
/tests/process-other-files/A/custom.html.techy:
--------------------------------------------------------------------------------
1 | ---
2 | title: Markdown
3 | text: Lorem ipsum
4 | ---
5 | # Custom page
6 |
7 | which is not a <% get('title') %>.
8 |
9 | <% get('text') %>
10 |
--------------------------------------------------------------------------------
/tests/process-other-files/B/log.txt.blah:
--------------------------------------------------------------------------------
1 | This is a log file
2 | This is a log file
3 | This is a log file
4 | This is a log file
--------------------------------------------------------------------------------
/tests/process-other-files/TechyFile.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | return {
3 | process: [
4 | '**/*.techy',
5 | '**/*.blah',
6 | '**/styles.css.ttt'
7 | ]
8 | }
9 | }
--------------------------------------------------------------------------------
/tests/process-other-files/rss.xml.techy:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Example Channel
5 | http://example.com/
6 | My example channel
7 | -
8 |
News for September the Second
9 | http://example.com/2002/09/01
10 | other things happened today
11 |
12 | -
13 |
News for September the First
14 | http://example.com/2002/09/02
15 |
16 |
17 |
--------------------------------------------------------------------------------
/tests/set-get/.gitignore:
--------------------------------------------------------------------------------
1 | public/
2 | themes/
--------------------------------------------------------------------------------
/tests/set-get/expected.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Hello. My title is "This is my title" and the value is 42.
4 |
--------------------------------------------------------------------------------
/tests/set-get/page.md:
--------------------------------------------------------------------------------
1 | <% set('title', 'This is my title') %>
2 | <%set('num', 42) %>
3 | Hello. My title is "<% get('title')%>" and the value is <%get('num')%>.
--------------------------------------------------------------------------------
/tests/should-use-src-dest/.gitignore:
--------------------------------------------------------------------------------
1 | public/
2 | themes/
--------------------------------------------------------------------------------
/tests/should-use-src-dest/_out/A.html:
--------------------------------------------------------------------------------
1 | Hello World
2 |
--------------------------------------------------------------------------------
/tests/should-use-src-dest/_out/page.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/should-use-src-dest/_out/page.html
--------------------------------------------------------------------------------
/tests/should-use-src-dest/_pages/src/A.md:
--------------------------------------------------------------------------------
1 | # Hello World
--------------------------------------------------------------------------------
/tests/should-use-src-dest/_pages/src/page.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/should-use-src-dest/_pages/src/page.md
--------------------------------------------------------------------------------
/tests/should-use-src-dest/expected.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/should-use-src-dest/expected.html
--------------------------------------------------------------------------------
/tests/sort-by/D.md:
--------------------------------------------------------------------------------
1 | ---
2 | date: 02-01-2014
3 | value: 20
4 | ---
--------------------------------------------------------------------------------
/tests/sort-by/articles/C.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/sort-by/articles/C.html
--------------------------------------------------------------------------------
/tests/sort-by/articles/C.md:
--------------------------------------------------------------------------------
1 | ---
2 | date: 8-04-2014
3 | value: 5
4 | ---
--------------------------------------------------------------------------------
/tests/sort-by/articles/awesome.article.300.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/sort-by/articles/awesome.article.300.html
--------------------------------------------------------------------------------
/tests/sort-by/articles/awesome.article.300.md:
--------------------------------------------------------------------------------
1 | ---
2 | date: 01-07-2014
3 | value: 2
4 | ---
--------------------------------------------------------------------------------
/tests/sort-by/articles/today/A.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/sort-by/articles/today/A.html
--------------------------------------------------------------------------------
/tests/sort-by/articles/today/A.md:
--------------------------------------------------------------------------------
1 | ---
2 | date: 06-03-2014
3 | value: 335
4 | ---
--------------------------------------------------------------------------------
/tests/sort-by/articles/today/B.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/sort-by/articles/today/B.html
--------------------------------------------------------------------------------
/tests/sort-by/articles/today/B.md:
--------------------------------------------------------------------------------
1 | ---
2 | date: 08-09-2014
3 | value: 325
4 | ---
--------------------------------------------------------------------------------
/tests/sort-by/expected.html:
--------------------------------------------------------------------------------
1 | Num of today pages: 2
2 | Num of pages matching pattern: 1
3 | Sorting:
4 | By date
5 |
6 | date=12-01-2014 value=undefined page.md
7 | date=08-09-2014 value=325 B.md
8 | date=8-04-2014 value=5 C.md
9 | date=06-03-2014 value=335 A.md
10 | date=02-01-2014 value=20 D.md
11 | date=01-07-2014 value=2 awesome.article.300.md
By value
12 |
13 | date=06-03-2014 value=335 A.md
14 | date=08-09-2014 value=325 B.md
15 | date=02-01-2014 value=20 D.md
16 | date=8-04-2014 value=5 C.md
17 | date=01-07-2014 value=2 awesome.article.300.md
18 | date=12-01-2014 value=undefined page.md
today by value
19 |
20 | date=06-03-2014 value=335 A.md
21 | date=08-09-2014 value=325 B.md
articles by date
22 |
23 | date=08-09-2014 value=325 B.md
24 | date=8-04-2014 value=5 C.md
25 | date=06-03-2014 value=335 A.md
26 | date=01-07-2014 value=2 awesome.article.300.md
27 |
--------------------------------------------------------------------------------
/tests/sort-by/page.md:
--------------------------------------------------------------------------------
1 | ---
2 | date: 12-01-2014
3 | ---
4 | Num of today pages: <% pages('articles/today').length %>
5 | Num of pages matching pattern: <% pages(/article\.300/).length %>
6 |
7 | Sorting:
8 |
9 | <% showsorting() %>
--------------------------------------------------------------------------------
/tests/sort-by/showsorting.techy.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | var appendStr = function(pages, title) {
3 | var str = '' + title + '
\n';
4 | for(var i=0; i \ndate=' + p.get('date') + ' value=' + p.get('value');
7 | str += ' ' + p.get('paths').file;
8 | }
9 | str += '
';
10 | return str;
11 | }
12 | return appendStr(this.pages(null, 'date'), 'By date') +
13 | appendStr(this.pages(null, 'value'), 'By value') +
14 | appendStr(this.pages('today', 'value'), 'today by value') +
15 | appendStr(this.pages('articles', 'date'), 'articles by date');
16 | }
--------------------------------------------------------------------------------
/tests/tests.js:
--------------------------------------------------------------------------------
1 | var Techy = require('../lib/index');
2 | var fs = require('fs');
3 | var expect = require('expect.js');
4 |
5 | var deleteFolderRecursive = function(path) {
6 | if(fs.existsSync(path)) {
7 | fs.readdirSync(path).forEach(function(file,index){
8 | var curPath = path + "/" + file;
9 | if(fs.lstatSync(curPath).isDirectory()) { // recurse
10 | deleteFolderRecursive(curPath);
11 | } else { // delete file
12 | fs.unlinkSync(curPath);
13 | }
14 | });
15 | fs.rmdirSync(path);
16 | }
17 | };
18 |
19 | var run = function(root, desc, asserts, ops, addToTechyCb) {
20 | ops = ops || { noLogging: true };
21 | addToTechyCb = addToTechyCb || function(){};
22 | it(desc, function(done) {
23 | deleteFolderRecursive(root + '/_dist');
24 | Techy(root, function() {
25 | addToTechyCb.call(this);
26 | if(asserts) {
27 | asserts(done);
28 | } else {
29 | done();
30 | }
31 | }, ops);
32 | });
33 | }
34 |
35 | var compareFileContent = function(a, b, ignoreNewLinesAndTabs) {
36 | if(ignoreNewLinesAndTabs) {
37 | expect(fs.readFileSync(a).toString().replace(/\n|\r|\t/g, '')).to.be(fs.readFileSync(b).toString().replace(/\n|\r|\t/g, ''));
38 | } else {
39 | expect(fs.readFileSync(a).toString()).to.be(fs.readFileSync(b).toString());
40 | }
41 | }
42 |
43 | var compare = function(root, desc, ops) {
44 | run(root, desc, function(done) {
45 | compareFileContent(root + '/_dist/page.html', root + '/expected.html');
46 | done();
47 | }, ops);
48 | }
49 |
50 | describe("Techy testing", function() {
51 | run(__dirname + "/basic", "should work properly", function(done) {
52 | expect(fs.existsSync(__dirname + '/basic/_dist/css/styles.css')).to.be(true);
53 | expect(fs.existsSync(__dirname + '/basic/_dist/js/scripts.js')).to.be(true);
54 | expect(fs.existsSync(__dirname + '/basic/_dist/inner/A.html')).to.be(true);
55 | expect(fs.existsSync(__dirname + '/basic/_dist/inner/A.md')).to.be(false);
56 | compareFileContent(__dirname + '/basic/_dist/inner/A.html', __dirname + '/basic/_expects/A.html');
57 | compareFileContent(__dirname + '/basic/_dist/page.html', __dirname + '/basic/_expects/page.html');
58 | done();
59 | });
60 | compare(__dirname + "/md-to-html", "should compile markdown file to HTML");
61 | compare(__dirname + "/with-layout", "should use layout");
62 | compare(__dirname + "/set-get", "should use get and set");
63 | compare(__dirname + "/custom-templates", "should use custom templates");
64 | compare(__dirname + "/custom-layout", "should use custom layout");
65 | compare(__dirname + "/custom-method", "should use a custom method");
66 | compare(__dirname + "/num-of-pages", "should use numofpages method");
67 | compare(__dirname + "/using-path", "should use path method");
68 | compare(__dirname + "/access-page-by-name", "should get a page by name");
69 | compare(__dirname + "/master-config", "should use a master config");
70 | compare(__dirname + "/html-usage", "should use html");
71 | compare(__dirname + "/linkto", "should use linkto");
72 | run(__dirname + "/css_absurd", "should use Absurd", function(done) {
73 | compareFileContent(__dirname + '/css_absurd/expected_styles.css', __dirname + '/css_absurd/_dist/css/styles.css');
74 | done();
75 | });
76 | run(__dirname + "/css_less", "should use LESS", function(done) {
77 | compareFileContent(__dirname + '/css_less/expected_styles.css', __dirname + '/css_less/_dist/css/styling.css');
78 | done();
79 | });
80 | // // the test is commented because gulp-sass can not be installed properly at the moment
81 | // // compare(__dirname + "/css_sass", "should use SASS", function(done) {
82 | // // var exprectedCSS = fs.readFileSync(__dirname + '/css_sass/expected_styles.css').toString('utf8').replace(/(\r|\n)/g, '');
83 | // // var actualCSS = fs.readFileSync(__dirname + '/css_sass/themes/empty/public/styling.css').toString('utf8').replace(/(\r|\n)/g, '');
84 | // // expect(exprectedCSS).to.be(actualCSS);
85 | // // done();
86 | // // });
87 | run(__dirname + "/css_css", "should use plain css", function(done) {
88 | compareFileContent(__dirname + '/css_css/expected_styles.css', __dirname + '/css_css/_dist/css/styles.css', true);
89 | done();
90 | });
91 | compare(__dirname + "/using-yaml", "should use yaml");
92 | run(__dirname + "/process-other-files", "should process other type of files", function(done) {
93 | compareFileContent(__dirname + "/process-other-files/_dist/A/C/styles.css", __dirname + "/process-other-files/_dist/A/C/styles.css.expected", true);
94 | compareFileContent(__dirname + "/process-other-files/_dist/A/custom.html", __dirname + "/process-other-files/_dist/A/custom.html.expected", true);
95 | done();
96 | });
97 | compare(__dirname + "/markdown-partials", "should use markdown as partial", function(done) {
98 | expect(fs.existsSync(__dirname + '/markdown-partials/A.html')).to.equal(false);
99 | expect(fs.existsSync(__dirname + '/markdown-partials/B.html')).to.equal(false);
100 | expect(fs.existsSync(__dirname + '/markdown-partials/C.html')).to.equal(true);
101 | done();
102 | });
103 | compare(__dirname + "/get-pages-from-dir", "should get pages from specific directory");
104 | compare(__dirname + "/sort-by", "should get pages from specific directory sorted");
105 | compare(__dirname + "/draft-pages", "pages should not return those which have draft: yes");
106 | compare(__dirname + "/custom-master-config", "techy should use custom master config", { noLogging: true, techyFile: __dirname + '/custom-master-config/options.js' });
107 | run(__dirname + "/should-use-src-dest", "should use src and dest params", function(done) {
108 | expect(fs.existsSync(__dirname + '/should-use-src-dest/_out/A.html')).to.equal(true);
109 | expect(fs.existsSync(__dirname + '/should-use-src-dest/_out/page.html')).to.equal(true);
110 | expect(fs.readFileSync(__dirname + '/should-use-src-dest/_out/A.html').toString('utf8')).to.equal('Hello World
\n');
111 | done();
112 | }, { noLogging: true, src: __dirname + '/should-use-src-dest/_pages/src', dest: __dirname + '/should-use-src-dest/_out'});
113 | run(__dirname + "/master-config-with-dest-folder", "should put the public folder properly", function(done) {
114 | expect(fs.readFileSync(__dirname + '/master-config-with-dest-folder/_out/page.html').toString('utf8')).to.equal('Hello world
\n');
115 | done();
116 | }, { noLogging: true });
117 | run(__dirname + "/js", "should concatenates JavaScript", function(done) {
118 | compareFileContent(__dirname + "/js/expected.js", __dirname + "/js/_dist/public/js/file.js");
119 | done();
120 | }, { noLogging: true });
121 | run(__dirname + "/copy-non-underscore", "should copy only non-underscore folders", function(done) {
122 | var path = __dirname + "/copy-non-underscore/";
123 | expect(fs.existsSync(path + '_dist/copythis/somefile.txt')).to.equal(true);
124 | expect(fs.existsSync(path + '_dist/copythis/_copyme.html')).to.equal(true);
125 | expect(fs.existsSync(path + '_dist/copythis/_butnotthis')).to.equal(false);
126 | expect(fs.existsSync(path + '_dist/page.html')).to.equal(true);
127 | done();
128 | }, { noLogging: true });
129 |
130 | context("Watch files", function()
131 | {
132 | this.timeout(5000); // need to use some setTimeouts
133 | var lessWatchCb = function(){};
134 | after(function()
135 | {
136 | lessWatchCb();
137 | });
138 |
139 | run(__dirname + "/css_less_watch_dir", "should watch LESS directory", function(done)
140 | {
141 | // first: test imports
142 | compareFileContent(__dirname + '/css_less_watch_dir/expected_style.css', __dirname + '/css_less_watch_dir/_dist/css/style.css');
143 | // second: test watch changes
144 | setTimeout(function()
145 | {
146 | var imported1File = __dirname + '/css_less_watch_dir/_less/include/other.less',
147 | imported2File = __dirname + '/css_less_watch_dir/_less/other.less',
148 | imported1Contents = fs.readFileSync( imported1File ).toString('utf8').replace(/(\r|\n)/g, ''),
149 | imported2Contents = fs.readFileSync( imported2File ).toString('utf8').replace(/(\r|\n)/g, ''),
150 | imported1 = fs.openSync( imported1File, 'w+'),
151 | imported2 = fs.openSync( imported2File, 'w+');
152 |
153 | // set files back to original contents;
154 | lessWatchCb = function()
155 | {
156 | fs.writeSync(imported1, imported1Contents, 0);
157 | fs.writeSync(imported2, imported2Contents, 0);
158 | };
159 | // write new values in the included files
160 | fs.writeSync(imported1, "@color1: #000000;");
161 | fs.writeSync(imported2, "@color2: #ffffff;");
162 | // check new values applied to new compiled style
163 | setTimeout(function()
164 | {
165 | compareFileContent(__dirname + '/css_less_watch_dir/expected_style_changed.css', __dirname + '/css_less_watch_dir/_dist/css/style.css');
166 | done();
167 | }, 200);
168 | }, 100);
169 | }, { noLogging: true }, function(){ this.watchFiles(); });
170 | });
171 | });
--------------------------------------------------------------------------------
/tests/using-path/expected.html:
--------------------------------------------------------------------------------
1 | The paths
object:
2 |
3 | - root:
./
4 | - self:
5 | - file:
page.md
6 |
7 | The paths
object:
8 |
9 | - root:
./
10 | - self:
11 | - file:
page.md
12 |
13 |
14 |
--------------------------------------------------------------------------------
/tests/using-path/inner/A/index.md:
--------------------------------------------------------------------------------
1 | The `paths` object:
2 |
3 | * root: `<% get('paths').root %>`
4 | * self: `<% get('paths').self %>`
5 | * file: `<% get('paths').file %>`
--------------------------------------------------------------------------------
/tests/using-path/inner/index.md:
--------------------------------------------------------------------------------
1 | The `paths` object:
2 |
3 | * root: `<% get('paths').root %>`
4 | * self: `<% get('paths').self %>`
5 | * file: `<% get('paths').file %>`
--------------------------------------------------------------------------------
/tests/using-path/page.md:
--------------------------------------------------------------------------------
1 | The `paths` object:
2 |
3 | * root: `<% get('paths').root %>`
4 | * self: `<% get('paths').self %>`
5 | * file: `<% get('paths').file %>`
6 |
7 | <% template('inner/index.md') %>
--------------------------------------------------------------------------------
/tests/using-theme/TechyFile.js:
--------------------------------------------------------------------------------
1 | module.exports = function() {
2 | return {
3 | theme: 'default'
4 | }
5 | }
--------------------------------------------------------------------------------
/tests/using-theme/_tpl/layout.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | <% this.title %>
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | <% get('content') %>
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/tests/using-theme/expected.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/using-theme/expected.html
--------------------------------------------------------------------------------
/tests/using-theme/page.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: _tpl/layout.html
3 | ---
4 | # Hello world
5 |
6 | // that's a code
7 | function test() {
8 | alert(42);
9 | }
10 |
11 | Lorem ipsum dolor sit amet, `consectetur adipisicing` elit. Delectus, aliquid, eius dicta fuga nobis sequi reprehenderit earum sed debitis maxime nemo ratione aspernatur aperiam tenetur culpa rem dolore placeat. Magnam.
12 |
13 | ---
14 |
15 | blah blah
--------------------------------------------------------------------------------
/tests/using-theme/public/css/styles.css:
--------------------------------------------------------------------------------
1 | /* misc */
2 |
3 | body, html {
4 | width: 100%;
5 | height: 100%;
6 | padding: 0;
7 | margin: 0;
8 | font-size: 20px;
9 | line-height: 34px;
10 | font-family: 'Average Sans', sans-serif;
11 | background: #FFF;
12 | color: #313131;
13 | }
14 | a {
15 | font-weight: bold;
16 | border-bottom: dotted 1px #c7c7c7;
17 | text-decoration: none;
18 | color: #313131;
19 | }
20 | a:hover {
21 | border-bottom: dotted 1px #999;
22 | color: #DC4141;
23 | }
24 | p {
25 | font-size: 20px;
26 | line-height: 34px;
27 | }
28 | hr {
29 | border-bottom: none;
30 | border-top: solid 4px #e6e6e6;
31 | }
32 | blockquote {
33 | border-left: solid 4px #999;
34 | padding: 0 0 0 20px;
35 | margin: 0;
36 | }
37 | blockquote p {
38 | color: #999;
39 | }
40 | table {
41 | border-spacing: 0;
42 | }
43 | table td {
44 | border-top: solid 1px #B3B3B3;
45 | border-left: solid 1px #B3B3B3;
46 | padding: 6px;
47 | word-wrap: break-word;
48 | }
49 | .left {
50 | float: left;
51 | }
52 | .right {
53 | float: right;
54 | }
55 |
56 | /* headings */
57 |
58 | h1 {
59 | font-size: 60px;
60 | line-height: 70px;
61 | padding: 0 0 40px 0;
62 | margin: 50px 0 30px 0;
63 | }
64 | h2 {
65 | font-size: 36px;
66 | line-height: 40px;
67 | }
68 | h3 {
69 | font-size: 36px;
70 | line-height: 40px;
71 | font-weight: normal;
72 | }
73 | h4 {
74 | font-size: 30px;
75 | line-height: 34px;
76 | font-weight: normal;
77 | }
78 | h5 {
79 | font-size: 24px;
80 | line-height: 28px;
81 | font-weight: normal;
82 | }
83 | h6 {
84 | font-size: 20px;
85 | line-height: 24px;
86 | }
87 |
88 | /* scroller */
89 |
90 | ::-webkit-scrollbar {
91 | width: 8px;
92 | }
93 | ::-webkit-scrollbar-track {
94 | webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
95 | -webkit-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
96 | -moz-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
97 | -ms-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
98 | -o-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
99 | border-radius: 2px;
100 | -webkit-border-radius: 2px;
101 | }
102 | ::-webkit-scrollbar-thumb {
103 | background: rgba(150,150,150,0.8);
104 | border-radius: 2px;
105 | -webkit-border-radius: 2px;
106 | webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
107 | -webkit-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
108 | -moz-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
109 | -ms-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
110 | -o-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
111 | }
112 | ::-webkit-scrollbar-thumb:window-inactive {
113 | background: rgba(150,150,150,0.4);
114 | }
115 |
116 | /* lists */
117 |
118 | ul {
119 | margin: 30px 0 30px 22px;
120 | padding: 0;
121 | list-style-type: circle;
122 | }
123 | ul li {
124 | margin: 0;
125 | padding: 0;
126 | }
127 | ol {
128 | margin: 30px 0 30px 22px;
129 | padding: 0;
130 | list-style-type: circle;
131 | }
132 | ol li {
133 | margin: 0;
134 | padding: 0;
135 | }
136 |
137 | /* code */
138 |
139 | code[class*="language-"] {
140 | font-size: 14px;
141 | line-height: 20px;
142 | }
143 | p code[class*="language-"] {
144 | font-size: 18px;
145 | border: solid 1px #D8D8D8;
146 | display: inline-block;
147 | padding: 0 10px 0 10px;
148 | }
149 | pre[class*="language-"] {
150 | font-size: 14px;
151 | line-height: 20px;
152 | }
153 | p pre[class*="language-"] {
154 | font-size: 18px;
155 | border: solid 1px #D8D8D8;
156 | display: inline-block;
157 | padding: 0 10px 0 10px;
158 | }
159 | pre {
160 | box-shadow: 0 0 2px 1px #ccc;
161 | -webkit-box-shadow: 0 0 2px 1px #ccc;
162 | -moz-box-shadow: 0 0 2px 1px #ccc;
163 | }
164 |
165 | /* grids */
166 |
167 | .grid-2:before {
168 | content: " ";
169 | display: table;
170 | clear: both;
171 | }
172 | .grid-2:after {
173 | content: " ";
174 | display: table;
175 | clear: both;
176 | }
177 | .grid-2 .grid-column {
178 | float: left;
179 | box-sizing: border-box;
180 | -webkit-box-sizing: border-box;
181 | -moz-box-sizing: border-box;
182 | width: 50.00%;
183 | }
184 | .grid-2 .grid-column p {
185 | padding-left: 0;
186 | pd: 0;
187 | }
188 | .grid-3:before {
189 | content: " ";
190 | display: table;
191 | clear: both;
192 | }
193 | .grid-3:after {
194 | content: " ";
195 | display: table;
196 | clear: both;
197 | }
198 | .grid-3 .grid-column {
199 | float: left;
200 | box-sizing: border-box;
201 | -webkit-box-sizing: border-box;
202 | -moz-box-sizing: border-box;
203 | width: 33.33%;
204 | }
205 | .grid-3 .grid-column p {
206 | padding-left: 0;
207 | pd: 0;
208 | }
209 | .grid-4:before {
210 | content: " ";
211 | display: table;
212 | clear: both;
213 | }
214 | .grid-4:after {
215 | content: " ";
216 | display: table;
217 | clear: both;
218 | }
219 | .grid-4 .grid-column {
220 | float: left;
221 | box-sizing: border-box;
222 | -webkit-box-sizing: border-box;
223 | -moz-box-sizing: border-box;
224 | width: 25.00%;
225 | }
226 | .grid-4 .grid-column p {
227 | padding-left: 0;
228 | pd: 0;
229 | }
230 |
231 | /* main container */
232 |
233 | .content {
234 | max-width: 650px;
235 | margin: 40px auto;
236 | }
237 |
238 | /* responsive */
239 |
240 | @media all and (max-width: 600px) {
241 | p {
242 | font-size: 18px;
243 | line-height: 28px;
244 | }
245 | h1 {
246 | font-size: 40px;
247 | line-height: 40px;
248 | margin: 20px 0 10px 0;
249 | padding: 0 0 20px 0;
250 | }
251 | h2 {
252 | font-size: 30px;
253 | line-height: 30px;
254 | }
255 | h3 {
256 | font-size: 26px;
257 | line-height: 26px;
258 | }
259 | h4 {
260 | font-size: 22px;
261 | line-height: 22px;
262 | }
263 | h5 {
264 | font-size: 18px;
265 | line-height: 18px;
266 | }
267 | h6 {
268 | font-size: 18px;
269 | line-height: 18px;
270 | }
271 | .grid-2 .grid-column {
272 | float: none;
273 | width: 100%;
274 | }
275 | }
276 | @media all and (max-width: 670px) {
277 | .grid-3 .grid-column {
278 | float: none;
279 | width: 100%;
280 | }
281 | }
282 | @media all and (max-width: 700px) {
283 | .grid-4 .grid-column {
284 | float: none;
285 | width: 100%;
286 | }
287 | }
288 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/using-theme/public/font-awesome-4.0.3/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/using-theme/public/font-awesome-4.0.3/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/using-theme/public/font-awesome-4.0.3/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/using-theme/public/font-awesome-4.0.3/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/less/bordered-pulled.less:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-border {
5 | padding: .2em .25em .15em;
6 | border: solid .08em @fa-border-color;
7 | border-radius: .1em;
8 | }
9 |
10 | .pull-right { float: right; }
11 | .pull-left { float: left; }
12 |
13 | .@{fa-css-prefix} {
14 | &.pull-left { margin-right: .3em; }
15 | &.pull-right { margin-left: .3em; }
16 | }
17 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/less/core.less:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .@{fa-css-prefix} {
5 | display: inline-block;
6 | font-family: FontAwesome;
7 | font-style: normal;
8 | font-weight: normal;
9 | line-height: 1;
10 | -webkit-font-smoothing: antialiased;
11 | -moz-osx-font-smoothing: grayscale;
12 | }
13 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/less/fixed-width.less:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .@{fa-css-prefix}-fw {
4 | width: (18em / 14);
5 | text-align: center;
6 | }
7 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/less/font-awesome.less:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | @import "variables";
7 | @import "mixins";
8 | @import "path";
9 | @import "core";
10 | @import "larger";
11 | @import "fixed-width";
12 | @import "list";
13 | @import "bordered-pulled";
14 | @import "spinning";
15 | @import "rotated-flipped";
16 | @import "stacked";
17 | @import "icons";
18 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/less/larger.less:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | /* makes the font 33% larger relative to the icon container */
5 | .@{fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -15%;
9 | }
10 | .@{fa-css-prefix}-2x { font-size: 2em; }
11 | .@{fa-css-prefix}-3x { font-size: 3em; }
12 | .@{fa-css-prefix}-4x { font-size: 4em; }
13 | .@{fa-css-prefix}-5x { font-size: 5em; }
14 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/less/list.less:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-ul {
5 | padding-left: 0;
6 | margin-left: @fa-li-width;
7 | list-style-type: none;
8 | > li { position: relative; }
9 | }
10 | .@{fa-css-prefix}-li {
11 | position: absolute;
12 | left: -@fa-li-width;
13 | width: @fa-li-width;
14 | top: (2em / 14);
15 | text-align: center;
16 | &.@{fa-css-prefix}-lg {
17 | left: -@fa-li-width + (4em / 14);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/less/mixins.less:
--------------------------------------------------------------------------------
1 | // Mixins
2 | // --------------------------
3 |
4 | .fa-icon-rotate(@degrees, @rotation) {
5 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);
6 | -webkit-transform: rotate(@degrees);
7 | -moz-transform: rotate(@degrees);
8 | -ms-transform: rotate(@degrees);
9 | -o-transform: rotate(@degrees);
10 | transform: rotate(@degrees);
11 | }
12 |
13 | .fa-icon-flip(@horiz, @vert, @rotation) {
14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1);
15 | -webkit-transform: scale(@horiz, @vert);
16 | -moz-transform: scale(@horiz, @vert);
17 | -ms-transform: scale(@horiz, @vert);
18 | -o-transform: scale(@horiz, @vert);
19 | transform: scale(@horiz, @vert);
20 | }
21 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/less/path.less:
--------------------------------------------------------------------------------
1 | /* FONT PATH
2 | * -------------------------- */
3 |
4 | @font-face {
5 | font-family: 'FontAwesome';
6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
8 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
9 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
10 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
11 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
12 | font-weight: normal;
13 | font-style: normal;
14 | }
15 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/less/rotated-flipped.less:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
7 |
8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
10 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/less/spinning.less:
--------------------------------------------------------------------------------
1 | // Spinning Icons
2 | // --------------------------
3 |
4 | .@{fa-css-prefix}-spin {
5 | -webkit-animation: spin 2s infinite linear;
6 | -moz-animation: spin 2s infinite linear;
7 | -o-animation: spin 2s infinite linear;
8 | animation: spin 2s infinite linear;
9 | }
10 |
11 | @-moz-keyframes spin {
12 | 0% { -moz-transform: rotate(0deg); }
13 | 100% { -moz-transform: rotate(359deg); }
14 | }
15 | @-webkit-keyframes spin {
16 | 0% { -webkit-transform: rotate(0deg); }
17 | 100% { -webkit-transform: rotate(359deg); }
18 | }
19 | @-o-keyframes spin {
20 | 0% { -o-transform: rotate(0deg); }
21 | 100% { -o-transform: rotate(359deg); }
22 | }
23 | @-ms-keyframes spin {
24 | 0% { -ms-transform: rotate(0deg); }
25 | 100% { -ms-transform: rotate(359deg); }
26 | }
27 | @keyframes spin {
28 | 0% { transform: rotate(0deg); }
29 | 100% { transform: rotate(359deg); }
30 | }
31 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/less/stacked.less:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-stack {
5 | position: relative;
6 | display: inline-block;
7 | width: 2em;
8 | height: 2em;
9 | line-height: 2em;
10 | vertical-align: middle;
11 | }
12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
13 | position: absolute;
14 | left: 0;
15 | width: 100%;
16 | text-align: center;
17 | }
18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; }
19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; }
20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; }
21 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/scss/_bordered-pulled.scss:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-border {
5 | padding: .2em .25em .15em;
6 | border: solid .08em $fa-border-color;
7 | border-radius: .1em;
8 | }
9 |
10 | .pull-right { float: right; }
11 | .pull-left { float: left; }
12 |
13 | .#{$fa-css-prefix} {
14 | &.pull-left { margin-right: .3em; }
15 | &.pull-right { margin-left: .3em; }
16 | }
17 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/scss/_core.scss:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix} {
5 | display: inline-block;
6 | font-family: FontAwesome;
7 | font-style: normal;
8 | font-weight: normal;
9 | line-height: 1;
10 | -webkit-font-smoothing: antialiased;
11 | -moz-osx-font-smoothing: grayscale;
12 | }
13 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/scss/_fixed-width.scss:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .#{$fa-css-prefix}-fw {
4 | width: (18em / 14);
5 | text-align: center;
6 | }
7 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/scss/_larger.scss:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | /* makes the font 33% larger relative to the icon container */
5 | .#{$fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -15%;
9 | }
10 | .#{$fa-css-prefix}-2x { font-size: 2em; }
11 | .#{$fa-css-prefix}-3x { font-size: 3em; }
12 | .#{$fa-css-prefix}-4x { font-size: 4em; }
13 | .#{$fa-css-prefix}-5x { font-size: 5em; }
14 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/scss/_list.scss:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-ul {
5 | padding-left: 0;
6 | margin-left: $fa-li-width;
7 | list-style-type: none;
8 | > li { position: relative; }
9 | }
10 | .#{$fa-css-prefix}-li {
11 | position: absolute;
12 | left: -$fa-li-width;
13 | width: $fa-li-width;
14 | top: (2em / 14);
15 | text-align: center;
16 | &.#{$fa-css-prefix}-lg {
17 | left: -$fa-li-width + (4em / 14);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/scss/_mixins.scss:
--------------------------------------------------------------------------------
1 | // Mixins
2 | // --------------------------
3 |
4 | @mixin fa-icon-rotate($degrees, $rotation) {
5 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);
6 | -webkit-transform: rotate($degrees);
7 | -moz-transform: rotate($degrees);
8 | -ms-transform: rotate($degrees);
9 | -o-transform: rotate($degrees);
10 | transform: rotate($degrees);
11 | }
12 |
13 | @mixin fa-icon-flip($horiz, $vert, $rotation) {
14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);
15 | -webkit-transform: scale($horiz, $vert);
16 | -moz-transform: scale($horiz, $vert);
17 | -ms-transform: scale($horiz, $vert);
18 | -o-transform: scale($horiz, $vert);
19 | transform: scale($horiz, $vert);
20 | }
21 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/scss/_path.scss:
--------------------------------------------------------------------------------
1 | /* FONT PATH
2 | * -------------------------- */
3 |
4 | @font-face {
5 | font-family: 'FontAwesome';
6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
8 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
9 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
10 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
11 | //src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
12 | font-weight: normal;
13 | font-style: normal;
14 | }
15 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/scss/_rotated-flipped.scss:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
7 |
8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
10 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/scss/_spinning.scss:
--------------------------------------------------------------------------------
1 | // Spinning Icons
2 | // --------------------------
3 |
4 | .#{$fa-css-prefix}-spin {
5 | -webkit-animation: spin 2s infinite linear;
6 | -moz-animation: spin 2s infinite linear;
7 | -o-animation: spin 2s infinite linear;
8 | animation: spin 2s infinite linear;
9 | }
10 |
11 | @-moz-keyframes spin {
12 | 0% { -moz-transform: rotate(0deg); }
13 | 100% { -moz-transform: rotate(359deg); }
14 | }
15 | @-webkit-keyframes spin {
16 | 0% { -webkit-transform: rotate(0deg); }
17 | 100% { -webkit-transform: rotate(359deg); }
18 | }
19 | @-o-keyframes spin {
20 | 0% { -o-transform: rotate(0deg); }
21 | 100% { -o-transform: rotate(359deg); }
22 | }
23 | @-ms-keyframes spin {
24 | 0% { -ms-transform: rotate(0deg); }
25 | 100% { -ms-transform: rotate(359deg); }
26 | }
27 | @keyframes spin {
28 | 0% { transform: rotate(0deg); }
29 | 100% { transform: rotate(359deg); }
30 | }
31 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/scss/_stacked.scss:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-stack {
5 | position: relative;
6 | display: inline-block;
7 | width: 2em;
8 | height: 2em;
9 | line-height: 2em;
10 | vertical-align: middle;
11 | }
12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
13 | position: absolute;
14 | left: 0;
15 | width: 100%;
16 | text-align: center;
17 | }
18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; }
19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; }
20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; }
21 |
--------------------------------------------------------------------------------
/tests/using-theme/public/font-awesome-4.0.3/scss/font-awesome.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | @import "variables";
7 | @import "mixins";
8 | @import "path";
9 | @import "core";
10 | @import "larger";
11 | @import "fixed-width";
12 | @import "list";
13 | @import "bordered-pulled";
14 | @import "spinning";
15 | @import "rotated-flipped";
16 | @import "stacked";
17 | @import "icons";
18 |
--------------------------------------------------------------------------------
/tests/using-theme/public/img/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/using-theme/public/img/favicon.png
--------------------------------------------------------------------------------
/tests/using-theme/public/js/scripts.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/krasimir/techy/ed1869a342f273eb01a1edeb075572387bdb7bb0/tests/using-theme/public/js/scripts.js
--------------------------------------------------------------------------------
/tests/using-theme/public/prism/prism.css:
--------------------------------------------------------------------------------
1 | /**
2 | * prism.js default theme for JavaScript, CSS and HTML
3 | * Based on dabblet (http://dabblet.com)
4 | * @author Lea Verou
5 | */
6 |
7 | code[class*="language-"],
8 | pre[class*="language-"] {
9 | color: black;
10 | text-shadow: 0 1px white;
11 | font-family: Consolas, Monaco, 'Andale Mono', monospace;
12 | direction: ltr;
13 | text-align: left;
14 | white-space: pre;
15 | word-spacing: normal;
16 | word-break: normal;
17 |
18 |
19 | -moz-tab-size: 4;
20 | -o-tab-size: 4;
21 | tab-size: 4;
22 |
23 | -webkit-hyphens: none;
24 | -moz-hyphens: none;
25 | -ms-hyphens: none;
26 | hyphens: none;
27 | }
28 |
29 | pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
30 | code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
31 | text-shadow: none;
32 | background: #b3d4fc;
33 | }
34 |
35 | pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
36 | code[class*="language-"]::selection, code[class*="language-"] ::selection {
37 | text-shadow: none;
38 | background: #b3d4fc;
39 | }
40 |
41 | @media print {
42 | code[class*="language-"],
43 | pre[class*="language-"] {
44 | text-shadow: none;
45 | }
46 | }
47 |
48 | /* Code blocks */
49 | pre[class*="language-"] {
50 | padding: 1em;
51 | margin: .5em 0;
52 | overflow: auto;
53 | }
54 |
55 | :not(pre) > code[class*="language-"],
56 | pre[class*="language-"] {
57 | background: #f5f2f0;
58 | }
59 |
60 | /* Inline code */
61 | :not(pre) > code[class*="language-"] {
62 | padding: .1em;
63 | border-radius: .3em;
64 | }
65 |
66 | .token.comment,
67 | .token.prolog,
68 | .token.doctype,
69 | .token.cdata {
70 | color: slategray;
71 | }
72 |
73 | .token.punctuation {
74 | color: #999;
75 | }
76 |
77 | .namespace {
78 | opacity: .7;
79 | }
80 |
81 | .token.property,
82 | .token.tag,
83 | .token.boolean,
84 | .token.number,
85 | .token.constant,
86 | .token.symbol {
87 | color: #905;
88 | }
89 |
90 | .token.selector,
91 | .token.attr-name,
92 | .token.string,
93 | .token.builtin {
94 | color: #690;
95 | }
96 |
97 | .token.operator,
98 | .token.entity,
99 | .token.url,
100 | .language-css .token.string,
101 | .style .token.string,
102 | .token.variable {
103 | color: #a67f59;
104 | background: hsla(0,0%,100%,.5);
105 | }
106 |
107 | .token.atrule,
108 | .token.attr-value,
109 | .token.keyword {
110 | color: #07a;
111 | }
112 |
113 |
114 | .token.regex,
115 | .token.important {
116 | color: #e90;
117 | }
118 |
119 | .token.important {
120 | font-weight: bold;
121 | }
122 |
123 | .token.entity {
124 | cursor: help;
125 | }
126 |
127 |
--------------------------------------------------------------------------------
/tests/using-theme/public/prism/prism.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Prism: Lightweight, robust, elegant syntax highlighting
3 | * MIT license http://www.opensource.org/licenses/mit-license.php/
4 | * @author Lea Verou http://lea.verou.me
5 | */(function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=self.Prism={util:{type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},clone:function(e){var n=t.util.type(e);switch(n){case"Object":var r={};for(var i in e)e.hasOwnProperty(i)&&(r[i]=t.util.clone(e[i]));return r;case"Array":return e.slice()}return e}},languages:{extend:function(e,n){var r=t.util.clone(t.languages[e]);for(var i in n)r[i]=n[i];return r},insertBefore:function(e,n,r,i){i=i||t.languages;var s=i[e],o={};for(var u in s)if(s.hasOwnProperty(u)){if(u==n)for(var a in r)r.hasOwnProperty(a)&&(o[a]=r[a]);o[u]=s[u]}return i[e]=o},DFS:function(e,n){for(var r in e){n.call(e,r,e[r]);t.util.type(e)==="Object"&&t.languages.DFS(e[r],n)}}},highlightAll:function(e,n){var r=document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code');for(var i=0,s;s=r[i++];)t.highlightElement(s,e===!0,n)},highlightElement:function(r,i,s){var o,u,a=r;while(a&&!e.test(a.className))a=a.parentNode;if(a){o=(a.className.match(e)||[,""])[1];u=t.languages[o]}if(!u)return;r.className=r.className.replace(e,"").replace(/\s+/g," ")+" language-"+o;a=r.parentNode;/pre/i.test(a.nodeName)&&(a.className=a.className.replace(e,"").replace(/\s+/g," ")+" language-"+o);var f=r.textContent;if(!f)return;f=f.replace(/&/g,"&").replace(/e.length)break e;if(p instanceof i)continue;a.lastIndex=0;var d=a.exec(p);if(d){l&&(c=d[1].length);var v=d.index-1+c,d=d[0].slice(c),m=d.length,g=v+m,y=p.slice(0,v+1),b=p.slice(g+1),w=[h,1];y&&w.push(y);var E=new i(u,f?t.tokenize(d,f):d);w.push(E);b&&w.push(b);Array.prototype.splice.apply(s,w)}}}return s},hooks:{all:{},add:function(e,n){var r=t.hooks.all;r[e]=r[e]||[];r[e].push(n)},run:function(e,n){var r=t.hooks.all[e];if(!r||!r.length)return;for(var i=0,s;s=r[i++];)s(n)}}},n=t.Token=function(e,t){this.type=e;this.content=t};n.stringify=function(e,r,i){if(typeof e=="string")return e;if(Object.prototype.toString.call(e)=="[object Array]")return e.map(function(t){return n.stringify(t,r,e)}).join("");var s={type:e.type,content:n.stringify(e.content,r,i),tag:"span",classes:["token",e.type],attributes:{},language:r,parent:i};s.type=="comment"&&(s.attributes.spellcheck="true");t.hooks.run("wrap",s);var o="";for(var u in s.attributes)o+=u+'="'+(s.attributes[u]||"")+'"';return"<"+s.tag+' class="'+s.classes.join(" ")+'" '+o+">"+s.content+""+s.tag+">"};if(!self.document){self.addEventListener("message",function(e){var n=JSON.parse(e.data),r=n.language,i=n.code;self.postMessage(JSON.stringify(t.tokenize(i,t.languages[r])));self.close()},!1);return}var r=document.getElementsByTagName("script");r=r[r.length-1];if(r){t.filename=r.src;document.addEventListener&&!r.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)}})();;
6 | Prism.languages.markup={comment:/<!--[\w\W]*?-->/g,prolog:/<\?.+?\?>/,doctype:/<!DOCTYPE.+?>/,cdata:/<!\[CDATA\[[\w\W]*?]]>/i,tag:{pattern:/<\/?[\w:-]+\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|\w+))?\s*)*\/?>/gi,inside:{tag:{pattern:/^<\/?[\w:-]+/i,inside:{punctuation:/^<\/?/,namespace:/^[\w-]+?:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/gi,inside:{punctuation:/=|>|"/g}},punctuation:/\/?>/g,"attr-name":{pattern:/[\w:-]+/g,inside:{namespace:/^[\w-]+?:/}}}},entity:/&#?[\da-z]{1,8};/gi};Prism.hooks.add("wrap",function(e){e.type==="entity"&&(e.attributes.title=e.content.replace(/&/,"&"))});;
7 | Prism.languages.css={comment:/\/\*[\w\W]*?\*\//g,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*{))/gi,inside:{punctuation:/[;:]/g}},url:/url\((["']?).*?\1\)/gi,selector:/[^\{\}\s][^\{\};]*(?=\s*\{)/g,property:/(\b|\B)[\w-]+(?=\s*:)/ig,string:/("|')(\\?.)*?\1/g,important:/\B!important\b/gi,ignore:/&(lt|gt|amp);/gi,punctuation:/[\{\};:]/g};Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{style:{pattern:/(<|<)style[\w\W]*?(>|>)[\w\W]*?(<|<)\/style(>|>)/ig,inside:{tag:{pattern:/(<|<)style[\w\W]*?(>|>)|(<|<)\/style(>|>)/ig,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.css}}});;
8 | Prism.languages.clike={comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|(^|[^:])\/\/.*?(\r?\n|$))/g,lookbehind:!0},string:/("|')(\\?.)*?\1/g,"class-name":{pattern:/((?:(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/ig,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/g,"boolean":/\b(true|false)\b/g,"function":{pattern:/[a-z0-9_]+\(/ig,inside:{punctuation:/\(/}}, number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/g,operator:/[-+]{1,2}|!|<=?|>=?|={1,3}|(&){1,2}|\|?\||\?|\*|\/|\~|\^|\%/g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\];(),.:]/g};
9 | ;
10 | Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(var|let|if|else|while|do|for|return|in|instanceof|function|new|with|typeof|try|throw|catch|finally|null|break|continue)\b/g,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?|NaN|-?Infinity)\b/g});Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,lookbehind:!0}});Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/(<|<)script[\w\W]*?(>|>)[\w\W]*?(<|<)\/script(>|>)/ig,inside:{tag:{pattern:/(<|<)script[\w\W]*?(>|>)|(<|<)\/script(>|>)/ig,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.javascript}}});
11 | ;
12 |
--------------------------------------------------------------------------------
/tests/using-yaml/A/a.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: another page
3 | itworks: indeed
4 | ---
5 |
6 | # A page
--------------------------------------------------------------------------------
/tests/using-yaml/expected.html:
--------------------------------------------------------------------------------
1 | Hello world
2 | Hello, my name is Derek Worthen. My address is some location. I love DOG. And here is a data from another page: indeed.
3 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. In, voluptatem eveniet corrupti eum vero consequatur veniam iusto facere ab amet quisquam distinctio maxime minus. Porro, aliquam illum facere obcaecati voluptatum.
4 |
--------------------------------------------------------------------------------
/tests/using-yaml/page.md:
--------------------------------------------------------------------------------
1 | ---
2 | username: Derek Worthen
3 | age: young
4 | contact:
5 | email: email@domain.com
6 | address: some location
7 | pets:
8 | - cat
9 | - dog
10 | - bat
11 | match: !!js/regexp /pattern/gim
12 | run: !!js/function function(a) { return a.toUpperCase(); }
13 | ---
14 |
15 | # Hello world
16 |
17 | Hello, my name is <% get('username') %>. My address is <% get('contact').address %>. I love <% get('run')(get('pets')[1]) %>. And here is a data from another page: <% page('another page').get('itworks') %>.
18 |
19 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. In, voluptatem eveniet corrupti eum vero consequatur veniam iusto facere ab amet quisquam distinctio maxime minus. Porro, aliquam illum facere obcaecati voluptatum.
--------------------------------------------------------------------------------
/tests/with-layout/custom-layout.html:
--------------------------------------------------------------------------------
1 |
2 | <% get('content') %>
3 |
--------------------------------------------------------------------------------
/tests/with-layout/expected.html:
--------------------------------------------------------------------------------
1 |
2 | My title
3 |
--------------------------------------------------------------------------------
/tests/with-layout/page.md:
--------------------------------------------------------------------------------
1 | <% set('layout', 'custom-layout') %>
2 |
3 | # My title
--------------------------------------------------------------------------------