Fully end to end encrypted anonymous chat program. Server only stores public key lookup for users and the encrypted messages. No credentials are transfered to the server, but kept in local browser storage. This allows 100% safe chatting.
https://safechat.ch
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
2.8 KiB
116 lines
2.8 KiB
var utils = require('../utils') |
|
, nodes = require('../nodes') |
|
, readFile = require('fs').readFileSync; |
|
|
|
/** |
|
* Convert a .json file into stylus variables or object. |
|
* Nested variable object keys are joined with a dash (-) |
|
* |
|
* Given this sample media-queries.json file: |
|
* { |
|
* "small": "screen and (max-width:400px)", |
|
* "tablet": { |
|
* "landscape": "screen and (min-width:600px) and (orientation:landscape)", |
|
* "portrait": "screen and (min-width:600px) and (orientation:portrait)" |
|
* } |
|
* } |
|
* |
|
* Examples: |
|
* |
|
* json('media-queries.json') |
|
* |
|
* @media small |
|
* // => @media screen and (max-width:400px) |
|
* |
|
* @media tablet-landscape |
|
* // => @media screen and (min-width:600px) and (orientation:landscape) |
|
* |
|
* vars = json('vars.json', { hash: true }) |
|
* body |
|
* width: vars.width |
|
* |
|
* @param {String} path |
|
* @param {Boolean} [local] |
|
* @param {String} [namePrefix] |
|
* @api public |
|
*/ |
|
|
|
module.exports = function(path, local, namePrefix){ |
|
utils.assertString(path, 'path'); |
|
|
|
// lookup |
|
path = path.string; |
|
var found = utils.lookup(path, this.options.paths, this.options.filename) |
|
, options = (local && 'object' == local.nodeName) && local; |
|
|
|
if (!found) { |
|
// optional JSON file |
|
if (options && options.get('optional').toBoolean().isTrue) { |
|
return nodes.null; |
|
} |
|
throw new Error('failed to locate .json file ' + path); |
|
} |
|
|
|
// read |
|
var json = JSON.parse(readFile(found, 'utf8')); |
|
|
|
if (options) { |
|
return convert(json, options); |
|
} else { |
|
oldJson.call(this, json, local, namePrefix); |
|
} |
|
|
|
function convert(obj, options){ |
|
var ret = new nodes.Object() |
|
, leaveStrings = options.get('leave-strings').toBoolean(); |
|
|
|
for (var key in obj) { |
|
var val = obj[key]; |
|
if ('object' == typeof val) { |
|
ret.set(key, convert(val, options)); |
|
} else { |
|
val = utils.coerce(val); |
|
if ('string' == val.nodeName && leaveStrings.isFalse) { |
|
val = utils.parseString(val.string); |
|
} |
|
ret.set(key, val); |
|
} |
|
} |
|
return ret; |
|
} |
|
}; |
|
|
|
/** |
|
* Old `json` BIF. |
|
* |
|
* @api private |
|
*/ |
|
|
|
function oldJson(json, local, namePrefix){ |
|
if (namePrefix) { |
|
utils.assertString(namePrefix, 'namePrefix'); |
|
namePrefix = namePrefix.val; |
|
} else { |
|
namePrefix = ''; |
|
} |
|
local = local ? local.toBoolean() : new nodes.Boolean(local); |
|
var scope = local.isTrue ? this.currentScope : this.global.scope; |
|
|
|
convert(json); |
|
return; |
|
|
|
function convert(obj, prefix){ |
|
prefix = prefix ? prefix + '-' : ''; |
|
for (var key in obj){ |
|
var val = obj[key]; |
|
var name = prefix + key; |
|
if ('object' == typeof val) { |
|
convert(val, name); |
|
} else { |
|
val = utils.coerce(val); |
|
if ('string' == val.nodeName) val = utils.parseString(val.string); |
|
scope.add({ name: namePrefix + name, val: val }); |
|
} |
|
} |
|
} |
|
};
|
|
|