├── .bowerrc ├── .gitattributes ├── .gitignore ├── .jshintrc ├── .travis.yml ├── Gruntfile.js ├── LICENSE ├── README.md ├── Rakefile ├── app ├── .buildignore ├── 404.html ├── bower_components │ ├── angular-mocks │ │ ├── .bower.json │ │ ├── README.md │ │ ├── angular-mocks.js │ │ └── bower.json │ ├── angular-resource │ │ ├── .bower.json │ │ ├── README.md │ │ ├── angular-resource.js │ │ ├── angular-resource.min.js │ │ ├── angular-resource.min.js.map │ │ └── bower.json │ ├── angular-route │ │ ├── .bower.json │ │ ├── README.md │ │ ├── angular-route.js │ │ ├── angular-route.min.js │ │ ├── angular-route.min.js.map │ │ └── bower.json │ ├── angular-sanitize │ │ ├── .bower.json │ │ ├── README.md │ │ ├── angular-sanitize.js │ │ ├── angular-sanitize.min.js │ │ ├── angular-sanitize.min.js.map │ │ └── bower.json │ ├── angular-scenario │ │ ├── .bower.json │ │ ├── README.md │ │ ├── angular-scenario.js │ │ ├── bower.json │ │ ├── jstd-scenario-adapter-config.js │ │ └── jstd-scenario-adapter.js │ ├── angular │ │ ├── .bower.json │ │ ├── README.md │ │ ├── angular-csp.css │ │ ├── angular.js │ │ ├── angular.min.js │ │ ├── angular.min.js.gzip │ │ ├── angular.min.js.map │ │ └── bower.json │ ├── bootstrap-modal │ │ ├── .bower.json │ │ ├── .gitattributes │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── composer.json │ │ ├── css │ │ │ └── bootstrap-modal.css │ │ ├── img │ │ │ └── ajax-loader.gif │ │ ├── index.html │ │ ├── js │ │ │ ├── bootstrap-modal.js │ │ │ └── bootstrap-modalmanager.js │ │ ├── modal_ajax_test.html │ │ └── params.json │ ├── bootstrap │ │ ├── .bower.json │ │ ├── DOCS-LICENSE │ │ ├── LICENSE │ │ ├── LICENSE-MIT │ │ ├── README.md │ │ ├── bower.json │ │ ├── dist │ │ │ ├── css │ │ │ │ ├── bootstrap-theme.css │ │ │ │ ├── bootstrap-theme.min.css │ │ │ │ ├── bootstrap.css │ │ │ │ └── bootstrap.min.css │ │ │ ├── fonts │ │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ │ └── glyphicons-halflings-regular.woff │ │ │ └── js │ │ │ │ ├── bootstrap.js │ │ │ │ └── bootstrap.min.js │ │ ├── js │ │ │ ├── affix.js │ │ │ ├── alert.js │ │ │ ├── button.js │ │ │ ├── carousel.js │ │ │ ├── collapse.js │ │ │ ├── dropdown.js │ │ │ ├── modal.js │ │ │ ├── popover.js │ │ │ ├── scrollspy.js │ │ │ ├── tab.js │ │ │ ├── tooltip.js │ │ │ └── transition.js │ │ └── less │ │ │ ├── alerts.less │ │ │ ├── badges.less │ │ │ ├── bootstrap.less │ │ │ ├── breadcrumbs.less │ │ │ ├── button-groups.less │ │ │ ├── buttons.less │ │ │ ├── carousel.less │ │ │ ├── close.less │ │ │ ├── code.less │ │ │ ├── component-animations.less │ │ │ ├── dropdowns.less │ │ │ ├── forms.less │ │ │ ├── glyphicons.less │ │ │ ├── grid.less │ │ │ ├── input-groups.less │ │ │ ├── jumbotron.less │ │ │ ├── labels.less │ │ │ ├── list-group.less │ │ │ ├── media.less │ │ │ ├── mixins.less │ │ │ ├── modals.less │ │ │ ├── navbar.less │ │ │ ├── navs.less │ │ │ ├── normalize.less │ │ │ ├── pager.less │ │ │ ├── pagination.less │ │ │ ├── panels.less │ │ │ ├── popovers.less │ │ │ ├── print.less │ │ │ ├── progress-bars.less │ │ │ ├── responsive-utilities.less │ │ │ ├── scaffolding.less │ │ │ ├── tables.less │ │ │ ├── theme.less │ │ │ ├── thumbnails.less │ │ │ ├── tooltip.less │ │ │ ├── type.less │ │ │ ├── utilities.less │ │ │ ├── variables.less │ │ │ └── wells.less │ ├── i18next │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── i18next.amd.js │ │ ├── i18next.amd.min.js │ │ ├── i18next.amd.withJQuery.js │ │ ├── i18next.amd.withJQuery.min.js │ │ ├── i18next.commonjs.withJQuery.js │ │ ├── i18next.commonjs.withJQuery.min.js │ │ ├── i18next.js │ │ ├── i18next.min.js │ │ ├── license │ │ ├── releasenotes.md │ │ └── typescript │ │ │ ├── i18next.d.ts │ │ │ ├── lib │ │ │ ├── jquery.d.ts │ │ │ ├── mocha.d.ts │ │ │ └── sinon.d.ts │ │ │ └── tests │ │ │ └── i18next.d.tests.ts │ ├── jquery │ │ ├── .bower.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── bower.json │ │ ├── component.json │ │ ├── composer.json │ │ ├── jquery-migrate.js │ │ ├── jquery-migrate.min.js │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ ├── jquery.min.map │ │ └── package.json │ ├── moment │ │ ├── .bower.json │ │ ├── LICENSE │ │ ├── bower.json │ │ ├── lang │ │ │ ├── ar-ma.js │ │ │ ├── ar.js │ │ │ ├── bg.js │ │ │ ├── br.js │ │ │ ├── bs.js │ │ │ ├── ca.js │ │ │ ├── cs.js │ │ │ ├── cv.js │ │ │ ├── cy.js │ │ │ ├── da.js │ │ │ ├── de.js │ │ │ ├── el.js │ │ │ ├── en-au.js │ │ │ ├── en-ca.js │ │ │ ├── en-gb.js │ │ │ ├── eo.js │ │ │ ├── es.js │ │ │ ├── et.js │ │ │ ├── eu.js │ │ │ ├── fa.js │ │ │ ├── fi.js │ │ │ ├── fo.js │ │ │ ├── fr-ca.js │ │ │ ├── fr.js │ │ │ ├── gl.js │ │ │ ├── he.js │ │ │ ├── hi.js │ │ │ ├── hr.js │ │ │ ├── hu.js │ │ │ ├── hy-am.js │ │ │ ├── id.js │ │ │ ├── is.js │ │ │ ├── it.js │ │ │ ├── ja.js │ │ │ ├── ka.js │ │ │ ├── ko.js │ │ │ ├── lb.js │ │ │ ├── lt.js │ │ │ ├── lv.js │ │ │ ├── mk.js │ │ │ ├── ml.js │ │ │ ├── mr.js │ │ │ ├── ms-my.js │ │ │ ├── nb.js │ │ │ ├── ne.js │ │ │ ├── nl.js │ │ │ ├── nn.js │ │ │ ├── pl.js │ │ │ ├── pt-br.js │ │ │ ├── pt.js │ │ │ ├── ro.js │ │ │ ├── rs.js │ │ │ ├── ru.js │ │ │ ├── sk.js │ │ │ ├── sl.js │ │ │ ├── sq.js │ │ │ ├── sv.js │ │ │ ├── ta.js │ │ │ ├── th.js │ │ │ ├── tl-ph.js │ │ │ ├── tr.js │ │ │ ├── tzm-la.js │ │ │ ├── tzm.js │ │ │ ├── uk.js │ │ │ ├── uz.js │ │ │ ├── vn.js │ │ │ ├── zh-cn.js │ │ │ └── zh-tw.js │ │ ├── min │ │ │ ├── langs.js │ │ │ ├── langs.min.js │ │ │ ├── moment-with-langs.js │ │ │ ├── moment-with-langs.min.js │ │ │ └── moment.min.js │ │ ├── moment.js │ │ └── readme.md │ └── ng-i18next │ │ ├── .bower.json │ │ ├── .bowerrc │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── .jshintrc │ │ ├── .travis.yml │ │ ├── CHANGELOG.md │ │ ├── Gruntfile.js │ │ ├── LICENSE │ │ ├── README.md │ │ ├── bower.json │ │ ├── dist │ │ ├── ng-i18next.js │ │ └── ng-i18next.min.js │ │ ├── gulpfile.js │ │ └── package.json ├── done.html ├── favicon.ico ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff ├── images │ ├── icon-large.png │ ├── icon-small.png │ ├── icon.pdf │ ├── rss-large.png │ ├── rss-small.png │ ├── subtome-large.png │ ├── subtome-small.png │ ├── subtome-wave.png │ ├── subtome.pdf │ └── superfeedr.png ├── index.html ├── load.js ├── locales │ ├── de │ │ └── translation.json │ ├── dev │ │ └── translation.json │ ├── en-US │ │ └── translation.json │ ├── en │ │ └── translation.json │ └── fr │ │ └── translation.json ├── register-no-ui.html ├── register.html ├── robots.txt ├── scripts │ ├── app.js │ ├── controllers │ │ ├── developers.js │ │ ├── export.js │ │ ├── import.js │ │ ├── index.js │ │ ├── publishers.js │ │ ├── redirect.js │ │ ├── register.js │ │ ├── settings.js │ │ ├── share.js │ │ ├── store.js │ │ ├── subscribe.js │ │ └── subscriptions.js │ ├── directives │ │ ├── browser-specific.js │ │ ├── file-picker.js │ │ ├── follow-on.js │ │ ├── hide-on-path.js │ │ ├── service-button.js │ │ └── uses-service.js │ ├── filters │ │ ├── from-now.js │ │ ├── link-to-home.js │ │ └── pick-color.js │ ├── redirect.js │ └── services │ │ ├── file-reader.js │ │ ├── opml-parser.js │ │ ├── safe-url.js │ │ ├── services.js │ │ ├── store.js │ │ └── subscriptions.js ├── styles │ ├── bootstrap-modal-bs3patch.css │ ├── main.css │ └── subtome.css ├── subtome-feedburner.png └── views │ ├── export.html │ ├── import.html │ ├── index.html │ ├── main.html │ ├── publishers.html │ ├── redirect.html │ ├── register.html │ ├── service-button.html │ ├── settings.html │ ├── share.html │ ├── store.html │ ├── subscribe.html │ └── subscriptions.html ├── bower.json ├── goodies ├── chrome │ ├── extension │ │ ├── background.js │ │ ├── manifest.json │ │ ├── subscribe-icon-128.png │ │ └── subscribe-icon-48.png │ └── store-material │ │ ├── extension-1.0.zip │ │ ├── extension-1.1.zip │ │ └── screenshot.png ├── firefox │ ├── .gitignore │ ├── src │ │ ├── data │ │ │ ├── no-feed.html │ │ │ ├── subtome.js │ │ │ └── toolbar-icon.png │ │ ├── icon.png │ │ ├── lib │ │ │ └── main.js │ │ ├── locale │ │ │ ├── de.properties │ │ │ └── en-US.properties │ │ └── package.json │ └── subtome.xpi └── wordpress │ └── subtome │ ├── .svn │ ├── entries │ ├── format │ ├── pristine │ │ ├── 17 │ │ │ └── 17fecbe9448adf41b390abca492f399c673c7659.svn-base │ │ ├── 26 │ │ │ └── 266b29620916498637910e93e8e2013dbf8f9573.svn-base │ │ ├── 45 │ │ │ └── 45da8fd550b98efdda9f201c61f423e899962252.svn-base │ │ ├── 66 │ │ │ └── 6679fc6abfb83a9920edf7ca4af614ad61096667.svn-base │ │ ├── 84 │ │ │ └── 841251f9508f13fb01f0f7b1c674ac4d7367acb4.svn-base │ │ ├── 4a │ │ │ └── 4a4411bcdb2b22f5301356315d348ae1d2e2e3ce.svn-base │ │ ├── 6c │ │ │ └── 6c91529f5c1a3cec6a3efe0ce3721f3955f26951.svn-base │ │ ├── 9b │ │ │ └── 9b6ca126cc5d5d6d34a622cabd6f86e8c4704833.svn-base │ │ ├── a1 │ │ │ └── a15fbc0031edc84d8dc676073cf35f92f50ba999.svn-base │ │ ├── a7 │ │ │ └── a76ad501ba9fe18326aa41027ded8fc8d041b54e.svn-base │ │ ├── ae │ │ │ └── aed0a3e7ca34906e874c42c5c24ddb05e8d47123.svn-base │ │ ├── b9 │ │ │ └── b99d9c5f748982398bf56da1b69a4303eba638af.svn-base │ │ ├── d2 │ │ │ └── d2572a167408758f8a113146af09af1f22428226.svn-base │ │ ├── d3 │ │ │ └── d302c7e78a9de27e7dffcf2672ddc1245e4a1baa.svn-base │ │ ├── d4 │ │ │ └── d4710fb8d861622c9f65677ec5051d389bb23992.svn-base │ │ ├── e9 │ │ │ └── e95dcdf09628d39728d7afac9e42190da88aa217.svn-base │ │ └── ed │ │ │ └── ed057c9cc6594c65e719fd6066aad4e69032893a.svn-base │ └── wc.db │ ├── assets │ └── banner-772x250.png │ ├── tags │ ├── 1.1 │ │ ├── README.txt │ │ ├── lang │ │ │ └── plugin.po │ │ ├── plugin.php │ │ ├── trunk │ │ │ ├── README.txt │ │ │ ├── lang │ │ │ │ └── plugin.po │ │ │ ├── plugin.php │ │ │ └── views │ │ │ │ ├── admin.php │ │ │ │ └── widget.php │ │ └── views │ │ │ ├── admin.php │ │ │ └── widget.php │ ├── 1.2 │ │ ├── README.txt │ │ ├── lang │ │ │ └── plugin.po │ │ ├── plugin.php │ │ └── views │ │ │ ├── admin.php │ │ │ └── widget.php │ ├── 1.3 │ │ ├── README.txt │ │ ├── lang │ │ │ └── plugin.po │ │ └── plugin.php │ └── 1.4 │ │ ├── README.txt │ │ ├── lang │ │ └── plugin.po │ │ └── plugin.php │ └── trunk │ ├── README.txt │ ├── lang │ └── plugin.po │ └── plugin.php ├── karma.conf.js ├── misc ├── mozilla-guest-post.markdown ├── subtome-screenshot.png └── zemanta-guest-post.markdown ├── package.json └── test ├── .jshintrc ├── runner.html └── spec ├── app.js ├── controllers ├── developers.js ├── export.js ├── import.js ├── index.js ├── publishers.js ├── redirect.js ├── register.js ├── settings.js ├── share.js ├── store.js ├── subscribe.js └── subscriptions.js ├── directives ├── browser-specific.js ├── file-picker.js ├── follow-on.js ├── hide-on-path.js ├── service-button.js └── uses-service.js ├── filters ├── from-now.js ├── link-to-home.js └── pick-color.js └── services ├── file-reader.js ├── opml-parser.js ├── safe-url.js ├── services.js ├── store.js └── subscriptions.js /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "app/bower_components", 3 | "json": "bower.json" 4 | } 5 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /node_modules 3 | dist 4 | .tmp/ 5 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "browser": true, 4 | "esnext": true, 5 | "bitwise": true, 6 | "camelcase": true, 7 | "curly": true, 8 | "eqeqeq": true, 9 | "immed": true, 10 | "indent": 2, 11 | "latedef": true, 12 | "newcap": true, 13 | "noarg": true, 14 | "quotmark": "single", 15 | "regexp": true, 16 | "undef": true, 17 | "unused": true, 18 | "strict": true, 19 | "trailing": true, 20 | "smarttabs": true, 21 | "globals": { 22 | "angular": false 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '0.8' 4 | - '0.10' 5 | before_script: 6 | - 'npm install -g bower grunt-cli' 7 | - 'bower install' 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Superfeedr 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all 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, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'date' 2 | 3 | def ok_failed(condition) 4 | if (condition) 5 | puts "OK" 6 | else 7 | puts "FAILED" 8 | end 9 | end 10 | 11 | s3_bucket = "www.subtome.com" 12 | 13 | desc "Deploy website via s3cmd" 14 | task :s3 do 15 | ok_failed system("s3cmd sync --acl-public --reduced-redundancy ./dist/* s3://#{s3_bucket}/") 16 | end 17 | 18 | desc "Pushes to s3" 19 | task :deploy => [:s3] 20 | -------------------------------------------------------------------------------- /app/.buildignore: -------------------------------------------------------------------------------- 1 | *.coffee -------------------------------------------------------------------------------- /app/bower_components/angular-mocks/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-mocks", 3 | "version": "1.2.6", 4 | "main": "./angular-mocks.js", 5 | "dependencies": { 6 | "angular": "1.2.6" 7 | }, 8 | "homepage": "https://github.com/angular/bower-angular-mocks", 9 | "_release": "1.2.6", 10 | "_resolution": { 11 | "type": "version", 12 | "tag": "v1.2.6", 13 | "commit": "bbece5b4dfd81263ffa409a1c3b6c5353a26e4ea" 14 | }, 15 | "_source": "git://github.com/angular/bower-angular-mocks.git", 16 | "_target": "1.2.6", 17 | "_originalSource": "angular-mocks" 18 | } -------------------------------------------------------------------------------- /app/bower_components/angular-mocks/README.md: -------------------------------------------------------------------------------- 1 | # bower-angular-mocks 2 | 3 | This repo is for distribution on `bower`. The source for this module is in the 4 | [main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngMock). 5 | Please file issues and pull requests against that repo. 6 | 7 | ## Install 8 | 9 | Install with `bower`: 10 | 11 | ```shell 12 | bower install angular-mocks 13 | ``` 14 | 15 | ## Documentation 16 | 17 | Documentation is available on the 18 | [AngularJS docs site](http://docs.angularjs.org/guide/dev_guide.unit-testing). 19 | 20 | ## License 21 | 22 | The MIT License 23 | 24 | Copyright (c) 2010-2012 Google, Inc. http://angularjs.org 25 | 26 | Permission is hereby granted, free of charge, to any person obtaining a copy 27 | of this software and associated documentation files (the "Software"), to deal 28 | in the Software without restriction, including without limitation the rights 29 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 30 | copies of the Software, and to permit persons to whom the Software is 31 | furnished to do so, subject to the following conditions: 32 | 33 | The above copyright notice and this permission notice shall be included in 34 | all copies or substantial portions of the Software. 35 | 36 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 37 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 38 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 39 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 40 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 41 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 42 | THE SOFTWARE. 43 | -------------------------------------------------------------------------------- /app/bower_components/angular-mocks/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-mocks", 3 | "version": "1.2.6", 4 | "main": "./angular-mocks.js", 5 | "dependencies": { 6 | "angular": "1.2.6" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /app/bower_components/angular-resource/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-resource", 3 | "version": "1.2.6", 4 | "main": "./angular-resource.js", 5 | "dependencies": { 6 | "angular": "1.2.6" 7 | }, 8 | "homepage": "https://github.com/angular/bower-angular-resource", 9 | "_release": "1.2.6", 10 | "_resolution": { 11 | "type": "version", 12 | "tag": "v1.2.6", 13 | "commit": "9a7ba02d8d139f5cce46beec6f9f68496f8f7937" 14 | }, 15 | "_source": "git://github.com/angular/bower-angular-resource.git", 16 | "_target": "1.2.6", 17 | "_originalSource": "angular-resource" 18 | } -------------------------------------------------------------------------------- /app/bower_components/angular-resource/README.md: -------------------------------------------------------------------------------- 1 | # bower-angular-resource 2 | 3 | This repo is for distribution on `bower`. The source for this module is in the 4 | [main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngResource). 5 | Please file issues and pull requests against that repo. 6 | 7 | ## Install 8 | 9 | Install with `bower`: 10 | 11 | ```shell 12 | bower install angular-resource 13 | ``` 14 | 15 | Add a ` 19 | ``` 20 | 21 | And add `ngResource` as a dependency for your app: 22 | 23 | ```javascript 24 | angular.module('myApp', ['ngResource']); 25 | ``` 26 | 27 | ## Documentation 28 | 29 | Documentation is available on the 30 | [AngularJS docs site](http://docs.angularjs.org/api/ngResource). 31 | 32 | ## License 33 | 34 | The MIT License 35 | 36 | Copyright (c) 2010-2012 Google, Inc. http://angularjs.org 37 | 38 | Permission is hereby granted, free of charge, to any person obtaining a copy 39 | of this software and associated documentation files (the "Software"), to deal 40 | in the Software without restriction, including without limitation the rights 41 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 42 | copies of the Software, and to permit persons to whom the Software is 43 | furnished to do so, subject to the following conditions: 44 | 45 | The above copyright notice and this permission notice shall be included in 46 | all copies or substantial portions of the Software. 47 | 48 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 49 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 50 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 51 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 52 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 53 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 54 | THE SOFTWARE. 55 | -------------------------------------------------------------------------------- /app/bower_components/angular-resource/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-resource", 3 | "version": "1.2.6", 4 | "main": "./angular-resource.js", 5 | "dependencies": { 6 | "angular": "1.2.6" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /app/bower_components/angular-route/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-route", 3 | "version": "1.2.6", 4 | "main": "./angular-route.js", 5 | "dependencies": { 6 | "angular": "1.2.6" 7 | }, 8 | "homepage": "https://github.com/angular/bower-angular-route", 9 | "_release": "1.2.6", 10 | "_resolution": { 11 | "type": "version", 12 | "tag": "v1.2.6", 13 | "commit": "13c62ba4fc177693ff31d5c078901e202b2aed33" 14 | }, 15 | "_source": "git://github.com/angular/bower-angular-route.git", 16 | "_target": "1.2.6", 17 | "_originalSource": "angular-route" 18 | } -------------------------------------------------------------------------------- /app/bower_components/angular-route/README.md: -------------------------------------------------------------------------------- 1 | # bower-angular-route 2 | 3 | This repo is for distribution on `bower`. The source for this module is in the 4 | [main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngRoute). 5 | Please file issues and pull requests against that repo. 6 | 7 | ## Install 8 | 9 | Install with `bower`: 10 | 11 | ```shell 12 | bower install angular-route 13 | ``` 14 | 15 | Add a ` 19 | ``` 20 | 21 | And add `ngRoute` as a dependency for your app: 22 | 23 | ```javascript 24 | angular.module('myApp', ['ngRoute']); 25 | ``` 26 | 27 | ## Documentation 28 | 29 | Documentation is available on the 30 | [AngularJS docs site](http://docs.angularjs.org/api/ngRoute). 31 | 32 | ## License 33 | 34 | The MIT License 35 | 36 | Copyright (c) 2010-2012 Google, Inc. http://angularjs.org 37 | 38 | Permission is hereby granted, free of charge, to any person obtaining a copy 39 | of this software and associated documentation files (the "Software"), to deal 40 | in the Software without restriction, including without limitation the rights 41 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 42 | copies of the Software, and to permit persons to whom the Software is 43 | furnished to do so, subject to the following conditions: 44 | 45 | The above copyright notice and this permission notice shall be included in 46 | all copies or substantial portions of the Software. 47 | 48 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 49 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 50 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 51 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 52 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 53 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 54 | THE SOFTWARE. 55 | -------------------------------------------------------------------------------- /app/bower_components/angular-route/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-route", 3 | "version": "1.2.6", 4 | "main": "./angular-route.js", 5 | "dependencies": { 6 | "angular": "1.2.6" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /app/bower_components/angular-sanitize/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-sanitize", 3 | "version": "1.2.6", 4 | "main": "./angular-sanitize.js", 5 | "dependencies": { 6 | "angular": "1.2.6" 7 | }, 8 | "homepage": "https://github.com/angular/bower-angular-sanitize", 9 | "_release": "1.2.6", 10 | "_resolution": { 11 | "type": "version", 12 | "tag": "v1.2.6", 13 | "commit": "d42ebcbaccab95512e0c075898fda2de99b82b24" 14 | }, 15 | "_source": "git://github.com/angular/bower-angular-sanitize.git", 16 | "_target": "1.2.6", 17 | "_originalSource": "angular-sanitize" 18 | } -------------------------------------------------------------------------------- /app/bower_components/angular-sanitize/README.md: -------------------------------------------------------------------------------- 1 | # bower-angular-sanitize 2 | 3 | This repo is for distribution on `bower`. The source for this module is in the 4 | [main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngSanitize). 5 | Please file issues and pull requests against that repo. 6 | 7 | ## Install 8 | 9 | Install with `bower`: 10 | 11 | ```shell 12 | bower install angular-sanitize 13 | ``` 14 | 15 | Add a ` 19 | ``` 20 | 21 | And add `ngSanitize` as a dependency for your app: 22 | 23 | ```javascript 24 | angular.module('myApp', ['ngSanitize']); 25 | ``` 26 | 27 | ## Documentation 28 | 29 | Documentation is available on the 30 | [AngularJS docs site](http://docs.angularjs.org/api/ngSanitize). 31 | 32 | ## License 33 | 34 | The MIT License 35 | 36 | Copyright (c) 2010-2012 Google, Inc. http://angularjs.org 37 | 38 | Permission is hereby granted, free of charge, to any person obtaining a copy 39 | of this software and associated documentation files (the "Software"), to deal 40 | in the Software without restriction, including without limitation the rights 41 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 42 | copies of the Software, and to permit persons to whom the Software is 43 | furnished to do so, subject to the following conditions: 44 | 45 | The above copyright notice and this permission notice shall be included in 46 | all copies or substantial portions of the Software. 47 | 48 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 49 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 50 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 51 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 52 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 53 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 54 | THE SOFTWARE. 55 | -------------------------------------------------------------------------------- /app/bower_components/angular-sanitize/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-sanitize", 3 | "version": "1.2.6", 4 | "main": "./angular-sanitize.js", 5 | "dependencies": { 6 | "angular": "1.2.6" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /app/bower_components/angular-scenario/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-scenario", 3 | "version": "1.2.6", 4 | "main": "./angular-scenario.js", 5 | "dependencies": { 6 | "angular": "1.2.6" 7 | }, 8 | "homepage": "https://github.com/angular/bower-angular-scenario", 9 | "_release": "1.2.6", 10 | "_resolution": { 11 | "type": "version", 12 | "tag": "v1.2.6", 13 | "commit": "031da7f50f0032ad40bb48de47020059b3a0ab17" 14 | }, 15 | "_source": "git://github.com/angular/bower-angular-scenario.git", 16 | "_target": "1.2.6", 17 | "_originalSource": "angular-scenario" 18 | } -------------------------------------------------------------------------------- /app/bower_components/angular-scenario/README.md: -------------------------------------------------------------------------------- 1 | # bower-angular-scenario 2 | 3 | This repo is for distribution on `bower`. The source for this module is in the 4 | [main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngScenario). 5 | Please file issues and pull requests against that repo. 6 | 7 | ## Install 8 | 9 | Install with `bower`: 10 | 11 | ```shell 12 | bower install angular-scenario 13 | ``` 14 | 15 | ## Documentation 16 | 17 | Documentation is available on the 18 | [AngularJS docs site](http://docs.angularjs.org/). 19 | 20 | ## License 21 | 22 | The MIT License 23 | 24 | Copyright (c) 2010-2012 Google, Inc. http://angularjs.org 25 | 26 | Permission is hereby granted, free of charge, to any person obtaining a copy 27 | of this software and associated documentation files (the "Software"), to deal 28 | in the Software without restriction, including without limitation the rights 29 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 30 | copies of the Software, and to permit persons to whom the Software is 31 | furnished to do so, subject to the following conditions: 32 | 33 | The above copyright notice and this permission notice shall be included in 34 | all copies or substantial portions of the Software. 35 | 36 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 37 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 38 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 39 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 40 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 41 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 42 | THE SOFTWARE. 43 | -------------------------------------------------------------------------------- /app/bower_components/angular-scenario/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-scenario", 3 | "version": "1.2.6", 4 | "main": "./angular-scenario.js", 5 | "dependencies": { 6 | "angular": "1.2.6" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /app/bower_components/angular-scenario/jstd-scenario-adapter-config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Configuration for jstd scenario adapter 3 | */ 4 | var jstdScenarioAdapter = { 5 | relativeUrlPrefix: '/build/docs/' 6 | }; 7 | -------------------------------------------------------------------------------- /app/bower_components/angular/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular", 3 | "version": "1.2.6", 4 | "main": "./angular.js", 5 | "dependencies": {}, 6 | "homepage": "https://github.com/angular/bower-angular", 7 | "_release": "1.2.6", 8 | "_resolution": { 9 | "type": "version", 10 | "tag": "v1.2.6", 11 | "commit": "74ab84326c3ddf32fa49f36c9050b92382d1b5cc" 12 | }, 13 | "_source": "git://github.com/angular/bower-angular.git", 14 | "_target": "1.2.6", 15 | "_originalSource": "angular" 16 | } -------------------------------------------------------------------------------- /app/bower_components/angular/README.md: -------------------------------------------------------------------------------- 1 | # bower-angular 2 | 3 | This repo is for distribution on `bower`. The source for this module is in the 4 | [main AngularJS repo](https://github.com/angular/angular.js). 5 | Please file issues and pull requests against that repo. 6 | 7 | ## Install 8 | 9 | Install with `bower`: 10 | 11 | ```shell 12 | bower install angular 13 | ``` 14 | 15 | Add a ` 19 | ``` 20 | 21 | ## Documentation 22 | 23 | Documentation is available on the 24 | [AngularJS docs site](http://docs.angularjs.org/). 25 | 26 | ## License 27 | 28 | The MIT License 29 | 30 | Copyright (c) 2010-2012 Google, Inc. http://angularjs.org 31 | 32 | Permission is hereby granted, free of charge, to any person obtaining a copy 33 | of this software and associated documentation files (the "Software"), to deal 34 | in the Software without restriction, including without limitation the rights 35 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 36 | copies of the Software, and to permit persons to whom the Software is 37 | furnished to do so, subject to the following conditions: 38 | 39 | The above copyright notice and this permission notice shall be included in 40 | all copies or substantial portions of the Software. 41 | 42 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 43 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 44 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 45 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 46 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 47 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 48 | THE SOFTWARE. 49 | -------------------------------------------------------------------------------- /app/bower_components/angular/angular-csp.css: -------------------------------------------------------------------------------- 1 | /* Include this file in your html if you are using the CSP mode. */ 2 | 3 | @charset "UTF-8"; 4 | 5 | [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], 6 | .ng-cloak, .x-ng-cloak, 7 | .ng-hide { 8 | display: none !important; 9 | } 10 | 11 | ng\:form { 12 | display: block; 13 | } 14 | -------------------------------------------------------------------------------- /app/bower_components/angular/angular.min.js.gzip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/app/bower_components/angular/angular.min.js.gzip -------------------------------------------------------------------------------- /app/bower_components/angular/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular", 3 | "version": "1.2.6", 4 | "main": "./angular.js", 5 | "dependencies": { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap-modal/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap-modal", 3 | "homepage": "https://github.com/jschr/bootstrap-modal", 4 | "version": "2.1.0", 5 | "_release": "2.1.0", 6 | "_resolution": { 7 | "type": "version", 8 | "tag": "2.1.0", 9 | "commit": "02b6c6bfe15c1d49e198dbddd35cd4e74722d689" 10 | }, 11 | "main": [ 12 | "css/bootstrap-modal.css", 13 | "js/bootstrap-modal.js", 14 | "js/bootstrap-modalmanager.js" 15 | ], 16 | "_source": "git://github.com/jschr/bootstrap-modal.git", 17 | "_target": "~2.1.0", 18 | "_originalSource": "bootstrap-modal", 19 | "_direct": true 20 | } 21 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap-modal/.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap-modal/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jschr/bootstrap-modal", 3 | "description": "Extends the default Bootstrap Modal class. Responsive, stackable, ajax and more.", 4 | "keywords": ["bootstrap", "modal", "javascript"], 5 | "homepage": "https://github.com/jschr/bootstrap-modal.git", 6 | "license": "Apache License 2.0", 7 | "authors": [ 8 | { 9 | "name": "Jordan Schroter", 10 | "homepage": "https://twitter.com/_jschr", 11 | "role": "Developer" 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /app/bower_components/bootstrap-modal/img/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/app/bower_components/bootstrap-modal/img/ajax-loader.gif -------------------------------------------------------------------------------- /app/bower_components/bootstrap-modal/modal_ajax_test.html: -------------------------------------------------------------------------------- 1 | 5 | 16 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap-modal/params.json: -------------------------------------------------------------------------------- 1 | {"body":"### Welcome to GitHub Pages.\r\nThis automatic page generator is the easiest way to create beautiful pages for all of your projects. Author your page content here using GitHub Flavored Markdown, select a template crafted by a designer, and publish. After your page is generated, you can check out the new branch:\r\n\r\n```\r\n$ cd your_repo_root/repo_name\r\n$ git fetch origin\r\n$ git checkout gh-pages\r\n```\r\n\r\nIf you're using the GitHub for Mac, simply sync your repository and you'll see the new branch.\r\n\r\n### Designer Templates\r\nWe've crafted some handsome templates for you to use. Go ahead and continue to layouts to browse through them. You can easily go back to edit your page before publishing. After publishing your page, you can revisit the page generator and switch to another theme. Your Page content will be preserved if it remained markdown format.\r\n\r\n### Rather Drive Stick?\r\nIf you prefer to not use the automatic generator, push a branch named `gh-pages` to your repository to create a page manually. In addition to supporting regular HTML content, GitHub Pages support Jekyll, a simple, blog aware static site generator written by our own Tom Preston-Werner. Jekyll makes it easy to create site-wide headers and footers without having to copy them across every page. It also offers intelligent blog support and other advanced templating features.\r\n\r\n### Authors and Contributors\r\nYou can @mention a GitHub username to generate a link to their profile. The resulting `` element will link to the contributor's GitHub Profile. For example: In 2007, Chris Wanstrath (@defunkt), PJ Hyett (@pjhyett), and Tom Preston-Werner (@mojombo) founded GitHub.\r\n\r\n### Support or Contact\r\nHaving trouble with Pages? Check out the documentation at http://help.github.com/pages or contact support@github.com and we’ll help you sort it out.","tagline":"Custom implementation of twitter bootstrap's modal class.","note":"Don't delete this file! It's used internally to help with page regeneration.","name":"Bootstrap-modal","google":""} -------------------------------------------------------------------------------- /app/bower_components/bootstrap/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap", 3 | "version": "3.0.3", 4 | "main": [ 5 | "./dist/js/bootstrap.js", 6 | "./dist/css/bootstrap.css", 7 | "./dist/fonts/glyphicons-halflings-regular.eot", 8 | "./dist/fonts/glyphicons-halflings-regular.svg", 9 | "./dist/fonts/glyphicons-halflings-regular.ttf", 10 | "./dist/fonts/glyphicons-halflings-regular.woff" 11 | ], 12 | "ignore": [ 13 | "**/.*", 14 | "_*", 15 | "docs-assets", 16 | "examples", 17 | "/fonts", 18 | "js/tests", 19 | "CNAME", 20 | "CONTRIBUTING.md", 21 | "Gruntfile.js", 22 | "browserstack.json", 23 | "composer.json", 24 | "package.json", 25 | "*.html" 26 | ], 27 | "dependencies": { 28 | "jquery": ">= 1.9.0" 29 | }, 30 | "homepage": "https://github.com/twbs/bootstrap", 31 | "_release": "3.0.3", 32 | "_resolution": { 33 | "type": "version", 34 | "tag": "v3.0.3", 35 | "commit": "6d03173a1aad98e75f7d33e65b411c519176c59a" 36 | }, 37 | "_source": "git://github.com/twbs/bootstrap.git", 38 | "_target": "~3.0.3", 39 | "_originalSource": "bootstrap" 40 | } -------------------------------------------------------------------------------- /app/bower_components/bootstrap/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Twitter, Inc 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all 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, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap", 3 | "version": "3.0.3", 4 | "main": [ 5 | "./dist/js/bootstrap.js", 6 | "./dist/css/bootstrap.css", 7 | "./dist/fonts/glyphicons-halflings-regular.eot", 8 | "./dist/fonts/glyphicons-halflings-regular.svg", 9 | "./dist/fonts/glyphicons-halflings-regular.ttf", 10 | "./dist/fonts/glyphicons-halflings-regular.woff" 11 | ], 12 | "ignore": [ 13 | "**/.*", 14 | "_*", 15 | "docs-assets", 16 | "examples", 17 | "/fonts", 18 | "js/tests", 19 | "CNAME", 20 | "CONTRIBUTING.md", 21 | "Gruntfile.js", 22 | "browserstack.json", 23 | "composer.json", 24 | "package.json", 25 | "*.html" 26 | ], 27 | "dependencies": { 28 | "jquery": ">= 1.9.0" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/app/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /app/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/app/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /app/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/app/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/transition.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: transition.js v3.0.3 3 | * http://getbootstrap.com/javascript/#transitions 4 | * ======================================================================== 5 | * Copyright 2013 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ======================================================================== */ 19 | 20 | 21 | +function ($) { "use strict"; 22 | 23 | // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) 24 | // ============================================================ 25 | 26 | function transitionEnd() { 27 | var el = document.createElement('bootstrap') 28 | 29 | var transEndEventNames = { 30 | 'WebkitTransition' : 'webkitTransitionEnd' 31 | , 'MozTransition' : 'transitionend' 32 | , 'OTransition' : 'oTransitionEnd otransitionend' 33 | , 'transition' : 'transitionend' 34 | } 35 | 36 | for (var name in transEndEventNames) { 37 | if (el.style[name] !== undefined) { 38 | return { end: transEndEventNames[name] } 39 | } 40 | } 41 | } 42 | 43 | // http://blog.alexmaccaw.com/css-transitions 44 | $.fn.emulateTransitionEnd = function (duration) { 45 | var called = false, $el = this 46 | $(this).one($.support.transition.end, function () { called = true }) 47 | var callback = function () { if (!called) $($el).trigger($.support.transition.end) } 48 | setTimeout(callback, duration) 49 | return this 50 | } 51 | 52 | $(function () { 53 | $.support.transition = transitionEnd() 54 | }) 55 | 56 | }(jQuery); 57 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/alerts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Alerts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // ------------------------- 8 | 9 | .alert { 10 | padding: @alert-padding; 11 | margin-bottom: @line-height-computed; 12 | border: 1px solid transparent; 13 | border-radius: @alert-border-radius; 14 | 15 | // Headings for larger alerts 16 | h4 { 17 | margin-top: 0; 18 | // Specified for the h4 to prevent conflicts of changing @headings-color 19 | color: inherit; 20 | } 21 | // Provide class for links that match alerts 22 | .alert-link { 23 | font-weight: @alert-link-font-weight; 24 | } 25 | 26 | // Improve alignment and spacing of inner content 27 | > p, 28 | > ul { 29 | margin-bottom: 0; 30 | } 31 | > p + p { 32 | margin-top: 5px; 33 | } 34 | } 35 | 36 | // Dismissable alerts 37 | // 38 | // Expand the right padding and account for the close button's positioning. 39 | 40 | .alert-dismissable { 41 | padding-right: (@alert-padding + 20); 42 | 43 | // Adjust close link position 44 | .close { 45 | position: relative; 46 | top: -2px; 47 | right: -21px; 48 | color: inherit; 49 | } 50 | } 51 | 52 | // Alternate styles 53 | // 54 | // Generate contextual modifier classes for colorizing the alert. 55 | 56 | .alert-success { 57 | .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); 58 | } 59 | .alert-info { 60 | .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); 61 | } 62 | .alert-warning { 63 | .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); 64 | } 65 | .alert-danger { 66 | .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); 67 | } 68 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/badges.less: -------------------------------------------------------------------------------- 1 | // 2 | // Badges 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base classes 7 | .badge { 8 | display: inline-block; 9 | min-width: 10px; 10 | padding: 3px 7px; 11 | font-size: @font-size-small; 12 | font-weight: @badge-font-weight; 13 | color: @badge-color; 14 | line-height: @badge-line-height; 15 | vertical-align: baseline; 16 | white-space: nowrap; 17 | text-align: center; 18 | background-color: @badge-bg; 19 | border-radius: @badge-border-radius; 20 | 21 | // Empty badges collapse automatically (not available in IE8) 22 | &:empty { 23 | display: none; 24 | } 25 | 26 | // Quick fix for badges in buttons 27 | .btn & { 28 | position: relative; 29 | top: -1px; 30 | } 31 | } 32 | 33 | // Hover state, but only for links 34 | a.badge { 35 | &:hover, 36 | &:focus { 37 | color: @badge-link-hover-color; 38 | text-decoration: none; 39 | cursor: pointer; 40 | } 41 | } 42 | 43 | // Account for counters in navs 44 | a.list-group-item.active > .badge, 45 | .nav-pills > .active > a > .badge { 46 | color: @badge-active-color; 47 | background-color: @badge-active-bg; 48 | } 49 | .nav-pills > li > a > .badge { 50 | margin-left: 3px; 51 | } 52 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/bootstrap.less: -------------------------------------------------------------------------------- 1 | // Core variables and mixins 2 | @import "variables.less"; 3 | @import "mixins.less"; 4 | 5 | // Reset 6 | @import "normalize.less"; 7 | @import "print.less"; 8 | 9 | // Core CSS 10 | @import "scaffolding.less"; 11 | @import "type.less"; 12 | @import "code.less"; 13 | @import "grid.less"; 14 | @import "tables.less"; 15 | @import "forms.less"; 16 | @import "buttons.less"; 17 | 18 | // Components 19 | @import "component-animations.less"; 20 | @import "glyphicons.less"; 21 | @import "dropdowns.less"; 22 | @import "button-groups.less"; 23 | @import "input-groups.less"; 24 | @import "navs.less"; 25 | @import "navbar.less"; 26 | @import "breadcrumbs.less"; 27 | @import "pagination.less"; 28 | @import "pager.less"; 29 | @import "labels.less"; 30 | @import "badges.less"; 31 | @import "jumbotron.less"; 32 | @import "thumbnails.less"; 33 | @import "alerts.less"; 34 | @import "progress-bars.less"; 35 | @import "media.less"; 36 | @import "list-group.less"; 37 | @import "panels.less"; 38 | @import "wells.less"; 39 | @import "close.less"; 40 | 41 | // Components w/ JavaScript 42 | @import "modals.less"; 43 | @import "tooltip.less"; 44 | @import "popovers.less"; 45 | @import "carousel.less"; 46 | 47 | // Utility classes 48 | @import "utilities.less"; 49 | @import "responsive-utilities.less"; 50 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/breadcrumbs.less: -------------------------------------------------------------------------------- 1 | // 2 | // Breadcrumbs 3 | // -------------------------------------------------- 4 | 5 | 6 | .breadcrumb { 7 | padding: 8px 15px; 8 | margin-bottom: @line-height-computed; 9 | list-style: none; 10 | background-color: @breadcrumb-bg; 11 | border-radius: @border-radius-base; 12 | > li { 13 | display: inline-block; 14 | + li:before { 15 | content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space 16 | padding: 0 5px; 17 | color: @breadcrumb-color; 18 | } 19 | } 20 | > .active { 21 | color: @breadcrumb-active-color; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/close.less: -------------------------------------------------------------------------------- 1 | // 2 | // Close icons 3 | // -------------------------------------------------- 4 | 5 | 6 | .close { 7 | float: right; 8 | font-size: (@font-size-base * 1.5); 9 | font-weight: @close-font-weight; 10 | line-height: 1; 11 | color: @close-color; 12 | text-shadow: @close-text-shadow; 13 | .opacity(.2); 14 | 15 | &:hover, 16 | &:focus { 17 | color: @close-color; 18 | text-decoration: none; 19 | cursor: pointer; 20 | .opacity(.5); 21 | } 22 | 23 | // Additional properties for button version 24 | // iOS requires the button element instead of an anchor tag. 25 | // If you want the anchor version, it requires `href="#"`. 26 | button& { 27 | padding: 0; 28 | cursor: pointer; 29 | background: transparent; 30 | border: 0; 31 | -webkit-appearance: none; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/code.less: -------------------------------------------------------------------------------- 1 | // 2 | // Code (inline and block) 3 | // -------------------------------------------------- 4 | 5 | 6 | // Inline and block code styles 7 | code, 8 | kbd, 9 | pre, 10 | samp { 11 | font-family: @font-family-monospace; 12 | } 13 | 14 | // Inline code 15 | code { 16 | padding: 2px 4px; 17 | font-size: 90%; 18 | color: @code-color; 19 | background-color: @code-bg; 20 | white-space: nowrap; 21 | border-radius: @border-radius-base; 22 | } 23 | 24 | // Blocks of code 25 | pre { 26 | display: block; 27 | padding: ((@line-height-computed - 1) / 2); 28 | margin: 0 0 (@line-height-computed / 2); 29 | font-size: (@font-size-base - 1); // 14px to 13px 30 | line-height: @line-height-base; 31 | word-break: break-all; 32 | word-wrap: break-word; 33 | color: @pre-color; 34 | background-color: @pre-bg; 35 | border: 1px solid @pre-border-color; 36 | border-radius: @border-radius-base; 37 | 38 | // Account for some code outputs that place code tags in pre tags 39 | code { 40 | padding: 0; 41 | font-size: inherit; 42 | color: inherit; 43 | white-space: pre-wrap; 44 | background-color: transparent; 45 | border-radius: 0; 46 | } 47 | } 48 | 49 | // Enable scrollable blocks of code 50 | .pre-scrollable { 51 | max-height: @pre-scrollable-max-height; 52 | overflow-y: scroll; 53 | } 54 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/component-animations.less: -------------------------------------------------------------------------------- 1 | // 2 | // Component animations 3 | // -------------------------------------------------- 4 | 5 | // Heads up! 6 | // 7 | // We don't use the `.opacity()` mixin here since it causes a bug with text 8 | // fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552. 9 | 10 | .fade { 11 | opacity: 0; 12 | .transition(opacity .15s linear); 13 | &.in { 14 | opacity: 1; 15 | } 16 | } 17 | 18 | .collapse { 19 | display: none; 20 | &.in { 21 | display: block; 22 | } 23 | } 24 | .collapsing { 25 | position: relative; 26 | height: 0; 27 | overflow: hidden; 28 | .transition(height .35s ease); 29 | } 30 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/grid.less: -------------------------------------------------------------------------------- 1 | // 2 | // Grid system 3 | // -------------------------------------------------- 4 | 5 | // Set the container width, and override it for fixed navbars in media queries 6 | .container { 7 | .container-fixed(); 8 | 9 | @media (min-width: @screen-sm) { 10 | width: @container-sm; 11 | } 12 | @media (min-width: @screen-md) { 13 | width: @container-md; 14 | } 15 | @media (min-width: @screen-lg-min) { 16 | width: @container-lg; 17 | } 18 | } 19 | 20 | // mobile first defaults 21 | .row { 22 | .make-row(); 23 | } 24 | 25 | // Common styles for small and large grid columns 26 | .make-grid-columns(); 27 | 28 | 29 | // Extra small grid 30 | // 31 | // Columns, offsets, pushes, and pulls for extra small devices like 32 | // smartphones. 33 | 34 | .make-grid-columns-float(xs); 35 | .make-grid(@grid-columns, xs, width); 36 | .make-grid(@grid-columns, xs, pull); 37 | .make-grid(@grid-columns, xs, push); 38 | .make-grid(@grid-columns, xs, offset); 39 | 40 | 41 | // Small grid 42 | // 43 | // Columns, offsets, pushes, and pulls for the small device range, from phones 44 | // to tablets. 45 | 46 | @media (min-width: @screen-sm-min) { 47 | .make-grid-columns-float(sm); 48 | .make-grid(@grid-columns, sm, width); 49 | .make-grid(@grid-columns, sm, pull); 50 | .make-grid(@grid-columns, sm, push); 51 | .make-grid(@grid-columns, sm, offset); 52 | } 53 | 54 | 55 | // Medium grid 56 | // 57 | // Columns, offsets, pushes, and pulls for the desktop device range. 58 | 59 | @media (min-width: @screen-md-min) { 60 | .make-grid-columns-float(md); 61 | .make-grid(@grid-columns, md, width); 62 | .make-grid(@grid-columns, md, pull); 63 | .make-grid(@grid-columns, md, push); 64 | .make-grid(@grid-columns, md, offset); 65 | } 66 | 67 | 68 | // Large grid 69 | // 70 | // Columns, offsets, pushes, and pulls for the large desktop device range. 71 | 72 | @media (min-width: @screen-lg-min) { 73 | .make-grid-columns-float(lg); 74 | .make-grid(@grid-columns, lg, width); 75 | .make-grid(@grid-columns, lg, pull); 76 | .make-grid(@grid-columns, lg, push); 77 | .make-grid(@grid-columns, lg, offset); 78 | } 79 | 80 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/jumbotron.less: -------------------------------------------------------------------------------- 1 | // 2 | // Jumbotron 3 | // -------------------------------------------------- 4 | 5 | 6 | .jumbotron { 7 | padding: @jumbotron-padding; 8 | margin-bottom: @jumbotron-padding; 9 | font-size: @jumbotron-font-size; 10 | font-weight: 200; 11 | line-height: (@line-height-base * 1.5); 12 | color: @jumbotron-color; 13 | background-color: @jumbotron-bg; 14 | 15 | h1, 16 | .h1 { 17 | line-height: 1; 18 | color: @jumbotron-heading-color; 19 | } 20 | p { 21 | line-height: 1.4; 22 | } 23 | 24 | .container & { 25 | border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container 26 | } 27 | 28 | .container { 29 | max-width: 100%; 30 | } 31 | 32 | @media screen and (min-width: @screen-sm-min) { 33 | padding-top: (@jumbotron-padding * 1.6); 34 | padding-bottom: (@jumbotron-padding * 1.6); 35 | 36 | .container & { 37 | padding-left: (@jumbotron-padding * 2); 38 | padding-right: (@jumbotron-padding * 2); 39 | } 40 | 41 | h1, 42 | .h1 { 43 | font-size: (@font-size-base * 4.5); 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/labels.less: -------------------------------------------------------------------------------- 1 | // 2 | // Labels 3 | // -------------------------------------------------- 4 | 5 | .label { 6 | display: inline; 7 | padding: .2em .6em .3em; 8 | font-size: 75%; 9 | font-weight: bold; 10 | line-height: 1; 11 | color: @label-color; 12 | text-align: center; 13 | white-space: nowrap; 14 | vertical-align: baseline; 15 | border-radius: .25em; 16 | 17 | // Add hover effects, but only for links 18 | &[href] { 19 | &:hover, 20 | &:focus { 21 | color: @label-link-hover-color; 22 | text-decoration: none; 23 | cursor: pointer; 24 | } 25 | } 26 | 27 | // Empty labels collapse automatically (not available in IE8) 28 | &:empty { 29 | display: none; 30 | } 31 | 32 | // Quick fix for labels in buttons 33 | .btn & { 34 | position: relative; 35 | top: -1px; 36 | } 37 | } 38 | 39 | // Colors 40 | // Contextual variations (linked labels get darker on :hover) 41 | 42 | .label-default { 43 | .label-variant(@label-default-bg); 44 | } 45 | 46 | .label-primary { 47 | .label-variant(@label-primary-bg); 48 | } 49 | 50 | .label-success { 51 | .label-variant(@label-success-bg); 52 | } 53 | 54 | .label-info { 55 | .label-variant(@label-info-bg); 56 | } 57 | 58 | .label-warning { 59 | .label-variant(@label-warning-bg); 60 | } 61 | 62 | .label-danger { 63 | .label-variant(@label-danger-bg); 64 | } 65 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/media.less: -------------------------------------------------------------------------------- 1 | // Media objects 2 | // Source: http://stubbornella.org/content/?p=497 3 | // -------------------------------------------------- 4 | 5 | 6 | // Common styles 7 | // ------------------------- 8 | 9 | // Clear the floats 10 | .media, 11 | .media-body { 12 | overflow: hidden; 13 | zoom: 1; 14 | } 15 | 16 | // Proper spacing between instances of .media 17 | .media, 18 | .media .media { 19 | margin-top: 15px; 20 | } 21 | .media:first-child { 22 | margin-top: 0; 23 | } 24 | 25 | // For images and videos, set to block 26 | .media-object { 27 | display: block; 28 | } 29 | 30 | // Reset margins on headings for tighter default spacing 31 | .media-heading { 32 | margin: 0 0 5px; 33 | } 34 | 35 | 36 | // Media image alignment 37 | // ------------------------- 38 | 39 | .media { 40 | > .pull-left { 41 | margin-right: 10px; 42 | } 43 | > .pull-right { 44 | margin-left: 10px; 45 | } 46 | } 47 | 48 | 49 | // Media list variation 50 | // ------------------------- 51 | 52 | // Undo default ul/ol styles 53 | .media-list { 54 | padding-left: 0; 55 | list-style: none; 56 | } 57 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/pager.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pager pagination 3 | // -------------------------------------------------- 4 | 5 | 6 | .pager { 7 | padding-left: 0; 8 | margin: @line-height-computed 0; 9 | list-style: none; 10 | text-align: center; 11 | .clearfix(); 12 | li { 13 | display: inline; 14 | > a, 15 | > span { 16 | display: inline-block; 17 | padding: 5px 14px; 18 | background-color: @pagination-bg; 19 | border: 1px solid @pagination-border; 20 | border-radius: @pager-border-radius; 21 | } 22 | 23 | > a:hover, 24 | > a:focus { 25 | text-decoration: none; 26 | background-color: @pagination-hover-bg; 27 | } 28 | } 29 | 30 | .next { 31 | > a, 32 | > span { 33 | float: right; 34 | } 35 | } 36 | 37 | .previous { 38 | > a, 39 | > span { 40 | float: left; 41 | } 42 | } 43 | 44 | .disabled { 45 | > a, 46 | > a:hover, 47 | > a:focus, 48 | > span { 49 | color: @pager-disabled-color; 50 | background-color: @pagination-bg; 51 | cursor: not-allowed; 52 | } 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/pagination.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pagination (multiple pages) 3 | // -------------------------------------------------- 4 | .pagination { 5 | display: inline-block; 6 | padding-left: 0; 7 | margin: @line-height-computed 0; 8 | border-radius: @border-radius-base; 9 | 10 | > li { 11 | display: inline; // Remove list-style and block-level defaults 12 | > a, 13 | > span { 14 | position: relative; 15 | float: left; // Collapse white-space 16 | padding: @padding-base-vertical @padding-base-horizontal; 17 | line-height: @line-height-base; 18 | text-decoration: none; 19 | background-color: @pagination-bg; 20 | border: 1px solid @pagination-border; 21 | margin-left: -1px; 22 | } 23 | &:first-child { 24 | > a, 25 | > span { 26 | margin-left: 0; 27 | .border-left-radius(@border-radius-base); 28 | } 29 | } 30 | &:last-child { 31 | > a, 32 | > span { 33 | .border-right-radius(@border-radius-base); 34 | } 35 | } 36 | } 37 | 38 | > li > a, 39 | > li > span { 40 | &:hover, 41 | &:focus { 42 | background-color: @pagination-hover-bg; 43 | } 44 | } 45 | 46 | > .active > a, 47 | > .active > span { 48 | &, 49 | &:hover, 50 | &:focus { 51 | z-index: 2; 52 | color: @pagination-active-color; 53 | background-color: @pagination-active-bg; 54 | border-color: @pagination-active-bg; 55 | cursor: default; 56 | } 57 | } 58 | 59 | > .disabled { 60 | > span, 61 | > span:hover, 62 | > span:focus, 63 | > a, 64 | > a:hover, 65 | > a:focus { 66 | color: @pagination-disabled-color; 67 | background-color: @pagination-bg; 68 | border-color: @pagination-border; 69 | cursor: not-allowed; 70 | } 71 | } 72 | } 73 | 74 | // Sizing 75 | // -------------------------------------------------- 76 | 77 | // Large 78 | .pagination-lg { 79 | .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large); 80 | } 81 | 82 | // Small 83 | .pagination-sm { 84 | .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small); 85 | } 86 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/print.less: -------------------------------------------------------------------------------- 1 | // 2 | // Basic print styles 3 | // -------------------------------------------------- 4 | // Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css 5 | 6 | @media print { 7 | 8 | * { 9 | text-shadow: none !important; 10 | color: #000 !important; // Black prints faster: h5bp.com/s 11 | background: transparent !important; 12 | box-shadow: none !important; 13 | } 14 | 15 | a, 16 | a:visited { 17 | text-decoration: underline; 18 | } 19 | 20 | a[href]:after { 21 | content: " (" attr(href) ")"; 22 | } 23 | 24 | abbr[title]:after { 25 | content: " (" attr(title) ")"; 26 | } 27 | 28 | // Don't show links for images, or javascript/internal links 29 | a[href^="javascript:"]:after, 30 | a[href^="#"]:after { 31 | content: ""; 32 | } 33 | 34 | pre, 35 | blockquote { 36 | border: 1px solid #999; 37 | page-break-inside: avoid; 38 | } 39 | 40 | thead { 41 | display: table-header-group; // h5bp.com/t 42 | } 43 | 44 | tr, 45 | img { 46 | page-break-inside: avoid; 47 | } 48 | 49 | img { 50 | max-width: 100% !important; 51 | } 52 | 53 | @page { 54 | margin: 2cm .5cm; 55 | } 56 | 57 | p, 58 | h2, 59 | h3 { 60 | orphans: 3; 61 | widows: 3; 62 | } 63 | 64 | h2, 65 | h3 { 66 | page-break-after: avoid; 67 | } 68 | 69 | // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245 70 | // Once fixed, we can just straight up remove this. 71 | select { 72 | background: #fff !important; 73 | } 74 | 75 | // Bootstrap components 76 | .navbar { 77 | display: none; 78 | } 79 | .table { 80 | td, 81 | th { 82 | background-color: #fff !important; 83 | } 84 | } 85 | .btn, 86 | .dropup > .btn { 87 | > .caret { 88 | border-top-color: #000 !important; 89 | } 90 | } 91 | .label { 92 | border: 1px solid #000; 93 | } 94 | 95 | .table { 96 | border-collapse: collapse !important; 97 | } 98 | .table-bordered { 99 | th, 100 | td { 101 | border: 1px solid #ddd !important; 102 | } 103 | } 104 | 105 | } 106 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/progress-bars.less: -------------------------------------------------------------------------------- 1 | // 2 | // Progress bars 3 | // -------------------------------------------------- 4 | 5 | 6 | // Bar animations 7 | // ------------------------- 8 | 9 | // WebKit 10 | @-webkit-keyframes progress-bar-stripes { 11 | from { background-position: 40px 0; } 12 | to { background-position: 0 0; } 13 | } 14 | 15 | // Spec and IE10+ 16 | @keyframes progress-bar-stripes { 17 | from { background-position: 40px 0; } 18 | to { background-position: 0 0; } 19 | } 20 | 21 | 22 | 23 | // Bar itself 24 | // ------------------------- 25 | 26 | // Outer container 27 | .progress { 28 | overflow: hidden; 29 | height: @line-height-computed; 30 | margin-bottom: @line-height-computed; 31 | background-color: @progress-bg; 32 | border-radius: @border-radius-base; 33 | .box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); 34 | } 35 | 36 | // Bar of progress 37 | .progress-bar { 38 | float: left; 39 | width: 0%; 40 | height: 100%; 41 | font-size: @font-size-small; 42 | line-height: @line-height-computed; 43 | color: @progress-bar-color; 44 | text-align: center; 45 | background-color: @progress-bar-bg; 46 | .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); 47 | .transition(width .6s ease); 48 | } 49 | 50 | // Striped bars 51 | .progress-striped .progress-bar { 52 | #gradient > .striped(); 53 | background-size: 40px 40px; 54 | } 55 | 56 | // Call animation for the active one 57 | .progress.active .progress-bar { 58 | .animation(progress-bar-stripes 2s linear infinite); 59 | } 60 | 61 | 62 | 63 | // Variations 64 | // ------------------------- 65 | 66 | .progress-bar-success { 67 | .progress-bar-variant(@progress-bar-success-bg); 68 | } 69 | 70 | .progress-bar-info { 71 | .progress-bar-variant(@progress-bar-info-bg); 72 | } 73 | 74 | .progress-bar-warning { 75 | .progress-bar-variant(@progress-bar-warning-bg); 76 | } 77 | 78 | .progress-bar-danger { 79 | .progress-bar-variant(@progress-bar-danger-bg); 80 | } 81 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/thumbnails.less: -------------------------------------------------------------------------------- 1 | // 2 | // Thumbnails 3 | // -------------------------------------------------- 4 | 5 | 6 | // Mixin and adjust the regular image class 7 | .thumbnail { 8 | display: block; 9 | padding: @thumbnail-padding; 10 | margin-bottom: @line-height-computed; 11 | line-height: @line-height-base; 12 | background-color: @thumbnail-bg; 13 | border: 1px solid @thumbnail-border; 14 | border-radius: @thumbnail-border-radius; 15 | .transition(all .2s ease-in-out); 16 | 17 | > img, 18 | a > img { 19 | .img-responsive(); 20 | margin-left: auto; 21 | margin-right: auto; 22 | } 23 | 24 | // Add a hover state for linked versions only 25 | a&:hover, 26 | a&:focus, 27 | a&.active { 28 | border-color: @link-color; 29 | } 30 | 31 | // Image captions 32 | .caption { 33 | padding: @thumbnail-caption-padding; 34 | color: @thumbnail-caption-color; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/utilities.less: -------------------------------------------------------------------------------- 1 | // 2 | // Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // Floats 7 | // ------------------------- 8 | 9 | .clearfix { 10 | .clearfix(); 11 | } 12 | .center-block { 13 | .center-block(); 14 | } 15 | .pull-right { 16 | float: right !important; 17 | } 18 | .pull-left { 19 | float: left !important; 20 | } 21 | 22 | 23 | // Toggling content 24 | // ------------------------- 25 | 26 | // Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 27 | .hide { 28 | display: none !important; 29 | } 30 | .show { 31 | display: block !important; 32 | } 33 | .invisible { 34 | visibility: hidden; 35 | } 36 | .text-hide { 37 | .text-hide(); 38 | } 39 | 40 | 41 | // Hide from screenreaders and browsers 42 | // 43 | // Credit: HTML5 Boilerplate 44 | 45 | .hidden { 46 | display: none !important; 47 | visibility: hidden !important; 48 | } 49 | 50 | 51 | // For Affix plugin 52 | // ------------------------- 53 | 54 | .affix { 55 | position: fixed; 56 | } 57 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/wells.less: -------------------------------------------------------------------------------- 1 | // 2 | // Wells 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .well { 8 | min-height: 20px; 9 | padding: 19px; 10 | margin-bottom: 20px; 11 | background-color: @well-bg; 12 | border: 1px solid darken(@well-bg, 7%); 13 | border-radius: @border-radius-base; 14 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); 15 | blockquote { 16 | border-color: #ddd; 17 | border-color: rgba(0,0,0,.15); 18 | } 19 | } 20 | 21 | // Sizes 22 | .well-lg { 23 | padding: 24px; 24 | border-radius: @border-radius-large; 25 | } 26 | .well-sm { 27 | padding: 9px; 28 | border-radius: @border-radius-small; 29 | } 30 | -------------------------------------------------------------------------------- /app/bower_components/i18next/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "i18next", 3 | "version": "1.8.0", 4 | "main": "./i18next.js", 5 | "dependencies": {}, 6 | "ignore": [ 7 | "test/", 8 | "release/", 9 | "spec/", 10 | "src/", 11 | "sample/", 12 | "report/", 13 | "buildtasks/", 14 | ".gitignore", 15 | "Gruntfile.js", 16 | "package.json", 17 | "testacular.conf.js", 18 | "**/*.zip" 19 | ], 20 | "homepage": "https://github.com/i18next/i18next", 21 | "_release": "1.8.0", 22 | "_resolution": { 23 | "type": "version", 24 | "tag": "1.8.0", 25 | "commit": "2bbf8ec6aa38b10587c721d7ebbf7308421824f7" 26 | }, 27 | "_source": "git://github.com/i18next/i18next.git", 28 | "_target": "~1.8.0", 29 | "_originalSource": "i18next" 30 | } -------------------------------------------------------------------------------- /app/bower_components/i18next/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "i18next", 3 | "version": "1.8.0", 4 | "main": "./i18next.js", 5 | "dependencies": {}, 6 | "ignore": [ 7 | "test/", 8 | "release/", 9 | "spec/", 10 | "src/", 11 | "sample/", 12 | "report/", 13 | "buildtasks/", 14 | ".gitignore", 15 | "Gruntfile.js", 16 | "package.json", 17 | "testacular.conf.js", 18 | "**/*.zip" 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /app/bower_components/i18next/i18next.commonjs.withJQuery.js: -------------------------------------------------------------------------------- 1 | // i18next, v1.8.0 2 | // Copyright (c)2015 Jan Mühlemann (jamuhl). 3 | // Distributed under MIT license 4 | // http://i18next.com 5 | -------------------------------------------------------------------------------- /app/bower_components/i18next/i18next.commonjs.withJQuery.min.js: -------------------------------------------------------------------------------- 1 | // i18next, v1.8.0 2 | // Copyright (c)2015 Jan Mühlemann (jamuhl). 3 | // Distributed under MIT license 4 | // http://i18next.com 5 | -------------------------------------------------------------------------------- /app/bower_components/i18next/license: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011 Jan Mühlemann 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /app/bower_components/i18next/typescript/lib/mocha.d.ts: -------------------------------------------------------------------------------- 1 | // BDD 2 | declare function describe(cb: () => void); 3 | declare function describe(cb: (done:() => void) => void); 4 | declare function describe(title: string, cb: () => void); 5 | declare function describe(title: string, cb: (done:() => void) => void); 6 | 7 | declare function it(cb: () => void); 8 | declare function it(cb: (done:() => void) => void); 9 | declare function it(title: string, cb: () => void); 10 | declare function it(title: string, cb: (done:() => void) => void); 11 | 12 | declare function before(cb: () => void); 13 | declare function before(cb: (done:() => void) => void); 14 | declare function before(title: string, cb: () => void); 15 | declare function before(title: string, cb: (done:() => void) => void); 16 | 17 | declare function after(cb: () => void); 18 | declare function after(cb: (done:() => void) => void); 19 | declare function after(title: string, cb: () => void); 20 | declare function after(title: string, cb: (done:() => void) => void); 21 | 22 | declare function beforeEach(cb: () => void); 23 | declare function beforeEach(cb: (done:() => void) => void); 24 | declare function beforeEach(title: string, cb: () => void); 25 | declare function beforeEach(title: string, cb: (done:() => void) => void); 26 | 27 | declare function afterEach(cb: () => void); 28 | declare function afterEach(cb: (done:() => void) => void); 29 | declare function afterEach(title: string, cb: () => void); 30 | declare function afterEach(title: string, cb: (done:() => void) => void); 31 | 32 | 33 | // TDD 34 | declare function suite(title: string, cb: () => void); 35 | declare function test(title: string, cb: () => void); 36 | declare function test(title: string, cb: (done:() => void) => void); 37 | declare function setup(title: string, cb: () => void); 38 | declare function teardown(title: string, cb: () => void); 39 | 40 | declare function suite(cb: () => void); 41 | declare function test(cb: () => void); 42 | declare function test(cb: (done:() => void) => void); 43 | declare function setup(cb: () => void); 44 | declare function teardown(cb: () => void); 45 | -------------------------------------------------------------------------------- /app/bower_components/i18next/typescript/lib/sinon.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | interface spy { 4 | called: bool; 5 | getCall(x: number): any; 6 | fakeServer: ISinonFakeServer; 7 | calledOnce: bool; 8 | calledWith(x: any, message: string): bool; 9 | } 10 | 11 | interface IJsonReponse { 12 | responseCode: number; 13 | responseHeaders: any; 14 | responseString: string; 15 | } 16 | 17 | interface ISinonFakeServer { 18 | create(): any; 19 | restore(): void; 20 | respondWith(postType: string, relativeUrl: string, x: any): any; 21 | respond(): any; 22 | } 23 | 24 | declare module sinon { 25 | export function spy(): spy; 26 | export function spy(fn: Function): spy; 27 | //export function spy(jquery: JQueryStatic , x: string): spy; 28 | export function spy(jquery: JQueryStatic , x: any): spy; 29 | export function spy(obj: Object , methodName: string): spy; 30 | export var fakeServer: ISinonFakeServer; 31 | export function stub(x: any, name: string); 32 | export function useFakeTimers(): void; 33 | } -------------------------------------------------------------------------------- /app/bower_components/jquery/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "version": "1.10.2", 4 | "description": "jQuery component", 5 | "keywords": [ 6 | "jquery", 7 | "component" 8 | ], 9 | "main": "jquery.js", 10 | "license": "MIT", 11 | "homepage": "https://github.com/components/jquery", 12 | "_release": "1.10.2", 13 | "_resolution": { 14 | "type": "version", 15 | "tag": "1.10.2", 16 | "commit": "6b2390db24ba3490ca75251eec4888f7342bf4da" 17 | }, 18 | "_source": "git://github.com/components/jquery.git", 19 | "_target": "~1.10.2", 20 | "_originalSource": "jquery" 21 | } -------------------------------------------------------------------------------- /app/bower_components/jquery/.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | -------------------------------------------------------------------------------- /app/bower_components/jquery/README.md: -------------------------------------------------------------------------------- 1 | jQuery Component 2 | ================ 3 | 4 | Shim repository for the [jQuery](http://jquery.com). 5 | 6 | Package Managers 7 | ---------------- 8 | 9 | * [Bower](http://twitter.github.com/bower/): `jquery` 10 | * [Component](https://github.com/component/component): `components/jquery` 11 | * [Composer](http://packagist.org/packages/components/jquery): `components/jquery` 12 | -------------------------------------------------------------------------------- /app/bower_components/jquery/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "version": "1.10.2", 4 | "description": "jQuery component", 5 | "keywords": [ 6 | "jquery", 7 | "component" 8 | ], 9 | "main": "jquery.js", 10 | "license": "MIT" 11 | } 12 | -------------------------------------------------------------------------------- /app/bower_components/jquery/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "repo": "components/jquery", 4 | "version": "1.10.2", 5 | "description": "jQuery component", 6 | "keywords": [ 7 | "jquery", 8 | "component" 9 | ], 10 | "main": "jquery.js", 11 | "scripts": [ 12 | "jquery.js" 13 | ], 14 | "license": "MIT" 15 | } 16 | -------------------------------------------------------------------------------- /app/bower_components/jquery/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "components/jquery", 3 | "description": "jQuery JavaScript Library", 4 | "type": "component", 5 | "homepage": "http://jquery.com", 6 | "license": "MIT", 7 | "support": { 8 | "irc": "irc://irc.freenode.org/jquery", 9 | "issues": "http://bugs.jquery.com", 10 | "forum": "http://forum.jquery.com", 11 | "wiki": "http://docs.jquery.com/", 12 | "source": "https://github.com/jquery/jquery" 13 | }, 14 | "authors": [ 15 | { 16 | "name": "John Resig", 17 | "email": "jeresig@gmail.com" 18 | } 19 | ], 20 | "require": { 21 | "robloach/component-installer": "*" 22 | }, 23 | "extra": { 24 | "component": { 25 | "scripts": [ 26 | "jquery.js" 27 | ], 28 | "files": [ 29 | "jquery.min.js", 30 | "jquery-migrate.js", 31 | "jquery-migrate.min.js" 32 | ] 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/bower_components/jquery/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "components-jquery", 3 | "version": "1.10.2", 4 | "description": "jQuery component", 5 | "keywords": ["jquery"], 6 | "main": "./jquery.js" 7 | } 8 | -------------------------------------------------------------------------------- /app/bower_components/moment/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "moment", 3 | "version": "2.5.1", 4 | "main": "moment.js", 5 | "ignore": [ 6 | "**/.*", 7 | "node_modules", 8 | "bower_components", 9 | "test", 10 | "tests", 11 | "tasks", 12 | "component.json", 13 | "composer.json", 14 | "CONTRIBUTING.md", 15 | "ender.js", 16 | "Gruntfile.js", 17 | "package.js", 18 | "package.json" 19 | ], 20 | "homepage": "https://github.com/moment/moment", 21 | "_release": "2.5.1", 22 | "_resolution": { 23 | "type": "version", 24 | "tag": "2.5.1", 25 | "commit": "5da8066ec789fe5b139ba087650c53e33f39da50" 26 | }, 27 | "_source": "git://github.com/moment/moment.git", 28 | "_target": "~2.5.1", 29 | "_originalSource": "moment", 30 | "_direct": true 31 | } -------------------------------------------------------------------------------- /app/bower_components/moment/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011-2013 Tim Wood, Iskren Chernev, Moment.js contributors 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /app/bower_components/moment/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "moment", 3 | "version": "2.5.1", 4 | "main": "moment.js", 5 | "ignore": [ 6 | "**/.*", 7 | "node_modules", 8 | "bower_components", 9 | "test", 10 | "tests", 11 | "tasks", 12 | "component.json", 13 | "composer.json", 14 | "CONTRIBUTING.md", 15 | "ender.js", 16 | "Gruntfile.js", 17 | "package.js", 18 | "package.json" 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /app/bower_components/moment/lang/ar-ma.js: -------------------------------------------------------------------------------- 1 | // moment.js language configuration 2 | // language : Moroccan Arabic (ar-ma) 3 | // author : ElFadili Yassine : https://github.com/ElFadiliY 4 | // author : Abdel Said : https://github.com/abdelsaid 5 | 6 | (function (factory) { 7 | if (typeof define === 'function' && define.amd) { 8 | define(['moment'], factory); // AMD 9 | } else if (typeof exports === 'object') { 10 | module.exports = factory(require('../moment')); // Node 11 | } else { 12 | factory(window.moment); // Browser global 13 | } 14 | }(function (moment) { 15 | return moment.lang('ar-ma', { 16 | months : "يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"), 17 | monthsShort : "يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"), 18 | weekdays : "الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"), 19 | weekdaysShort : "احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"), 20 | weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"), 21 | longDateFormat : { 22 | LT : "HH:mm", 23 | L : "DD/MM/YYYY", 24 | LL : "D MMMM YYYY", 25 | LLL : "D MMMM YYYY LT", 26 | LLLL : "dddd D MMMM YYYY LT" 27 | }, 28 | calendar : { 29 | sameDay: "[اليوم على الساعة] LT", 30 | nextDay: '[غدا على الساعة] LT', 31 | nextWeek: 'dddd [على الساعة] LT', 32 | lastDay: '[أمس على الساعة] LT', 33 | lastWeek: 'dddd [على الساعة] LT', 34 | sameElse: 'L' 35 | }, 36 | relativeTime : { 37 | future : "في %s", 38 | past : "منذ %s", 39 | s : "ثوان", 40 | m : "دقيقة", 41 | mm : "%d دقائق", 42 | h : "ساعة", 43 | hh : "%d ساعات", 44 | d : "يوم", 45 | dd : "%d أيام", 46 | M : "شهر", 47 | MM : "%d أشهر", 48 | y : "سنة", 49 | yy : "%d سنوات" 50 | }, 51 | week : { 52 | dow : 6, // Saturday is the first day of the week. 53 | doy : 12 // The week that contains Jan 1st is the first week of the year. 54 | } 55 | }); 56 | })); 57 | -------------------------------------------------------------------------------- /app/bower_components/moment/lang/da.js: -------------------------------------------------------------------------------- 1 | // moment.js language configuration 2 | // language : danish (da) 3 | // author : Ulrik Nielsen : https://github.com/mrbase 4 | 5 | (function (factory) { 6 | if (typeof define === 'function' && define.amd) { 7 | define(['moment'], factory); // AMD 8 | } else if (typeof exports === 'object') { 9 | module.exports = factory(require('../moment')); // Node 10 | } else { 11 | factory(window.moment); // Browser global 12 | } 13 | }(function (moment) { 14 | return moment.lang('da', { 15 | months : "januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"), 16 | monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"), 17 | weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"), 18 | weekdaysShort : "søn_man_tir_ons_tor_fre_lør".split("_"), 19 | weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"), 20 | longDateFormat : { 21 | LT : "HH:mm", 22 | L : "DD/MM/YYYY", 23 | LL : "D MMMM YYYY", 24 | LLL : "D MMMM YYYY LT", 25 | LLLL : "dddd D. MMMM, YYYY LT" 26 | }, 27 | calendar : { 28 | sameDay : '[I dag kl.] LT', 29 | nextDay : '[I morgen kl.] LT', 30 | nextWeek : 'dddd [kl.] LT', 31 | lastDay : '[I går kl.] LT', 32 | lastWeek : '[sidste] dddd [kl] LT', 33 | sameElse : 'L' 34 | }, 35 | relativeTime : { 36 | future : "om %s", 37 | past : "%s siden", 38 | s : "få sekunder", 39 | m : "et minut", 40 | mm : "%d minutter", 41 | h : "en time", 42 | hh : "%d timer", 43 | d : "en dag", 44 | dd : "%d dage", 45 | M : "en måned", 46 | MM : "%d måneder", 47 | y : "et år", 48 | yy : "%d år" 49 | }, 50 | ordinal : '%d.', 51 | week : { 52 | dow : 1, // Monday is the first day of the week. 53 | doy : 4 // The week that contains Jan 4th is the first week of the year. 54 | } 55 | }); 56 | })); 57 | -------------------------------------------------------------------------------- /app/bower_components/moment/lang/fo.js: -------------------------------------------------------------------------------- 1 | // moment.js language configuration 2 | // language : faroese (fo) 3 | // author : Ragnar Johannesen : https://github.com/ragnar123 4 | 5 | (function (factory) { 6 | if (typeof define === 'function' && define.amd) { 7 | define(['moment'], factory); // AMD 8 | } else if (typeof exports === 'object') { 9 | module.exports = factory(require('../moment')); // Node 10 | } else { 11 | factory(window.moment); // Browser global 12 | } 13 | }(function (moment) { 14 | return moment.lang('fo', { 15 | months : "januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"), 16 | monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"), 17 | weekdays : "sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"), 18 | weekdaysShort : "sun_mán_týs_mik_hós_frí_ley".split("_"), 19 | weekdaysMin : "su_má_tý_mi_hó_fr_le".split("_"), 20 | longDateFormat : { 21 | LT : "HH:mm", 22 | L : "DD/MM/YYYY", 23 | LL : "D MMMM YYYY", 24 | LLL : "D MMMM YYYY LT", 25 | LLLL : "dddd D. MMMM, YYYY LT" 26 | }, 27 | calendar : { 28 | sameDay : '[Í dag kl.] LT', 29 | nextDay : '[Í morgin kl.] LT', 30 | nextWeek : 'dddd [kl.] LT', 31 | lastDay : '[Í gjár kl.] LT', 32 | lastWeek : '[síðstu] dddd [kl] LT', 33 | sameElse : 'L' 34 | }, 35 | relativeTime : { 36 | future : "um %s", 37 | past : "%s síðani", 38 | s : "fá sekund", 39 | m : "ein minutt", 40 | mm : "%d minuttir", 41 | h : "ein tími", 42 | hh : "%d tímar", 43 | d : "ein dagur", 44 | dd : "%d dagar", 45 | M : "ein mánaði", 46 | MM : "%d mánaðir", 47 | y : "eitt ár", 48 | yy : "%d ár" 49 | }, 50 | ordinal : '%d.', 51 | week : { 52 | dow : 1, // Monday is the first day of the week. 53 | doy : 4 // The week that contains Jan 4th is the first week of the year. 54 | } 55 | }); 56 | })); 57 | -------------------------------------------------------------------------------- /app/bower_components/moment/lang/fr-ca.js: -------------------------------------------------------------------------------- 1 | // moment.js language configuration 2 | // language : canadian french (fr-ca) 3 | // author : Jonathan Abourbih : https://github.com/jonbca 4 | 5 | (function (factory) { 6 | if (typeof define === 'function' && define.amd) { 7 | define(['moment'], factory); // AMD 8 | } else if (typeof exports === 'object') { 9 | module.exports = factory(require('../moment')); // Node 10 | } else { 11 | factory(window.moment); // Browser global 12 | } 13 | }(function (moment) { 14 | return moment.lang('fr-ca', { 15 | months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"), 16 | monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"), 17 | weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"), 18 | weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"), 19 | weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"), 20 | longDateFormat : { 21 | LT : "HH:mm", 22 | L : "YYYY-MM-DD", 23 | LL : "D MMMM YYYY", 24 | LLL : "D MMMM YYYY LT", 25 | LLLL : "dddd D MMMM YYYY LT" 26 | }, 27 | calendar : { 28 | sameDay: "[Aujourd'hui à] LT", 29 | nextDay: '[Demain à] LT', 30 | nextWeek: 'dddd [à] LT', 31 | lastDay: '[Hier à] LT', 32 | lastWeek: 'dddd [dernier à] LT', 33 | sameElse: 'L' 34 | }, 35 | relativeTime : { 36 | future : "dans %s", 37 | past : "il y a %s", 38 | s : "quelques secondes", 39 | m : "une minute", 40 | mm : "%d minutes", 41 | h : "une heure", 42 | hh : "%d heures", 43 | d : "un jour", 44 | dd : "%d jours", 45 | M : "un mois", 46 | MM : "%d mois", 47 | y : "un an", 48 | yy : "%d ans" 49 | }, 50 | ordinal : function (number) { 51 | return number + (number === 1 ? 'er' : ''); 52 | } 53 | }); 54 | })); 55 | -------------------------------------------------------------------------------- /app/bower_components/moment/lang/ja.js: -------------------------------------------------------------------------------- 1 | // moment.js language configuration 2 | // language : japanese (ja) 3 | // author : LI Long : https://github.com/baryon 4 | 5 | (function (factory) { 6 | if (typeof define === 'function' && define.amd) { 7 | define(['moment'], factory); // AMD 8 | } else if (typeof exports === 'object') { 9 | module.exports = factory(require('../moment')); // Node 10 | } else { 11 | factory(window.moment); // Browser global 12 | } 13 | }(function (moment) { 14 | return moment.lang('ja', { 15 | months : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), 16 | monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), 17 | weekdays : "日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"), 18 | weekdaysShort : "日_月_火_水_木_金_土".split("_"), 19 | weekdaysMin : "日_月_火_水_木_金_土".split("_"), 20 | longDateFormat : { 21 | LT : "Ah時m分", 22 | L : "YYYY/MM/DD", 23 | LL : "YYYY年M月D日", 24 | LLL : "YYYY年M月D日LT", 25 | LLLL : "YYYY年M月D日LT dddd" 26 | }, 27 | meridiem : function (hour, minute, isLower) { 28 | if (hour < 12) { 29 | return "午前"; 30 | } else { 31 | return "午後"; 32 | } 33 | }, 34 | calendar : { 35 | sameDay : '[今日] LT', 36 | nextDay : '[明日] LT', 37 | nextWeek : '[来週]dddd LT', 38 | lastDay : '[昨日] LT', 39 | lastWeek : '[前週]dddd LT', 40 | sameElse : 'L' 41 | }, 42 | relativeTime : { 43 | future : "%s後", 44 | past : "%s前", 45 | s : "数秒", 46 | m : "1分", 47 | mm : "%d分", 48 | h : "1時間", 49 | hh : "%d時間", 50 | d : "1日", 51 | dd : "%d日", 52 | M : "1ヶ月", 53 | MM : "%dヶ月", 54 | y : "1年", 55 | yy : "%d年" 56 | } 57 | }); 58 | })); 59 | -------------------------------------------------------------------------------- /app/bower_components/moment/lang/ko.js: -------------------------------------------------------------------------------- 1 | // moment.js language configuration 2 | // language : korean (ko) 3 | // 4 | // authors 5 | // 6 | // - Kyungwook, Park : https://github.com/kyungw00k 7 | // - Jeeeyul Lee 8 | (function (factory) { 9 | if (typeof define === 'function' && define.amd) { 10 | define(['moment'], factory); // AMD 11 | } else if (typeof exports === 'object') { 12 | module.exports = factory(require('../moment')); // Node 13 | } else { 14 | factory(window.moment); // Browser global 15 | } 16 | }(function (moment) { 17 | return moment.lang('ko', { 18 | months : "1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"), 19 | monthsShort : "1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"), 20 | weekdays : "일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"), 21 | weekdaysShort : "일_월_화_수_목_금_토".split("_"), 22 | weekdaysMin : "일_월_화_수_목_금_토".split("_"), 23 | longDateFormat : { 24 | LT : "A h시 mm분", 25 | L : "YYYY.MM.DD", 26 | LL : "YYYY년 MMMM D일", 27 | LLL : "YYYY년 MMMM D일 LT", 28 | LLLL : "YYYY년 MMMM D일 dddd LT" 29 | }, 30 | meridiem : function (hour, minute, isUpper) { 31 | return hour < 12 ? '오전' : '오후'; 32 | }, 33 | calendar : { 34 | sameDay : '오늘 LT', 35 | nextDay : '내일 LT', 36 | nextWeek : 'dddd LT', 37 | lastDay : '어제 LT', 38 | lastWeek : '지난주 dddd LT', 39 | sameElse : 'L' 40 | }, 41 | relativeTime : { 42 | future : "%s 후", 43 | past : "%s 전", 44 | s : "몇초", 45 | ss : "%d초", 46 | m : "일분", 47 | mm : "%d분", 48 | h : "한시간", 49 | hh : "%d시간", 50 | d : "하루", 51 | dd : "%d일", 52 | M : "한달", 53 | MM : "%d달", 54 | y : "일년", 55 | yy : "%d년" 56 | }, 57 | ordinal : '%d일', 58 | meridiemParse : /(오전|오후)/, 59 | isPM : function (token) { 60 | return token === "오후"; 61 | } 62 | }); 63 | })); 64 | -------------------------------------------------------------------------------- /app/bower_components/moment/lang/nn.js: -------------------------------------------------------------------------------- 1 | // moment.js language configuration 2 | // language : norwegian nynorsk (nn) 3 | // author : https://github.com/mechuwind 4 | 5 | (function (factory) { 6 | if (typeof define === 'function' && define.amd) { 7 | define(['moment'], factory); // AMD 8 | } else if (typeof exports === 'object') { 9 | module.exports = factory(require('../moment')); // Node 10 | } else { 11 | factory(window.moment); // Browser global 12 | } 13 | }(function (moment) { 14 | return moment.lang('nn', { 15 | months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"), 16 | monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"), 17 | weekdays : "sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"), 18 | weekdaysShort : "sun_mån_tys_ons_tor_fre_lau".split("_"), 19 | weekdaysMin : "su_må_ty_on_to_fr_lø".split("_"), 20 | longDateFormat : { 21 | LT : "HH:mm", 22 | L : "DD.MM.YYYY", 23 | LL : "D MMMM YYYY", 24 | LLL : "D MMMM YYYY LT", 25 | LLLL : "dddd D MMMM YYYY LT" 26 | }, 27 | calendar : { 28 | sameDay: '[I dag klokka] LT', 29 | nextDay: '[I morgon klokka] LT', 30 | nextWeek: 'dddd [klokka] LT', 31 | lastDay: '[I går klokka] LT', 32 | lastWeek: '[Føregående] dddd [klokka] LT', 33 | sameElse: 'L' 34 | }, 35 | relativeTime : { 36 | future : "om %s", 37 | past : "for %s siden", 38 | s : "noen sekund", 39 | m : "ett minutt", 40 | mm : "%d minutt", 41 | h : "en time", 42 | hh : "%d timar", 43 | d : "en dag", 44 | dd : "%d dagar", 45 | M : "en månad", 46 | MM : "%d månader", 47 | y : "ett år", 48 | yy : "%d år" 49 | }, 50 | ordinal : '%d.', 51 | week : { 52 | dow : 1, // Monday is the first day of the week. 53 | doy : 4 // The week that contains Jan 4th is the first week of the year. 54 | } 55 | }); 56 | })); 57 | -------------------------------------------------------------------------------- /app/bower_components/moment/lang/sq.js: -------------------------------------------------------------------------------- 1 | // moment.js language configuration 2 | // language : Albanian (sq) 3 | // author : Flakërim Ismani : https://github.com/flakerimi 4 | // author: Menelion Elensúle: https://github.com/Oire (tests) 5 | 6 | (function (factory) { 7 | if (typeof define === 'function' && define.amd) { 8 | define(['moment'], factory); // AMD 9 | } else if (typeof exports === 'object') { 10 | module.exports = factory(require('../moment')); // Node 11 | } else { 12 | factory(window.moment); // Browser global 13 | } 14 | }(function (moment) { 15 | return moment.lang('sq', { 16 | months : "Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"), 17 | monthsShort : "Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"), 18 | weekdays : "E Diel_E Hënë_E Marte_E Mërkure_E Enjte_E Premte_E Shtunë".split("_"), 19 | weekdaysShort : "Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"), 20 | weekdaysMin : "D_H_Ma_Më_E_P_Sh".split("_"), 21 | longDateFormat : { 22 | LT : "HH:mm", 23 | L : "DD/MM/YYYY", 24 | LL : "D MMMM YYYY", 25 | LLL : "D MMMM YYYY LT", 26 | LLLL : "dddd, D MMMM YYYY LT" 27 | }, 28 | calendar : { 29 | sameDay : '[Sot në] LT', 30 | nextDay : '[Neser në] LT', 31 | nextWeek : 'dddd [në] LT', 32 | lastDay : '[Dje në] LT', 33 | lastWeek : 'dddd [e kaluar në] LT', 34 | sameElse : 'L' 35 | }, 36 | relativeTime : { 37 | future : "në %s", 38 | past : "%s me parë", 39 | s : "disa sekonda", 40 | m : "një minut", 41 | mm : "%d minuta", 42 | h : "një orë", 43 | hh : "%d orë", 44 | d : "një ditë", 45 | dd : "%d ditë", 46 | M : "një muaj", 47 | MM : "%d muaj", 48 | y : "një vit", 49 | yy : "%d vite" 50 | }, 51 | ordinal : '%d.', 52 | week : { 53 | dow : 1, // Monday is the first day of the week. 54 | doy : 4 // The week that contains Jan 4th is the first week of the year. 55 | } 56 | }); 57 | })); 58 | -------------------------------------------------------------------------------- /app/bower_components/moment/lang/tl-ph.js: -------------------------------------------------------------------------------- 1 | // moment.js language configuration 2 | // language : Tagalog/Filipino (tl-ph) 3 | // author : Dan Hagman 4 | 5 | (function (factory) { 6 | if (typeof define === 'function' && define.amd) { 7 | define(['moment'], factory); // AMD 8 | } else if (typeof exports === 'object') { 9 | module.exports = factory(require('../moment')); // Node 10 | } else { 11 | factory(window.moment); // Browser global 12 | } 13 | }(function (moment) { 14 | return moment.lang('tl-ph', { 15 | months : "Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"), 16 | monthsShort : "Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"), 17 | weekdays : "Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"), 18 | weekdaysShort : "Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"), 19 | weekdaysMin : "Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"), 20 | longDateFormat : { 21 | LT : "HH:mm", 22 | L : "MM/D/YYYY", 23 | LL : "MMMM D, YYYY", 24 | LLL : "MMMM D, YYYY LT", 25 | LLLL : "dddd, MMMM DD, YYYY LT" 26 | }, 27 | calendar : { 28 | sameDay: "[Ngayon sa] LT", 29 | nextDay: '[Bukas sa] LT', 30 | nextWeek: 'dddd [sa] LT', 31 | lastDay: '[Kahapon sa] LT', 32 | lastWeek: 'dddd [huling linggo] LT', 33 | sameElse: 'L' 34 | }, 35 | relativeTime : { 36 | future : "sa loob ng %s", 37 | past : "%s ang nakalipas", 38 | s : "ilang segundo", 39 | m : "isang minuto", 40 | mm : "%d minuto", 41 | h : "isang oras", 42 | hh : "%d oras", 43 | d : "isang araw", 44 | dd : "%d araw", 45 | M : "isang buwan", 46 | MM : "%d buwan", 47 | y : "isang taon", 48 | yy : "%d taon" 49 | }, 50 | ordinal : function (number) { 51 | return number; 52 | }, 53 | week : { 54 | dow : 1, // Monday is the first day of the week. 55 | doy : 4 // The week that contains Jan 4th is the first week of the year. 56 | } 57 | }); 58 | })); 59 | -------------------------------------------------------------------------------- /app/bower_components/moment/lang/tzm-la.js: -------------------------------------------------------------------------------- 1 | // moment.js language configuration 2 | // language : Morocco Central Atlas Tamaziɣt in Latin (tzm-la) 3 | // author : Abdel Said : https://github.com/abdelsaid 4 | 5 | (function (factory) { 6 | if (typeof define === 'function' && define.amd) { 7 | define(['moment'], factory); // AMD 8 | } else if (typeof exports === 'object') { 9 | module.exports = factory(require('../moment')); // Node 10 | } else { 11 | factory(window.moment); // Browser global 12 | } 13 | }(function (moment) { 14 | return moment.lang('tzm-la', { 15 | months : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"), 16 | monthsShort : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"), 17 | weekdays : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"), 18 | weekdaysShort : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"), 19 | weekdaysMin : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"), 20 | longDateFormat : { 21 | LT : "HH:mm", 22 | L : "DD/MM/YYYY", 23 | LL : "D MMMM YYYY", 24 | LLL : "D MMMM YYYY LT", 25 | LLLL : "dddd D MMMM YYYY LT" 26 | }, 27 | calendar : { 28 | sameDay: "[asdkh g] LT", 29 | nextDay: '[aska g] LT', 30 | nextWeek: 'dddd [g] LT', 31 | lastDay: '[assant g] LT', 32 | lastWeek: 'dddd [g] LT', 33 | sameElse: 'L' 34 | }, 35 | relativeTime : { 36 | future : "dadkh s yan %s", 37 | past : "yan %s", 38 | s : "imik", 39 | m : "minuḍ", 40 | mm : "%d minuḍ", 41 | h : "saɛa", 42 | hh : "%d tassaɛin", 43 | d : "ass", 44 | dd : "%d ossan", 45 | M : "ayowr", 46 | MM : "%d iyyirn", 47 | y : "asgas", 48 | yy : "%d isgasn" 49 | }, 50 | week : { 51 | dow : 6, // Saturday is the first day of the week. 52 | doy : 12 // The week that contains Jan 1st is the first week of the year. 53 | } 54 | }); 55 | })); 56 | -------------------------------------------------------------------------------- /app/bower_components/moment/lang/tzm.js: -------------------------------------------------------------------------------- 1 | // moment.js language configuration 2 | // language : Morocco Central Atlas Tamaziɣt (tzm) 3 | // author : Abdel Said : https://github.com/abdelsaid 4 | 5 | (function (factory) { 6 | if (typeof define === 'function' && define.amd) { 7 | define(['moment'], factory); // AMD 8 | } else if (typeof exports === 'object') { 9 | module.exports = factory(require('../moment')); // Node 10 | } else { 11 | factory(window.moment); // Browser global 12 | } 13 | }(function (moment) { 14 | return moment.lang('tzm', { 15 | months : "ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"), 16 | monthsShort : "ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"), 17 | weekdays : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"), 18 | weekdaysShort : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"), 19 | weekdaysMin : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"), 20 | longDateFormat : { 21 | LT : "HH:mm", 22 | L : "DD/MM/YYYY", 23 | LL : "D MMMM YYYY", 24 | LLL : "D MMMM YYYY LT", 25 | LLLL : "dddd D MMMM YYYY LT" 26 | }, 27 | calendar : { 28 | sameDay: "[ⴰⵙⴷⵅ ⴴ] LT", 29 | nextDay: '[ⴰⵙⴽⴰ ⴴ] LT', 30 | nextWeek: 'dddd [ⴴ] LT', 31 | lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT', 32 | lastWeek: 'dddd [ⴴ] LT', 33 | sameElse: 'L' 34 | }, 35 | relativeTime : { 36 | future : "ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s", 37 | past : "ⵢⴰⵏ %s", 38 | s : "ⵉⵎⵉⴽ", 39 | m : "ⵎⵉⵏⵓⴺ", 40 | mm : "%d ⵎⵉⵏⵓⴺ", 41 | h : "ⵙⴰⵄⴰ", 42 | hh : "%d ⵜⴰⵙⵙⴰⵄⵉⵏ", 43 | d : "ⴰⵙⵙ", 44 | dd : "%d oⵙⵙⴰⵏ", 45 | M : "ⴰⵢoⵓⵔ", 46 | MM : "%d ⵉⵢⵢⵉⵔⵏ", 47 | y : "ⴰⵙⴳⴰⵙ", 48 | yy : "%d ⵉⵙⴳⴰⵙⵏ" 49 | }, 50 | week : { 51 | dow : 6, // Saturday is the first day of the week. 52 | doy : 12 // The week that contains Jan 1st is the first week of the year. 53 | } 54 | }); 55 | })); 56 | -------------------------------------------------------------------------------- /app/bower_components/moment/lang/uz.js: -------------------------------------------------------------------------------- 1 | // moment.js language configuration 2 | // language : uzbek 3 | // author : Sardor Muminov : https://github.com/muminoff 4 | 5 | (function (factory) { 6 | if (typeof define === 'function' && define.amd) { 7 | define(['moment'], factory); // AMD 8 | } else if (typeof exports === 'object') { 9 | module.exports = factory(require('../moment')); // Node 10 | } else { 11 | factory(window.moment); // Browser global 12 | } 13 | }(function (moment) { 14 | return moment.lang('uz', { 15 | months : "январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"), 16 | monthsShort : "янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"), 17 | weekdays : "Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"), 18 | weekdaysShort : "Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"), 19 | weekdaysMin : "Як_Ду_Се_Чо_Па_Жу_Ша".split("_"), 20 | longDateFormat : { 21 | LT : "HH:mm", 22 | L : "DD/MM/YYYY", 23 | LL : "D MMMM YYYY", 24 | LLL : "D MMMM YYYY LT", 25 | LLLL : "D MMMM YYYY, dddd LT" 26 | }, 27 | calendar : { 28 | sameDay : '[Бугун соат] LT [да]', 29 | nextDay : '[Эртага] LT [да]', 30 | nextWeek : 'dddd [куни соат] LT [да]', 31 | lastDay : '[Кеча соат] LT [да]', 32 | lastWeek : '[Утган] dddd [куни соат] LT [да]', 33 | sameElse : 'L' 34 | }, 35 | relativeTime : { 36 | future : "Якин %s ичида", 37 | past : "Бир неча %s олдин", 38 | s : "фурсат", 39 | m : "бир дакика", 40 | mm : "%d дакика", 41 | h : "бир соат", 42 | hh : "%d соат", 43 | d : "бир кун", 44 | dd : "%d кун", 45 | M : "бир ой", 46 | MM : "%d ой", 47 | y : "бир йил", 48 | yy : "%d йил" 49 | }, 50 | week : { 51 | dow : 1, // Monday is the first day of the week. 52 | doy : 7 // The week that contains Jan 4th is the first week of the year. 53 | } 54 | }); 55 | })); 56 | -------------------------------------------------------------------------------- /app/bower_components/ng-i18next/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ng-i18next", 3 | "main": "./dist/ng-i18next.js", 4 | "version": "0.2.9", 5 | "devDependencies": { 6 | "angular": "~1.2.6", 7 | "i18next": "latest", 8 | "angular-mocks": "~1.2.6" 9 | }, 10 | "ignore": [ 11 | "releases", 12 | "docs", 13 | "examples", 14 | "src", 15 | "test", 16 | "karma.conf.js", 17 | "package.json", 18 | ".jshintrc", 19 | ".editorconfig", 20 | ".gitignore" 21 | ], 22 | "homepage": "https://github.com/archer96/ng-i18next", 23 | "_release": "0.2.9", 24 | "_resolution": { 25 | "type": "version", 26 | "tag": "v0.2.9", 27 | "commit": "454e1f5e636278b90c9bca1100ac2b1fcde0dc14" 28 | }, 29 | "_source": "git://github.com/archer96/ng-i18next.git", 30 | "_target": "~0.2.9", 31 | "_originalSource": "ng-i18next", 32 | "_direct": true 33 | } -------------------------------------------------------------------------------- /app/bower_components/ng-i18next/.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "bower_components" 3 | } 4 | -------------------------------------------------------------------------------- /app/bower_components/ng-i18next/.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | # Tabs in JS unless otherwise specified 13 | [**.js] 14 | indent_style = tab 15 | 16 | [**.css] 17 | indent_style = space 18 | indent_size = 8 19 | 20 | [**.html] 21 | indent_style = tab 22 | -------------------------------------------------------------------------------- /app/bower_components/ng-i18next/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | bower_components 4 | *.log 5 | .directory 6 | -------------------------------------------------------------------------------- /app/bower_components/ng-i18next/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "browser": true, 4 | "esnext": true, 5 | "bitwise": true, 6 | "camelcase": false, 7 | "curly": true, 8 | "eqeqeq": true, 9 | "immed": true, 10 | "indent": 4, 11 | "latedef": true, 12 | "newcap": true, 13 | "noarg": true, 14 | "quotmark": "single", 15 | "regexp": true, 16 | "undef": true, 17 | "unused": true, 18 | "strict": true, 19 | "trailing": true, 20 | "smarttabs": true, 21 | "sub": true, 22 | "globals": { 23 | "alert": false, 24 | "angular": false, 25 | "i18n": false, 26 | "jasmine": false, 27 | "describe": false, 28 | "beforeEach": false, 29 | "afterEach": false, 30 | "it": false, 31 | "spyOn": false, 32 | "inject": false, 33 | "expect": false, 34 | "waits": false, 35 | "done": false 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/bower_components/ng-i18next/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - 0.10 5 | - 0.11 6 | 7 | before_install: 8 | - npm install -g gulp bower 9 | - npm install 10 | - bower install 11 | 12 | script: 13 | - gulp ci 14 | -------------------------------------------------------------------------------- /app/bower_components/ng-i18next/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2013 Andre Meyering (angular provider); i18next by Jan Mühlemann 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all 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, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/bower_components/ng-i18next/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ng-i18next", 3 | "main": "./dist/ng-i18next.js", 4 | "version": "0.2.9", 5 | "devDependencies": { 6 | "angular": "~1.2.6", 7 | "i18next": "latest", 8 | "angular-mocks": "~1.2.6" 9 | }, 10 | "ignore": [ 11 | "releases", 12 | "docs", 13 | "examples", 14 | "src", 15 | "test", 16 | "karma.conf.js", 17 | "package.json", 18 | ".jshintrc", 19 | ".editorconfig", 20 | ".gitignore" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /app/bower_components/ng-i18next/dist/ng-i18next.min.js: -------------------------------------------------------------------------------- 1 | /*! ng-i18next - v0.2.9 - 2014-01-07 - Copyright (c) 2014 Andre Meyering; Licensed MIT */angular.module("jm.i18next",["ng"]),angular.module("jm.i18next").provider("$i18next",function(){"use strict";var a,b=this,c=null,d={};b.options={},b.$get=["$rootScope",function(e){function f(a){window.i18n.init(a,function(a){d={},e.$$phase||e.$digest(),c=a,e.$broadcast("i18nextLanguageChange")})}function g(a,b,e){var f=b.lng||"auto";d[f]||(d[f]={}),c?(!d[f][a]||e)&&(d[f][a]=c(a,b)):d[f][a]=a}function h(b,c){var e=c?angular.extend({},a,c):a;return g(b,e,!!c),c&&c.lng?d[c.lng][b]:a.lng?d[a.lng][b]:d.auto[b]}return h.debugMsg=[],a=h.options=b.options,e.$watch(function(){return h.options},function(b,c){h.debugMsg.push("i18next options changed: \n","old options",c,"new options",b),a=h.options,f(a)},!0),f(a),h}]}),angular.module("jm.i18next").directive("ngI18next",["$rootScope","$i18next","$compile","$parse",function(a,b,c,d){"use strict";function e(e,f,g){var h,i="text",j=[i];if(0===g.indexOf("[")){var k=g.split("]");g=k[1],i=k[0].substr(1,k[0].length-1)}if(g.indexOf(";")===g.length-1&&(g=g.substr(0,g.length-2)),i.indexOf(":")>=0?(j=i.split(":"),i=j[0]):"i18next"===i&&(j[1]="i18next",i="text"),"i18next"!==i&&"i18next"!==j[1])h=b(g);else{var l={},m=g;if(g.indexOf("(")>=0&&g.indexOf(")")>=0){var n=g.split(")");n[0]=n[0].substr(1,n[0].length),n.length>2?(m=n.pop(),l=d(n.join(")"))()):(l=d(n[0])(),m=n[1])}h=b(m,l)}"html"===i?f.html(h):"text"===i?f.text(h):f.attr(i,h),c(f.contents())(e),a.$$phase||a.$digest()}function f(a,b,c){if(c.indexOf(";")>=0)for(var d=c.split(";"),f=0;f 2 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /app/register.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/robots.txt: -------------------------------------------------------------------------------- 1 | # robotstxt.org 2 | 3 | User-agent: * 4 | -------------------------------------------------------------------------------- /app/scripts/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var subtome = angular.module('subtome', ['ngResource', 'ngSanitize', 'ngRoute', 'jm.i18next']); 4 | 5 | subtome.config(['$routeProvider', '$i18nextProvider', function($routeProvider, $i18nextProvider) { 6 | 7 | $i18nextProvider.options = { 8 | lng: navigator.language, 9 | fallbackLng: 'en', 10 | useLocalStorage: true, 11 | localStorageExpirationTime: 1000 * 60 * 60 * 24, 12 | resGetPath: '../locales/__lng__/__ns__.json' 13 | }; 14 | 15 | $routeProvider. 16 | when('/', {templateUrl: 'views/index.html', controller: 'IndexController'}). 17 | when('/settings', {templateUrl: 'views/settings.html', controller: 'SettingsController'}). 18 | when('/publishers', {templateUrl: 'views/publishers.html', controller: 'PublishersController'}). 19 | when('/developers', {templateUrl: 'views/developers.html', controller: 'DevelopersController'}). 20 | when('/register', {templateUrl: 'views/register.html', controller: 'RegisterController'}). 21 | when('/subscribe', {templateUrl: 'views/subscribe.html', controller: 'SubscribeController'}). 22 | when('/subscriptions', {templateUrl: 'views/subscriptions.html', controller: 'SubscriptionsController'}). 23 | when('/import', {templateUrl: 'views/import.html', controller: 'ImportController'}). 24 | when('/export', {templateUrl: 'views/export.html', controller: 'ExportController'}). 25 | when('/share', {templateUrl: 'views/share.html', controller: 'ShareController'}). 26 | when('/store', {templateUrl: 'views/store.html', controller: 'StoreController'}). 27 | when('/redirect', {templateUrl: 'views/redirect.html', controller: 'RedirectController'}). 28 | otherwise({redirectTo: '/'}); 29 | }]); 30 | 31 | 32 | subtome.run([function() { 33 | // window.navigator.registerContentHandler('application/vnd.mozilla.maybe.feed', 'https://subtome.com/#/subscribe?feeds=%s', 'SubToMe'); 34 | }]); 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /app/scripts/controllers/developers.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .controller('DevelopersController', ['$window', function DevelopersController($window) { 5 | $window.location = 'http://docs.subtome.com/developers/'; 6 | }]); 7 | -------------------------------------------------------------------------------- /app/scripts/controllers/export.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .controller('ExportController', ['$window', 'subscriptions', function ExportController($window, subscriptions) { 5 | var opml = subscriptions.opml(); 6 | $window.location = 'data:application/xml;base64,' + window.btoa(opml); 7 | }]); 8 | 9 | -------------------------------------------------------------------------------- /app/scripts/controllers/import.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .controller('ImportController', ['$scope', '$routeParams', '$timeout', 'opmlParser', 'fileReader', function ImportController($scope, $routeParams, $timeout, opmlParser, fileReader) { 5 | $scope.subscriptions = []; 6 | 7 | function onFileRead(content) { 8 | $scope.subscriptions = opmlParser(content); 9 | } 10 | 11 | function onFileFailed() { 12 | $scope.error = 'Error reading your OPML file. Make sure it\'s valid.'; 13 | } 14 | 15 | $scope.$watch('file', function() { 16 | if($scope.file) { 17 | fileReader($scope.file, onFileRead, onFileFailed); 18 | $timeout(function() { 19 | $scope.$apply(); 20 | }); 21 | } 22 | }); 23 | 24 | if($routeParams.opml) { 25 | try { 26 | var xml = atob($routeParams.opml); 27 | try { 28 | $scope.subscriptions = opmlParser(xml); 29 | } 30 | catch(error) { 31 | console.error('We could not parse opml content from argument', xml); 32 | $scope.subscriptions = []; 33 | } 34 | } 35 | catch(error) { 36 | console.error('We could not convert argument from binary', $routeParams.opml); 37 | $scope.subscriptions = []; 38 | } 39 | } 40 | }]); 41 | -------------------------------------------------------------------------------- /app/scripts/controllers/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .controller('IndexController', ['$scope', '$i18next', function IndexController($scope, $i18next) { 5 | $scope.button = $i18next('See it in Action'); 6 | $scope.over = function over() { 7 | $scope.button = $i18next('Follow our Blog'); 8 | }; 9 | $scope.left = function left() { 10 | $scope.button = $i18next('See it in Action'); 11 | }; 12 | }]); 13 | -------------------------------------------------------------------------------- /app/scripts/controllers/publishers.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .controller('PublishersController', ['$window', function PublishersController($window) { 5 | $window.location = 'http://docs.subtome.com/publishers/'; 6 | }]); 7 | -------------------------------------------------------------------------------- /app/scripts/controllers/redirect.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .controller('RedirectController', ['$window', '$routeParams', '$scope', '$location', 'safeUrl', function RedirectController($window, $routeParams, $scope, $location, safeUrl) { 5 | $scope.info = 'Redirecting you to the feed...'; 6 | if(!$routeParams.to) { 7 | $window.location = '/'; 8 | return ; 9 | } 10 | var destination = decodeURIComponent($routeParams.to); 11 | if(!safeUrl(destination)) { 12 | $scope.info = 'We could not achieve a redirect because this URL ' + destination + ' is not safe.'; 13 | return ; 14 | } 15 | // TOFIX. This creates an error in the console... even though that works! 16 | if($window.history && $window.history.pushState) { 17 | $window.history.pushState({}, 'SubToMe: Subscribe', '/#/subscribe?resource=' + destination + '&feeds=' + destination + ''); 18 | } 19 | $window.location = destination; 20 | }]); 21 | -------------------------------------------------------------------------------- /app/scripts/controllers/register.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .controller('RegisterController', ['$scope', '$routeParams', 'services', function RegisterController($scope, $routeParams, services) { 5 | services.register($routeParams.name, $routeParams.url); 6 | $scope.service = {name: $routeParams.name, url: $routeParams.url}; 7 | }]); 8 | -------------------------------------------------------------------------------- /app/scripts/controllers/settings.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .controller('SettingsController', ['$scope', 'services', function SettingsController($scope, services) { 5 | $scope.services = services; 6 | $scope.remove = function removeService(service) { 7 | services.removeService(service.name); 8 | }; 9 | }]); 10 | -------------------------------------------------------------------------------- /app/scripts/controllers/share.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .controller('ShareController', ['$window', '$scope', '$routeParams', 'subscriptions', function ShareController($window, $scope, $routeParams, subscriptions) { 5 | 6 | $scope.url = $routeParams.url; 7 | var a = angular.element('', { href:$scope.url } )[0]; 8 | $scope.urlRoot = a.protocol + '//' + a.hostname ; 9 | if(a.port && a.port > 0) { 10 | $scope.urlRoot += ':' + a.port; 11 | } 12 | $scope.urlRoot += '/'; 13 | var opml = subscriptions.opml(); 14 | $scope.share = function() { 15 | $window.location = $routeParams.url.replace('{subscriptions}', btoa(opml)); 16 | }; 17 | $scope.deny = function() { 18 | $window.location = '/#/subscriptions'; 19 | }; 20 | }]); 21 | -------------------------------------------------------------------------------- /app/scripts/controllers/store.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .controller('StoreController', ['$scope', 'services', 'store', function StoreController($scope, services, store) { 5 | store.forEach(function(a) { 6 | a.installed = services.uses(a.name); 7 | }); 8 | $scope.apps = store; 9 | $scope.services = services; 10 | 11 | $scope.install = function installApp(app) { 12 | app.installed = true; 13 | services.register(app.registration.name, app.registration.url); 14 | }; 15 | 16 | $scope.remove = function removeApp(app) { 17 | app.installed = false; 18 | services.removeService(app.registration.name); 19 | }; 20 | }]); 21 | -------------------------------------------------------------------------------- /app/scripts/controllers/subscriptions.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .controller('SubscriptionsController', ['$scope', 'subscriptions', function SubscriptionsController($scope, subscriptions) { 5 | $scope.subscriptions = subscriptions.all(); 6 | }]); 7 | -------------------------------------------------------------------------------- /app/scripts/directives/browser-specific.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .directive('browserSpecific', ['$window', function($window) { 5 | return { 6 | restrict: 'A', 7 | link: function($scope, $element, $attrs) { 8 | var showed = false; 9 | if($attrs.browserSpecific) { 10 | $attrs.browserSpecific.split(' ').forEach(function(c) { 11 | if($window.navigator.userAgent.toLowerCase().indexOf(c) >= 0) { 12 | showed = true; 13 | } 14 | }); 15 | } 16 | if(showed) { 17 | $element.show(); 18 | } 19 | else { 20 | $element.hide(); 21 | } 22 | } 23 | }; 24 | }]); 25 | -------------------------------------------------------------------------------- /app/scripts/directives/file-picker.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .directive('filePicker', function(){ 5 | return { 6 | link: function($scope, $element){ 7 | $element.on('change', function() { 8 | $scope.file = $element[0].files[0]; 9 | $scope.$apply(); 10 | }); 11 | } 12 | }; 13 | }); 14 | -------------------------------------------------------------------------------- /app/scripts/directives/follow-on.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .directive('followOn', ['$window', function($window) { 5 | return { 6 | restrict: 'A', 7 | link: function($scope, $element, $attrs) { 8 | if($attrs.followOn) { 9 | $element.bind($attrs.followOn, function(evt) { 10 | var z = $window.document.createElement('script'); 11 | if(evt) { 12 | $window.document.subtomeBtn = evt.target; 13 | } 14 | z.src = '/load.js'; 15 | $window.document.body.appendChild(z); 16 | }); 17 | } 18 | } 19 | }; 20 | }]); 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/scripts/directives/hide-on-path.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .directive('hideOnPath', ['$rootScope', '$location' , function($rootScope, $location) { 5 | return { 6 | restrict: 'A', 7 | link: function($scope, $element, $attrs) { 8 | function showOrHide() { 9 | if ($location.path() !== $attrs.hideOnPath) { 10 | $element.show(); 11 | } 12 | else { 13 | $element.hide(); 14 | } 15 | } 16 | $rootScope.$on('$locationChangeSuccess', showOrHide); 17 | } 18 | }; 19 | }]); 20 | -------------------------------------------------------------------------------- /app/scripts/directives/service-button.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .directive('serviceButton', ['$window', 'services', 'subscriptions', 'safeUrl', function($window, services, subscriptions, safeUrl) { 5 | return { 6 | restrict: 'E', 7 | scope: { 8 | service: '=' 9 | }, 10 | templateUrl: '/views/service-button.html', 11 | replace:true, 12 | link: function(scope) { 13 | 14 | scope.service.used = services.uses(scope.service.name); 15 | 16 | scope.open = function() { 17 | var url = scope.service.url; 18 | if(!safeUrl(url)) { 19 | return $window.alert('It looks like this redirect is not safe. Please remove that service from your favorites.'); 20 | } 21 | 22 | var redirect = decodeURIComponent(url).replace('{url}', encodeURIComponent(scope.$parent.resource)); 23 | if(redirect.match(/\{feed\}/)) { 24 | if(scope.$parent.feeds[0]) { 25 | redirect = redirect.replace('{feed}', encodeURIComponent(scope.$parent.feeds[0])); 26 | } 27 | else { 28 | redirect = redirect.replace('{feed}', encodeURIComponent(scope.$parent.resource)); 29 | } 30 | } 31 | if(redirect.match(/\{feeds\}/)) { 32 | redirect = redirect.replace('{feeds}', scope.$parent.feeds.join(',')); 33 | } 34 | subscriptions.add(scope.$parent.resource, {feeds: scope.$parent.feeds, service: scope.service.name}); 35 | var d = document.createElement('a'); 36 | d.href = scope.$parent.resource; 37 | var s = document.createElement('a'); 38 | s.href = url; 39 | $window.parent.postMessage({subscription: { 40 | feeds: scope.$parent.feeds, 41 | resource: scope.$parent.resource, 42 | app: { 43 | name: scope.service.name, 44 | url: s.protocol + '//' + s.host 45 | } 46 | }}, d.protocol + '//' + d.host); 47 | $window.open(redirect); 48 | }; 49 | } 50 | }; 51 | }]); 52 | 53 | 54 | -------------------------------------------------------------------------------- /app/scripts/directives/uses-service.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .directive('usesService', ['$window', 'services', function($window, services) { 5 | return { 6 | restrict: 'A', 7 | link: function($scope, $element) { 8 | 9 | function setClasses() { 10 | $element.addClass('glyphicon'); 11 | if(services.uses($scope.service.name)) { 12 | $element.removeClass('glyphicon-heart'); 13 | $element.addClass('glyphicon-remove'); 14 | } 15 | else { 16 | $element.removeClass('glyphicon-remove'); 17 | $element.addClass('glyphicon-heart'); 18 | } 19 | } 20 | 21 | $scope.toggle = function() { 22 | if(services.uses($scope.service.name)) { 23 | services.removeService($scope.service.name); 24 | } 25 | else { 26 | services.register($scope.service.name, $scope.service.url); 27 | } 28 | setClasses(); 29 | }; 30 | 31 | setClasses(); 32 | } 33 | }; 34 | }]); 35 | -------------------------------------------------------------------------------- /app/scripts/filters/from-now.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .filter('fromNow', ['$window' , function($window) { 5 | return function(dateString) { 6 | return $window.moment(new Date(dateString)).fromNow(); 7 | }; 8 | }]); 9 | 10 | -------------------------------------------------------------------------------- /app/scripts/filters/link-to-home.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .filter('linkToHome', function() { 5 | return function(url) { 6 | var a = document.createElement('a'); 7 | a.href = decodeURIComponent(url); 8 | return a.protocol + '//' + a.host + '/'; 9 | }; 10 | }); 11 | -------------------------------------------------------------------------------- /app/scripts/filters/pick-color.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .filter('pickColor', [function() { 5 | return function pickColor(string) { 6 | var colors = [ 7 | 'background-color: rgb(66, 139, 202)', 8 | 'background-color: rgb(91, 192, 222)', 9 | 'background-color: rgb(240, 173, 78)', 10 | 'background-color: rgb(217, 83, 79);', 11 | 'background-color: rgb(92, 184, 92)', 12 | ]; 13 | var s = 0; 14 | for(var k = 0; k < string.length; k++) { 15 | s += string.charCodeAt(k); 16 | } 17 | return colors[s % colors.length]; 18 | }; 19 | }]); 20 | 21 | -------------------------------------------------------------------------------- /app/scripts/redirect.js: -------------------------------------------------------------------------------- 1 | if(!(window.location.host === 'www.subtome.com' && window.location.protocol === 'https:')) { 2 | window.location = 'https://www.subtome.com' + window.location.pathname + window.location.hash; 3 | } 4 | 5 | -------------------------------------------------------------------------------- /app/scripts/services/file-reader.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .factory('fileReader', function() { 5 | return function(file, onSuccess, onError) { 6 | var reader = new FileReader(); 7 | reader.readAsText(file, 'UTF-8'); 8 | reader.onload = function (evt) { 9 | onSuccess(evt.target.result); 10 | }; 11 | reader.onerror = function () { 12 | onError('Error reading your OPML file. Make sure it\'s valid.'); 13 | }; 14 | }; 15 | }); 16 | -------------------------------------------------------------------------------- /app/scripts/services/opml-parser.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('subtome') 4 | .factory('opmlParser', function() { 5 | return function(contents) { 6 | var parser = new DOMParser(); 7 | var opml = parser.parseFromString(contents, 'text/xml'); 8 | var outlines = opml.getElementsByTagName('outline'); 9 | var subscriptions = []; 10 | for(var i=0; i hr { 41 | margin: 30px 0; 42 | } 43 | 44 | /* Main marketing message and sign up button */ 45 | .jumbotron { 46 | text-align: center; 47 | border-bottom: 1px solid #e5e5e5; 48 | } 49 | .jumbotron .btn { 50 | font-size: 21px; 51 | padding: 14px 24px; 52 | } 53 | 54 | /* Supporting marketing content */ 55 | .marketing { 56 | margin: 40px 0; 57 | } 58 | .marketing p + h4 { 59 | margin-top: 28px; 60 | } 61 | 62 | /* Responsive: Portrait tablets and up */ 63 | @media screen and (min-width: 768px) { 64 | /* Remove the padding we set earlier */ 65 | .header, 66 | .marketing, 67 | .footer { 68 | padding-left: 0; 69 | padding-right: 0; 70 | } 71 | /* Space out the masthead */ 72 | .header { 73 | margin-bottom: 30px; 74 | } 75 | /* Remove the bottom border on the jumbotron for visual effect */ 76 | .jumbotron { 77 | border-bottom: 0; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /app/subtome-feedburner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/app/subtome-feedburner.png -------------------------------------------------------------------------------- /app/views/export.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/views/import.html: -------------------------------------------------------------------------------- 1 |

Import

2 |

3 | Import your OPML file to subscribe to more feeds in your favorite reader. 4 |

5 | 6 | 7 | 8 | 9 | 12 | 13 |
{{subscription.title || subscription.html || subscription.feed}} 10 | Follow 11 |
14 | 15 | 16 |

Most RSS readers will allow you to export your subscription list.

17 | 18 | -------------------------------------------------------------------------------- /app/views/main.html: -------------------------------------------------------------------------------- 1 |
2 | 7 |

subtome com

8 |
9 | 10 |
11 |

'Allo, 'Allo!

12 |

13 | I'm Yeoman
14 | Always a pleasure scaffolding your apps. 15 |

16 |

Splendid!

17 |
18 | 19 |
20 |

HTML5 Boilerplate

21 |

22 | HTML5 Boilerplate is a professional front-end template for building fast, robust, and adaptable web apps or sites. 23 |

24 | 25 |

Angular

26 |

27 | AngularJS is a toolset for building the framework most suited to your application development. 28 |

29 | 30 |

Karma

31 |

Spectacular Test Runner for JavaScript.

32 |
33 | 34 | 37 | -------------------------------------------------------------------------------- /app/views/publishers.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/views/redirect.html: -------------------------------------------------------------------------------- 1 |

{{info}}

2 | -------------------------------------------------------------------------------- /app/views/register.html: -------------------------------------------------------------------------------- 1 |

{{service.name}}

2 |

3 | was successfully registered as one of your favorite apps. 4 |

5 |

6 | You can now safely close this window. 7 |

8 | 9 | -------------------------------------------------------------------------------- /app/views/service-button.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | -------------------------------------------------------------------------------- /app/views/settings.html: -------------------------------------------------------------------------------- 1 |

2 | Drag and drop this Subscribe bookmarklet into your bookmark bar 3 | or install this Chrome Extension, 4 | or install this Firefox Add-On, 5 | to subscribe to pages without a subscribe button.

6 |

Subscribing applications

7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
Name of ServiceAdded On 
{{service.name}}{{service.addedOn | fromNow}}
19 |

You currently do not use any reader.

20 |

21 | New services are added automatically when they register with SubToMe. Check our suggested apps. 22 |

23 | -------------------------------------------------------------------------------- /app/views/share.html: -------------------------------------------------------------------------------- 1 |

Sharing

2 | 3 |
4 |

It looks like the service {{urlRoot}} wants SubToMe to share your subscription list with them. Do you allow that?

5 | 6 | 7 |
8 |
9 |

We can't share your subscriptions if you do not supply the url of the service you want us to share them with!

10 | 11 |
12 | -------------------------------------------------------------------------------- /app/views/store.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

4 | {{app.name}} 5 |

6 |
7 | {{tag}} 8 |
9 |

{{app.description}}

10 | 11 |  Installed 12 | 13 | 14 |
15 |
16 | -------------------------------------------------------------------------------- /app/views/subscriptions.html: -------------------------------------------------------------------------------- 1 |

Subscriptions

2 |

3 | Here is the list of sites to which you've subscribed using SubToMe. 4 |

5 | 6 |

7 | It appears that you are not following any website yet. Make sure you start following some soon! 8 |

9 | 10 | 11 | 12 | 13 | 16 | 17 |
{{subscription[0]}} 14 | {{sub.service}}  15 |
18 | 19 |

OPML

20 |

21 | OPML is an open web standard for lists of subscriptions. It is supported by several feed readers to export and import your existing subscriptions between services. 22 |

23 | Import 24 | Export 25 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "subtome", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "angular": "1.2.6", 6 | "jquery": "~1.10.2", 7 | "bootstrap": "~3.0.3", 8 | "angular-resource": "1.2.6", 9 | "angular-sanitize": "1.2.6", 10 | "angular-route": "1.2.6", 11 | "i18next": "~1.8.0", 12 | "ng-i18next": "~0.2.9", 13 | "moment": "~2.5.1", 14 | "bootstrap-modal": "~2.1.0" 15 | }, 16 | "devDependencies": { 17 | "angular-mocks": "1.2.6", 18 | "angular-scenario": "1.2.6" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /goodies/chrome/extension/background.js: -------------------------------------------------------------------------------- 1 | chrome.browserAction.onClicked.addListener(function(tab) { 2 | var script = "(function(){var z=document.createElement('script');z.src='https://s3.amazonaws.com/www.subtome.com/load.js';document.body.appendChild(z);})()" 3 | chrome.tabs.executeScript(tab.id, {code: script}); 4 | }); 5 | -------------------------------------------------------------------------------- /goodies/chrome/extension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | "name": "SubToMe", 4 | "description": "The universal subscribe button", 5 | "version": "1.1", 6 | "background": { 7 | "scripts": [ 8 | "background.js" 9 | ] 10 | }, 11 | "permissions": [ 12 | "tabs", "http://*/*", "https://*/*" 13 | ], 14 | "browser_action": { 15 | "default_icon": "subscribe-icon-48.png", 16 | "default_title": "Subscribe" 17 | }, 18 | "icons": { 19 | "128": "subscribe-icon-128.png", 20 | "48": "subscribe-icon-48.png" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /goodies/chrome/extension/subscribe-icon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/goodies/chrome/extension/subscribe-icon-128.png -------------------------------------------------------------------------------- /goodies/chrome/extension/subscribe-icon-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/goodies/chrome/extension/subscribe-icon-48.png -------------------------------------------------------------------------------- /goodies/chrome/store-material/extension-1.0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/goodies/chrome/store-material/extension-1.0.zip -------------------------------------------------------------------------------- /goodies/chrome/store-material/extension-1.1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/goodies/chrome/store-material/extension-1.1.zip -------------------------------------------------------------------------------- /goodies/chrome/store-material/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/goodies/chrome/store-material/screenshot.png -------------------------------------------------------------------------------- /goodies/firefox/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/goodies/firefox/.gitignore -------------------------------------------------------------------------------- /goodies/firefox/src/data/no-feed.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | -------------------------------------------------------------------------------- /goodies/firefox/src/data/subtome.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | var feeds = []; 3 | var links = document.getElementsByTagName('link'); 4 | for (var i = 0; i < links.length; i++) { 5 | if (links[i].rel) { 6 | if (links[i].rel.split(' ').indexOf('alternate') >= 0) { 7 | if (links[i].href && links[i].href.length > 0) { 8 | feeds.push(encodeURIComponent(links[i].href)); 9 | } 10 | } 11 | } 12 | } 13 | 14 | if (feeds.length > 0) { 15 | var s = document.createElement('iframe'); 16 | var resource = window.location.toString(); 17 | s.setAttribute('style', 'position:fixed;top:0px; left:0px; width:100%; height:100%; border:0px; background: transparent; z-index: 2147483647'); 18 | s.setAttribute('src', '//www.subtome.com/subscribe.html?resource=' + encodeURIComponent(resource) + '&feeds=' + feeds.join(',')); 19 | var loaded = false; 20 | s.onload = function () { 21 | if (loaded) { 22 | document.getElementsByTagName('body')[0].removeChild(s); 23 | } 24 | loaded = true; 25 | } 26 | document.getElementsByTagName('body')[0].appendChild(s); 27 | } else { 28 | self.port.emit('pageHasNoFeed', 'true'); 29 | } 30 | })(); 31 | -------------------------------------------------------------------------------- /goodies/firefox/src/data/toolbar-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/goodies/firefox/src/data/toolbar-icon.png -------------------------------------------------------------------------------- /goodies/firefox/src/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/goodies/firefox/src/icon.png -------------------------------------------------------------------------------- /goodies/firefox/src/lib/main.js: -------------------------------------------------------------------------------- 1 | const _ = require('sdk/l10n').get; 2 | const data = require('sdk/self').data; 3 | const panels = require('sdk/panel'); 4 | const tabs = require('sdk/tabs'); 5 | const widgets = require('sdk/widget'); 6 | 7 | exports.main = function () { 8 | const panel = panels.Panel({ 9 | height : 38, 10 | contentURL : data.url('no-feed.html') 11 | }); 12 | 13 | const widget = widgets.Widget({ 14 | id : 'subtome', 15 | label : _('SUBSCRIBE_TO_PAGE'), 16 | contentURL : data.url('toolbar-icon.png'), 17 | onClick : function () { 18 | var worker = tabs.activeTab.attach({ 19 | contentScriptFile : data.url('subtome.js') 20 | }); 21 | 22 | worker.port.on('pageHasNoFeed', function () { 23 | panel.show(); 24 | }); 25 | } 26 | }); 27 | }; 28 | -------------------------------------------------------------------------------- /goodies/firefox/src/locale/de.properties: -------------------------------------------------------------------------------- 1 | PAGE_NO_FEED = Diese Webseite hat keinen Feed. 2 | SUBSCRIBE_TO_PAGE = Diese Seite abonnieren 3 | -------------------------------------------------------------------------------- /goodies/firefox/src/locale/en-US.properties: -------------------------------------------------------------------------------- 1 | PAGE_NO_FEED = This page has no feed. 2 | SUBSCRIBE_TO_PAGE = Subscribe to this page 3 | -------------------------------------------------------------------------------- /goodies/firefox/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "subtome", 3 | "license" : "MPL 2.0", 4 | "author" : "Sören Hentzschel", 5 | "version" : "1.0", 6 | "fullName" : "SubToMe - Universal Follow Button", 7 | "id" : "subtome@soeren-hentzschel.at", 8 | "description" : "SubToMe makes it easy for people to follow web sites, because browsers don't." 9 | } 10 | -------------------------------------------------------------------------------- /goodies/firefox/subtome.xpi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/goodies/firefox/subtome.xpi -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/entries: -------------------------------------------------------------------------------- 1 | 12 2 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/format: -------------------------------------------------------------------------------- 1 | 12 2 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/pristine/17/17fecbe9448adf41b390abca492f399c673c7659.svn-base: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | Version: 1.4 3 | Contributors: julien51, pfefferle 4 | Donate link: http://www.subtome.com/ 5 | Requires at least: 3.3.1 6 | Tested up to: 3.7 7 | Stable tag: 4.3 8 | License: GPLv2 or later 9 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 10 | Tags: SubToMe, Follow, Follow Button, Subscribe, Subscribe Button, Follow Button for Wordpress.org users, Follow button for non Wordpress.com users, RSS, Follow RSS, RSS Button, widget, subscribe, subscription 11 | 12 | This widget adds a [SubToMe](http://www.subtome.com/) button to your blog and allows people to subscribe to your content in one click. 13 | 14 | == Description == 15 | 16 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 17 | 18 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 19 | 20 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 21 | 22 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 23 | 24 | == Installation == 25 | 26 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 27 | 2. Activate the plugin through the 'Plugins' menu in WordPress 28 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 29 | 30 | == Credits == 31 | 32 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate), [Matthias Pfefferle](http://notizblog.org/) for his precious help, mostly with version 1.3! 33 | 34 | == Changelog == 35 | 36 | == 1.4 = 37 | * Updated README. More tests* 38 | 39 | = 1.3 = 40 | * Simplified plugin 41 | * Added shortcode 42 | 43 | = 1.0 = 44 | * First version 45 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/pristine/26/266b29620916498637910e93e8e2013dbf8f9573.svn-base: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | 3 | Version: 1.3 4 | Contributors: julien51 5 | Donate link: http://www.subtome.com/ 6 | Tags: widget, subscribe, subscription, subtome 7 | Requires at least: 3.3.1 8 | Tested up to: 3.3.1 9 | Stable tag: 4.3 10 | License: GPLv2 or later 11 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 12 | 13 | This publish adds a SubToMe widget to your blog and allows people 14 | to subscribe to your content in one click. 15 | 16 | The widget will show a button, that, when clicked will load a litte snippet of code which will know what are your readers favorite subscription application. 17 | 18 | == Description == 19 | 20 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 21 | 22 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 23 | 24 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 25 | 26 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 27 | 28 | == Installation == 29 | 30 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 31 | 2. Activate the plugin through the 'Plugins' menu in WordPress 32 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 33 | 34 | == Credits == 35 | 36 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate), [Matthias Pfefferle](http://notizblog.org/) for his precious help, mostly with version 1.3! 37 | 38 | == Changelog == 39 | 40 | = 1.3 = 41 | * Simplified plugin 42 | * Added shortcode 43 | 44 | = 1.0 = 45 | * First version 46 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/pristine/4a/4a4411bcdb2b22f5301356315d348ae1d2e2e3ce.svn-base: -------------------------------------------------------------------------------- 1 | 2 |

3 | 4 | 5 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/pristine/6c/6c91529f5c1a3cec6a3efe0ce3721f3955f26951.svn-base: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/goodies/wordpress/subtome/.svn/pristine/6c/6c91529f5c1a3cec6a3efe0ce3721f3955f26951.svn-base -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/pristine/84/841251f9508f13fb01f0f7b1c674ac4d7367acb4.svn-base: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: SubToMe WordPress Widget\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2013-03-05 15:16+0100\n" 6 | "PO-Revision-Date: 2013-03-05 15:16+0100\n" 7 | "Last-Translator: Matthias Pfefferle \n" 8 | "Language-Team: Julien Genestoux \n" 9 | "Language: en_US\n" 10 | "MIME-Version: 1.0\n" 11 | "Content-Type: text/plain; charset=UTF-8\n" 12 | "Content-Transfer-Encoding: 8bit\n" 13 | "X-Poedit-KeywordsList: __;_e\n" 14 | "X-Poedit-Basepath: .\n" 15 | "X-Poedit-SourceCharset: utf-8\n" 16 | "X-Generator: Poedit 1.5.5\n" 17 | "X-Poedit-SearchPath-0: ..\n" 18 | 19 | #: ../plugin.php:49 20 | msgid "SubToMe" 21 | msgstr "" 22 | 23 | #: ../plugin.php:52 24 | msgid "Universal Subscribe Button." 25 | msgstr "" 26 | 27 | #: ../plugin.php:113 28 | msgid "Title:" 29 | msgstr "" 30 | 31 | #: ../plugin.php:114 32 | msgid "Caption:" 33 | msgstr "" 34 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/pristine/9b/9b6ca126cc5d5d6d34a622cabd6f86e8c4704833.svn-base: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | 3 | Version: 1.4 4 | Contributors: julien51, pfefferle 5 | Donate link: http://www.subtome.com/ 6 | Requires at least: 3.3.1 7 | Tested up to: 3.7 8 | Stable tag: 4.3 9 | License: GPLv2 or later 10 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 11 | Tags: SubToMe, Follow, Follow Button, Subscribe, Subscribe Button, Follow Button for Wordpress.org users, Follow button for non Wordpress.com users, RSS, Follow RSS, RSS Button, widget, subscribe, subscription 12 | Author URI: http://www.subtome.com/ 13 | 14 | This widget adds a SubToMe button to your blog and allows people 15 | to subscribe to your content in one click. 16 | 17 | The widget will show a button, that, when clicked will load a litte snippet of code which will know what are your readers favorite subscription application. 18 | 19 | == Description == 20 | 21 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 22 | 23 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 24 | 25 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 26 | 27 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 28 | 29 | == Installation == 30 | 31 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 32 | 2. Activate the plugin through the 'Plugins' menu in WordPress 33 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 34 | 35 | == Credits == 36 | 37 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate), [Matthias Pfefferle](http://notizblog.org/) for his precious help, mostly with version 1.3! 38 | 39 | == Changelog == 40 | 41 | == 1.4 = 42 | * Updated README. More tests* 43 | 44 | = 1.3 = 45 | * Simplified plugin 46 | * Added shortcode 47 | 48 | = 1.0 = 49 | * First version 50 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/pristine/a1/a15fbc0031edc84d8dc676073cf35f92f50ba999.svn-base: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: SubToMe WordPress Widget\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2013-02-14 00:00-0000\n" 6 | "PO-Revision-Date: 2013-02-14 00:00-0000\n" 7 | "Last-Translator: \n" 8 | "Language-Team: Julien Genestoux \n" 9 | "MIME-Version: 1.0\n" 10 | "Content-Type: text/plain; charset=UTF-8\n" 11 | "Content-Transfer-Encoding: 8bit\n" 12 | "X-Poedit-KeywordsList: __;_e\n" 13 | "X-Poedit-Basepath: .\n" 14 | "X-Poedit-Language: English\n" 15 | "X-Poedit-Country: UNITED STATES\n" 16 | "X-Poedit-SourceCharset: utf-8\n" 17 | "X-Poedit-SearchPath-0: ..\n" 18 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/pristine/a7/a76ad501ba9fe18326aa41027ded8fc8d041b54e.svn-base: -------------------------------------------------------------------------------- 1 |

2 | 5 |

6 |

7 | 10 |

11 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/pristine/ae/aed0a3e7ca34906e874c42c5c24ddb05e8d47123.svn-base: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | 3 | Version: 1.2 4 | Contributors: julien51 5 | Donate link: http://www.subtome.com/ 6 | Tags: widget, subscribe, subscription, subtome 7 | Requires at least: 3.3.1 8 | Tested up to: 3.3.1 9 | Stable tag: 4.3 10 | License: GPLv2 or later 11 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 12 | 13 | This publish adds a SubToMe widget to your blog and allows people 14 | to subscribe to your content in one click. 15 | 16 | The widget will show a button, that, when clicked will load a litte snippet of code which will know what are your readers favorite subscription application. 17 | 18 | == Description == 19 | 20 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 21 | 22 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 23 | 24 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 25 | 26 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 27 | 28 | == Installation == 29 | 30 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 31 | 2. Activate the plugin through the 'Plugins' menu in WordPress 32 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 33 | 34 | == Credits == 35 | 36 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate) 37 | 38 | == Changelog == 39 | 40 | = 1.0 = 41 | * First version 42 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/pristine/b9/b99d9c5f748982398bf56da1b69a4303eba638af.svn-base: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | 3 | Version: 1.1 4 | Contributors: julien51 5 | Donate link: http://www.subtome.com/ 6 | Tags: widget, subscribe, subscription, subtome 7 | Requires at least: 3.3.1 8 | Tested up to: 3.3.1 9 | Stable tag: 4.3 10 | License: GPLv2 or later 11 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 12 | 13 | This publish adds a SubToMe widget to your blog and allows people 14 | to subscribe to your content in one click. 15 | 16 | The widget will show a button, that, when clicked will load a litte snippet of code which will know what are your readers favorite subscription application. 17 | 18 | == Description == 19 | 20 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 21 | 22 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 23 | 24 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 25 | 26 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 27 | 28 | == Installation == 29 | 30 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 31 | 2. Activate the plugin through the 'Plugins' menu in WordPress 32 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 33 | 34 | == Credits == 35 | 36 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate) 37 | 38 | == Changelog == 39 | 40 | = 1.0 = 41 | * First version 42 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/pristine/d2/d2572a167408758f8a113146af09af1f22428226.svn-base: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | 3 | Version: 1.3 4 | Contributors: julien51, pfefferle 5 | Donate link: http://www.subtome.com/ 6 | Requires at least: 3.3.1 7 | Tested up to: 3.7 8 | Stable tag: 4.3 9 | License: GPLv2 or later 10 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 11 | Tags: SubToMe, Follow, Follow Button, Subscribe, Subscribe Button, Follow Button for Wordpress.org users, Follow button for non Wordpress.com users, RSS, Follow RSS, RSS Button, widget, subscribe, subscription 12 | Author URI: http://www.subtome.com/ 13 | 14 | This widget adds a SubToMe button to your blog and allows people 15 | to subscribe to your content in one click. 16 | 17 | The widget will show a button, that, when clicked will load a litte snippet of code which will know what are your readers favorite subscription application. 18 | 19 | == Description == 20 | 21 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 22 | 23 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 24 | 25 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 26 | 27 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 28 | 29 | == Installation == 30 | 31 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 32 | 2. Activate the plugin through the 'Plugins' menu in WordPress 33 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 34 | 35 | == Credits == 36 | 37 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate), [Matthias Pfefferle](http://notizblog.org/) for his precious help, mostly with version 1.3! 38 | 39 | == Changelog == 40 | 41 | = 1.3 = 42 | * Simplified plugin 43 | * Added shortcode 44 | 45 | = 1.0 = 46 | * First version 47 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/pristine/d3/d302c7e78a9de27e7dffcf2672ddc1245e4a1baa.svn-base: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | 3 | Version: 1.1 4 | Contributors: julien51 5 | Donate link: http://www.subtome.com/ 6 | Tags: widget, subscribe, subscription, subtome 7 | Requires at least: 3.3.1 8 | Tested up to: 3.3.1 9 | Stable tag: 4.3 10 | License: GPLv2 or later 11 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 12 | 13 | This publish adds a SubToMe widget to your blog and allows people 14 | to subscribe to your content in one click. 15 | 16 | The widget will show a button, that, when clicked will load a litte snippet of code which will know what are your readers favorite subscription application. 17 | 18 | == Description == 19 | 20 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 21 | 22 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 23 | 24 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 25 | 26 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 27 | 28 | == Installation == 29 | 30 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 31 | 2. Activate the plugin through the 'Plugins' menu in WordPress 32 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 33 | 34 | == Credits == 35 | 36 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate) 37 | 38 | == Changelog == 39 | 40 | = 1.1 = 41 | * Minor README changes 42 | 43 | = 1.0 = 44 | * First version 45 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/pristine/ed/ed057c9cc6594c65e719fd6066aad4e69032893a.svn-base: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | Version: 1.4 3 | Contributors: julien51, pfefferle 4 | Donate link: http://www.subtome.com/ 5 | Requires at least: 3.3.1 6 | Tested up to: 3.7 7 | Stable tag: 4.3 8 | License: GPLv2 or later 9 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 10 | Tags: SubToMe, Follow, Follow Button, Subscribe, Subscribe Button, Follow Button for Wordpress.org users, Follow button for non Wordpress.com users, RSS, Follow RSS, RSS Button, widget, subscribe, subscription 11 | 12 | This widget adds a SubToMe button to your blog and allows people to subscribe to your content in one click. 13 | 14 | == Description == 15 | 16 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 17 | 18 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 19 | 20 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 21 | 22 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 23 | 24 | == Installation == 25 | 26 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 27 | 2. Activate the plugin through the 'Plugins' menu in WordPress 28 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 29 | 30 | == Credits == 31 | 32 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate), [Matthias Pfefferle](http://notizblog.org/) for his precious help, mostly with version 1.3! 33 | 34 | == Changelog == 35 | 36 | == 1.4 = 37 | * Updated README. More tests* 38 | 39 | = 1.3 = 40 | * Simplified plugin 41 | * Added shortcode 42 | 43 | = 1.0 = 44 | * First version 45 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/.svn/wc.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/goodies/wordpress/subtome/.svn/wc.db -------------------------------------------------------------------------------- /goodies/wordpress/subtome/assets/banner-772x250.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/goodies/wordpress/subtome/assets/banner-772x250.png -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.1/README.txt: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | 3 | Version: 1.1 4 | Contributors: julien51 5 | Donate link: http://www.subtome.com/ 6 | Tags: widget, subscribe, subscription, subtome 7 | Requires at least: 3.3.1 8 | Tested up to: 3.3.1 9 | Stable tag: 4.3 10 | License: GPLv2 or later 11 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 12 | 13 | This publish adds a SubToMe widget to your blog and allows people 14 | to subscribe to your content in one click. 15 | 16 | The widget will show a button, that, when clicked will load a litte snippet of code which will know what are your readers favorite subscription application. 17 | 18 | == Description == 19 | 20 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 21 | 22 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 23 | 24 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 25 | 26 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 27 | 28 | == Installation == 29 | 30 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 31 | 2. Activate the plugin through the 'Plugins' menu in WordPress 32 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 33 | 34 | == Credits == 35 | 36 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate) 37 | 38 | == Changelog == 39 | 40 | = 1.1 = 41 | * Minor README changes 42 | 43 | = 1.0 = 44 | * First version 45 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.1/lang/plugin.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: SubToMe WordPress Widget\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2013-02-14 00:00-0000\n" 6 | "PO-Revision-Date: 2013-02-14 00:00-0000\n" 7 | "Last-Translator: \n" 8 | "Language-Team: Julien Genestoux \n" 9 | "MIME-Version: 1.0\n" 10 | "Content-Type: text/plain; charset=UTF-8\n" 11 | "Content-Transfer-Encoding: 8bit\n" 12 | "X-Poedit-KeywordsList: __;_e\n" 13 | "X-Poedit-Basepath: .\n" 14 | "X-Poedit-Language: English\n" 15 | "X-Poedit-Country: UNITED STATES\n" 16 | "X-Poedit-SourceCharset: utf-8\n" 17 | "X-Poedit-SearchPath-0: ..\n" 18 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.1/trunk/README.txt: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | 3 | Version: 1.1 4 | Contributors: julien51 5 | Donate link: http://www.subtome.com/ 6 | Tags: widget, subscribe, subscription, subtome 7 | Requires at least: 3.3.1 8 | Tested up to: 3.3.1 9 | Stable tag: 4.3 10 | License: GPLv2 or later 11 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 12 | 13 | This publish adds a SubToMe widget to your blog and allows people 14 | to subscribe to your content in one click. 15 | 16 | The widget will show a button, that, when clicked will load a litte snippet of code which will know what are your readers favorite subscription application. 17 | 18 | == Description == 19 | 20 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 21 | 22 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 23 | 24 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 25 | 26 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 27 | 28 | == Installation == 29 | 30 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 31 | 2. Activate the plugin through the 'Plugins' menu in WordPress 32 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 33 | 34 | == Credits == 35 | 36 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate) 37 | 38 | == Changelog == 39 | 40 | = 1.0 = 41 | * First version 42 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.1/trunk/lang/plugin.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: SubToMe WordPress Widget\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2013-02-14 00:00-0000\n" 6 | "PO-Revision-Date: 2013-02-14 00:00-0000\n" 7 | "Last-Translator: \n" 8 | "Language-Team: Julien Genestoux \n" 9 | "MIME-Version: 1.0\n" 10 | "Content-Type: text/plain; charset=UTF-8\n" 11 | "Content-Transfer-Encoding: 8bit\n" 12 | "X-Poedit-KeywordsList: __;_e\n" 13 | "X-Poedit-Basepath: .\n" 14 | "X-Poedit-Language: English\n" 15 | "X-Poedit-Country: UNITED STATES\n" 16 | "X-Poedit-SourceCharset: utf-8\n" 17 | "X-Poedit-SearchPath-0: ..\n" 18 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.1/trunk/views/admin.php: -------------------------------------------------------------------------------- 1 |

2 | 5 |

6 |

7 | 10 |

11 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.1/trunk/views/widget.php: -------------------------------------------------------------------------------- 1 | 2 |

3 | 4 | 5 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.1/views/admin.php: -------------------------------------------------------------------------------- 1 |

2 | 5 |

6 |

7 | 10 |

11 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.1/views/widget.php: -------------------------------------------------------------------------------- 1 | 2 |

3 | 4 | 5 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.2/README.txt: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | 3 | Version: 1.2 4 | Contributors: julien51 5 | Donate link: http://www.subtome.com/ 6 | Tags: widget, subscribe, subscription, subtome 7 | Requires at least: 3.3.1 8 | Tested up to: 3.3.1 9 | Stable tag: 4.3 10 | License: GPLv2 or later 11 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 12 | 13 | This publish adds a SubToMe widget to your blog and allows people 14 | to subscribe to your content in one click. 15 | 16 | The widget will show a button, that, when clicked will load a litte snippet of code which will know what are your readers favorite subscription application. 17 | 18 | == Description == 19 | 20 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 21 | 22 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 23 | 24 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 25 | 26 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 27 | 28 | == Installation == 29 | 30 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 31 | 2. Activate the plugin through the 'Plugins' menu in WordPress 32 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 33 | 34 | == Credits == 35 | 36 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate) 37 | 38 | == Changelog == 39 | 40 | = 1.0 = 41 | * First version 42 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.2/lang/plugin.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: SubToMe WordPress Widget\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2013-02-14 00:00-0000\n" 6 | "PO-Revision-Date: 2013-02-14 00:00-0000\n" 7 | "Last-Translator: \n" 8 | "Language-Team: Julien Genestoux \n" 9 | "MIME-Version: 1.0\n" 10 | "Content-Type: text/plain; charset=UTF-8\n" 11 | "Content-Transfer-Encoding: 8bit\n" 12 | "X-Poedit-KeywordsList: __;_e\n" 13 | "X-Poedit-Basepath: .\n" 14 | "X-Poedit-Language: English\n" 15 | "X-Poedit-Country: UNITED STATES\n" 16 | "X-Poedit-SourceCharset: utf-8\n" 17 | "X-Poedit-SearchPath-0: ..\n" 18 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.2/views/admin.php: -------------------------------------------------------------------------------- 1 |

2 | 5 |

6 |

7 | 10 |

11 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.2/views/widget.php: -------------------------------------------------------------------------------- 1 | 2 |

3 | 4 | 5 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.3/README.txt: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | 3 | Version: 1.3 4 | Contributors: julien51 5 | Donate link: http://www.subtome.com/ 6 | Tags: widget, subscribe, subscription, subtome 7 | Requires at least: 3.3.1 8 | Tested up to: 3.3.1 9 | Stable tag: 4.3 10 | License: GPLv2 or later 11 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 12 | 13 | This publish adds a SubToMe widget to your blog and allows people 14 | to subscribe to your content in one click. 15 | 16 | The widget will show a button, that, when clicked will load a litte snippet of code which will know what are your readers favorite subscription application. 17 | 18 | == Description == 19 | 20 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 21 | 22 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 23 | 24 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 25 | 26 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 27 | 28 | == Installation == 29 | 30 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 31 | 2. Activate the plugin through the 'Plugins' menu in WordPress 32 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 33 | 34 | == Credits == 35 | 36 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate), [Matthias Pfefferle](http://notizblog.org/) for his precious help, mostly with version 1.3! 37 | 38 | == Changelog == 39 | 40 | = 1.3 = 41 | * Simplified plugin 42 | * Added shortcode 43 | 44 | = 1.0 = 45 | * First version 46 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.3/lang/plugin.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: SubToMe WordPress Widget\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2013-03-05 15:16+0100\n" 6 | "PO-Revision-Date: 2013-03-05 15:16+0100\n" 7 | "Last-Translator: Matthias Pfefferle \n" 8 | "Language-Team: Julien Genestoux \n" 9 | "Language: en_US\n" 10 | "MIME-Version: 1.0\n" 11 | "Content-Type: text/plain; charset=UTF-8\n" 12 | "Content-Transfer-Encoding: 8bit\n" 13 | "X-Poedit-KeywordsList: __;_e\n" 14 | "X-Poedit-Basepath: .\n" 15 | "X-Poedit-SourceCharset: utf-8\n" 16 | "X-Generator: Poedit 1.5.5\n" 17 | "X-Poedit-SearchPath-0: ..\n" 18 | 19 | #: ../plugin.php:49 20 | msgid "SubToMe" 21 | msgstr "" 22 | 23 | #: ../plugin.php:52 24 | msgid "Universal Subscribe Button." 25 | msgstr "" 26 | 27 | #: ../plugin.php:113 28 | msgid "Title:" 29 | msgstr "" 30 | 31 | #: ../plugin.php:114 32 | msgid "Caption:" 33 | msgstr "" 34 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.4/README.txt: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | Version: 1.4 3 | Contributors: julien51, pfefferle 4 | Donate link: http://www.subtome.com/ 5 | Requires at least: 3.3.1 6 | Tested up to: 3.7 7 | Stable tag: 4.3 8 | License: GPLv2 or later 9 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 10 | Tags: SubToMe, Follow, Follow Button, Subscribe, Subscribe Button, Follow Button for Wordpress.org users, Follow button for non Wordpress.com users, RSS, Follow RSS, RSS Button, widget, subscribe, subscription 11 | 12 | This widget adds a SubToMe button to your blog and allows people to subscribe to your content in one click. 13 | 14 | == Description == 15 | 16 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 17 | 18 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 19 | 20 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 21 | 22 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 23 | 24 | == Installation == 25 | 26 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 27 | 2. Activate the plugin through the 'Plugins' menu in WordPress 28 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 29 | 30 | == Credits == 31 | 32 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate), [Matthias Pfefferle](http://notizblog.org/) for his precious help, mostly with version 1.3! 33 | 34 | == Changelog == 35 | 36 | == 1.4 = 37 | * Updated README. More tests* 38 | 39 | = 1.3 = 40 | * Simplified plugin 41 | * Added shortcode 42 | 43 | = 1.0 = 44 | * First version 45 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/tags/1.4/lang/plugin.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: SubToMe WordPress Widget\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2013-03-05 15:16+0100\n" 6 | "PO-Revision-Date: 2013-03-05 15:16+0100\n" 7 | "Last-Translator: Matthias Pfefferle \n" 8 | "Language-Team: Julien Genestoux \n" 9 | "Language: en_US\n" 10 | "MIME-Version: 1.0\n" 11 | "Content-Type: text/plain; charset=UTF-8\n" 12 | "Content-Transfer-Encoding: 8bit\n" 13 | "X-Poedit-KeywordsList: __;_e\n" 14 | "X-Poedit-Basepath: .\n" 15 | "X-Poedit-SourceCharset: utf-8\n" 16 | "X-Generator: Poedit 1.5.5\n" 17 | "X-Poedit-SearchPath-0: ..\n" 18 | 19 | #: ../plugin.php:49 20 | msgid "SubToMe" 21 | msgstr "" 22 | 23 | #: ../plugin.php:52 24 | msgid "Universal Subscribe Button." 25 | msgstr "" 26 | 27 | #: ../plugin.php:113 28 | msgid "Title:" 29 | msgstr "" 30 | 31 | #: ../plugin.php:114 32 | msgid "Caption:" 33 | msgstr "" 34 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/trunk/README.txt: -------------------------------------------------------------------------------- 1 | === SubToMe === 2 | Version: 1.4 3 | Contributors: julien51, pfefferle 4 | Donate link: http://www.subtome.com/ 5 | Requires at least: 3.3.1 6 | Tested up to: 3.7 7 | Stable tag: 4.3 8 | License: GPLv2 or later 9 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 10 | Tags: SubToMe, Follow, Follow Button, Subscribe, Subscribe Button, RSS, Follow RSS, RSS Button, widget, subscribe, subscription, sidebar, button, feed, follow feed, subscribe feed, feeds, javascript 11 | 12 | This widget adds a SubToMe button to your blog and allows people to subscribe to your content in one click. 13 | 14 | == Description == 15 | 16 | This widget adds a [SubToMe](http://www.subtome.com/) button to your Wordpress blog. This button allows your readers to follow your blog using their **favorite** applications. 17 | 18 | If the user clicks the button, then, it will load an external iframe with Javascript. The iframe will show the user the list of their favorite subscription tools. Once they pick one, they're redirect to it with your blog information. 19 | 20 | The user information is stored in the browser, but is only accessible on the domain `subtome.com`, which is why we hae to load the iframe. 21 | 22 | No data is ever "leaked". The whole [SubToMe code](https://github.com/superfeedr/subtome) is open source. Feel free to check it out by yourself. 23 | 24 | == Installation == 25 | 26 | 1. Upload the plugin directory to the `/wp-content/plugins/` directory 27 | 2. Activate the plugin through the 'Plugins' menu in WordPress 28 | 2. Add the widget to your layout from the 'Widget' submenu in WordPress 29 | 30 | == Credits == 31 | 32 | [Wordpress Widget Boilerplate](https://github.com/tommcfarlin/WordPress-Widget-Boilerplate), [Matthias Pfefferle](http://notizblog.org/) for his precious help, mostly with version 1.3! 33 | 34 | == Changelog == 35 | 36 | == 1.4 = 37 | * Updated README. More tests* 38 | 39 | = 1.3 = 40 | * Simplified plugin 41 | * Added shortcode 42 | 43 | = 1.0 = 44 | * First version 45 | -------------------------------------------------------------------------------- /goodies/wordpress/subtome/trunk/lang/plugin.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: SubToMe WordPress Widget\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2013-03-05 15:16+0100\n" 6 | "PO-Revision-Date: 2013-03-05 15:16+0100\n" 7 | "Last-Translator: Matthias Pfefferle \n" 8 | "Language-Team: Julien Genestoux \n" 9 | "Language: en_US\n" 10 | "MIME-Version: 1.0\n" 11 | "Content-Type: text/plain; charset=UTF-8\n" 12 | "Content-Transfer-Encoding: 8bit\n" 13 | "X-Poedit-KeywordsList: __;_e\n" 14 | "X-Poedit-Basepath: .\n" 15 | "X-Poedit-SourceCharset: utf-8\n" 16 | "X-Generator: Poedit 1.5.5\n" 17 | "X-Poedit-SearchPath-0: ..\n" 18 | 19 | #: ../plugin.php:49 20 | msgid "SubToMe" 21 | msgstr "" 22 | 23 | #: ../plugin.php:52 24 | msgid "Universal Subscribe Button." 25 | msgstr "" 26 | 27 | #: ../plugin.php:113 28 | msgid "Title:" 29 | msgstr "" 30 | 31 | #: ../plugin.php:114 32 | msgid "Caption:" 33 | msgstr "" 34 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration 2 | // http://karma-runner.github.io/0.10/config/configuration-file.html 3 | 4 | module.exports = function(config) { 5 | config.set({ 6 | // base path, that will be used to resolve files and exclude 7 | basePath: '', 8 | 9 | // testing framework to use (jasmine/mocha/qunit/...) 10 | frameworks: ['jasmine'], 11 | 12 | // list of files / patterns to load in the browser 13 | files: [ 14 | 'app/bower_components/jquery/jquery.js', 15 | 'app/bower_components/angular/angular.js', 16 | 'app/bower_components/angular-mocks/angular-mocks.js', 17 | 'app/bower_components/angular-resource/angular-resource.js', 18 | 'app/bower_components/angular-sanitize/angular-sanitize.js', 19 | 'app/bower_components/angular-route/angular-route.js', 20 | 'app/bower_components/bootstrap-modal/js/bootstrap-modal.js', 21 | 'app/bower_components/bootstrap-modal/js/bootstrap-modalmanager.js', 22 | 'app/bower_components/i18next/release/i18next-1.7.1.min.js', 23 | 'app/bower_components/moment/moment.js', 24 | 'app/bower_components/ng-i18next/dist/ng-i18next.js', 25 | 'app/scripts/*.js', 26 | 'app/scripts/**/*.js', 27 | 'test/mock/**/*.js', 28 | 'test/spec/**/*.js' 29 | ], 30 | 31 | // list of files / patterns to exclude 32 | exclude: ['app/scripts/redirect.js'], 33 | 34 | // web server port 35 | port: 8080, 36 | 37 | // level of logging 38 | // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG 39 | logLevel: config.LOG_INFO, 40 | 41 | 42 | // enable / disable watching file and executing tests whenever any file changes 43 | autoWatch: true, 44 | 45 | 46 | // Start these browsers, currently available: 47 | // - Chrome 48 | // - ChromeCanary 49 | // - Firefox 50 | // - Opera 51 | // - Safari (only Mac) 52 | // - PhantomJS 53 | // - IE (only Windows) 54 | browsers: ['Chrome', 'Firefox', 'PhantomJS', 'Safari'], 55 | // browsers: ['Firefox'], 56 | 57 | 58 | // Continuous Integration mode 59 | // if true, it capture browsers, run tests and exit 60 | singleRun: false 61 | }); 62 | }; 63 | -------------------------------------------------------------------------------- /misc/subtome-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superfeedr/subtome/34523f2bb799d3575e606c62fcc31e51f9244a5d/misc/subtome-screenshot.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "subtomecom", 3 | "version": "0.0.0", 4 | "dependencies": {}, 5 | "devDependencies": { 6 | "grunt": "~0.4.1", 7 | "grunt-autoprefixer": "~0.4.0", 8 | "grunt-bower-install": "~0.7.0", 9 | "grunt-concurrent": "~0.4.1", 10 | "grunt-contrib-clean": "~0.5.0", 11 | "grunt-contrib-coffee": "~0.7.0", 12 | "grunt-contrib-compass": "~0.6.0", 13 | "grunt-contrib-concat": "~0.3.0", 14 | "grunt-contrib-connect": "~0.5.0", 15 | "grunt-contrib-copy": "~0.4.1", 16 | "grunt-contrib-cssmin": "~0.7.0", 17 | "grunt-contrib-htmlmin": "~0.1.3", 18 | "grunt-contrib-imagemin": "~0.3.0", 19 | "grunt-contrib-jshint": "~0.7.1", 20 | "grunt-contrib-uglify": "~0.2.0", 21 | "grunt-contrib-watch": "~0.5.2", 22 | "grunt-google-cdn": "~0.2.0", 23 | "grunt-newer": "~0.5.4", 24 | "grunt-ngmin": "~0.0.2", 25 | "grunt-rev": "~0.1.0", 26 | "grunt-svgmin": "~0.2.0", 27 | "grunt-targethtml": "*", 28 | "grunt-usemin": "~2.0.0", 29 | "jshint-stylish": "~0.1.3", 30 | "load-grunt-tasks": "~0.2.0", 31 | "time-grunt": "~0.2.1", 32 | "karma-ng-scenario": "~0.1.0", 33 | "grunt-karma": "~0.6.2", 34 | "karma-script-launcher": "~0.1.0", 35 | "karma-chrome-launcher": "~0.1.2", 36 | "karma-firefox-launcher": "~0.1.3", 37 | "karma-html2js-preprocessor": "~0.1.0", 38 | "karma-jasmine": "~0.1.5", 39 | "karma-coffee-preprocessor": "~0.1.2", 40 | "requirejs": "~2.1.10", 41 | "karma-requirejs": "~0.2.1", 42 | "karma-phantomjs-launcher": "~0.1.2", 43 | "karma": "~0.10.9", 44 | "karma-ng-html2js-preprocessor": "~0.1.0", 45 | "grunt-appcache": "~0.1.2" 46 | }, 47 | "engines": { 48 | "node": ">=0.8.0" 49 | }, 50 | "scripts": { 51 | "test": "grunt test" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /test/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "browser": true, 4 | "esnext": true, 5 | "bitwise": true, 6 | "camelcase": true, 7 | "curly": true, 8 | "eqeqeq": true, 9 | "immed": true, 10 | "indent": 2, 11 | "latedef": true, 12 | "newcap": true, 13 | "noarg": true, 14 | "quotmark": "single", 15 | "regexp": true, 16 | "undef": true, 17 | "unused": true, 18 | "strict": true, 19 | "trailing": true, 20 | "smarttabs": true, 21 | "globals": { 22 | "after": false, 23 | "afterEach": false, 24 | "angular": false, 25 | "before": false, 26 | "beforeEach": false, 27 | "browser": false, 28 | "describe": false, 29 | "expect": false, 30 | "inject": false, 31 | "it": false, 32 | "jasmine": false, 33 | "spyOn": false 34 | } 35 | } 36 | 37 | -------------------------------------------------------------------------------- /test/runner.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | End2end Test Runner 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /test/spec/app.js: -------------------------------------------------------------------------------- 1 | // Tests for the app. 2 | -------------------------------------------------------------------------------- /test/spec/controllers/developers.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: DevelopersController', function () { 4 | 5 | beforeEach(module('subtome')); 6 | 7 | it('should redirect to the docs', function () { 8 | inject(function ($location, $rootScope, $controller) { 9 | var scope = $rootScope.$new(); 10 | var windowMock = {}; 11 | $controller('DevelopersController', {$scope: scope, $window: windowMock}); 12 | scope.$apply(); 13 | expect(windowMock.location).toBe('http://docs.subtome.com/developers/'); 14 | }); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /test/spec/controllers/export.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: ExportController', function () { 4 | 5 | beforeEach(module('subtome')); 6 | 7 | it('should redirect to the data-uri of an opml', function () { 8 | inject(function ($location, $rootScope, $controller, subscriptions, $window) { 9 | var scope = $rootScope.$new(); 10 | var windowMock = {}; 11 | $controller('ExportController', {$scope: scope, $window: windowMock, subscriptions: subscriptions}); 12 | scope.$apply(); 13 | expect(windowMock.location).toBe('data:application/xml;base64,' + $window.btoa(subscriptions.opml())); 14 | }); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /test/spec/controllers/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: IndexController', function () { 4 | 5 | beforeEach(module('subtome')); 6 | 7 | it('should have the right scope', function () { 8 | inject(function ($rootScope, $controller, $i18next) { 9 | var scope = $rootScope.$new(); 10 | $controller('IndexController', {$scope: scope, $i18next: $i18next}); 11 | scope.$apply(); 12 | expect(scope.button).toBe('See it in Action'); 13 | scope.over(); 14 | expect(scope.button).toBe('Follow our Blog'); 15 | scope.left(); 16 | expect(scope.button).toBe('See it in Action'); 17 | }); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /test/spec/controllers/publishers.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: PublishersController', function () { 4 | 5 | beforeEach(module('subtome')); 6 | 7 | it('should redirect to the docs', function () { 8 | inject(function ($location, $rootScope, $controller) { 9 | var scope = $rootScope.$new(); 10 | var windowMock = {}; 11 | $controller('PublishersController', {$scope: scope, $window: windowMock}); 12 | scope.$apply(); 13 | expect(windowMock.location).toBe('http://docs.subtome.com/publishers/'); 14 | }); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /test/spec/controllers/redirect.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: RedirectController', function () { 4 | var routeParams, windowMock; 5 | 6 | beforeEach(module('subtome')); 7 | 8 | beforeEach(function() { 9 | routeParams = {}; 10 | windowMock = {}; 11 | }); 12 | 13 | it('should have the right scope info', function () { 14 | inject(function ($rootScope, $controller) { 15 | var scope = $rootScope.$new(); 16 | $controller('RedirectController', {$scope: scope, $window: windowMock, $routeParams: routeParams}); 17 | scope.$apply(); 18 | expect(scope.info).toBe('Redirecting you to the feed...'); 19 | }); 20 | }); 21 | 22 | it('should redirect to the home page if there is no destination', function () { 23 | inject(function ($rootScope, $controller) { 24 | var scope = $rootScope.$new(); 25 | routeParams.to = ''; 26 | $controller('RedirectController', {$scope: scope, $window: windowMock, $routeParams: routeParams}); 27 | scope.$apply(); 28 | expect(windowMock.location).toBe('/'); 29 | }); 30 | }); 31 | 32 | it('should set an error if the url is not safe', function () { 33 | inject(function ($rootScope, $controller) { 34 | var scope = $rootScope.$new(); 35 | var safeUrl = function() { 36 | return false; 37 | }; 38 | routeParams.to = 'notsafe'; 39 | $controller('RedirectController', {$scope: scope, $routeParams: routeParams, safeUrl: safeUrl}); 40 | scope.$apply(); 41 | expect(scope.info).toBe('We could not achieve a redirect because this URL notsafe is not safe.'); 42 | }); 43 | }); 44 | 45 | it('should redirect to the right url if everything is fine', function () { 46 | inject(function ($rootScope, $controller) { 47 | var scope = $rootScope.$new(); 48 | routeParams.to = 'the-destination'; 49 | $controller('RedirectController', {$scope: scope, $routeParams: routeParams, $window: windowMock}); 50 | scope.$apply(); 51 | expect(windowMock.location).toBe('the-destination'); 52 | }); 53 | }); 54 | }); 55 | -------------------------------------------------------------------------------- /test/spec/controllers/register.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: RegisterController', function () { 4 | var routeParams, windowMock; 5 | 6 | beforeEach(module('subtome')); 7 | 8 | beforeEach(function() { 9 | localStorage.clear(); 10 | routeParams = {}; 11 | windowMock = {}; 12 | }); 13 | 14 | afterEach(function() { 15 | localStorage.clear(); 16 | }); 17 | 18 | it('should have the right scope info based on the route params', function () { 19 | inject(function ($rootScope, $controller) { 20 | var scope = $rootScope.$new(); 21 | routeParams = { 22 | name: 'My Service', 23 | url: 'handler' 24 | }; 25 | $controller('RegisterController', {$scope: scope, $window: windowMock, $routeParams: routeParams}); 26 | scope.$apply(); 27 | expect(scope.service.name).toBe(routeParams.name); 28 | expect(scope.service.url).toBe(routeParams.url); 29 | }); 30 | }); 31 | 32 | it('should have register the service based on the route params', function () { 33 | inject(function ($rootScope, $controller) { 34 | var scope = $rootScope.$new(); 35 | routeParams = { 36 | name: 'My Service', 37 | url: 'handler' 38 | }; 39 | var services = { 40 | register: jasmine.createSpy() 41 | }; 42 | $controller('RegisterController', {$scope: scope, $window: windowMock, services: services, $routeParams: routeParams}); 43 | scope.$apply(); 44 | expect(services.register).toHaveBeenCalledWith(routeParams.name, routeParams.url); 45 | }); 46 | }); 47 | 48 | }); 49 | -------------------------------------------------------------------------------- /test/spec/controllers/settings.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: SettingsController', function () { 4 | 5 | beforeEach(module('subtome')); 6 | 7 | afterEach(function() { 8 | localStorage.clear(); 9 | }); 10 | 11 | it('should set the right scope', function () { 12 | inject(function ($rootScope, $controller) { 13 | var scope = $rootScope.$new(); 14 | var services = { 15 | removeService: jasmine.createSpy() 16 | }; 17 | $controller('SettingsController', {$scope: scope, services: services}); 18 | scope.$apply(); 19 | expect(scope.services).toBe(services); 20 | var toBeRemoved = { 21 | name: 'My Service' 22 | }; 23 | scope.remove(toBeRemoved); 24 | expect(services.removeService).toHaveBeenCalledWith(toBeRemoved.name); 25 | }); 26 | }); 27 | 28 | }); 29 | -------------------------------------------------------------------------------- /test/spec/controllers/share.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: ShareController', function () { 4 | var routeParams, windowMock; 5 | 6 | beforeEach(module('subtome')); 7 | 8 | beforeEach(function() { 9 | routeParams = {}; 10 | windowMock = {}; 11 | }); 12 | 13 | afterEach(function() { 14 | localStorage.clear(); 15 | }); 16 | 17 | it('should set the right scope url, urlRoot, ', function () { 18 | inject(function ($rootScope, $controller) { 19 | var scope = $rootScope.$new(); 20 | var routeParams = { 21 | url: 'http://my.reader.tld/import/subscriptions?subscription={subscriptions}' 22 | }; 23 | $controller('ShareController', {$scope: scope, $routeParams: routeParams}); 24 | scope.$apply(); 25 | expect(scope.url).toBe(routeParams.url); 26 | expect(scope.urlRoot).toBe('http://my.reader.tld/'); 27 | }); 28 | }); 29 | 30 | it('should redirect to the destination when share is called with the right location', function () { 31 | inject(function ($rootScope, $controller) { 32 | var scope = $rootScope.$new(); 33 | var routeParams = { 34 | url: 'http://my.reader.tld/import/subscriptions?subscription={subscriptions}' 35 | }; 36 | var subscriptions = { 37 | opml: function() { 38 | return ''; 39 | } 40 | }; 41 | $controller('ShareController', {$scope: scope, $routeParams: routeParams, $window: windowMock, subscriptions: subscriptions}); 42 | scope.$apply(); 43 | scope.share(); 44 | expect(windowMock.location).toBe('http://my.reader.tld/import/subscriptions?subscription=PG9wbWxmaWxlPg=='); 45 | }); 46 | }); 47 | 48 | it('should redirect to the subscriptions list when share is called', function () { 49 | inject(function ($rootScope, $controller) { 50 | var scope = $rootScope.$new(); 51 | var routeParams = { 52 | url: 'http://my.reader.tld/import/subscriptions?subscription={subscriptions}' 53 | }; 54 | $controller('ShareController', {$scope: scope, $routeParams: routeParams, $window: windowMock}); 55 | scope.$apply(); 56 | scope.deny(); 57 | expect(windowMock.location).toBe('/#/subscriptions'); 58 | }); 59 | }); 60 | 61 | }); 62 | -------------------------------------------------------------------------------- /test/spec/controllers/subscriptions.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Controller: SubscriptionsController', function () { 4 | 5 | beforeEach(module('subtome')); 6 | 7 | afterEach(function() { 8 | localStorage.clear(); 9 | }); 10 | 11 | it('should have the all the subscriptions in scope', function() { 12 | inject(function ($rootScope, $controller, subscriptions) { 13 | var scope = $rootScope.$new(); 14 | subscriptions.add('http://blog.superfeedr.com', {feeds: ['http://blog.superfeedr.com/atom.xml'], service: 'My service'}); 15 | $controller('SubscriptionsController', {$scope: scope, subscriptions: subscriptions}); 16 | scope.$apply(); 17 | expect(scope.subscriptions[0][0]).toBe('http://blog.superfeedr.com'); 18 | expect(scope.subscriptions[0][1][0].feeds[0]).toBe('http://blog.superfeedr.com/atom.xml'); 19 | expect(scope.subscriptions[0][1][0].service).toBe('My service'); 20 | }); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /test/spec/directives/browser-specific.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Directive: browserSpecific', function () { 4 | 5 | beforeEach(angular.mock.module('subtome')); 6 | 7 | describe('browserSpecific', function() { 8 | it('should keep the element hidden if it does not match the browser', function() { 9 | module(function($provide) { 10 | $provide.value('$window', { 11 | navigator: { 12 | userAgent: 'My UserAgent does not match' 13 | } 14 | }); 15 | }); 16 | inject(function($compile, $rootScope) { 17 | var element = $compile('')($rootScope); 18 | expect(element.css('display')).toBe('none'); 19 | }); 20 | }); 21 | 22 | it('should show the element if it does match the browser', function() { 23 | module(function($provide) { 24 | $provide.value('$window', { 25 | navigator: { 26 | userAgent: 'My UserAgent does match Chrome' 27 | } 28 | }); 29 | }); 30 | inject(function($compile, $rootScope) { 31 | var element = $compile('')($rootScope); 32 | expect(element.css('display')).not.toBe('none'); 33 | }); 34 | }); 35 | }); 36 | }); 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /test/spec/directives/file-picker.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Directive: filePicker', function () { 4 | 5 | beforeEach(angular.mock.module('subtome')); 6 | 7 | describe('filePicker', function() { 8 | it('should set the scope\'s file when the element was changed'); 9 | }); 10 | }); 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /test/spec/directives/follow-on.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Directive: followOn', function () { 4 | 5 | beforeEach(angular.mock.module('subtome')); 6 | 7 | describe('followOn', function() { 8 | it('should add a script element to the page including the load.js file when clicked', function() { 9 | inject(function($compile, $rootScope, $window) { 10 | var action = 'click'; 11 | 12 | var element = $compile('')($rootScope); 13 | element.trigger(action); 14 | expect($window.document.body.children[$window.document.body.children.length - 1].tagName).toBe('SCRIPT'); 15 | expect($window.document.body.children[$window.document.body.children.length - 1].getAttribute('src')).toBe('/load.js'); 16 | }); 17 | }); 18 | 19 | it('should add a script element to the page including the load.js file when clicked', function() { 20 | inject(function($compile, $rootScope, $window) { 21 | var action = 'click'; 22 | var element = $compile('')($rootScope); 23 | element.trigger(action); 24 | expect($window.document.subtomeBtn).toBe(element[0]); 25 | }); 26 | }); 27 | }); 28 | }); 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /test/spec/directives/hide-on-path.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Directive: hideOnPath', function () { 4 | 5 | beforeEach(angular.mock.module('subtome')); 6 | 7 | describe('hideOnPath', function() { 8 | it('should keep the element hidden if it the path does match', function() { 9 | 10 | 11 | inject(function($compile, $rootScope, $location) { 12 | $location.path('/path-which-hides'); 13 | var element = $compile('')($rootScope); 14 | $rootScope.$apply(); 15 | expect(element.css('display')).toBe('none'); 16 | }); 17 | }); 18 | 19 | it('should keep the element shown if it the path does not match', function() { 20 | 21 | 22 | inject(function($compile, $rootScope, $location) { 23 | $location.path('/path-which-shows'); 24 | var element = $compile('')($rootScope); 25 | $rootScope.$apply(); 26 | expect(element.css('display')).not.toBe('none'); 27 | }); 28 | }); 29 | 30 | it('should set a element previously shown to hidden if the location is updated', function() { 31 | 32 | inject(function($compile, $rootScope, $location) { 33 | $location.path('/path-which-shows'); 34 | var element = $compile('')($rootScope); 35 | $rootScope.$apply(); 36 | expect(element.css('display')).not.toBe('none'); 37 | $location.path('/path-which-hides'); 38 | $rootScope.$apply(); 39 | expect(element.css('display')).toBe('none'); 40 | }); 41 | }); 42 | 43 | }); 44 | }); 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /test/spec/directives/service-button.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Directive serviceButton', function () { 4 | 5 | beforeEach(angular.mock.module('subtome')); 6 | 7 | it('should setup the button with the right scope information'); 8 | 9 | describe('open', function() { 10 | 11 | beforeEach(function() { 12 | localStorage.clear(); 13 | }); 14 | 15 | afterEach(function() { 16 | localStorage.clear(); 17 | }); 18 | 19 | it('should send a google analytics event'); 20 | 21 | it('should alert the user if the redirect is not safe'); 22 | 23 | it('should replace the {url} in the redirect url with the resource'); 24 | 25 | it('should replace the {feed} in the redirect url with the first feed if there are several'); 26 | 27 | it('should replace the {feed} in the redirect url with the only feed if there is just one'); 28 | 29 | it('should replace the {feeds} in the redirect url with the only feed with all feeds if there are multiple'); 30 | 31 | it('should add a subscription to the list of subscriptions'); 32 | 33 | it('should post a message to the parent'); 34 | 35 | it('should open the redirect in a new tab'); 36 | }); 37 | }); 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /test/spec/filters/from-now.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Filter: fromNow', function () { 4 | 5 | beforeEach(angular.mock.module('subtome')); 6 | 7 | it('The application should have a fromNow filter', inject(function($filter) { 8 | expect($filter('fromNow')).not.toEqual(null); 9 | })); 10 | 11 | it('should return a string version of the time', inject(function($filter) { 12 | expect($filter('fromNow')(new Date())).toEqual('a few seconds ago'); 13 | })); 14 | 15 | }); 16 | -------------------------------------------------------------------------------- /test/spec/filters/link-to-home.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Filter: linkToHome', function () { 4 | 5 | beforeEach(angular.mock.module('subtome')); 6 | 7 | it('The application should have a linkToHome filter', inject(function($filter) { 8 | expect($filter('linkToHome')).not.toEqual(null); 9 | })); 10 | 11 | it('should return the link to the home page given a url', inject(function($filter) { 12 | expect($filter('linkToHome')('https://feedbin.me/?subscribe={feed}')).toEqual('https://feedbin.me/'); 13 | expect($filter('linkToHome')('https://feedbin.me/')).toEqual('https://feedbin.me/'); 14 | })); 15 | 16 | }); 17 | -------------------------------------------------------------------------------- /test/spec/filters/pick-color.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Filter: pickColor', function () { 4 | 5 | beforeEach(angular.mock.module('subtome')); 6 | 7 | it('The application should have a pickColor filter', inject(function($filter) { 8 | expect($filter('pickColor')).not.toEqual(null); 9 | })); 10 | 11 | it('should return a different color for differen strings', inject(function($filter) { 12 | expect($filter('pickColor')('a')).toEqual('background-color: rgb(240, 173, 78)'); 13 | expect($filter('pickColor')('b')).toEqual('background-color: rgb(217, 83, 79);'); 14 | expect($filter('pickColor')('c')).toEqual('background-color: rgb(92, 184, 92)'); 15 | expect($filter('pickColor')('d')).toEqual('background-color: rgb(66, 139, 202)'); 16 | expect($filter('pickColor')('e')).toEqual('background-color: rgb(91, 192, 222)'); 17 | expect($filter('pickColor')('f')).toEqual('background-color: rgb(240, 173, 78)'); 18 | })); 19 | }); 20 | -------------------------------------------------------------------------------- /test/spec/services/file-reader.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Service: fileReader', function () { 4 | 5 | var fileReader; 6 | 7 | module(function($provide) { 8 | $provide.value('$window', {}); 9 | }); 10 | 11 | beforeEach(function() { 12 | module('subtome'); 13 | inject(function($injector) { 14 | fileReader = $injector.get('fileReader'); 15 | }); 16 | }); 17 | 18 | 19 | }); 20 | 21 | -------------------------------------------------------------------------------- /test/spec/services/opml-parser.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Service: opmlParser', function () { 4 | 5 | var opmlParser; 6 | 7 | module(function($provide) { 8 | $provide.value('$window', {}); 9 | }); 10 | 11 | beforeEach(function() { 12 | module('subtome'); 13 | inject(function($injector) { 14 | opmlParser = $injector.get('opmlParser'); 15 | }); 16 | }); 17 | 18 | 19 | }); 20 | 21 | -------------------------------------------------------------------------------- /test/spec/services/safe-url.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Service: SafeUrl', function () { 4 | 5 | var safeUrl; 6 | 7 | module(function($provide) { 8 | $provide.value('$window', {}); 9 | }); 10 | 11 | beforeEach(function() { 12 | module('subtome'); 13 | inject(function($injector) { 14 | safeUrl = $injector.get('safeUrl'); 15 | }); 16 | }); 17 | 18 | it('should prevent data urls', function() { 19 | expect(safeUrl('data:text/html;charset=utf-8;base64,PCFET0...C9odG1sPg==')).toBe(false); 20 | }); 21 | it('should prevent javascript urls', function() { 22 | expect(safeUrl(['javascript', 'alert("I am evil")'].join(':'))).toBe(false); 23 | }); 24 | it('should accept http url', function() { 25 | expect(safeUrl('http://feedbin.me/?subscribe=http%3A%2F%2Fblog.superfeedr.com%2Fatom.xml')).toBe(true); 26 | }); 27 | it('should accept https url', function() { 28 | expect(safeUrl('https://feedbin.me/?subscribe=http%3A%2F%2Fblog.superfeedr.com%2Fatom.xml')).toBe(true); 29 | }); 30 | }); 31 | 32 | -------------------------------------------------------------------------------- /test/spec/services/store.js: -------------------------------------------------------------------------------- 1 | /*TODO*/ 2 | --------------------------------------------------------------------------------