diff --git a/.gitignore b/.gitignore index 88d6a27..f912e56 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules coverage t.* tt.* +*.log diff --git a/lib/index.js b/lib/index.js index d06c795..dd3acf2 100644 --- a/lib/index.js +++ b/lib/index.js @@ -206,8 +206,9 @@ return lineDiff; } }; - search = function(name, input){ + search = function(name, input, opts){ var cleanInput, parsedInput, e, results, resultsLen, count, that, sortedResults, slicedResults, replaced, inputLines, inputLinesLength, i$, len$, result; + opts == null && (opts = {}); if (debug) { console.time("search-total:" + name); } @@ -240,7 +241,7 @@ slicedResults = slice$.call(sortedResults, 0, count); if (replacement != null) { try { - replaced = replace(replacement, cleanInput, slicedResults, queryEngine); + replaced = replace(replacement, cleanInput, slicedResults, queryEngine, opts); if (options.to || options.inPlace) { resultsFormat = 'pairs'; out([name, replaced]); diff --git a/lib/replace.js b/lib/replace.js index c34a1ed..0ad34e2 100644 --- a/lib/replace.js +++ b/lib/replace.js @@ -14,7 +14,20 @@ return (node.rawPrepend || '') + "" + raw + (node.rawAppend || ''); }; filterRegex = /\s+\|\s+([-a-zA-Z]+)((?:\s+(?:'(?:\\'|[^'])*'|"(?:\\"|[^"])*"|[^\|\s]+))*)/; - replacer = function(input, node, queryEngine){ + replacer = function(input, node, queryEngine, opts){ + var log; + opts == null && (opts = {}); + log = function(){ + var args, res$, i$, to$; + res$ = []; + for (i$ = 0, to$ = arguments.length; i$ < to$; ++i$) { + res$.push(arguments[i$]); + } + args = res$; + if (opts.log) { + return console.log.apply(console, args); + } + }; return function(arg$, replacementArg){ var origResults, ref$, filters, selector, that, e, results, rawPrepend, rawAppend, join, textOperations, filterName, argsStr, args, ref1$, pre, post, i$, len$, arg, result, n, len, rawResults, res$, outputString, this$ = this; if (/^\s*\|\s+/.test(replacementArg)) { @@ -26,10 +39,10 @@ origResults = [].concat(that); } else { try { - origResults = queryEngine.query(selector, node); + origResults = queryEngine.query(selector, node, opts); } catch (e$) { e = e$; - origResults = queryEngine.query(replacementArg, node); + origResults = queryEngine.query(replacementArg, node, opts); filters = []; } } @@ -66,6 +79,7 @@ rawAppend += post + ""; break; case 'prepend': + log("prepend: " + args); for (i$ = 0, len$ = args.length; i$ < len$; ++i$) { arg = args[i$]; results.unshift({ @@ -75,6 +89,7 @@ } break; case 'append': + log("append: " + args); for (i$ = 0, len$ = args.length; i$ < len$; ++i$) { arg = args[i$]; results.push({ @@ -236,7 +251,7 @@ } }; }; - getReplacementFunc = function(replacement, input, queryEngine){ + getReplacementFunc = function(replacement, input, queryEngine, opts){ var replacementPrime; if (toString$.call(replacement).slice(8, -1) === 'Function') { return function(node){ @@ -251,11 +266,11 @@ return function(node){ return replacementPrime.replace(/{{}}/g, function(){ return getRaw(input, node); - }).replace(/{{((?:[^}]|}[^}])+)}}/g, replacer(input, node, queryEngine)); + }).replace(/{{((?:[^}]|}[^}])+)}}/g, replacer(input, node, queryEngine, opts)); }; } }; - replace = function(replacement, input, nodes, queryEngine){ + replace = function(replacement, input, nodes, queryEngine, opts){ var inputLines, colOffset, lineOffset, lastLine, prevNode, replaceNode, i$, len$, node, ref$, start, end, startLineNum, endLineNum, numberOfLines, startCol, endCol, replaceLines, startLine, endLine, startContext, endContext, replaceLast, endLen; inputLines = lines(input); colOffset = 0; @@ -264,7 +279,7 @@ prevNode = { end: 0 }; - replaceNode = getReplacementFunc(replacement, input, queryEngine); + replaceNode = getReplacementFunc(replacement, input, queryEngine, opts); for (i$ = 0, len$ = nodes.length; i$ < len$; ++i$) { node = nodes[i$]; if (node.start < prevNode.end) { diff --git a/src/index.ls b/src/index.ls index 3c78d7a..434df6e 100644 --- a/src/index.ls +++ b/src/index.ls @@ -156,7 +156,7 @@ run = ({ line-diff = a-start.line - b-start.line if line-diff is 0 then a-start.column - b-start.column else line-diff - search = (name, input) !-> + search = (name, input, opts = {}) !-> console.time "search-total:#name" if debug clean-input = input.replace /^#!.*\n/ '' @@ -182,7 +182,7 @@ run = ({ if replacement? try - replaced = replace replacement, clean-input, sliced-results, query-engine + replaced = replace replacement, clean-input, sliced-results, query-engine, opts if options.to or options.in-place results-format := 'pairs' out [name, replaced] diff --git a/src/replace.ls b/src/replace.ls index 8519afa..7d47856 100644 --- a/src/replace.ls +++ b/src/replace.ls @@ -19,7 +19,10 @@ filter-regex = // ((?:\s+(?:'(?:\\'|[^'])*'|"(?:\\"|[^"])*"|[^\|\s]+))*) // -replacer = (input, node, query-engine) -> +replacer = (input, node, query-engine, opts = {}) -> + log = (...args) -> + console.log(...args) if opts.log + (, replacement-arg) -> if /^\s*\|\s+/.test replacement-arg orig-results = [node] @@ -30,9 +33,9 @@ replacer = (input, node, query-engine) -> orig-results = [].concat that else try - orig-results = query-engine.query selector, node + orig-results = query-engine.query selector, node, opts catch - orig-results = query-engine.query replacement-arg, node + orig-results = query-engine.query replacement-arg, node, opts filters := [] if orig-results.length results = orig-results @@ -55,18 +58,26 @@ replacer = (input, node, query-engine) -> switch filter-name | 'join' => join := if args.length then "#{args.0}" else '' + | 'before' => raw-prepend := "#{args.0}#raw-prepend" + | 'after' => raw-append += "#{args.0}" + | 'wrap' => [pre, post] = if args.length is 1 then [args.0, args.0] else args raw-prepend := "#pre#raw-prepend" raw-append += "#post" + | 'prepend' => + log "prepend: #args" for arg in args then results.unshift type: 'Raw', raw: "#arg" + | 'append' => + log "append: #args" for arg in args then results.push type: 'Raw', raw: "#arg" + | 'each' => throw new Error "No arguments supplied for 'each #{args.0}'" if args.length < 2 switch args.0 @@ -139,7 +150,7 @@ replacer = (input, node, query-engine) -> else '' -get-replacement-func = (replacement, input, query-engine) -> +get-replacement-func = (replacement, input, query-engine, opts) -> if typeof! replacement is 'Function' (node) -> replacement do @@ -152,15 +163,15 @@ get-replacement-func = (replacement, input, query-engine) -> (node) -> replacement-prime .replace /{{}}/g, -> get-raw input, node # func b/c don't want to call get-raw unless we need to - .replace /{{((?:[^}]|}[^}])+)}}/g, replacer input, node, query-engine + .replace /{{((?:[^}]|}[^}])+)}}/g, replacer input, node, query-engine, opts -replace = (replacement, input, nodes, query-engine) -> +replace = (replacement, input, nodes, query-engine, opts) -> input-lines = lines input col-offset = 0 line-offset = 0 last-line = null prev-node = end: 0 - replace-node = get-replacement-func replacement, input, query-engine + replace-node = get-replacement-func replacement, input, query-engine, opts for node in nodes continue if node.start < prev-node.end