diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..b512c09d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/README.md b/README.md index 33bc3757..5d5ffcdf 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,22 @@ # MagicMirror V2 This version of the Magic Mirror software focusses on a modular plugin system. Besides that, the Magic Mirror software now also uses [Electron](http://electron.atom.io/), so no more webserver or browser installs necessary. +#WARNING: THIS VERSION IS IN A VERY EARLY STAGE. IT IS NOT COMPLETED YET. PLEASE USE THE MASTER BRANCH. + ##Usage 1. Install [Node.js](https://nodejs.org/en/) 2. Execute `npm install && npm start`. +##Configuration +1. Duplicate `config/config.js.sample` to `config/config.js`. +2. Modify your required settings. + ##Todo Things that still have to be implemented or changed. -###Helper scripts -- Only start helper scripts of modules that are actually loaded in the UI (config.js) -- Notification system, so that not every helper scripts needs it's own socket to the UI. +####Loader +- Loading of module uses `eval()`. We might want to look into a better solution. [loader.js#L112](https://github.com/MichMich/MagicMirror/blob/v2-beta/js/loader.js#L112). + + + + -#WARNING: THIS VERSION IS IN A VERY EARLY STAGE. IT IS NOT COMPLETED YET. PLEASE USE THE MASTER BRANCH. diff --git a/config.codekit b/config.codekit deleted file mode 100644 index 62ffb346..00000000 --- a/config.codekit +++ /dev/null @@ -1,2034 +0,0 @@ -{ -"CodeKitInfo": "This is a CodeKit 2.x project configuration file. It is designed to sync project settings across multiple machines. MODIFYING THE CONTENTS OF THIS FILE IS A POOR LIFE DECISION. If you do so, you will likely cause CodeKit to crash. This file is not useful unless accompanied by the project that created it in CodeKit 2. This file is not backwards-compatible with CodeKit 1.x. For more information, see: http:\/\/incident57.com\/codekit", -"creatorBuild": "19115", -"files": { - "\/config\/config.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/config\/config.js", - "outputAbbreviatedPath": "\/config\/min\/config-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/css\/main.css": { - "fileType": 16, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/css\/main.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/robot.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/robot.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_black\/Roboto-Black-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_black\/Roboto-Black-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_black\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_black\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_black\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_black\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_black\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_black\/specimen_files\/Roboto-Black-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 83352, - "inputAbbreviatedPath": "\/fonts\/roboto_black\/specimen_files\/Roboto-Black-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_black\/specimen_files\/Roboto-Black-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_black\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_black\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_black\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_black\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_blackitalic\/Roboto-BlackItalic-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_blackitalic\/Roboto-BlackItalic-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_blackitalic\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_blackitalic\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_blackitalic\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_blackitalic\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_blackitalic\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_blackitalic\/specimen_files\/Roboto-BlackItalic-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 87438, - "inputAbbreviatedPath": "\/fonts\/roboto_blackitalic\/specimen_files\/Roboto-BlackItalic-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_blackitalic\/specimen_files\/Roboto-BlackItalic-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_blackitalic\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_blackitalic\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_blackitalic\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_blackitalic\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_bold\/Roboto-Bold-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_bold\/Roboto-Bold-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_bold\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_bold\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_bold\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_bold\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_bold\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_bold\/specimen_files\/Roboto-Bold-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 85781, - "inputAbbreviatedPath": "\/fonts\/roboto_bold\/specimen_files\/Roboto-Bold-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_bold\/specimen_files\/Roboto-Bold-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_bold\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_bold\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_bold\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_bold\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_boldcondensed\/RobotoCondensed-Bold-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_boldcondensed\/RobotoCondensed-Bold-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_boldcondensed\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_boldcondensed\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_boldcondensed\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_boldcondensed\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_boldcondensed\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_boldcondensed\/specimen_files\/RobotoCondensed-Bold-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 86782, - "inputAbbreviatedPath": "\/fonts\/roboto_boldcondensed\/specimen_files\/RobotoCondensed-Bold-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_boldcondensed\/specimen_files\/RobotoCondensed-Bold-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_boldcondensed\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_boldcondensed\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_boldcondensed\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_boldcondensed\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_boldcondenseditalic\/RobotoCondensed-BoldItalic-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_boldcondenseditalic\/RobotoCondensed-BoldItalic-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_boldcondenseditalic\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_boldcondenseditalic\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_boldcondenseditalic\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_boldcondenseditalic\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_boldcondenseditalic\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_boldcondenseditalic\/specimen_files\/RobotoCondensed-BoldItalic-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 91094, - "inputAbbreviatedPath": "\/fonts\/roboto_boldcondenseditalic\/specimen_files\/RobotoCondensed-BoldItalic-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_boldcondenseditalic\/specimen_files\/RobotoCondensed-BoldItalic-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_boldcondenseditalic\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_boldcondenseditalic\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_boldcondenseditalic\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_boldcondenseditalic\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_bolditalic\/Roboto-BoldItalic-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_bolditalic\/Roboto-BoldItalic-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_bolditalic\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_bolditalic\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_bolditalic\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_bolditalic\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_bolditalic\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_bolditalic\/specimen_files\/Roboto-BoldItalic-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 89575, - "inputAbbreviatedPath": "\/fonts\/roboto_bolditalic\/specimen_files\/Roboto-BoldItalic-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_bolditalic\/specimen_files\/Roboto-BoldItalic-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_bolditalic\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_bolditalic\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_bolditalic\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_bolditalic\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_condensed\/RobotoCondensed-Regular-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_condensed\/RobotoCondensed-Regular-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_condensed\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_condensed\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_condensed\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_condensed\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_condensed\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_condensed\/specimen_files\/RobotoCondensed-Regular-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 90523, - "inputAbbreviatedPath": "\/fonts\/roboto_condensed\/specimen_files\/RobotoCondensed-Regular-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_condensed\/specimen_files\/RobotoCondensed-Regular-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_condensed\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_condensed\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_condensed\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_condensed\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_condenseditalic\/RobotoCondensed-Italic-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_condenseditalic\/RobotoCondensed-Italic-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_condenseditalic\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_condenseditalic\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_condenseditalic\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_condenseditalic\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_condenseditalic\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_condenseditalic\/specimen_files\/RobotoCondensed-Italic-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 93738, - "inputAbbreviatedPath": "\/fonts\/roboto_condenseditalic\/specimen_files\/RobotoCondensed-Italic-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_condenseditalic\/specimen_files\/RobotoCondensed-Italic-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_condenseditalic\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_condenseditalic\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_condenseditalic\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_condenseditalic\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_italic\/Roboto-Italic-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_italic\/Roboto-Italic-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_italic\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_italic\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_italic\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_italic\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_italic\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_italic\/specimen_files\/Roboto-Italic-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 89124, - "inputAbbreviatedPath": "\/fonts\/roboto_italic\/specimen_files\/Roboto-Italic-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_italic\/specimen_files\/Roboto-Italic-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_italic\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_italic\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_italic\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_italic\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_light\/Roboto-Light-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_light\/Roboto-Light-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_light\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_light\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_light\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_light\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_light\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_light\/specimen_files\/Roboto-Light-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 83980, - "inputAbbreviatedPath": "\/fonts\/roboto_light\/specimen_files\/Roboto-Light-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_light\/specimen_files\/Roboto-Light-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_light\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_light\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_light\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_light\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_lightcondensed\/RobotoCondensed-Light-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightcondensed\/RobotoCondensed-Light-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_lightcondensed\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightcondensed\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_lightcondensed\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_lightcondensed\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightcondensed\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_lightcondensed\/specimen_files\/RobotoCondensed-Light-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 89201, - "inputAbbreviatedPath": "\/fonts\/roboto_lightcondensed\/specimen_files\/RobotoCondensed-Light-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_lightcondensed\/specimen_files\/RobotoCondensed-Light-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_lightcondensed\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightcondensed\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_lightcondensed\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightcondensed\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_lightcondenseditalic\/RobotoCondensed-LightItalic-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightcondenseditalic\/RobotoCondensed-LightItalic-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_lightcondenseditalic\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightcondenseditalic\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_lightcondenseditalic\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_lightcondenseditalic\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightcondenseditalic\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_lightcondenseditalic\/specimen_files\/RobotoCondensed-LightItalic-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 92532, - "inputAbbreviatedPath": "\/fonts\/roboto_lightcondenseditalic\/specimen_files\/RobotoCondensed-LightItalic-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_lightcondenseditalic\/specimen_files\/RobotoCondensed-LightItalic-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_lightcondenseditalic\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightcondenseditalic\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_lightcondenseditalic\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightcondenseditalic\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_lightitalic\/Roboto-LightItalic-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightitalic\/Roboto-LightItalic-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_lightitalic\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightitalic\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_lightitalic\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_lightitalic\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightitalic\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_lightitalic\/specimen_files\/Roboto-LightItalic-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 88922, - "inputAbbreviatedPath": "\/fonts\/roboto_lightitalic\/specimen_files\/Roboto-LightItalic-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_lightitalic\/specimen_files\/Roboto-LightItalic-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_lightitalic\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightitalic\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_lightitalic\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_lightitalic\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_medium\/Roboto-Medium-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_medium\/Roboto-Medium-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_medium\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_medium\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_medium\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_medium\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_medium\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_medium\/specimen_files\/Roboto-Medium-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 86670, - "inputAbbreviatedPath": "\/fonts\/roboto_medium\/specimen_files\/Roboto-Medium-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_medium\/specimen_files\/Roboto-Medium-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_medium\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_medium\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_medium\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_medium\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_mediumitalic\/Roboto-MediumItalic-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_mediumitalic\/Roboto-MediumItalic-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_mediumitalic\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_mediumitalic\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_mediumitalic\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_mediumitalic\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_mediumitalic\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_mediumitalic\/specimen_files\/Roboto-MediumItalic-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 89781, - "inputAbbreviatedPath": "\/fonts\/roboto_mediumitalic\/specimen_files\/Roboto-MediumItalic-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_mediumitalic\/specimen_files\/Roboto-MediumItalic-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_mediumitalic\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_mediumitalic\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_mediumitalic\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_mediumitalic\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_regular\/Roboto-Regular-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_regular\/Roboto-Regular-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_regular\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_regular\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_regular\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_regular\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_regular\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_regular\/specimen_files\/Roboto-Regular-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 85569, - "inputAbbreviatedPath": "\/fonts\/roboto_regular\/specimen_files\/Roboto-Regular-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_regular\/specimen_files\/Roboto-Regular-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_regular\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_regular\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_regular\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_regular\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_thin\/Roboto-Thin-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_thin\/Roboto-Thin-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_thin\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_thin\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_thin\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_thin\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_thin\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_thin\/specimen_files\/Roboto-Thin-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 80640, - "inputAbbreviatedPath": "\/fonts\/roboto_thin\/specimen_files\/Roboto-Thin-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_thin\/specimen_files\/Roboto-Thin-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_thin\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_thin\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_thin\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_thin\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_thinitalic\/Roboto-ThinItalic-demo.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_thinitalic\/Roboto-ThinItalic-demo.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_thinitalic\/specimen_files\/easytabs.js": { - "fileType": 64, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_thinitalic\/specimen_files\/easytabs.js", - "outputAbbreviatedPath": "\/fonts\/roboto_thinitalic\/specimen_files\/min\/easytabs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/fonts\/roboto_thinitalic\/specimen_files\/grid_12-825-55-15.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_thinitalic\/specimen_files\/grid_12-825-55-15.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_thinitalic\/specimen_files\/Roboto-ThinItalic-cleartype.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 83107, - "inputAbbreviatedPath": "\/fonts\/roboto_thinitalic\/specimen_files\/Roboto-ThinItalic-cleartype.png", - "outputAbbreviatedPath": "\/fonts\/roboto_thinitalic\/specimen_files\/Roboto-ThinItalic-cleartype.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/fonts\/roboto_thinitalic\/specimen_files\/specimen_stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_thinitalic\/specimen_files\/specimen_stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/fonts\/roboto_thinitalic\/stylesheet.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/fonts\/roboto_thinitalic\/stylesheet.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/index.html": { - "fileType": 8192, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/index.html", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/js\/class.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/js\/class.js", - "outputAbbreviatedPath": "\/js\/min\/class-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/js\/defaults.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/js\/defaults.js", - "outputAbbreviatedPath": "\/js\/min\/defaults-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/js\/loader.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/js\/loader.js", - "outputAbbreviatedPath": "\/js\/min\/loader-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/js\/logger.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/js\/logger.js", - "outputAbbreviatedPath": "\/js\/min\/logger-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/js\/main.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/js\/main.js", - "outputAbbreviatedPath": "\/js\/min\/main-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "syntaxCheckerStyle": 1 - }, - "\/js\/module.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/js\/module.js", - "outputAbbreviatedPath": "\/js\/min\/module-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/modules\/clock\/clock.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/modules\/clock\/clock.js", - "outputAbbreviatedPath": "\/modules\/clock\/min\/clock-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/modules\/compliments\/compliments.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/modules\/compliments\/compliments.js", - "outputAbbreviatedPath": "\/modules\/compliments\/min\/compliments-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/modules\/helloworld\/helloworld.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/modules\/helloworld\/helloworld.js", - "outputAbbreviatedPath": "\/modules\/helloworld\/min\/helloworld-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/vendor\/moment\/moment-with-locales.min.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/vendor\/moment\/moment-with-locales.min.js", - "outputAbbreviatedPath": "\/vendor\/moment\/min\/moment-with-locales.min-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/vendor\/vendor.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/vendor\/vendor.js", - "outputAbbreviatedPath": "\/vendor\/min\/vendor-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - } - }, -"hooks": [ - ], -"lastSavedByUser": "Michael Teeuw", -"manualImportLinks": { - }, -"projectAttributes": { - "bowerAbbreviatedPath": "", - "displayValue": "MagicMirror V2", - "displayValueWasSetByUser": 1, - "iconImageName": "brackets_orange" - }, -"projectSettings": { - "alwaysUseExternalServer": 1, - "animateCSSInjections": 1, - "autoApplyPSLanguageSettingsStyle": 0, - "autoprefixerBrowserString": "> 1%, last 2 versions, Firefox ESR, Opera 12.1", - "autoSyncProjectSettingsFile": 1, - "browserRefreshDelay": 0, - "coffeeAutoOutputPathEnabled": 1, - "coffeeAutoOutputPathFilenamePattern": "*.js", - "coffeeAutoOutputPathRelativePath": "", - "coffeeAutoOutputPathReplace1": "", - "coffeeAutoOutputPathReplace2": "", - "coffeeAutoOutputPathStyle": 0, - "coffeeCreateSourceMap": 0, - "coffeeLintFlags2": { - "arrow_spacing": { - "active": 0, - "flagValue": -1 - }, - "camel_case_classes": { - "active": 1, - "flagValue": -1 - }, - "colon_assignment_spacing": { - "active": 0, - "flagValue": 1 - }, - "cyclomatic_complexity": { - "active": 0, - "flagValue": 10 - }, - "duplicate_key": { - "active": 1, - "flagValue": -1 - }, - "empty_constructor_needs_parens": { - "active": 0, - "flagValue": -1 - }, - "ensure_comprehensions": { - "active": 1, - "flagValue": -1 - }, - "indentation": { - "active": 1, - "flagValue": 2 - }, - "line_endings": { - "active": 0, - "flagValue": 0 - }, - "max_line_length": { - "active": 0, - "flagValue": 150 - }, - "missing_fat_arrows": { - "active": 0, - "flagValue": -1 - }, - "newlines_after_classes": { - "active": 0, - "flagValue": 3 - }, - "no_backticks": { - "active": 1, - "flagValue": -1 - }, - "no_debugger": { - "active": 1, - "flagValue": -1 - }, - "no_empty_functions": { - "active": 0, - "flagValue": -1 - }, - "no_empty_param_list": { - "active": 0, - "flagValue": -1 - }, - "no_implicit_braces": { - "active": 1, - "flagValue": -1 - }, - "no_implicit_parens": { - "active": 0, - "flagValue": -1 - }, - "no_interpolation_in_single_quotes": { - "active": 0, - "flagValue": -1 - }, - "no_nested_string_interpolation": { - "active": 1, - "flagValue": -1 - }, - "no_plusplus": { - "active": 0, - "flagValue": -1 - }, - "no_private_function_fat_arrows": { - "active": 1, - "flagValue": -1 - }, - "no_stand_alone_at": { - "active": 1, - "flagValue": -1 - }, - "no_tabs": { - "active": 1, - "flagValue": -1 - }, - "no_this": { - "active": 0, - "flagValue": -1 - }, - "no_throwing_strings": { - "active": 1, - "flagValue": -1 - }, - "no_trailing_semicolons": { - "active": 1, - "flagValue": -1 - }, - "no_trailing_whitespace": { - "active": 1, - "flagValue": -1 - }, - "no_unnecessary_double_quotes": { - "active": 0, - "flagValue": -1 - }, - "no_unnecessary_fat_arrows": { - "active": 1, - "flagValue": -1 - }, - "non_empty_constructor_needs_parens": { - "active": 0, - "flagValue": -1 - }, - "prefer_english_operator": { - "active": 0, - "flagValue": -1 - }, - "space_operators": { - "active": 0, - "flagValue": -1 - }, - "spacing_after_comma": { - "active": 1, - "flagValue": -1 - } - }, - "coffeeMinifyOutput": 1, - "coffeeOutputStyle": 0, - "coffeeSyntaxCheckerStyle": 1, - "externalServerAddress": "http:\/\/magicmirror.app\/v2", - "externalServerPreviewPathAddition": "", - "genericWebpageFileExtensionsString": "html, htm, shtml, shtm, xhtml, php, jsp, asp, aspx, erb, ctp", - "hamlAutoOutputPathEnabled": 1, - "hamlAutoOutputPathFilenamePattern": "*.html", - "hamlAutoOutputPathRelativePath": "", - "hamlAutoOutputPathReplace1": "", - "hamlAutoOutputPathReplace2": "", - "hamlAutoOutputPathStyle": 0, - "hamlEscapeHTMLCharacters": 0, - "hamlNoEscapeInAttributes": 0, - "hamlOutputFormat": 2, - "hamlOutputStyle": 0, - "hamlUseCDATA": 0, - "hamlUseDoubleQuotes": 0, - "hamlUseUnixNewlines": 0, - "jadeAutoOutputPathEnabled": 1, - "jadeAutoOutputPathFilenamePattern": "*.html", - "jadeAutoOutputPathRelativePath": "", - "jadeAutoOutputPathReplace1": "", - "jadeAutoOutputPathReplace2": "", - "jadeAutoOutputPathStyle": 0, - "jadeCompileDebug": 1, - "jadeOutputStyle": 0, - "javascriptAutoOutputPathEnabled": 1, - "javascriptAutoOutputPathFilenamePattern": "*-min.js", - "javascriptAutoOutputPathRelativePath": "\/min", - "javascriptAutoOutputPathReplace1": "", - "javascriptAutoOutputPathReplace2": "", - "javascriptAutoOutputPathStyle": 2, - "javascriptCreateSourceMap": 1, - "javascriptOutputStyle": 1, - "javascriptSyntaxCheckerStyle": 1, - "jsCheckerReservedNamesString": "", - "jsHintFlags2": { - "asi": { - "active": 0, - "flagValue": -1 - }, - "bitwise": { - "active": 1, - "flagValue": -1 - }, - "boss": { - "active": 0, - "flagValue": -1 - }, - "browser": { - "active": 1, - "flagValue": -1 - }, - "browserify": { - "active": 0, - "flagValue": -1 - }, - "camelcase": { - "active": 0, - "flagValue": -1 - }, - "couch": { - "active": 0, - "flagValue": -1 - }, - "curly": { - "active": 1, - "flagValue": -1 - }, - "debug": { - "active": 0, - "flagValue": -1 - }, - "devel": { - "active": 0, - "flagValue": -1 - }, - "dojo": { - "active": 0, - "flagValue": -1 - }, - "elision": { - "active": 1, - "flagValue": -1 - }, - "eqeqeq": { - "active": 1, - "flagValue": -1 - }, - "eqnull": { - "active": 0, - "flagValue": -1 - }, - "es3": { - "active": 0, - "flagValue": -1 - }, - "esnext": { - "active": 0, - "flagValue": -1 - }, - "evil": { - "active": 0, - "flagValue": -1 - }, - "expr": { - "active": 0, - "flagValue": -1 - }, - "forin": { - "active": 0, - "flagValue": -1 - }, - "freeze": { - "active": 1, - "flagValue": -1 - }, - "funcscope": { - "active": 0, - "flagValue": -1 - }, - "futurehostile": { - "active": 0, - "flagValue": -1 - }, - "globalstrict": { - "active": 0, - "flagValue": -1 - }, - "immed": { - "active": 0, - "flagValue": -1 - }, - "indent": { - "active": 0, - "flagValue": 4 - }, - "iterator": { - "active": 0, - "flagValue": -1 - }, - "jasmine": { - "active": 0, - "flagValue": -1 - }, - "jquery": { - "active": 1, - "flagValue": -1 - }, - "lastsemic": { - "active": 0, - "flagValue": -1 - }, - "latedef": { - "active": 1, - "flagValue": -1 - }, - "laxbreak": { - "active": 0, - "flagValue": -1 - }, - "laxcomma": { - "active": 0, - "flagValue": -1 - }, - "loopfunc": { - "active": 0, - "flagValue": -1 - }, - "maxcomplexity": { - "active": 0, - "flagValue": 10 - }, - "maxdepth": { - "active": 0, - "flagValue": 3 - }, - "maxlen": { - "active": 0, - "flagValue": 150 - }, - "maxparams": { - "active": 0, - "flagValue": 3 - }, - "maxstatements": { - "active": 0, - "flagValue": 4 - }, - "mocha": { - "active": 0, - "flagValue": -1 - }, - "mootools": { - "active": 0, - "flagValue": -1 - }, - "moz": { - "active": 0, - "flagValue": -1 - }, - "multistr": { - "active": 0, - "flagValue": -1 - }, - "newcap": { - "active": 1, - "flagValue": -1 - }, - "noarg": { - "active": 1, - "flagValue": -1 - }, - "nocomma": { - "active": 0, - "flagValue": -1 - }, - "node": { - "active": 0, - "flagValue": -1 - }, - "noempty": { - "active": 0, - "flagValue": -1 - }, - "nonbsp": { - "active": 0, - "flagValue": -1 - }, - "nonew": { - "active": 1, - "flagValue": -1 - }, - "nonstandard": { - "active": 0, - "flagValue": -1 - }, - "notypeof": { - "active": 1, - "flagValue": -1 - }, - "noyield": { - "active": 0, - "flagValue": -1 - }, - "onecase": { - "active": 0, - "flagValue": -1 - }, - "phantom": { - "active": 0, - "flagValue": -1 - }, - "plusplus": { - "active": 0, - "flagValue": -1 - }, - "proto": { - "active": 0, - "flagValue": -1 - }, - "prototypejs": { - "active": 0, - "flagValue": -1 - }, - "qunit": { - "active": 0, - "flagValue": -1 - }, - "regexp": { - "active": 1, - "flagValue": -1 - }, - "rhino": { - "active": 0, - "flagValue": -1 - }, - "scripturl": { - "active": 0, - "flagValue": -1 - }, - "shadow": { - "active": 0, - "flagValue": -1 - }, - "shelljs": { - "active": 0, - "flagValue": -1 - }, - "singleGroups": { - "active": 0, - "flagValue": -1 - }, - "strict": { - "active": 0, - "flagValue": -1 - }, - "sub": { - "active": 0, - "flagValue": -1 - }, - "supernew": { - "active": 0, - "flagValue": -1 - }, - "typed": { - "active": 0, - "flagValue": -1 - }, - "undef": { - "active": 1, - "flagValue": -1 - }, - "unused": { - "active": 1, - "flagValue": -1 - }, - "varstmt": { - "active": 0, - "flagValue": -1 - }, - "withstmt": { - "active": 0, - "flagValue": -1 - }, - "worker": { - "active": 0, - "flagValue": -1 - }, - "wsh": { - "active": 0, - "flagValue": -1 - }, - "yui": { - "active": 0, - "flagValue": -1 - } - }, - "jsLintFlags2": { - "bitwise": { - "active": 0, - "flagValue": -1 - }, - "browser": { - "active": 1, - "flagValue": -1 - }, - "couch": { - "active": 0, - "flagValue": -1 - }, - "devel": { - "active": 0, - "flagValue": -1 - }, - "es6": { - "active": 0, - "flagValue": -1 - }, - "eval": { - "active": 0, - "flagValue": -1 - }, - "for": { - "active": 0, - "flagValue": -1 - }, - "maxlen": { - "active": 0, - "flagValue": 150 - }, - "node": { - "active": 0, - "flagValue": -1 - }, - "this": { - "active": 0, - "flagValue": -1 - }, - "white": { - "active": 0, - "flagValue": -1 - } - }, - "jsonAutoOutputPathEnabled": 0, - "jsonAutoOutputPathFilenamePattern": "*-min.json", - "jsonAutoOutputPathRelativePath": "", - "jsonAutoOutputPathReplace1": "", - "jsonAutoOutputPathReplace2": "", - "jsonAutoOutputPathStyle": 0, - "jsonOrderOutput": 0, - "jsonOutputStyle": 1, - "kitAutoOutputPathEnabled": 1, - "kitAutoOutputPathFilenamePattern": "*.html", - "kitAutoOutputPathRelativePath": "", - "kitAutoOutputPathReplace1": "", - "kitAutoOutputPathReplace2": "", - "kitAutoOutputPathStyle": 0, - "lessAllowInsecureImports": 0, - "lessAutoOutputPathEnabled": 1, - "lessAutoOutputPathFilenamePattern": "*.css", - "lessAutoOutputPathRelativePath": "..\/css", - "lessAutoOutputPathReplace1": "less", - "lessAutoOutputPathReplace2": "css", - "lessAutoOutputPathStyle": 2, - "lessCreateSourceMap": 0, - "lessDisableJavascript": 0, - "lessIeCompatibility": 1, - "lessOutputStyle": 0, - "lessRelativeURLS": 0, - "lessStrictImports": 0, - "lessStrictMath": 0, - "lessStrictUnits": 0, - "markdownAutoOutputPathEnabled": 1, - "markdownAutoOutputPathFilenamePattern": "*.html", - "markdownAutoOutputPathRelativePath": "", - "markdownAutoOutputPathReplace1": "", - "markdownAutoOutputPathReplace2": "", - "markdownAutoOutputPathStyle": 0, - "markdownCriticStyle": 0, - "markdownEnableFootnotes": 1, - "markdownEnableLabels": 1, - "markdownEnableSmartQuotes": 1, - "markdownEscapeLineBreaks": 0, - "markdownMaskEmailAddresses": 1, - "markdownOutputFormat": 0, - "markdownOutputStyle": 0, - "markdownParseMetadata": 1, - "markdownProcessHTML": 0, - "markdownRandomFootnoteNumbers": 0, - "markdownUseCompatibilityMode": 0, - "reloadFileURLs": 0, - "sassAutoOutputPathEnabled": 1, - "sassAutoOutputPathFilenamePattern": "*.css", - "sassAutoOutputPathRelativePath": "..\/css", - "sassAutoOutputPathReplace1": "sass", - "sassAutoOutputPathReplace2": "css", - "sassAutoOutputPathStyle": 2, - "sassCreateSourceMap": 0, - "sassDebugStyle": 0, - "sassDecimalPrecision": 10, - "sassOutputStyle": 0, - "sassUseLibsass": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "skippedItemsString": ".svn, .git, .hg, log, _logs, _cache, cache, logs, node_modules", - "slimAutoOutputPathEnabled": 1, - "slimAutoOutputPathFilenamePattern": "*.html", - "slimAutoOutputPathRelativePath": "", - "slimAutoOutputPathReplace1": "", - "slimAutoOutputPathReplace2": "", - "slimAutoOutputPathStyle": 0, - "slimCompileOnly": 0, - "slimLogicless": 0, - "slimOutputFormat": 0, - "slimOutputStyle": 1, - "slimRailsCompatible": 0, - "stylusAutoOutputPathEnabled": 1, - "stylusAutoOutputPathFilenamePattern": "*.css", - "stylusAutoOutputPathRelativePath": "..\/css", - "stylusAutoOutputPathReplace1": "stylus", - "stylusAutoOutputPathReplace2": "css", - "stylusAutoOutputPathStyle": 2, - "stylusCreateSourceMap": 0, - "stylusDebugStyle": 0, - "stylusImportCSS": 0, - "stylusOutputStyle": 0, - "stylusResolveRelativeURLS": 0, - "typescriptAutoOutputPathEnabled": 1, - "typescriptAutoOutputPathFilenamePattern": "*.js", - "typescriptAutoOutputPathRelativePath": "\/js", - "typescriptAutoOutputPathReplace1": "", - "typescriptAutoOutputPathReplace2": "", - "typescriptAutoOutputPathStyle": 2, - "typescriptCreateDeclarationFile": 0, - "typescriptCreateSourceMap": 0, - "typescriptJSXMode": 0, - "typescriptMinifyOutput": 0, - "typescriptModuleResolutionType": 0, - "typescriptModuleType": 0, - "typescriptNoImplicitAny": 0, - "typescriptPreserveConstEnums": 0, - "typescriptRemoveComments": 0, - "typescriptSuppressImplicitAnyIndexErrors": 0, - "typescriptTargetECMAVersion": 0, - "uglifyDefinesString": "", - "uglifyFlags2": { - "ascii-only": { - "active": 0, - "flagValue": -1 - }, - "bare-returns": { - "active": 0, - "flagValue": -1 - }, - "booleans": { - "active": 1, - "flagValue": -1 - }, - "bracketize": { - "active": 0, - "flagValue": -1 - }, - "cascade": { - "active": 1, - "flagValue": -1 - }, - "comments": { - "active": 1, - "flagValue": -1 - }, - "comparisons": { - "active": 1, - "flagValue": -1 - }, - "compress": { - "active": 1, - "flagValue": -1 - }, - "conditionals": { - "active": 1, - "flagValue": -1 - }, - "dead_code": { - "active": 0, - "flagValue": -1 - }, - "drop_console": { - "active": 0, - "flagValue": -1 - }, - "drop_debugger": { - "active": 1, - "flagValue": -1 - }, - "eval": { - "active": 0, - "flagValue": -1 - }, - "evaluate": { - "active": 1, - "flagValue": -1 - }, - "hoist_funs": { - "active": 1, - "flagValue": -1 - }, - "hoist_vars": { - "active": 0, - "flagValue": -1 - }, - "if_return": { - "active": 1, - "flagValue": -1 - }, - "indent-level": { - "active": 0, - "flagValue": 4 - }, - "indent-start": { - "active": 0, - "flagValue": 0 - }, - "inline-script": { - "active": 0, - "flagValue": -1 - }, - "join_vars": { - "active": 1, - "flagValue": -1 - }, - "keep_fargs": { - "active": 0, - "flagValue": -1 - }, - "keep_fnames": { - "active": 0, - "flagValue": -1 - }, - "loops": { - "active": 1, - "flagValue": -1 - }, - "mangle": { - "active": 1, - "flagValue": -1 - }, - "max-line-len": { - "active": 1, - "flagValue": 32000 - }, - "negate_iife": { - "active": 1, - "flagValue": -1 - }, - "properties": { - "active": 1, - "flagValue": -1 - }, - "pure_getters": { - "active": 0, - "flagValue": -1 - }, - "quote-keys": { - "active": 0, - "flagValue": -1 - }, - "screw-ie8": { - "active": 0, - "flagValue": -1 - }, - "semicolons": { - "active": 1, - "flagValue": -1 - }, - "sequences": { - "active": 1, - "flagValue": -1 - }, - "sort": { - "active": 0, - "flagValue": -1 - }, - "space-colon": { - "active": 1, - "flagValue": -1 - }, - "toplevel": { - "active": 0, - "flagValue": -1 - }, - "unsafe": { - "active": 0, - "flagValue": -1 - }, - "unused": { - "active": 0, - "flagValue": -1 - }, - "warnings": { - "active": 0, - "flagValue": -1 - }, - "width": { - "active": 1, - "flagValue": 80 - } - }, - "uglifyReservedNamesString": "$", - "websiteRelativeRoot": "" - }, -"settingsFileVersion": "2" -} \ No newline at end of file diff --git a/config/.gitignore b/config/.gitignore new file mode 100644 index 00000000..a2d72a24 --- /dev/null +++ b/config/.gitignore @@ -0,0 +1 @@ +config.js \ No newline at end of file diff --git a/config/config.js b/config/config.js deleted file mode 100644 index 58b8dc8d..00000000 --- a/config/config.js +++ /dev/null @@ -1,35 +0,0 @@ -/* exported config */ - -/* Magic Mirror Config - * - * By Michael Teeuw http://michaelteeuw.nl - * MIT Licensed. - */ - -var config = { - - language: 'en', - - modules: [ - { - module: 'clock', - position: 'top_left' - }, - { - module: 'compliments', - position: 'lower_third', - }, - { - module: 'helloworld', - position: 'top_right' - }, - { - module: 'helloworld', - position: 'bottom_bar', - config: { - text: 'Magic Mirror V2' - } - }, - ] - -}; \ No newline at end of file diff --git a/config/config.js.sample b/config/config.js.sample new file mode 100644 index 00000000..03059a38 --- /dev/null +++ b/config/config.js.sample @@ -0,0 +1,55 @@ +/* exported config */ + +/* Magic Mirror Config + * + * By Michael Teeuw http://michaelteeuw.nl + * MIT Licensed. + */ + +var config = { + port: 80, + + language: 'en', + timeFormat: 24, + + modules: [ + { + module: 'clock', + position: 'top_left' + }, + { + module: 'compliments', + position: 'lower_third', + }, + { + module: 'currentweather', + position: 'top_right', + config: { + location: 'New York', + appid: 'YOUR_OPENWEATHER_API_KEY' + } + }, + { + module: 'weatherforecast', + position: 'top_right', + header: 'Weather Forecast', + config: { + location: 'New York', + appid: 'YOUR_OPENWEATHER_API_KEY' + } + }, + { + module: 'newsfeed', + position: 'bottom_bar', + config: { + feedUrl: 'http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml', + showPublishDate: true, + } + }, + ] + +}; + + +/*************** DO NOT EDIT THE LINE BELOW ***************/ +if (typeof module !== 'undefined') {module.exports = config;} \ No newline at end of file diff --git a/css/main.css b/css/main.css index 9293685d..de6b2266 100644 --- a/css/main.css +++ b/css/main.css @@ -20,18 +20,21 @@ body { .xsmall {font-size: 15px; line-height: 20px;} .small {font-size: 20px; line-height: 25px;} .medium {font-size: 30px; line-height: 35px;} -.large {font-size: 60px; line-height: 60px;} -.xlarge {font-size: 70px; line-height: 70px; letter-spacing: -3px;} +.large {font-size: 65px; line-height: 65px;} +.xlarge {font-size: 75px; line-height: 75px; letter-spacing: -3px;} .thin {font-family: 'robotothin'; } .light {font-family: 'roboto_condensedlight'; } .regular {font-family: 'roboto_condensedregular';} .bold {font-family: 'roboto_condensedbold';} +.align-right {text-align: right;} + + header { - margin-top: 50px; + margin-top: 40px; text-transform: uppercase; - font-size: 0.4em; + font-size: 15px; font-family: 'roboto_condensedregular'; border-bottom: 1px solid #333; line-height: 0.35em; @@ -40,6 +43,10 @@ header { color: #666; } +header:first-child { + margin-top: 0px; +} + sup { font-size: 50%; line-height: 50%; @@ -113,4 +120,7 @@ sup { } .region.right { text-align: right; +} +.region.right table { + float: right; } \ No newline at end of file diff --git a/index.html b/index.html index 23cf889e..70b73040 100644 --- a/index.html +++ b/index.html @@ -27,6 +27,7 @@
+ @@ -34,6 +35,7 @@ + diff --git a/js/defaults.js b/js/defaults.js index f7ec13d0..33707784 100644 --- a/js/defaults.js +++ b/js/defaults.js @@ -8,8 +8,10 @@ */ var defaults = { + port: 80, language: 'en', + timeFormat: 24, modules: [ { @@ -49,4 +51,8 @@ var defaults = { modules: 'modules', vendor: 'vendor' }, -}; \ No newline at end of file +}; + + +/*************** DO NOT EDIT THE LINE BELOW ***************/ +if (typeof module !== 'undefined') {module.exports = defaults;} \ No newline at end of file diff --git a/js/electron.js b/js/electron.js index 224c6554..1ce98a0e 100755 --- a/js/electron.js +++ b/js/electron.js @@ -1,10 +1,15 @@ 'use strict'; -//for searching modules +//load modules const walk = require('walk'); +const fs = require('fs'); +const Server = require(__dirname + '/server.js'); const spawn = require('child_process').spawn; - const electron = require('electron'); + + +// Config +var config = {}; // Module to control application life. const app = electron.app; // Module to create native browser window. @@ -15,61 +20,115 @@ const BrowserWindow = electron.BrowserWindow; let mainWindow; function createWindow () { - // Create the browser window. - mainWindow = new BrowserWindow({width: 800, height: 600, fullscreen: true, "auto-hide-menu-bar": true, "node-integration": false}); + // Create the browser window. + mainWindow = new BrowserWindow({width: 800, height: 600, fullscreen: true, "auto-hide-menu-bar": true, "node-integration": false}); - // and load the index.html of the app. - mainWindow.loadURL('file://' + __dirname + '../../index.html'); + // and load the index.html of the app. + //mainWindow.loadURL('file://' + __dirname + '../../index.html'); + mainWindow.loadURL('http://localhost:' + config.port); - // Open the DevTools. - //mainWindow.webContents.openDevTools(); + // Open the DevTools. + //mainWindow.webContents.openDevTools(); - // Emitted when the window is closed. - mainWindow.on('closed', function() { - // Dereference the window object, usually you would store windows - // in an array if your app supports multi windows, this is the time - // when you should delete the corresponding element. - mainWindow = null; - }); + // Emitted when the window is closed. + mainWindow.on('closed', function() { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + mainWindow = null; + }); } -//Walk module folder and get file names -var module_loader = walk.walk(__dirname + '/../modules', { followLinks: false }); +function loadConfig (callback) { + console.log("Loading config ..."); + var defaults = require(__dirname + '/defaults.js'); + var configFilename = __dirname + '/../config/config.js'; -//for each file in modules -module_loader.on('file', function(root, stat, next) { - //if file is called node_helper.js load it - if (stat.name == "node_helper.js"){ - //start module as child - spawn('node', [root + '/' + stat.name]) - //Log module name - var module = (root + '/' + stat.name).split("/") - console.log("Started helper script for module " + module[module.length-2] + "."); - } - next(); + try { + fs.accessSync(configFilename, fs.R_OK); + var c = require(configFilename); + var config = Object.assign(defaults, c); + callback(config); + } catch (e) { + callback(defaults); + } +} + +function loadModule(moduleName) { + var helperPath = __dirname + '/../modules/' + moduleName + '/node_helper.js'; + + try { + fs.accessSync(helperPath, fs.R_OK); + + var child = spawn('node', [helperPath]); + + // Make sure the output is logged. + child.stdout.on('data', function(data) { + process.stdout.write('[' + moduleName + '] ' + data); + }); + + child.stderr.on('data', function(data) { + process.stdout.write('[' + moduleName + '] ' + data); + }); + + child.on('close', function(code) { + console.log(moduleName + ' closing code: ' + code); + }); + + //Log module name + console.log("Started helper script for module: " + moduleName + "."); + + } catch (e) { + console.log("No helper found for module: " + moduleName + "."); + } +} + +function loadModules(modules) { + console.log("Loading module helpers ..."); + + for (var m in modules) { + loadModule(modules[m]); + } + + console.log("All module helpers loaded."); +} + +loadConfig(function(c) { + config = c; + + var modules = []; + + for (var m in config.modules) { + var module = config.modules[m]; + if (modules.indexOf(module.module) === -1) { + modules.push(module.module); + } + } + + loadModules(modules); }); -module_loader.on('end', function() { - console.log("All helpers started."); -}); - // This method will be called when Electron has finished // initialization and is ready to create browser windows. -app.on('ready', createWindow); +app.on('ready', function() { + var server = new Server(config, function() { + createWindow(); + }); +}); // Quit when all windows are closed. app.on('window-all-closed', function () { - // On OS X it is common for applications and their menu bar - // to stay active until the user quits explicitly with Cmd + Q - if (process.platform !== 'darwin') { - app.quit(); - } + // On OS X it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== 'darwin') { + app.quit(); + } }); app.on('activate', function () { - // On OS X it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (mainWindow === null) { - createWindow(); - } + // On OS X it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (mainWindow === null) { + createWindow(); + } }); diff --git a/js/loader.js b/js/loader.js index 3fba0b33..45129589 100644 --- a/js/loader.js +++ b/js/loader.js @@ -80,6 +80,7 @@ var Loader = (function() { path: config.paths.modules + '/' + module, file: module + '.js', position: moduleData.position, + header: moduleData.header, config: moduleData.config }); diff --git a/js/main.js b/js/main.js index d2a88558..2325f9e0 100644 --- a/js/main.js +++ b/js/main.js @@ -22,10 +22,18 @@ var MM = (function() { for (var m in modules) { var module = modules[m]; if (module.data.position) { - var dom = document.createElement("div"); - dom.id = module.identifier; var wrapper = selectWrapper(module.data.position); + + if (typeof module.data.header !== 'undefined' && module.data.header !== '') { + var header = document.createElement("header"); + header.innerHTML = module.data.header; + wrapper.appendChild(header); + } + + var dom = document.createElement("div"); + dom.id = module.identifier; + dom.className = module.name; wrapper.appendChild(dom); dom.appendChild(module.getDom()); @@ -75,10 +83,19 @@ var MM = (function() { */ var updateDom = function(module, speed) { var wrapper = document.getElementById(module.identifier); + var newContent = module.getDom(); + + var tempWrapper = document.createElement('div'); + tempWrapper.appendChild(newContent); + + if (tempWrapper.innerHTML === wrapper.innerHTML) { + // Content did not change. Abort update. + return; + } if (!speed) { wrapper.innerHTML = null; - wrapper.appendChild(module.getDom()); + wrapper.appendChild(newContent); return; } @@ -88,7 +105,7 @@ var MM = (function() { setTimeout(function() { wrapper.innerHTML = null; - wrapper.appendChild(module.getDom()); + wrapper.appendChild(newContent); wrapper.style.opacity = 1; }, speed / 2); diff --git a/js/module.js b/js/module.js index e18c6e61..34ae02e6 100644 --- a/js/module.js +++ b/js/module.js @@ -88,7 +88,15 @@ var Module = Class.extend({ } }, - + /* socketNotificationReceived(notification, payload) + * This method is called when a socket notification arrives. + * + * argument notification string - The identifier of the noitication. + * argument payload mixed - The payload of the notification. + */ + socketNotificationReceived: function(notification, payload) { + Log.log(this.name + ' received a socket notification: ' + notification + ' - Payload: ' + payload); + }, @@ -118,6 +126,23 @@ var Module = Class.extend({ this.config = Object.assign(this.defaults, config); }, + /* socket() + * Returns a socket object. If it doesn't exsist, it's created. + * It also registers the notification callback. + */ + socket: function() { + if (typeof this._socket === 'undefined') { + this._socket = this._socket = new MMSocket(this.name); + } + + var self = this; + this._socket.setNotificationCallback(function(notification, payload) { + self.socketNotificationReceived(notification, payload); + }); + + return this._socket; + }, + /* file(file) * Retrieve the path to a module fike. * @@ -170,6 +195,16 @@ var Module = Class.extend({ */ sendNotification: function(notification, payload) { MM.sendNotification(notification, payload, this); + }, + + /* sendSocketNotification(notification, payload) + * Send a socket notification to the node helper. + * + * argument notification string - The identifier of the noitication. + * argument payload mixed - The payload of the notification. + */ + sendSocketNotification: function(notification, payload) { + this.socket().sendNotification(notification, payload); } }); diff --git a/js/server.js b/js/server.js new file mode 100644 index 00000000..32670a46 --- /dev/null +++ b/js/server.js @@ -0,0 +1,83 @@ +/* Magic Mirror + * Server + * + * By Michael Teeuw http://michaelteeuw.nl + * MIT Licensed. + */ + +var express = require('express'); +var app = require('express')(); +var server = require('http').Server(app); +var io = require('socket.io')(server); +var path = require('path'); + +var Server = function(config, callback) { + + /* createNamespace(namespace) + * Creates a namespace with a wildcard event. + * + * argument namespace string - The name of the namespace. + */ + var createNamespace = function(namespace) { + console.log('Creating socket namespace: ' + namespace); + + io.of(namespace).on('connection', function (socket) { + console.log("New socket connection on namespace: " + namespace); + + // add a catch all event. + var onevent = socket.onevent; + socket.onevent = function (packet) { + var args = packet.data || []; + onevent.call (this, packet); // original call + packet.data = ["*"].concat(args); + onevent.call(this, packet); // additional call to catch-all + }; + + // register catch all. + socket.on('*', function (event, data) { + io.of(namespace).emit(event, data); + }); + }); + }; + + /* createNamespaces() + * Creates a namespace for all modules in the config. + */ + var createNamespaces = function() { + var modules = []; + var m; + + for (m in config.modules) { + var module = config.modules[m]; + if (modules.indexOf(module.module) === -1) { + modules.push(module.module); + } + } + + for (m in modules) { + createNamespace(modules[m]); + } + }; + + console.log("Starting server op port " + config.port + " ... "); + + server.listen(config.port); + app.use('/js', express.static(__dirname)); + app.use('/config', express.static(path.resolve(__dirname + '/../config'))); + app.use('/css', express.static(path.resolve(__dirname + '/../css'))); + app.use('/fonts', express.static(path.resolve(__dirname + '/../fonts'))); + app.use('/modules', express.static(path.resolve(__dirname + '/../modules'))); + app.use('/vendor', express.static(path.resolve(__dirname + '/../vendor'))); + + app.get('/', function (req, res) { + res.sendFile(path.resolve(__dirname + '/../index.html')); + }); + + createNamespaces(); + + if (typeof callback === 'function') { + callback(); + } +}; + +module.exports = Server; \ No newline at end of file diff --git a/js/socket.js b/js/socket.js new file mode 100644 index 00000000..4badc5f8 --- /dev/null +++ b/js/socket.js @@ -0,0 +1,40 @@ +/* exported Log */ + +/* Magic Mirror + * Socket Connection + * + * By Michael Teeuw http://michaelteeuw.nl + * MIT Licensed. + */ + + + +var MMSocket = function(moduleName) { + + var self = this; + + if (typeof moduleName !== 'string') { + throw new Error('Please set the module name for the MMSocket.'); + } + + self.moduleName = moduleName; + + + self.socket = io('http://localhost:8080'); + self.socket.on('notification', function (data) { + MM.sendNotification(data.notification, data.payload, Socket); + }); + + return { + sendMessage: function(notification, payload, sender) { + Log.log('Send socket message: ' + notification); + self.socket.emit('notification', { + notification: notification, + sender: sender, + payload: payload + }); + } + }; +}; + + \ No newline at end of file diff --git a/js/socketclient.js b/js/socketclient.js new file mode 100644 index 00000000..a3cb57bd --- /dev/null +++ b/js/socketclient.js @@ -0,0 +1,83 @@ +if (typeof window === 'undefined') { + // Only perfom this part if is isn't running in the browser. + + // Load socket client + var io = require('socket.io-client'); + + // Load config + var fs = require('fs'); + + var config = {}; + + var defaults = require(__dirname + '/defaults.js'); + var configFilename = __dirname + '/../config/config.js'; + + try { + fs.accessSync(configFilename, fs.R_OK); + var c = require(configFilename); + config = Object.assign(defaults, c); + } catch (e) { + config = defaults; + } +} + + +var MMSocket = function(moduleName) { + + var self = this; + + if (typeof moduleName !== 'string') { + throw new Error('Please set the module name for the MMSocket.'); + } + + self.moduleName = moduleName; + + // Private Methods + var socketBase = (typeof window === 'undefined') ? 'http://localhost:'+config.port : ''; + socket = io(socketBase + '/' + self.moduleName); + + var notificationCallback = function() {}; + + socket.on('connect', function(s) { + + // add a catch all event. + var onevent = socket.onevent; + socket.onevent = function (packet) { + var args = packet.data || []; + onevent.call (this, packet); // original call + packet.data = ["*"].concat(args); + onevent.call(this, packet); // additional call to catch-all + }; + + // register catch all. + socket.on('*', function (notification, payload) { + if (notification !== '*') { + //console.log('Received notification: ' + notification +', payload: ' + payload); + notificationCallback(notification, payload); + } + }); + + + }); + + var sendNotification = function(notification, payload) { + //console.log('Send notification: ' + notification +', payload: ' + payload); + socket.emit(notification, payload); + }; + + // Public Methods + this.setNotificationCallback = function(callback) { + notificationCallback = callback; + }; + + this.sendNotification = function(notification, payload) { + if (typeof payload === 'undefined') { + payload = {}; + } + sendNotification(notification, payload); + }; +}; + +if (typeof module !== 'undefined') { + module.exports = MMSocket; +} \ No newline at end of file diff --git a/modules/clock/clock.js b/modules/clock/clock.js index 659f7ecc..f4ea72b6 100644 --- a/modules/clock/clock.js +++ b/modules/clock/clock.js @@ -11,7 +11,7 @@ Module.create({ // Module config defaults. defaults: { - timeFormat: 24, + timeFormat: config.timeFormat, displaySeconds: true, }, diff --git a/modules/currentweather/currentweather.css b/modules/currentweather/currentweather.css new file mode 100644 index 00000000..b953534b --- /dev/null +++ b/modules/currentweather/currentweather.css @@ -0,0 +1,9 @@ +.currentweather .weathericon { + font-size: 75%; + line-height: 65px; + display: inline-block; + + -ms-transform: translate(0px,-3px); /* IE 9 */ + -webkit-transform: translate(0px,-3px); /* Safari */ + transform: translate(0px,-3px); +} \ No newline at end of file diff --git a/modules/currentweather/currentweather.js b/modules/currentweather/currentweather.js new file mode 100644 index 00000000..1219a8d1 --- /dev/null +++ b/modules/currentweather/currentweather.js @@ -0,0 +1,271 @@ +/* global Module */ + +/* Magic Mirror + * Module: CurrentWeather + * + * By Michael Teeuw http://michaelteeuw.nl + * MIT Licensed. + */ + +Module.create({ + + // Default module config. + defaults: { + location: '', + appid: '', + units: 'metric', + updateInterval: 10 * 60 * 1000, // every 10 minutes + animationSpeed: 1000, + timeFormat: config.timeFormat, + lang: config.language, + + initialLoadDelay: 0, // 0 seconds delay + retryDelay: 2500, + + apiVersion: '2.5', + apiBase: 'http://api.openweathermap.org/data/', + weatherEndpoint: 'weather', + + iconTable: { + '01d':'wi-day-sunny', + '02d':'wi-day-cloudy', + '03d':'wi-cloudy', + '04d':'wi-cloudy-windy', + '09d':'wi-showers', + '10d':'wi-rain', + '11d':'wi-thunderstorm', + '13d':'wi-snow', + '50d':'wi-fog', + '01n':'wi-night-clear', + '02n':'wi-night-cloudy', + '03n':'wi-night-cloudy', + '04n':'wi-night-cloudy', + '09n':'wi-night-showers', + '10n':'wi-night-rain', + '11n':'wi-night-thunderstorm', + '13n':'wi-night-snow', + '50n':'wi-night-alt-cloudy-windy' + }, + }, + + // Define required scripts. + getScripts: function() { + return ['moment.js']; + }, + + // Define required scripts. + getStyles: function() { + return ['weather-icons.css', 'currentweather.css']; + }, + + + // Define start sequence. + start: function() { + Log.info('Starting module: ' + this.name); + + // Set locale. + moment.locale(config.language); + + this.windSpeed = null; + this.sunriseSunsetTime = null; + this.sunriseSunsetIcon = null; + this.temperature = null; + this.weatherType = null; + + this.loaded = false; + this.scheduleUpdate(this.config.initialLoadDelay); + + this.updateTimer = null; + + }, + + // Override dom generator. + getDom: function() { + var wrapper = document.createElement("div"); + + if (this.config.appid === '') { + wrapper.innerHTML = "Please set the correct openweather appid in the config for module: " + this.name + "."; + wrapper.className = "dimmed light small"; + return wrapper; + } + + if (this.config.location === '') { + wrapper.innerHTML = "Please set the openweather location in the config for module: " + this.name + "."; + wrapper.className = "dimmed light small"; + return wrapper; + } + + if (!this.loaded) { + wrapper.innerHTML = "Loading weather ..."; + wrapper.className = "dimmed light small"; + return wrapper; + } + + + var small = document.createElement("div"); + small.className = "normal medium"; + + var windIcon = document.createElement("span"); + windIcon.className = "wi wi-strong-wind dimmed"; + small.appendChild(windIcon); + + var windSpeed = document.createElement("span"); + windSpeed.innerHTML = " " + this.windSpeed; + small.appendChild(windSpeed); + + var spacer = document.createElement("span"); + spacer.innerHTML = " "; + small.appendChild(spacer); + + var sunriseSunsetIcon = document.createElement("span"); + sunriseSunsetIcon.className = "wi dimmed " + this.sunriseSunsetIcon; + small.appendChild(sunriseSunsetIcon); + + var sunriseSunsetTime = document.createElement("span"); + sunriseSunsetTime.innerHTML = " " + this.sunriseSunsetTime; + small.appendChild(sunriseSunsetTime); + + var large = document.createElement("div"); + large.className = "large light"; + + var weatherIcon = document.createElement("span"); + weatherIcon.className = "wi weathericon " + this.weatherType; + large.appendChild(weatherIcon); + + var temperature = document.createElement("span"); + temperature.className = "bright"; + temperature.innerHTML = " " + this.temperature + '°'; + large.appendChild(temperature); + + wrapper.appendChild(small); + wrapper.appendChild(large); + return wrapper; + }, + + + /* updateWeather(compliments) + * Requests new data from openweather.org. + * Calls processWeather on succesfull response. + */ + updateWeather: function() { + var url = this.config.apiBase + this.config.apiVersion + '/' + this.config.weatherEndpoint + this.getParams(); + var self = this; + var retry = true; + + var weatherRequest = new XMLHttpRequest(); + weatherRequest.open("GET", url, true); + weatherRequest.onreadystatechange = function() { + if(this.readyState === 4) { + if(this.status === 200) { + self.processWeather(JSON.parse(this.response)); + } else if (this.status === 401) { + self.config.appid = ''; + self.updateDom(self.config.animationSpeed); + + Log.error(self.name + ": Incorrect APPID."); + retry = false; + } else { + Log.error(self.name + ": Could not load weather."); + } + + if (retry) { + self.scheduleUpdate((self.loaded) ? -1 : self.config.retryDelay); + } + } + }; + weatherRequest.send(); + }, + + /* getParams(compliments) + * Generates an url with api parameters based on the config. + * + * return String - URL params. + */ + getParams: function() { + var params = "?"; + params += 'q=' + this.config.location; + params += '&units=' + this.config.units; + params += '&lang=' + this.config.lang; + params += '&APPID=' + this.config.appid; + + return params; + }, + + /* processWeather(data) + * Uses the received data to set the various values. + * + * argument data object - Weather information received form openweather.org. + */ + processWeather: function(data) { + this.temperature = this.roundValue(data.main.temp); + this.windSpeed = this.ms2Beaufort(this.roundValue(data.wind.speed)); + this.weatherType = this.config.iconTable[data.weather[0].icon]; + + + + var now = moment().format('x'); + var sunrise = moment(data.sys.sunrise*1000).format('x'); + var sunset = moment(data.sys.sunset*1000).format('x'); + + + if (sunrise < now && sunset > now) { + this.sunriseSunsetTime = moment(data.sys.sunset*1000).format((this.config.timeFormat === 24) ? 'HH:mm' : 'hh:mm a'); + this.sunriseSunsetIcon = 'wi-sunset'; + } else { + this.sunriseSunsetTime = moment(data.sys.sunrise*1000).format((this.config.timeFormat === 24) ? 'HH:mm' : 'hh:mm a'); + this.sunriseSunsetIcon = 'wi-sunrise'; + + } + + this.loaded = true; + this.updateDom(this.config.animationSpeed); + }, + + /* scheduleUpdate() + * Schedule next update. + * + * argument delay number - Milliseconds before next update. If empty, this.config.updateInterval is used. + */ + scheduleUpdate: function(delay) { + var nextLoad = this.config.updateInterval; + if (typeof delay !== 'undefined' && delay >= 0) { + nextLoad = delay; + } + + var self = this; + setTimeout(function() { + self.updateWeather(); + }, nextLoad); + }, + + /* ms2Beaufort(ms) + * Converts m2 to beaufort (windspeed). + * + * argument ms number - Windspeed in m/s. + * + * return number - Windspeed in beaufort. + */ + ms2Beaufort: function(ms) { + var kmh = ms * 60 * 60 / 1000; + var speeds = [1, 5, 11, 19, 28, 38, 49, 61, 74, 88, 102, 117, 1000]; + for (var beaufort in speeds) { + var speed = speeds[beaufort]; + if (speed > kmh) { + return beaufort; + } + } + return 12; + }, + + /* function(temperature) + * Rounds a temperature to 1 decimal. + * + * argument temperature number - Temperature. + * + * return number - Rounded Temperature. + */ + roundValue: function (temperature) { + return parseFloat(temperature).toFixed(1); + } +}); + diff --git a/modules/helper_test/node_helper.js b/modules/helper_test/node_helper.js deleted file mode 100644 index ea00fc25..00000000 --- a/modules/helper_test/node_helper.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -console.log("test"); \ No newline at end of file diff --git a/modules/newsfeed/newsfeed.js b/modules/newsfeed/newsfeed.js new file mode 100644 index 00000000..2c84eda8 --- /dev/null +++ b/modules/newsfeed/newsfeed.js @@ -0,0 +1,123 @@ +/* global Module */ + +/* Magic Mirror + * Module: NewsFeed + * + * By Michael Teeuw http://michaelteeuw.nl + * MIT Licensed. + */ + +Module.create({ + + // Default module config. + defaults: { + feedUrl: 'http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml', + showPublishDate: true, + reloadInterval: 10 * 60 * 1000, // every 10 minutes + updateInterval: 7.5 * 1000, + animationSpeed: 2.5 * 1000, + }, + + // Define required scripts. + getScripts: function() { + return ['moment.js']; + }, + + // Define start sequence. + start: function() { + Log.info('Starting module: ' + this.name); + + // Set locale. + moment.locale(config.language); + + this.newsItems = []; + this.loaded = false; + this.activeItem = 0; + + this.fetchNews(); + }, + + // Override socket notification handler. + socketNotificationReceived: function(notification, payload) { + if (notification === 'NEWS_ITEMS') { + if (payload.url === this.config.feedUrl) { + this.newsItems = payload.items; + if (!this.loaded) { + this.scheduleUpdateInterval(); + } + + this.loaded = true; + } + } + }, + + // Override dom generator. + getDom: function() { + + var wrapper = document.createElement("div"); + + if (this.activeItem >= this.newsItems.length) { + this.activeItem = 0; + } + + if (this.newsItems.length > 0) { + + if (this.config.showPublishDate) { + var timestamp = document.createElement("div"); + timestamp.className = "light small dimmed"; + timestamp.innerHTML = this.capitalizeFirstLetter(moment(new Date(this.newsItems[this.activeItem].pubdate)).fromNow() + ':'); + //timestamp.innerHTML = this.config.feedUrl; + wrapper.appendChild(timestamp); + } + + var title = document.createElement("div"); + title.className = "bright medium light"; + title.innerHTML = this.newsItems[this.activeItem].title; + wrapper.appendChild(title); + + } else { + wrapper.innerHTML = "Loading news ..."; + wrapper.className = "small dimmed"; + } + + return wrapper; + }, + + /* fetchNews(compliments) + * Requests new data from news proxy. + */ + fetchNews: function() { + Log.log('Add news feed to fetcher: ' + this.config.feedUrl); + this.sendSocketNotification('ADD_FEED', { + url: this.config.feedUrl, + reloadInterval: this.config.reloadInterval + }); + }, + + /* scheduleUpdateInterval() + * Schedule visual update. + */ + scheduleUpdateInterval: function() { + var self = this; + + self.updateDom(self.config.animationSpeed); + + setInterval(function() { + self.activeItem++; + self.updateDom(self.config.animationSpeed); + }, this.config.updateInterval); + }, + + /* capitalizeFirstLetter(string) + * Capitalizes the first character of a string. + * + * argument string string - Input string. + * + * return string - Capitalized output string. + */ + capitalizeFirstLetter: function(string) { + return string.charAt(0).toUpperCase() + string.slice(1); + } +}); + + diff --git a/modules/newsfeed/node_helper.js b/modules/newsfeed/node_helper.js new file mode 100644 index 00000000..f1423736 --- /dev/null +++ b/modules/newsfeed/node_helper.js @@ -0,0 +1,185 @@ + +// Load modules. +var request = require('request'); +var FeedMe = require('feedme'); +var validUrl = require('valid-url'); +var MMSocket = require('../../js/socketclient.js'); +var socket = new MMSocket('newsfeed'); + +var fetchers = {}; + +// Register the notification callback. +socket.setNotificationCallback(function(notification, payload) { + if(notification === 'ADD_FEED') { + createFetcher(payload.url, payload.reloadInterval); + } +}); + +/* createFetcher(url, reloadInterval) + * Creates a fetcher for a new url if it doesn't exsist yet. + * Otherwise it reoses the exsisting one. + * + * attribute url string - URL of the news feed. + * attribute reloadInterval number - Reload interval in milliseconds. + */ + +var createFetcher = function(url, reloadInterval) { + if (!validUrl.isUri(url)){ + socket.sendNotification('INCORRECT_URL', url); + return; + } + + var fetcher; + if (typeof fetchers[url] === 'undefined') { + console.log('Create new news fetcher for url: ' + url + ' - Interval: ' + reloadInterval); + fetcher = new Fetcher(url, reloadInterval); + fetchers[url] = fetcher; + } else { + console.log('Use exsisting news fetcher for url: ' + url); + fetcher = fetchers[url]; + fetcher.setReloadInterval(reloadInterval); + fetcher.broadcastItems(); + } + + fetcher.startFetch(); +}; + + +/* Fetcher + * Responsible for requesting an update on the set interval and broadcasting the data. + * + * attribute url string - URL of the news feed. + * attribute reloadInterval number - Reload interval in milliseconds. + */ + +var Fetcher = function(url, reloadInterval) { + var self = this; + var newsFetcher = new NewsFetcher(); + if (reloadInterval < 1000) { + reloadInterval = 1000; + } + + var reloadTimer = null; + var items = []; + + /* private methods */ + + /* fetchNews() + * Request the new items from the newsFetcher. + */ + + var fetchNews = function() { + //console.log('Fetch news.'); + clearTimeout(reloadTimer); + reloadTimer = null; + newsFetcher.fetchNews(url, function(fetchedItems) { + //console.log(fetchedItems.length + ' items received.'); + items = fetchedItems; + self.broadcastItems(); + scheduleTimer(); + }, function(error) { + //console.log('Unable to load news: ' + error); + socket.sendNotification('UNABLE_TO_LOAD_NEWS', {url:url, error:error}); + scheduleTimer(); + }); + }; + + /* scheduleTimer() + * Schedule the timer for the next update. + */ + + var scheduleTimer = function() { + //console.log('Schedule update timer.'); + clearTimeout(reloadTimer); + reloadTimer = setTimeout(function() { + fetchNews(); + }, reloadInterval); + }; + + /* public methods */ + + /* setReloadInterval() + * Update the reload interval, but only if we need to increase the speed. + * + * attribute interval number - Interval for the update in milliseconds. + */ + this.setReloadInterval = function(interval) { + if (interval > 1000 && interval < reloadInterval) { + reloadInterval = interval; + } + }; + + /* startFetch() + * Initiate fetchNews(); + */ + this.startFetch = function() { + fetchNews(); + }; + + /* broadcastItems() + * Broadcast the exsisting items. + */ + this.broadcastItems = function() { + if (items.length <= 0) { + //console.log('No items to broadcast yet.'); + return; + } + //console.log('Broadcasting ' + items.length + ' items.'); + socket.sendNotification('NEWS_ITEMS', { + url: url, + items: items + }); + }; +}; + +/* NewsFetcher + * Responsible for requesting retrieving the data. + */ + +var NewsFetcher = function() { + var self = this; + + self.successCallback = function(){}; + self.errorCallback = function(){}; + + self.items = []; + + var parser = new FeedMe(); + + parser.on('item', function(item) { + //console.log(item); + self.items.push({ + title: item.title, + pubdate: item.pubdate, + }); + }); + + parser.on('end', function(item) { + self.successCallback(self.items); + }); + + parser.on('error', function(error) { + self.errorCallback(error); + }); + + /* public methods */ + + /* fetchNews() + * Fetch the new news items. + * + * attribute url string - The url to fetch. + * attribute success function(items) - Callback on succes. + * attribute error function(error) - Callback on error. + */ + self.fetchNews = function(url, success, error) { + self.successCallback = success; + self.errorCallback = error; + request(url).pipe(parser); + }; +}; + + + + + + diff --git a/modules/weatherforecast/weatherforecast.css b/modules/weatherforecast/weatherforecast.css new file mode 100644 index 00000000..323e65a6 --- /dev/null +++ b/modules/weatherforecast/weatherforecast.css @@ -0,0 +1,18 @@ +.weatherforecast .day { + padding-left: 0px; + padding-right: 20px; +} + +.weatherforecast .weather-icon { + padding-right: 30px; +} + +.weatherforecast .min-temp { + padding-left: 10px; + padding-right: 0px; +} + +.weatherforecast table { + border-spacing: 0px; + border-collapse: separate; +} diff --git a/modules/weatherforecast/weatherforecast.js b/modules/weatherforecast/weatherforecast.js new file mode 100644 index 00000000..47ac33db --- /dev/null +++ b/modules/weatherforecast/weatherforecast.js @@ -0,0 +1,280 @@ +/* global Module */ + +/* Magic Mirror + * Module: WeatherForecast + * + * By Michael Teeuw http://michaelteeuw.nl + * MIT Licensed. + */ + +Module.create({ + + // Default module config. + defaults: { + location: '', + appid: '', + units: 'metric', + updateInterval: 10 * 60 * 1000, // every 10 minutes + animationSpeed: 1000, + timeFormat: config.timeFormat, + lang: config.language, + fade: true, + fadePoint: 0.25, // Start on 1/4th of the list. + + initialLoadDelay: 5000, // 5 seconds delay. This delay is used to keep the OpenWeather API happy. + retryDelay: 2500, + + apiVersion: '2.5', + apiBase: 'http://api.openweathermap.org/data/', + forecastEndpoint: 'forecast/daily', + + iconTable: { + '01d':'wi-day-sunny', + '02d':'wi-day-cloudy', + '03d':'wi-cloudy', + '04d':'wi-cloudy-windy', + '09d':'wi-showers', + '10d':'wi-rain', + '11d':'wi-thunderstorm', + '13d':'wi-snow', + '50d':'wi-fog', + '01n':'wi-night-clear', + '02n':'wi-night-cloudy', + '03n':'wi-night-cloudy', + '04n':'wi-night-cloudy', + '09n':'wi-night-showers', + '10n':'wi-night-rain', + '11n':'wi-night-thunderstorm', + '13n':'wi-night-snow', + '50n':'wi-night-alt-cloudy-windy' + }, + }, + + // Define required scripts. + getScripts: function() { + return ['moment.js']; + }, + + // Define required scripts. + getStyles: function() { + return ['weather-icons.css', 'weatherforecast.css']; + }, + + + // Define start sequence. + start: function() { + Log.info('Starting module: ' + this.name); + + // Set locale. + moment.locale(config.language); + + this.forecast = []; + this.loaded = false; + this.scheduleUpdate(this.config.initialLoadDelay); + + this.updateTimer = null; + + }, + + // Override dom generator. + getDom: function() { + var wrapper = document.createElement("div"); + + if (this.config.appid === '') { + wrapper.innerHTML = "Please set the correct openweather appid in the config for module: " + this.name + "."; + wrapper.className = "dimmed light small"; + return wrapper; + } + + if (this.config.location === '') { + wrapper.innerHTML = "Please set the openweather location in the config for module: " + this.name + "."; + wrapper.className = "dimmed light small"; + return wrapper; + } + + if (!this.loaded) { + wrapper.innerHTML = "Loading weather ..."; + wrapper.className = "dimmed light small"; + return wrapper; + } + + + var table = document.createElement("table"); + table.className = "small"; + + for (var f in this.forecast) { + var forecast = this.forecast[f]; + + var row = document.createElement("tr"); + table.appendChild(row); + + var dayCell = document.createElement("td"); + dayCell.className = 'day'; + dayCell.innerHTML = forecast.day; + row.appendChild(dayCell); + + var iconCell = document.createElement("td"); + iconCell.className = "bright weather-icon"; + row.appendChild(iconCell); + + var icon = document.createElement("span"); + icon.className = forecast.icon; + iconCell.appendChild(icon); + + var maxTempCell = document.createElement("td"); + maxTempCell.innerHTML = forecast.maxTemp; + maxTempCell.className = 'align-right bright max-temp'; + row.appendChild(maxTempCell); + + var minTempCell = document.createElement("td"); + minTempCell.innerHTML = forecast.minTemp; + minTempCell.className = 'align-right min-temp'; + row.appendChild(minTempCell); + + + if (this.config.fade && this.config.fadePoint < 1) { + if (this.config.fadePoint < 0) { + this.config.fadePoint = 0; + } + var startingPoint = this.forecast.length * this.config.fadePoint; + var steps = this.forecast.length - startingPoint; + if (f >= startingPoint) { + var currentStep = f - startingPoint; + row.style.opacity = 1 - (1 / steps * currentStep); + } + } + + + + } + + + + return table; + }, + + + /* updateWeather(compliments) + * Requests new data from openweather.org. + * Calls processWeather on succesfull response. + */ + updateWeather: function() { + var url = this.config.apiBase + this.config.apiVersion + '/' + this.config.forecastEndpoint + this.getParams(); + var self = this; + var retry = true; + + var weatherRequest = new XMLHttpRequest(); + weatherRequest.open("GET", url, true); + weatherRequest.onreadystatechange = function() { + if(this.readyState === 4) { + if(this.status === 200) { + self.processWeather(JSON.parse(this.response)); + } else if (this.status === 401) { + self.config.appid = ''; + self.updateDom(self.config.animationSpeed); + + Log.error(self.name + ": Incorrect APPID."); + retry = false; + } else { + Log.error(self.name + ": Could not load weather."); + } + + if (retry) { + self.scheduleUpdate((self.loaded) ? -1 : self.config.retryDelay); + } + } + }; + weatherRequest.send(); + }, + + /* getParams(compliments) + * Generates an url with api parameters based on the config. + * + * return String - URL params. + */ + getParams: function() { + var params = "?"; + params += 'q=' + this.config.location; + params += '&units=' + this.config.units; + params += '&lang=' + this.config.lang; + params += '&APPID=' + this.config.appid; + + return params; + }, + + /* processWeather(data) + * Uses the received data to set the various values. + * + * argument data object - Weather information received form openweather.org. + */ + processWeather: function(data) { + + this.forecast = []; + for (var i = 0, count = data.list.length; i < count; i++) { + + var forecast = data.list[i]; + this.forecast.push({ + + day: moment(forecast.dt, 'X').format('ddd.'), + icon: this.config.iconTable[forecast.weather[0].icon], + maxTemp: this.roundValue(forecast.temp.max), + minTemp: this.roundValue(forecast.temp.min) + + }); + } + + //Log.log(this.forecast); + + this.loaded = true; + this.updateDom(this.config.animationSpeed); + }, + + /* scheduleUpdate() + * Schedule next update. + * + * argument delay number - Milliseconds before next update. If empty, this.config.updateInterval is used. + */ + scheduleUpdate: function(delay) { + var nextLoad = this.config.updateInterval; + if (typeof delay !== 'undefined' && delay >= 0) { + nextLoad = delay; + } + + var self = this; + clearTimeout(this.updateTimer); + this.updateTimer = setTimeout(function() { + self.updateWeather(); + }, nextLoad); + }, + + /* ms2Beaufort(ms) + * Converts m2 to beaufort (windspeed). + * + * argument ms number - Windspeed in m/s. + * + * return number - Windspeed in beaufort. + */ + ms2Beaufort: function(ms) { + var kmh = ms * 60 * 60 / 1000; + var speeds = [1, 5, 11, 19, 28, 38, 49, 61, 74, 88, 102, 117, 1000]; + for (var beaufort in speeds) { + var speed = speeds[beaufort]; + if (speed > kmh) { + return beaufort; + } + } + return 12; + }, + + /* function(temperature) + * Rounds a temperature to 1 decimal. + * + * argument temperature number - Temperature. + * + * return number - Rounded Temperature. + */ + roundValue: function (temperature) { + return parseFloat(temperature).toFixed(1); + } +}); + diff --git a/package.json b/package.json index 9df003f5..96070afe 100755 --- a/package.json +++ b/package.json @@ -1,32 +1,39 @@ { - "name": "Magic-Mirror", - "version": "2.0.0", - "description": "A modular interface for smart mirrors.", - "main": "js/electron.js", - "scripts": { - "start": "electron js/electron.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/MichMich/MagicMirror.git" - }, - "keywords": [ - "magic mirror", - "smart mirror", - "mirror UI", - "modular" - ], - "author": "Michael Teeuw", - "contributors": "https://github.com/MichMich/MagicMirror/graphs/contributors", - "license": "MIT", - "bugs": { - "url": "https://github.com/MichMich/MagicMirror/issues" - }, - "homepage": "https://github.com/MichMich/MagicMirror#readme", - "devDependencies": { - "electron-prebuilt": "latest" - }, - "dependencies": { - "walk": "latest" - } + "name": "magicmirror", + "version": "2.0.0", + "description": "A modular interface for smart mirrors.", + "main": "js/electron.js", + "scripts": { + "start": "electron js/electron.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/MichMich/MagicMirror.git" + }, + "keywords": [ + "magic mirror", + "smart mirror", + "mirror UI", + "modular" + ], + "author": "Michael Teeuw", + "contributors": "https://github.com/MichMich/MagicMirror/graphs/contributors", + "license": "MIT", + "bugs": { + "url": "https://github.com/MichMich/MagicMirror/issues" + }, + "homepage": "https://github.com/MichMich/MagicMirror#readme", + "devDependencies": { + "electron-prebuilt": "latest" + }, + "dependencies": { + "socket.io":"latest", + "express":"latest", + "request":"latest", + "walk": "latest", + "feedme": "latest", + "valid-url": "latest", + "ical": "latest", + "moment": "latest" + } } diff --git a/vendor/vendor.js b/vendor/vendor.js index a6e60420..3d984d03 100644 --- a/vendor/vendor.js +++ b/vendor/vendor.js @@ -9,4 +9,5 @@ var vendor = { 'moment.js' : 'moment/moment-with-locales.min.js', + 'weather-icons.css': 'weather-icons/weather-icons.css' }; \ No newline at end of file diff --git a/vendor/weather-icons/weather-icons.css b/vendor/weather-icons/weather-icons.css new file mode 100755 index 00000000..c547ce67 --- /dev/null +++ b/vendor/weather-icons/weather-icons.css @@ -0,0 +1,327 @@ +/*! + * Weather Icons Beta 1 + * Weather themed icons for Bootstrap + * ------------------------------------------------------------------------------ + * Maintained at http://erikflowers.github.io/weather-icons + * http://twitter.com/Erik_UX + * + * License + * ------------------------------------------------------------------------------ + * - Fpmt licensed under SIL OFL 1.1 - + * http://scripts.sil.org/OFL + * - CSS and LESS are licensed under MIT License - + * http://opensource.org/licenses/mit-license.html + * - Documentation licensed under CC BY 3.0 - + * http://creativecommons.org/licenses/by/3.0/ + * - Inspired by and works great as a companion with Font Aweosme + * "Font Awesome by Dave Gandy - http://fontawesome.io" + * + * Weather Icons Bootstrap Package Author - Erik Flowers - erik@helloerik.com + * Weather Icons gives full credit for inspiration to Font Awesome and makes no + * claim to invention, intellectual property, or ownership of methodology. + * + * Support Open Source! + * + * ------------------------------------------------------------------------------ + * Email: erik@helloerik.com + * Twitter: http://twitter.com/Erik_UX + */ +@font-face { + font-family: 'weather'; + src: url('weathericons-regular-webfont.eot'); + src: url('weathericons-regular-webfont.eot?#iefix') format('embedded-opentype'), url('weathericons-regular-webfont.woff') format('woff'), url('weathericons-regular-webfont.ttf') format('truetype'), url('weathericons-regular-webfont.svg#weathericons-regular-webfontRg') format('svg'); + font-weight: normal; + font-style: normal; +} +[class^="wi-"], +[class*=" wi-"] { + font-family: weather; + font-weight: normal; + font-style: normal; + text-decoration: inherit; + text-transform: none; + -webkit-font-smoothing: antialiased; + *margin-right: .3em; +} +[class^="wi-"]:before, +[class*=" wi-"]:before { + text-decoration: inherit; + display: inline-block; + speak: none; +} +.wi-day-cloudy-gusts:before { + content: "\f000"; +} +.wi-day-cloudy-windy:before { + content: "\f001"; +} +.wi-day-cloudy:before { + content: "\f002"; +} +.wi-day-fog:before { + content: "\f003"; +} +.wi-day-hail:before { + content: "\f004"; +} +.wi-day-lightning:before { + content: "\f005"; +} +.wi-day-rain-mix:before { + content: "\f006"; +} +.wi-day-rain-wind:before { + content: "\f007"; +} +.wi-day-rain:before { + content: "\f008"; +} +.wi-day-showers:before { + content: "\f009"; +} +.wi-day-snow:before { + content: "\f00a"; +} +.wi-day-sprinkle:before { + content: "\f00b"; +} +.wi-day-sunny-overcast:before { + content: "\f00c"; +} +.wi-day-sunny:before { + content: "\f00d"; +} +.wi-day-storm-showers:before { + content: "\f00e"; +} +.wi-day-thunderstorm:before { + content: "\f010"; +} +.wi-cloudy-gusts:before { + content: "\f011"; +} +.wi-cloudy-windy:before { + content: "\f012"; +} +.wi-cloudy:before { + content: "\f013"; +} +.wi-fog:before { + content: "\f014"; +} +.wi-hail:before { + content: "\f015"; +} +.wi-lightning:before { + content: "\f016"; +} +.wi-rain-mix:before { + content: "\f017"; +} +.wi-rain-wind:before { + content: "\f018"; +} +.wi-rain:before { + content: "\f019"; +} +.wi-showers:before { + content: "\f01a"; +} +.wi-snow:before { + content: "\f01b"; +} +.wi-sprinkle:before { + content: "\f01c"; +} +.wi-storm-showers:before { + content: "\f01d"; +} +.wi-thunderstorm:before { + content: "\f01e"; +} +.wi-windy:before { + content: "\f021"; +} +.wi-night-alt-cloudy-gusts:before { + content: "\f022"; +} +.wi-night-alt-cloudy-windy:before { + content: "\f023"; +} +.wi-night-alt-hail:before { + content: "\f024"; +} +.wi-night-alt-lightning:before { + content: "\f025"; +} +.wi-night-alt-rain-mix:before { + content: "\f026"; +} +.wi-night-alt-rain-wind:before { + content: "\f027"; +} +.wi-night-alt-rain:before { + content: "\f028"; +} +.wi-night-alt-showers:before { + content: "\f029"; +} +.wi-night-alt-snow:before { + content: "\f02a"; +} +.wi-night-alt-sprinkle:before { + content: "\f02b"; +} +.wi-night-alt-storm-showers:before { + content: "\f02c"; +} +.wi-night-alt-thunderstorm:before { + content: "\f02d"; +} +.wi-night-clear:before { + content: "\f02e"; +} +.wi-night-cloudy-gusts:before { + content: "\f02f"; +} +.wi-night-cloudy-windy:before { + content: "\f030"; +} +.wi-night-cloudy:before { + content: "\f031"; +} +.wi-night-hail:before { + content: "\f032"; +} +.wi-night-lightning:before { + content: "\f033"; +} +.wi-night-rain-mix:before { + content: "\f034"; +} +.wi-night-rain-wind:before { + content: "\f035"; +} +.wi-night-rain:before { + content: "\f036"; +} +.wi-night-showers:before { + content: "\f037"; +} +.wi-night-snow:before { + content: "\f038"; +} +.wi-night-sprinkle:before { + content: "\f039"; +} +.wi-night-storm-showers:before { + content: "\f03a"; +} +.wi-night-thunderstorm:before { + content: "\f03b"; +} +.wi-celcius:before { + content: "\f03c"; +} +.wi-cloud-down:before { + content: "\f03d"; +} +.wi-cloud-refresh:before { + content: "\f03e"; +} +.wi-cloud-up:before { + content: "\f040"; +} +.wi-cloud:before { + content: "\f041"; +} +.wi-degrees:before { + content: "\f042"; +} +.wi-down-left:before { + content: "\f043"; +} +.wi-down:before { + content: "\f044"; +} +.wi-fahrenheit:before { + content: "\f045"; +} +.wi-horizon-alt:before { + content: "\f046"; +} +.wi-horizon:before { + content: "\f047"; +} +.wi-left:before { + content: "\f048"; +} +.wi-lightning:before { + content: "\f016"; +} +.wi-night-fog:before { + content: "\f04a"; +} +.wi-refresh-alt:before { + content: "\f04b"; +} +.wi-refresh:before { + content: "\f04c"; +} +.wi-right:before { + content: "\f04d"; +} +.wi-sprinkles:before { + content: "\f04e"; +} +.wi-strong-wind:before { + content: "\f050"; +} +.wi-sunrise:before { + content: "\f051"; +} +.wi-sunset:before { + content: "\f052"; +} +.wi-thermometer-exterior:before { + content: "\f053"; +} +.wi-thermometer-internal:before { + content: "\f054"; +} +.wi-thermometer:before { + content: "\f055"; +} +.wi-tornado:before { + content: "\f056"; +} +.wi-up-right:before { + content: "\f057"; +} +.wi-up:before { + content: "\f058"; +} +.wi-wind-east:before { + content: "\f059"; +} +.wi-wind-north-east:before { + content: "\f05a"; +} +.wi-wind-north-west:before { + content: "\f05b"; +} +.wi-wind-north:before { + content: "\f05c"; +} +.wi-wind-south-east:before { + content: "\f05d"; +} +.wi-wind-south-west:before { + content: "\f05e"; +} +.wi-wind-south:before { + content: "\f060"; +} +.wi-wind-west:before { + content: "\f061"; +} diff --git a/vendor/weather-icons/weathericons-regular-webfont.eot b/vendor/weather-icons/weathericons-regular-webfont.eot new file mode 100755 index 00000000..d9f8a717 Binary files /dev/null and b/vendor/weather-icons/weathericons-regular-webfont.eot differ diff --git a/vendor/weather-icons/weathericons-regular-webfont.svg b/vendor/weather-icons/weathericons-regular-webfont.svg new file mode 100755 index 00000000..9c8d899a --- /dev/null +++ b/vendor/weather-icons/weathericons-regular-webfont.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendor/weather-icons/weathericons-regular-webfont.ttf b/vendor/weather-icons/weathericons-regular-webfont.ttf new file mode 100755 index 00000000..e10fbc83 Binary files /dev/null and b/vendor/weather-icons/weathericons-regular-webfont.ttf differ diff --git a/vendor/weather-icons/weathericons-regular-webfont.woff b/vendor/weather-icons/weathericons-regular-webfont.woff new file mode 100755 index 00000000..af1d7bbf Binary files /dev/null and b/vendor/weather-icons/weathericons-regular-webfont.woff differ