Skip to content

Commit

Permalink
Fix indent (#242)
Browse files Browse the repository at this point in the history
* improve import system

* fix_indent
  • Loading branch information
valq7711 authored Oct 30, 2020
1 parent 22c0a6a commit 1c05184
Show file tree
Hide file tree
Showing 12 changed files with 319 additions and 269 deletions.
3 changes: 2 additions & 1 deletion lib/compile.js
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,8 @@ module.exports = function(start_time, argv, base_path, src_path, lib_path) {
beautify: argv.beautify,
private_scope: !argv.bare,
omit_baselib: argv.omit_baselib,
strict_names: argv.strict_names
strict_names: argv.strict_names,
indent_min: parseInt(argv.indent_min)
};
if (!argv.omit_baselib) {
parseOpts.baselib = rapydscript.parse_baselib(src_path, parseOpts.es6);
Expand Down
23 changes: 19 additions & 4 deletions lib/rapydscript.js
Original file line number Diff line number Diff line change
Expand Up @@ -3400,9 +3400,15 @@ var ՐՏ_modules = ՐՏ_def_modules();
ՐՏ_modules["ՐՏ:tokenizer"].body = function(){
var __name__ = "tokenizer";

var ES6_KEYWORDS, COMMON_KEYWORDS, JS_KEYWORDS, JS_KEYWORDS_AUTOFIX, RS_KEYWORDS, KEYWORDS, KEYWORDS_ATOM, RESERVED_WORDS, KEYWORDS_BEFORE_EXPRESSION, ALL_KEYWORDS, ALL_JS_KEYWORDS, IS_ANY_KEYWORD, OPERATOR_CHARS, RE_HEX_NUMBER, RE_OCT_NUMBER, RE_DEC_NUMBER, OPERATORS, OP_MAP, WHITESPACE_CHARS, PUNC_BEFORE_EXPRESSION, PUNC_CHARS, REGEXP_MODIFIERS, UNICODE, IDENTIFIER_PAT, STRING_MODIFIERS, UNARY_POSTFIX, PRECEDENCE, EX_EOF;
var makePredicate = ՐՏ_modules["utils"].makePredicate;var ParseError = ՐՏ_modules["utils"].ParseError;
var OPTIONS, ES6_KEYWORDS, COMMON_KEYWORDS, JS_KEYWORDS, JS_KEYWORDS_AUTOFIX, RS_KEYWORDS, KEYWORDS, KEYWORDS_ATOM, RESERVED_WORDS, KEYWORDS_BEFORE_EXPRESSION, ALL_KEYWORDS, ALL_JS_KEYWORDS, IS_ANY_KEYWORD, OPERATOR_CHARS, RE_HEX_NUMBER, RE_OCT_NUMBER, RE_DEC_NUMBER, OPERATORS, OP_MAP, WHITESPACE_CHARS, PUNC_BEFORE_EXPRESSION, PUNC_CHARS, REGEXP_MODIFIERS, UNICODE, IDENTIFIER_PAT, STRING_MODIFIERS, UNARY_POSTFIX, PRECEDENCE, EX_EOF;
var makePredicate = ՐՏ_modules["utils"].makePredicate;var ParseError = ՐՏ_modules["utils"].ParseError;var defaults = ՐՏ_modules["utils"].defaults;
var ast = ՐՏ_modules["ast"];
OPTIONS = {
indent_min: 2
};
function set_options(opt) {
OPTIONS = defaults(opt, OPTIONS, true);
}
function characters(str_) {
return str_.split("");
}
Expand Down Expand Up @@ -3713,6 +3719,9 @@ var ՐՏ_modules = ՐՏ_def_modules();
most_recent = (ՐՏ_216 = S.whitespace_before)[ՐՏ_216.length-1] || "";
S.endblock = false;
if ((ՐՏ_217 = S.in_scope)[ՐՏ_217.length-1] === "block" && leading_whitespace !== most_recent) {
if ((leading_whitespace.indexOf(" ") === 0 || most_recent.indexOf(" ") === 0) && Math.abs(leading_whitespace.length - most_recent.length) < OPTIONS.indent_min) {
TokenizerError("Indentation is too small");
}
if (S.newblock && leading_whitespace && leading_whitespace.indexOf(most_recent) === 0) {
S.newblock = false;
S.whitespace_before.push(leading_whitespace);
Expand Down Expand Up @@ -4134,6 +4143,7 @@ var ՐՏ_modules = ՐՏ_def_modules();
return next_token;
}
var ՐՏ_mod = ՐՏ_modules["ՐՏ:tokenizer"];
ՐՏ_mod.export("OPTIONS", function(){return OPTIONS;}, function(ՐՏ_v){if (typeof OPTIONS !== "undefined") {OPTIONS = ՐՏ_v;};});
ՐՏ_mod.export("ES6_KEYWORDS", function(){return ES6_KEYWORDS;}, function(ՐՏ_v){if (typeof ES6_KEYWORDS !== "undefined") {ES6_KEYWORDS = ՐՏ_v;};});
ՐՏ_mod.export("COMMON_KEYWORDS", function(){return COMMON_KEYWORDS;}, function(ՐՏ_v){if (typeof COMMON_KEYWORDS !== "undefined") {COMMON_KEYWORDS = ՐՏ_v;};});
ՐՏ_mod.export("JS_KEYWORDS", function(){return JS_KEYWORDS;}, function(ՐՏ_v){if (typeof JS_KEYWORDS !== "undefined") {JS_KEYWORDS = ՐՏ_v;};});
Expand Down Expand Up @@ -4162,6 +4172,7 @@ var ՐՏ_modules = ՐՏ_def_modules();
ՐՏ_mod.export("UNARY_POSTFIX", function(){return UNARY_POSTFIX;}, function(ՐՏ_v){if (typeof UNARY_POSTFIX !== "undefined") {UNARY_POSTFIX = ՐՏ_v;};});
ՐՏ_mod.export("PRECEDENCE", function(){return PRECEDENCE;}, function(ՐՏ_v){if (typeof PRECEDENCE !== "undefined") {PRECEDENCE = ՐՏ_v;};});
ՐՏ_mod.export("EX_EOF", function(){return EX_EOF;}, function(ՐՏ_v){if (typeof EX_EOF !== "undefined") {EX_EOF = ՐՏ_v;};});
ՐՏ_mod.export("set_options", function(){return set_options;}, function(ՐՏ_v){if (typeof set_options !== "undefined") {set_options = ՐՏ_v;};});
ՐՏ_mod.export("characters", function(){return characters;}, function(ՐՏ_v){if (typeof characters !== "undefined") {characters = ՐՏ_v;};});
ՐՏ_mod.export("is_letter", function(){return is_letter;}, function(ՐՏ_v){if (typeof is_letter !== "undefined") {is_letter = ՐՏ_v;};});
ՐՏ_mod.export("is_digit", function(){return is_digit;}, function(ՐՏ_v){if (typeof is_digit !== "undefined") {is_digit = ՐՏ_v;};});
Expand All @@ -4176,7 +4187,7 @@ var ՐՏ_modules = ՐՏ_def_modules();
ՐՏ_mod.export("is_token", function(){return is_token;}, function(ՐՏ_v){if (typeof is_token !== "undefined") {is_token = ՐՏ_v;};});
ՐՏ_mod.export("js_error", function(){return js_error;}, function(ՐՏ_v){if (typeof js_error !== "undefined") {js_error = ՐՏ_v;};});
ՐՏ_mod.export("tokenizer", function(){return tokenizer;}, function(ՐՏ_v){if (typeof tokenizer !== "undefined") {tokenizer = ՐՏ_v;};});
ՐՏ_mod.export("ParseError", function(){return ParseError;}, function(ՐՏ_v){if (typeof ParseError !== "undefined") {ParseError = ՐՏ_v;};});
ՐՏ_mod.export("defaults", function(){return defaults;}, function(ՐՏ_v){if (typeof defaults !== "undefined") {defaults = ՐՏ_v;};});
ՐՏ_mod.export("ast", function(){return ast;}, function(ՐՏ_v){if (typeof ast !== "undefined") {ast = ՐՏ_v;};});
return ՐՏ_mod["exports"];
};
Expand Down Expand Up @@ -4306,7 +4317,8 @@ var ՐՏ_modules = ՐՏ_def_modules();
dropImports: [],
dropDocstrings: false,
classes: null,
readfile: typeof require != "undefined" ? require("fs").readFileSync : null
readfile: typeof require != "undefined" ? require("fs").readFileSync : null,
indent_min: 2
});
module_id = options.module_id;
import_dirs = options.import_dirs.slice(0);
Expand All @@ -4321,6 +4333,9 @@ var ՐՏ_modules = ՐՏ_def_modules();
IMPORTED = options.IMPORTED || {};
IMPORTING = options.IMPORTING || {};
(ՐՏ_230 = IMPORTING)[module_id] = true;
tokenizer.set_options({
indent_min: options.indent_min
});
S = {
input: typeof $TEXT === "string" ? tokenizer.tokenizer($TEXT, options.filename) : $TEXT,
token: null,
Expand Down
23 changes: 19 additions & 4 deletions lib/rapydscript_web.js
Original file line number Diff line number Diff line change
Expand Up @@ -3405,9 +3405,15 @@ var ՐՏ_modules = ՐՏ_def_modules();
ՐՏ_modules["ՐՏ:tokenizer"].body = function(){
var __name__ = "tokenizer";

var ES6_KEYWORDS, COMMON_KEYWORDS, JS_KEYWORDS, JS_KEYWORDS_AUTOFIX, RS_KEYWORDS, KEYWORDS, KEYWORDS_ATOM, RESERVED_WORDS, KEYWORDS_BEFORE_EXPRESSION, ALL_KEYWORDS, ALL_JS_KEYWORDS, IS_ANY_KEYWORD, OPERATOR_CHARS, RE_HEX_NUMBER, RE_OCT_NUMBER, RE_DEC_NUMBER, OPERATORS, OP_MAP, WHITESPACE_CHARS, PUNC_BEFORE_EXPRESSION, PUNC_CHARS, REGEXP_MODIFIERS, UNICODE, IDENTIFIER_PAT, STRING_MODIFIERS, UNARY_POSTFIX, PRECEDENCE, EX_EOF;
var makePredicate = ՐՏ_modules["utils"].makePredicate;var ParseError = ՐՏ_modules["utils"].ParseError;
var OPTIONS, ES6_KEYWORDS, COMMON_KEYWORDS, JS_KEYWORDS, JS_KEYWORDS_AUTOFIX, RS_KEYWORDS, KEYWORDS, KEYWORDS_ATOM, RESERVED_WORDS, KEYWORDS_BEFORE_EXPRESSION, ALL_KEYWORDS, ALL_JS_KEYWORDS, IS_ANY_KEYWORD, OPERATOR_CHARS, RE_HEX_NUMBER, RE_OCT_NUMBER, RE_DEC_NUMBER, OPERATORS, OP_MAP, WHITESPACE_CHARS, PUNC_BEFORE_EXPRESSION, PUNC_CHARS, REGEXP_MODIFIERS, UNICODE, IDENTIFIER_PAT, STRING_MODIFIERS, UNARY_POSTFIX, PRECEDENCE, EX_EOF;
var makePredicate = ՐՏ_modules["utils"].makePredicate;var ParseError = ՐՏ_modules["utils"].ParseError;var defaults = ՐՏ_modules["utils"].defaults;
var ast = ՐՏ_modules["ast"];
OPTIONS = {
indent_min: 2
};
function set_options(opt) {
OPTIONS = defaults(opt, OPTIONS, true);
}
function characters(str_) {
return str_.split("");
}
Expand Down Expand Up @@ -3718,6 +3724,9 @@ var ՐՏ_modules = ՐՏ_def_modules();
most_recent = (ՐՏ_216 = S.whitespace_before)[ՐՏ_216.length-1] || "";
S.endblock = false;
if ((ՐՏ_217 = S.in_scope)[ՐՏ_217.length-1] === "block" && leading_whitespace !== most_recent) {
if ((leading_whitespace.indexOf(" ") === 0 || most_recent.indexOf(" ") === 0) && Math.abs(leading_whitespace.length - most_recent.length) < OPTIONS.indent_min) {
TokenizerError("Indentation is too small");
}
if (S.newblock && leading_whitespace && leading_whitespace.indexOf(most_recent) === 0) {
S.newblock = false;
S.whitespace_before.push(leading_whitespace);
Expand Down Expand Up @@ -4139,6 +4148,7 @@ var ՐՏ_modules = ՐՏ_def_modules();
return next_token;
}
var ՐՏ_mod = ՐՏ_modules["ՐՏ:tokenizer"];
ՐՏ_mod.export("OPTIONS", function(){return OPTIONS;}, function(ՐՏ_v){if (typeof OPTIONS !== "undefined") {OPTIONS = ՐՏ_v;};});
ՐՏ_mod.export("ES6_KEYWORDS", function(){return ES6_KEYWORDS;}, function(ՐՏ_v){if (typeof ES6_KEYWORDS !== "undefined") {ES6_KEYWORDS = ՐՏ_v;};});
ՐՏ_mod.export("COMMON_KEYWORDS", function(){return COMMON_KEYWORDS;}, function(ՐՏ_v){if (typeof COMMON_KEYWORDS !== "undefined") {COMMON_KEYWORDS = ՐՏ_v;};});
ՐՏ_mod.export("JS_KEYWORDS", function(){return JS_KEYWORDS;}, function(ՐՏ_v){if (typeof JS_KEYWORDS !== "undefined") {JS_KEYWORDS = ՐՏ_v;};});
Expand Down Expand Up @@ -4167,6 +4177,7 @@ var ՐՏ_modules = ՐՏ_def_modules();
ՐՏ_mod.export("UNARY_POSTFIX", function(){return UNARY_POSTFIX;}, function(ՐՏ_v){if (typeof UNARY_POSTFIX !== "undefined") {UNARY_POSTFIX = ՐՏ_v;};});
ՐՏ_mod.export("PRECEDENCE", function(){return PRECEDENCE;}, function(ՐՏ_v){if (typeof PRECEDENCE !== "undefined") {PRECEDENCE = ՐՏ_v;};});
ՐՏ_mod.export("EX_EOF", function(){return EX_EOF;}, function(ՐՏ_v){if (typeof EX_EOF !== "undefined") {EX_EOF = ՐՏ_v;};});
ՐՏ_mod.export("set_options", function(){return set_options;}, function(ՐՏ_v){if (typeof set_options !== "undefined") {set_options = ՐՏ_v;};});
ՐՏ_mod.export("characters", function(){return characters;}, function(ՐՏ_v){if (typeof characters !== "undefined") {characters = ՐՏ_v;};});
ՐՏ_mod.export("is_letter", function(){return is_letter;}, function(ՐՏ_v){if (typeof is_letter !== "undefined") {is_letter = ՐՏ_v;};});
ՐՏ_mod.export("is_digit", function(){return is_digit;}, function(ՐՏ_v){if (typeof is_digit !== "undefined") {is_digit = ՐՏ_v;};});
Expand All @@ -4181,7 +4192,7 @@ var ՐՏ_modules = ՐՏ_def_modules();
ՐՏ_mod.export("is_token", function(){return is_token;}, function(ՐՏ_v){if (typeof is_token !== "undefined") {is_token = ՐՏ_v;};});
ՐՏ_mod.export("js_error", function(){return js_error;}, function(ՐՏ_v){if (typeof js_error !== "undefined") {js_error = ՐՏ_v;};});
ՐՏ_mod.export("tokenizer", function(){return tokenizer;}, function(ՐՏ_v){if (typeof tokenizer !== "undefined") {tokenizer = ՐՏ_v;};});
ՐՏ_mod.export("ParseError", function(){return ParseError;}, function(ՐՏ_v){if (typeof ParseError !== "undefined") {ParseError = ՐՏ_v;};});
ՐՏ_mod.export("defaults", function(){return defaults;}, function(ՐՏ_v){if (typeof defaults !== "undefined") {defaults = ՐՏ_v;};});
ՐՏ_mod.export("ast", function(){return ast;}, function(ՐՏ_v){if (typeof ast !== "undefined") {ast = ՐՏ_v;};});
return ՐՏ_mod["exports"];
};
Expand Down Expand Up @@ -4311,7 +4322,8 @@ var ՐՏ_modules = ՐՏ_def_modules();
dropImports: [],
dropDocstrings: false,
classes: null,
readfile: typeof require != "undefined" ? require("fs").readFileSync : null
readfile: typeof require != "undefined" ? require("fs").readFileSync : null,
indent_min: 2
});
module_id = options.module_id;
import_dirs = options.import_dirs.slice(0);
Expand All @@ -4326,6 +4338,9 @@ var ՐՏ_modules = ՐՏ_def_modules();
IMPORTED = options.IMPORTED || {};
IMPORTING = options.IMPORTING || {};
(ՐՏ_230 = IMPORTING)[module_id] = true;
tokenizer.set_options({
indent_min: options.indent_min
});
S = {
input: typeof $TEXT === "string" ? tokenizer.tokenizer($TEXT, options.filename) : $TEXT,
token: null,
Expand Down
5 changes: 3 additions & 2 deletions src/compile.pyj
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ module.exports = def(start_time, argv, base_path, src_path, lib_path):
beautify: argv.beautify,
private_scope: !argv.bare,
omit_baselib: argv.omit_baselib,
strict_names: argv.strict_names
strict_names: argv.strict_names,
indent_min: parseInt(argv.indent_min)
}
if not argv.omit_baselib:
parseOpts.baselib = rapydscript.parse_baselib(src_path, parseOpts.es6)
Expand Down Expand Up @@ -82,7 +83,7 @@ module.exports = def(start_time, argv, base_path, src_path, lib_path):
'console': console,
'process': process,
'require': require,
'root': JS('typeof window') is 'object' ? window : global
'root': v'typeof window' is 'object' ? window : global
}, {'filename':files[0]})
else:
console.log(output)
Expand Down
90 changes: 45 additions & 45 deletions src/lib/yql.pyj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# RapydScript Standard Library
# Author: Alexander Tsepkov
# Copyright 2013 Pyjeon Software LLC
# License: Apache License 2.0
# License: Apache License 2.0
# This library is covered under Apache license, so that
# you can distribute it with your RapydScript applications.
###########################################################
Expand All @@ -13,59 +13,59 @@
# YQL serves JSONP (with a callback) so all we have to do
# is create a script element with the right 'src':
class YQLError(Error):
def __init__(self, message):
self.name = 'YQLError'
self.message = message
def __init__(self, message):
self.name = 'YQLError'
self.message = message

class YQL:
"""
This class asynchronously performs passed in YQL query, and triggers a callback function
upon completion. It's designed to handle multiple simultaneous queries without breaking.
"""
This class asynchronously performs passed in YQL query, and triggers a callback function
upon completion. It's designed to handle multiple simultaneous queries without breaking.

Usage Example:
query = YQL('select * from geo.places where text="san francisco, ca"', showMePlaces)
query.fetch()
Usage Example:
query = YQL('select * from geo.places where text="san francisco, ca"', showMePlaces)
query.fetch()

If you only need the query result once, you can retrieve it immediatelly:
result = YQL('select * from weather.forecast where location=90210').fetch()
If you only need the query result once, you can retrieve it immediatelly:
result = YQL('select * from weather.forecast where location=90210').fetch()

If you're trying to debug your query, you can turn diagnostics on to retrieve more info:
query = YQL(statement, callback, True)
If you're trying to debug your query, you can turn diagnostics on to retrieve more info:
query = YQL(statement, callback, True)

You may also set all 3 of these qttributes manually after YQL() constructor fires:
query = YQL()
query.query = statement
query.callback = callback
query.diagnostics = True
You may also set all 3 of these qttributes manually after YQL() constructor fires:
query = YQL()
query.query = statement
query.callback = callback
query.diagnostics = True

"""
def __init__(self, query, callback, diagnostics=False):
self.query = query
doNothing = def(): pass
self.callback = callback or doNothing
self.diagnostics = diagnostics
"""
def __init__(self, query, callback, diagnostics=False):
self.query = query
doNothing = def(): pass
self.callback = callback or doNothing
self.diagnostics = diagnostics

def fetch(self):
if not self.query:
raise YQLError('YQL.query attribute must be defined before invoking YQL.fetch()')
elif not self.callback:
raise YQLError('YQL.callback attribute must be defined before invoking YQL.fetch()')
def fetch(self):
if not self.query:
raise YQLError('YQL.query attribute must be defined before invoking YQL.fetch()')
elif not self.callback:
raise YQLError('YQL.callback attribute must be defined before invoking YQL.fetch()')

scriptEl = document.createElement('script')
scriptEl = document.createElement('script')

# uid needs to be unique, to ensure that collision doesn't happen, we convert
# the timestamp to milliseconds and append a random integer at the end, zero-padding
# it to avoid two unrelated times from possibility of clashing
uid = 'yql' + Date().getTime() + str(Math.floor(Math.random()*1000)).zfill(3)
encodedQuery = encodeURIComponent(self.query.toLowerCase())
# uid needs to be unique, to ensure that collision doesn't happen, we convert
# the timestamp to milliseconds and append a random integer at the end, zero-padding
# it to avoid two unrelated times from possibility of clashing
uid = 'yql' + Date().getTime() + str(Math.floor(Math.random()*1000)).zfill(3)
encodedQuery = encodeURIComponent(self.query.toLowerCase())

window[uid] = def(json):
self.callback(json['query'])
del window[uid]
document.body.removeChild(scriptEl)
window[uid] = def(json):
self.callback(json['query'])
del window[uid]
document.body.removeChild(scriptEl)

url = 'http://query.yahooapis.com/v1/public/yql?q=' + encodedQuery
if self.diagnostics:
url += '&diagnostics=true'
scriptEl.src = url + '&format=json&callback=' + uid
document.body.appendChild(scriptEl)
url = 'http://query.yahooapis.com/v1/public/yql?q=' + encodedQuery
if self.diagnostics:
url += '&diagnostics=true'
scriptEl.src = url + '&format=json&callback=' + uid
document.body.appendChild(scriptEl)
7 changes: 4 additions & 3 deletions src/parser.pyj
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,8 @@ def parse($TEXT, options):
dropImports: [], # Imports to omit from compilation
dropDocstrings: False, # If true, omit docstrings from compilation
classes: None, # Map of class names to ast.Class that are available in the global namespace (used by the REPL)
readfile: JS('typeof require != "undefined"') ? require('fs').readFileSync : None # File reader
readfile: v'typeof require != "undefined"' ? require('fs').readFileSync : None, # File reader
indent_min: 2
})
module_id = options.module_id

Expand All @@ -269,9 +270,9 @@ def parse($TEXT, options):
IMPORTED = options.IMPORTED or {}
IMPORTING = options.IMPORTING or {}
IMPORTING[module_id] = True

tokenizer.set_options({indent_min:options.indent_min})
S = {
input: (JS('typeof $TEXT') is "string" ? tokenizer.tokenizer($TEXT, options.filename) : $TEXT),
input: (v'typeof $TEXT' is "string" ? tokenizer.tokenizer($TEXT, options.filename) : $TEXT),
token: None, # current token being scanned
prev: None, # previous token
peeked: None, # cached version of next token
Expand Down
Loading

0 comments on commit 1c05184

Please sign in to comment.