Alternate way of handling the concatenation.
This commit is contained in:
parent
2ab00be0b5
commit
5ec7a559be
76
Makefile
76
Makefile
@ -20,19 +20,17 @@ template := node tools/template.js
|
|||||||
template_deps := package.json tools/template.js node_modules/lodash/package.json
|
template_deps := package.json tools/template.js node_modules/lodash/package.json
|
||||||
cat := node tools/cat.js
|
cat := node tools/cat.js
|
||||||
cat_deps := tools/cat.js
|
cat_deps := tools/cat.js
|
||||||
jshint_deps := .jshintrc node_modules/jshint/package.json
|
|
||||||
|
|
||||||
parts := top API classes General Filtering Quotelinks Posting Images Linkification Menu Monitoring Archive Miscellaneous bottom
|
parts := Config API classes General Filtering Quotelinks Posting Images Linkification Menu Monitoring Archive Miscellaneous bottom
|
||||||
|
|
||||||
js_parts := $(foreach p,$(subst API,API_crx API_userscript,$(parts)),tmp/parts/$(p).js)
|
intermediate := LICENSE src/meta/fbegin.js tmp/declaration.js tmp/globals.js $(foreach p,$(parts),tmp/$(p).js) src/meta/fend.js
|
||||||
|
|
||||||
define sorted_dir
|
define sorted_dir
|
||||||
sources_$1 := $$(sort $$(wildcard src/$1/*.coffee))
|
sources_$1 := $$(sort $$(wildcard src/$1/*.coffee))
|
||||||
endef
|
endef
|
||||||
|
|
||||||
sources_top := \
|
sources_Config := \
|
||||||
src/General/Config.coffee \
|
src/General/Config.coffee
|
||||||
src/General/Globals.coffee
|
|
||||||
|
|
||||||
sources_API := \
|
sources_API := \
|
||||||
src/General/$$.coffee \
|
src/General/$$.coffee \
|
||||||
@ -46,7 +44,7 @@ sources_classes := \
|
|||||||
|
|
||||||
sources_General := \
|
sources_General := \
|
||||||
$(foreach n, \
|
$(foreach n, \
|
||||||
Polyfill Header Index Build Get UI BuildTest \
|
Polyfill Header Index Build Get UI Build.Test \
|
||||||
,src/General/$(n).coffee)
|
,src/General/$(n).coffee)
|
||||||
|
|
||||||
$(foreach d, \
|
$(foreach d, \
|
||||||
@ -72,10 +70,9 @@ sources_bottom := \
|
|||||||
src/General/Settings.coffee \
|
src/General/Settings.coffee \
|
||||||
src/General/Main.coffee
|
src/General/Main.coffee
|
||||||
|
|
||||||
imports_top := \
|
imports_Config := \
|
||||||
src/Archive/archives.json \
|
src/Archive/archives.json \
|
||||||
src/css/custom.css \
|
src/css/custom.css
|
||||||
version.json
|
|
||||||
imports_Monitoring := \
|
imports_Monitoring := \
|
||||||
src/meta/icon128.png
|
src/meta/icon128.png
|
||||||
imports_Miscellaneous := \
|
imports_Miscellaneous := \
|
||||||
@ -106,15 +103,13 @@ testbds := $(foreach f,$(filter-out %.crx %.zip,$(bds)),test$(f)) $(foreach t,cr
|
|||||||
|
|
||||||
testcrx := $(foreach f,$(filter %.crx %.zip,$(bds)),test$(f))
|
testcrx := $(foreach f,$(filter %.crx %.zip,$(bds)),test$(f))
|
||||||
|
|
||||||
jshint := $(foreach f,script-crx eventPage script-userscript,.events/jshint.$(f))
|
jshint := $(foreach f,globals $(subst API,API_crx API_userscript,$(parts)),.events/jshint.$(f))
|
||||||
|
|
||||||
jshint_parts := $(foreach p,$(subst API,API_crx API_userscript,$(parts)),.events/jshint_p.$(p))
|
default : jshint install
|
||||||
|
|
||||||
default : jshint_parts install
|
|
||||||
|
|
||||||
all : jshint bds install
|
all : jshint bds install
|
||||||
|
|
||||||
.events tmp tmp/parts testbuilds builds :
|
.events tmp testbuilds builds :
|
||||||
$(MKDIR)
|
$(MKDIR)
|
||||||
|
|
||||||
.events/npm : npm-shrinkwrap.json | .events
|
.events/npm : npm-shrinkwrap.json | .events
|
||||||
@ -133,32 +128,34 @@ tmp/font-awesome.css : src/css/font-awesome.css $(imports_font_awesome) $(templa
|
|||||||
tmp/style.css : src/css/style.css $(imports_style) $(template_deps) | tmp
|
tmp/style.css : src/css/style.css $(imports_style) $(template_deps) | tmp
|
||||||
$(template) $< $@
|
$(template) $< $@
|
||||||
|
|
||||||
|
tmp/declaration.js : $(wildcard src/*/*.coffee) tools/declare.js | tmp
|
||||||
|
node tools/declare.js
|
||||||
|
|
||||||
|
tmp/globals.js : src/General/globals.js version.json $(template_deps) | tmp
|
||||||
|
$(template) $< $@
|
||||||
|
|
||||||
define rules_part
|
define rules_part
|
||||||
|
|
||||||
tmp/parts/$1.jst : $$(sources_$1) $(cat_deps) | tmp/parts
|
tmp/$1.jst : $$(sources_$1) $(cat_deps) | tmp
|
||||||
$(cat) $$(sources_$1) $$@
|
$(cat) $$(sources_$1) $$@
|
||||||
|
|
||||||
tmp/parts/$1.coffee : tmp/parts/$1.jst $$(filter-out %.coffee,$$(wildcard src/$1/*.* src/$1/*/*.* src/$1/*/*/*.*)) $$(imports_$1) .tests_enabled $(template_deps)
|
tmp/$1.coffee : tmp/$1.jst $$(filter-out %.coffee,$$(wildcard src/$1/*.* src/$1/*/*.* src/$1/*/*/*.*)) $$(imports_$1) .tests_enabled $(template_deps)
|
||||||
$(template) $$< $$@
|
$(template) $$< $$@
|
||||||
|
|
||||||
tmp/parts/$1.js : tmp/parts/$1.coffee $(coffee_deps)
|
tmp/$1.js : tmp/$1.coffee $(coffee_deps) tools/globalize.js
|
||||||
$(coffee) $$<
|
$(coffee) $$<
|
||||||
|
node tools/globalize.js $$@ $$(sources_$1)
|
||||||
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(foreach i,$(parts),$(eval $(call rules_part,$(i))))
|
$(foreach i,$(parts),$(eval $(call rules_part,$(i))))
|
||||||
|
|
||||||
tmp/parts/API_%.coffee : tmp/parts/API.jst $(template_deps)
|
tmp/API_%.coffee : tmp/API.jst $(template_deps)
|
||||||
$(template) $< $@ type=$*
|
$(template) $< $@ type=$*
|
||||||
|
|
||||||
tmp/parts/API_%.js : tmp/parts/API_%.coffee $(coffee_deps)
|
tmp/API_%.js : tmp/API_%.coffee $(coffee_deps)
|
||||||
$(coffee) $<
|
$(coffee) $<
|
||||||
|
node tools/globalize.js $@ $(sources_API)
|
||||||
tmp/script-crx.js : $(filter-out tmp/parts/API_userscript.js,$(js_parts)) tools/cat-coffee.js
|
|
||||||
node tools/cat-coffee.js $(filter-out tmp/parts/API_userscript.js,$(js_parts)) $@
|
|
||||||
|
|
||||||
tmp/script-userscript.js : $(filter-out tmp/parts/API_crx.js,$(js_parts)) tools/cat-coffee.js
|
|
||||||
node tools/cat-coffee.js $(filter-out tmp/parts/API_crx.js,$(js_parts)) $@
|
|
||||||
|
|
||||||
tmp/eventPage.js : src/General/eventPage.coffee $(coffee_deps) | tmp
|
tmp/eventPage.js : src/General/eventPage.coffee $(coffee_deps) | tmp
|
||||||
$(coffee) -o tmp src/General/eventPage.coffee
|
$(coffee) -o tmp src/General/eventPage.coffee
|
||||||
@ -168,8 +165,8 @@ define rules_channel
|
|||||||
testbuilds/crx$1 :
|
testbuilds/crx$1 :
|
||||||
$$(MKDIR)
|
$$(MKDIR)
|
||||||
|
|
||||||
testbuilds/crx$1/script.js : src/meta/botproc.js LICENSE src/meta/usestrict.js tmp/script-crx.js $(cat_deps) | testbuilds/crx$1
|
testbuilds/crx$1/script.js : src/meta/botproc.js $(subst API,API_crx,$(intermediate)) $(cat_deps) | testbuilds/crx$1
|
||||||
$(cat) src/meta/botproc.js LICENSE src/meta/usestrict.js tmp/script-crx.js $$@
|
$(cat) src/meta/botproc.js $(subst API,API_crx,$(intermediate)) $$@
|
||||||
|
|
||||||
testbuilds/crx$1/eventPage.js : tmp/eventPage.js | testbuilds/crx$1
|
testbuilds/crx$1/eventPage.js : tmp/eventPage.js | testbuilds/crx$1
|
||||||
$$(CP)
|
$$(CP)
|
||||||
@ -194,8 +191,8 @@ testbuilds/$(name)$1.crx : testbuilds/$(name)$1.crx.zip package.json tools/sign.
|
|||||||
testbuilds/$(name)$1.meta.js : src/meta/metadata.js src/meta/icon48.png version.json $(template_deps) | testbuilds
|
testbuilds/$(name)$1.meta.js : src/meta/metadata.js src/meta/icon48.png version.json $(template_deps) | testbuilds
|
||||||
$(template) $$< $$@ type=userscript channel=$1
|
$(template) $$< $$@ type=userscript channel=$1
|
||||||
|
|
||||||
testbuilds/$(name)$1.user.js : src/meta/botproc.js testbuilds/$(name)$1.meta.js LICENSE src/meta/usestrict.js tmp/script-userscript.js $(cat_deps)
|
testbuilds/$(name)$1.user.js : src/meta/botproc.js testbuilds/$(name)$1.meta.js $(subst API,API_userscript,$(intermediate)) $(cat_deps)
|
||||||
$(cat) src/meta/botproc.js testbuilds/$(name)$1.meta.js LICENSE src/meta/usestrict.js tmp/script-userscript.js $$@
|
$(cat) src/meta/botproc.js testbuilds/$(name)$1.meta.js $(subst API,API_userscript,$(intermediate)) $$@
|
||||||
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
@ -212,17 +209,10 @@ builds/% : testbuilds/% $(jshint) | builds
|
|||||||
test.html : README.md template.jst tools/markdown.js node_modules/marked/package.json node_modules/lodash/package.json
|
test.html : README.md template.jst tools/markdown.js node_modules/marked/package.json node_modules/lodash/package.json
|
||||||
node tools/markdown.js
|
node tools/markdown.js
|
||||||
|
|
||||||
tmp/parts/.jshintrc : src/meta/jshint.json $(template_deps) | tmp/parts
|
tmp/.jshintrc : src/meta/jshint.json tmp/declaration.js tmp/globals.js $(template_deps) | tmp
|
||||||
$(template) $< $@ stage=parts
|
$(template) $< $@
|
||||||
|
|
||||||
.jshintrc : src/meta/jshint.json $(template_deps)
|
.events/jshint.% : tmp/%.js tmp/.jshintrc node_modules/jshint/package.json | .events
|
||||||
$(template) $< $@ stage=full
|
|
||||||
|
|
||||||
.events/jshint.% : tmp/%.js .jshintrc node_modules/jshint/package.json | .events
|
|
||||||
$(BIN)jshint $<
|
|
||||||
echo -> $@
|
|
||||||
|
|
||||||
.events/jshint_p.% : tmp/parts/%.js tmp/parts/.jshintrc node_modules/jshint/package.json | .events
|
|
||||||
$(BIN)jshint $<
|
$(BIN)jshint $<
|
||||||
echo -> $@
|
echo -> $@
|
||||||
|
|
||||||
@ -235,11 +225,11 @@ install.json :
|
|||||||
|
|
||||||
.SECONDARY :
|
.SECONDARY :
|
||||||
|
|
||||||
.PHONY: default all clean cleanall testbds bds jshint jshint_parts install
|
.PHONY: default all clean cleanall testbds bds jshint install
|
||||||
|
|
||||||
clean :
|
clean :
|
||||||
$(RMDIR) tmp testbuilds .events
|
$(RMDIR) tmp testbuilds .events
|
||||||
$(RM) .jshintrc .tests_enabled
|
$(RM) .tests_enabled
|
||||||
|
|
||||||
cleanall : clean
|
cleanall : clean
|
||||||
$(RMDIR) builds
|
$(RMDIR) builds
|
||||||
@ -252,6 +242,4 @@ bds : $(bds)
|
|||||||
|
|
||||||
jshint : $(jshint)
|
jshint : $(jshint)
|
||||||
|
|
||||||
jshint_parts : $(jshint_parts)
|
|
||||||
|
|
||||||
install : .events/install
|
install : .events/install
|
||||||
|
|||||||
@ -40,15 +40,6 @@
|
|||||||
"GM_openInTab",
|
"GM_openInTab",
|
||||||
"GM_xmlhttpRequest"
|
"GM_xmlhttpRequest"
|
||||||
],
|
],
|
||||||
"globals": [
|
|
||||||
"$$",
|
|
||||||
"c",
|
|
||||||
"Conf",
|
|
||||||
"d",
|
|
||||||
"doc",
|
|
||||||
"E",
|
|
||||||
"g"
|
|
||||||
],
|
|
||||||
"min": {
|
"min": {
|
||||||
"chrome": "33",
|
"chrome": "33",
|
||||||
"firefox": "26",
|
"firefox": "26",
|
||||||
|
|||||||
@ -593,6 +593,3 @@ $.clear = (cb) ->
|
|||||||
$.delete $.listValues().map (key) -> key.replace g.NAMESPACE, ''
|
$.delete $.listValues().map (key) -> key.replace g.NAMESPACE, ''
|
||||||
cb?()
|
cb?()
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
$$ = (selector, root=d.body) ->
|
|
||||||
[root.querySelectorAll(selector)...]
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<% if (readJSON('.tests_enabled')) { %>
|
<% if (readJSON('.tests_enabled')) { %>
|
||||||
BuildTest =
|
Build.Test =
|
||||||
init: ->
|
init: ->
|
||||||
return if !Conf['Menu'] or g.VIEW not in ['index', 'thread']
|
return if !Conf['Menu'] or g.VIEW not in ['index', 'thread']
|
||||||
|
|
||||||
@ -27,11 +27,11 @@ BuildTest =
|
|||||||
x2 = x.childNodes[i]
|
x2 = x.childNodes[i]
|
||||||
y2 = y.childNodes[i]
|
y2 = y.childNodes[i]
|
||||||
return [x2, y2] unless x2 and y2
|
return [x2, y2] unless x2 and y2
|
||||||
return BuildTest.firstDiff(x2, y2) unless x2.isEqualNode y2
|
return Build.Test.firstDiff(x2, y2) unless x2.isEqualNode y2
|
||||||
i++
|
i++
|
||||||
|
|
||||||
testOne: (post) ->
|
testOne: (post) ->
|
||||||
BuildTest.postsRemaining++
|
Build.Test.postsRemaining++
|
||||||
$.cache "//a.4cdn.org/#{post.board.ID}/thread/#{post.thread.ID}.json", ->
|
$.cache "//a.4cdn.org/#{post.board.ID}/thread/#{post.thread.ID}.json", ->
|
||||||
{posts} = @response
|
{posts} = @response
|
||||||
Build.spoilerRange[post.board.ID] = posts[0].custom_spoiler
|
Build.spoilerRange[post.board.ID] = posts[0].custom_spoiler
|
||||||
@ -41,7 +41,7 @@ BuildTest =
|
|||||||
obj = Build.parseJSON postData, post.board.ID
|
obj = Build.parseJSON postData, post.board.ID
|
||||||
root = Build.post obj
|
root = Build.post obj
|
||||||
t2 = new Date().getTime()
|
t2 = new Date().getTime()
|
||||||
BuildTest.time += t2 - t1
|
Build.Test.time += t2 - t1
|
||||||
post2 = new Post root, post.thread, post.board
|
post2 = new Post root, post.thread, post.board
|
||||||
fail = false
|
fail = false
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ BuildTest =
|
|||||||
unless x.isEqualNode y
|
unless x.isEqualNode y
|
||||||
fail = true
|
fail = true
|
||||||
c.log "#{post.fullID} differs"
|
c.log "#{post.fullID} differs"
|
||||||
[x2, y2] = BuildTest.firstDiff x, y
|
[x2, y2] = Build.Test.firstDiff x, y
|
||||||
c.log x2
|
c.log x2
|
||||||
c.log y2
|
c.log y2
|
||||||
c.log x.outerHTML
|
c.log x.outerHTML
|
||||||
@ -66,11 +66,11 @@ BuildTest =
|
|||||||
c.log val2
|
c.log val2
|
||||||
|
|
||||||
if fail
|
if fail
|
||||||
BuildTest.postsFailed++
|
Build.Test.postsFailed++
|
||||||
else
|
else
|
||||||
c.log "#{post.fullID} correct"
|
c.log "#{post.fullID} correct"
|
||||||
BuildTest.postsRemaining--
|
Build.Test.postsRemaining--
|
||||||
BuildTest.report() if BuildTest.postsRemaining is 0
|
Build.Test.report() if Build.Test.postsRemaining is 0
|
||||||
post2.isFetchedQuote = true
|
post2.isFetchedQuote = true
|
||||||
Main.callbackNodes Post, [post2]
|
Main.callbackNodes Post, [post2]
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ BuildTest =
|
|||||||
g.posts.forEach (post) ->
|
g.posts.forEach (post) ->
|
||||||
unless post.isClone or post.isFetchedQuote
|
unless post.isClone or post.isFetchedQuote
|
||||||
unless (abbr = $ '.abbr', post.nodes.comment) and /Comment too long\./.test(abbr.textContent)
|
unless (abbr = $ '.abbr', post.nodes.comment) and /Comment too long\./.test(abbr.textContent)
|
||||||
BuildTest.testOne post
|
Build.Test.testOne post
|
||||||
return
|
return
|
||||||
|
|
||||||
postsRemaining: 0
|
postsRemaining: 0
|
||||||
@ -86,18 +86,18 @@ BuildTest =
|
|||||||
time: 0
|
time: 0
|
||||||
|
|
||||||
report: ->
|
report: ->
|
||||||
if BuildTest.postsFailed
|
if Build.Test.postsFailed
|
||||||
new Notice 'warning', "#{BuildTest.postsFailed} post(s) differ (#{BuildTest.time} ms)", 30
|
new Notice 'warning', "#{Build.Test.postsFailed} post(s) differ (#{Build.Test.time} ms)", 30
|
||||||
else
|
else
|
||||||
new Notice 'success', "All correct (#{BuildTest.time} ms)", 5
|
new Notice 'success', "All correct (#{Build.Test.time} ms)", 5
|
||||||
BuildTest.postsFailed = BuildTest.time = 0
|
Build.Test.postsFailed = Build.Test.time = 0
|
||||||
|
|
||||||
cb:
|
cb:
|
||||||
testOne: ->
|
testOne: ->
|
||||||
BuildTest.testOne g.posts[@dataset.fullID]
|
Build.Test.testOne g.posts[@dataset.fullID]
|
||||||
Menu.menu.close()
|
Menu.menu.close()
|
||||||
|
|
||||||
testAll: ->
|
testAll: ->
|
||||||
BuildTest.testAll()
|
Build.Test.testAll()
|
||||||
Header.menu.close()
|
Header.menu.close()
|
||||||
<% } %>
|
<% } %>
|
||||||
@ -1,24 +0,0 @@
|
|||||||
Conf = {}
|
|
||||||
c = console
|
|
||||||
d = document
|
|
||||||
doc = d.documentElement
|
|
||||||
g =
|
|
||||||
VERSION: '<%= readJSON('version.json').version %>'
|
|
||||||
NAMESPACE: '<%= meta.name %>.'
|
|
||||||
boards: {}
|
|
||||||
|
|
||||||
E = do ->
|
|
||||||
str = {'&': '&', "'": ''', '"': '"', '<': '<', '>': '>'}
|
|
||||||
r = String::replace
|
|
||||||
regex = /[&"'<>]/g
|
|
||||||
fn = (x) ->
|
|
||||||
str[x]
|
|
||||||
(text) -> r.call text, regex, fn
|
|
||||||
|
|
||||||
E.cat = (templates) ->
|
|
||||||
html = ''
|
|
||||||
html += x.innerHTML for x in templates
|
|
||||||
html
|
|
||||||
|
|
||||||
E.url = (content) ->
|
|
||||||
"data:text/html;charset=utf-8,<!doctype html>#{encodeURIComponent content.innerHTML}"
|
|
||||||
@ -470,7 +470,7 @@ Main =
|
|||||||
['Flash Features', Flash]
|
['Flash Features', Flash]
|
||||||
['Reply Pruning', ReplyPruning]
|
['Reply Pruning', ReplyPruning]
|
||||||
<% if (readJSON('.tests_enabled')) { %>
|
<% if (readJSON('.tests_enabled')) { %>
|
||||||
['Build Test', BuildTest]
|
['Build Test', Build.Test]
|
||||||
<% } %>
|
<% } %>
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
42
src/General/globals.js
Normal file
42
src/General/globals.js
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
var Conf, c, d, doc, g, E, $$;
|
||||||
|
|
||||||
|
Conf = {};
|
||||||
|
c = console;
|
||||||
|
d = document;
|
||||||
|
doc = d.documentElement;
|
||||||
|
g = {
|
||||||
|
VERSION: '<%= readJSON('version.json').version %>',
|
||||||
|
NAMESPACE: '<%= meta.name %>.',
|
||||||
|
boards: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
E = (function() {
|
||||||
|
var str = {'&': '&', "'": ''', '"': '"', '<': '<', '>': '>'};
|
||||||
|
var r = String.prototype.replace;
|
||||||
|
var regex = /[&"'<>]/g;
|
||||||
|
var fn = function (x) {
|
||||||
|
return str[x];
|
||||||
|
};
|
||||||
|
return function(text) {
|
||||||
|
return r.call(text, regex, fn);
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
|
E.cat = function(templates) {
|
||||||
|
var html = '';
|
||||||
|
for (var i = 0, len = templates.length; i < len; i++) {
|
||||||
|
html += templates[i].innerHTML;
|
||||||
|
}
|
||||||
|
return html;
|
||||||
|
};
|
||||||
|
|
||||||
|
E.url = function (content) {
|
||||||
|
return 'data:text/html;charset=utf-8,<!doctype html>' + encodeURIComponent(content.innerHTML);
|
||||||
|
};
|
||||||
|
|
||||||
|
$$ = function(selector, root) {
|
||||||
|
if (root == null) {
|
||||||
|
root = d.body;
|
||||||
|
}
|
||||||
|
return [].slice.call(root.querySelectorAll(selector));
|
||||||
|
};
|
||||||
@ -195,7 +195,7 @@ Keybinds =
|
|||||||
<% if (readJSON('.tests_enabled')) { %>
|
<% if (readJSON('.tests_enabled')) { %>
|
||||||
when 't'
|
when 't'
|
||||||
return unless threadRoot
|
return unless threadRoot
|
||||||
BuildTest.testAll()
|
Build.Test.testAll()
|
||||||
<% } %>
|
<% } %>
|
||||||
else
|
else
|
||||||
return
|
return
|
||||||
|
|||||||
3
src/meta/fbegin.js
Normal file
3
src/meta/fbegin.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
(function() {
|
||||||
1
src/meta/fend.js
Normal file
1
src/meta/fend.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
}).call(this);
|
||||||
@ -20,16 +20,10 @@
|
|||||||
"unsafeWindow": true,
|
"unsafeWindow": true,
|
||||||
"chrome": true<%=
|
"chrome": true<%=
|
||||||
meta.grants.map(x => `,\n "${x}": true`).join('')
|
meta.grants.map(x => `,\n "${x}": true`).join('')
|
||||||
%><% if (stage === 'parts') { %><%=
|
|
||||||
meta.globals.map(x => `,\n "${x}": true`).join('')
|
|
||||||
%><%=
|
%><%=
|
||||||
(ls('src')
|
read('tmp/declaration.js').match(/^var (.*);/)[1].split(', ').map(x => `,\n "${x}": true`).join('')
|
||||||
.map(x => ls(`src/${x}`))
|
%><%=
|
||||||
.reduce((x,y) => x.concat(y))
|
read('tmp/globals.js').match(/^var (.*);/)[1].split(', ').map(x => `,\n "${x}": true`).join('')
|
||||||
.filter(x => /^[$A-Z]\w*\.coffee/.test(x))
|
%>
|
||||||
.map(x => x.split('.')[0])
|
|
||||||
.map(x => `,\n "${x}": true`).join('')
|
|
||||||
)
|
|
||||||
%><% } %>
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
@ -1,56 +0,0 @@
|
|||||||
var fs = require('fs');
|
|
||||||
|
|
||||||
var inputFiles = process.argv.slice(2, -1);
|
|
||||||
|
|
||||||
var allVars = [];
|
|
||||||
var allHelperNames = [];
|
|
||||||
var allHelperValues = {};
|
|
||||||
var allBodies = [];
|
|
||||||
|
|
||||||
for (var file of inputFiles) {
|
|
||||||
var inputText = fs.readFileSync(file, 'utf8').replace(/\r\n/g, '\n');
|
|
||||||
|
|
||||||
var parts = inputText.match(/^\(function\(\) {\n var ([\w$]+(?:, [\w$]+)*)((?:,\n [\w$]+ = .*)*);\n\n([^]*)\n\n}\)\.call\(this\);\n$/);
|
|
||||||
if (!parts) throw new Error(`${file}: unexpected format`);
|
|
||||||
|
|
||||||
var vars = parts[1].split(', ');
|
|
||||||
for (var v of vars) {
|
|
||||||
if (allVars.indexOf(v) >= 0) {
|
|
||||||
throw new Error(`${file}: reused variable name ${v}`);
|
|
||||||
}
|
|
||||||
if (allHelperNames.indexOf(v) >= 0) {
|
|
||||||
throw new Error(`${file}: variable clashes with helper ${v}`);
|
|
||||||
}
|
|
||||||
allVars.push(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
var helpers = parts[2].split(',\n ').slice(1);
|
|
||||||
for (var h of helpers) {
|
|
||||||
var hparts = h.match(/^([\w$]+) = (.*)$/);
|
|
||||||
var hn = hparts[1];
|
|
||||||
var hv = hparts[2];
|
|
||||||
if (allVars.indexOf(hn) >= 0) {
|
|
||||||
throw new Error(`${file}: helper clashes with variable ${v}`);
|
|
||||||
}
|
|
||||||
if (allHelperNames.indexOf(hn) >= 0) {
|
|
||||||
if (allHelperValues[hn] !== hv) {
|
|
||||||
throw new Error(`${file}: redefined helper ${hn}`);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
allHelperNames.push(hn);
|
|
||||||
allHelperValues[hn] = hv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var body = parts[3];
|
|
||||||
allBodies.push(body);
|
|
||||||
}
|
|
||||||
|
|
||||||
var varText = allVars.sort().join(', ');
|
|
||||||
var helperText = allHelperNames.map(hn => `,\n ${hn} = ${allHelperValues[hn]}`).join('');
|
|
||||||
var bodyText = allBodies.join('\n\n');
|
|
||||||
|
|
||||||
var outputText = `(function() {\n var ${varText}${helperText};\n\n${bodyText}\n\n}).call(this);\n`;
|
|
||||||
|
|
||||||
var outputName = process.argv[process.argv.length - 1];
|
|
||||||
fs.writeFileSync(outputName, outputText);
|
|
||||||
10
tools/declare.js
Normal file
10
tools/declare.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
var names = [];
|
||||||
|
for (var d of fs.readdirSync('src')) {
|
||||||
|
for (var f of fs.readdirSync(`src/${d}`)) {
|
||||||
|
var m = f.match(/^([$A-Z]\w*)\.coffee$/);
|
||||||
|
if (m) names.push(m[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fs.writeFileSync('tmp/declaration.js', `var ${names.sort().join(', ')};\n`);
|
||||||
54
tools/globalize.js
Normal file
54
tools/globalize.js
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
var filename = process.argv[2];
|
||||||
|
var sources = process.argv.slice(3);
|
||||||
|
|
||||||
|
// Extract variables to be made global from source file list
|
||||||
|
// e.g. ImageExpand from src/Images/ImageExpand.coffee
|
||||||
|
// but not QR.post or eventPage
|
||||||
|
var names = [];
|
||||||
|
for (var f of sources) {
|
||||||
|
f = f.match(/[^/]*$/)[0];
|
||||||
|
var m = f.match(/^([$A-Z]\w*)\.coffee$/);
|
||||||
|
if (m) names.push(m[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
var script = fs.readFileSync(filename, 'utf8').replace(/\r\n/g, '\n');
|
||||||
|
|
||||||
|
var replaced = 0;
|
||||||
|
|
||||||
|
script = script.replace(
|
||||||
|
|
||||||
|
// matches declaration at the start of the function, not including helper function assignments
|
||||||
|
/ *\bvar\s+[\w$]+(,\s*[\w$]+)*(,\s*|;\n)/,
|
||||||
|
|
||||||
|
function(declaration) {
|
||||||
|
var parts = declaration.split(/([\w$]+)(?=[,;])/);
|
||||||
|
|
||||||
|
for (var name of names) {
|
||||||
|
var i = parts.indexOf(name);
|
||||||
|
if (i < 0) {
|
||||||
|
throw new Error(`${filename}: ${name} not found`);
|
||||||
|
} else if (i !== 1) {
|
||||||
|
// not first: remove variable and separator before it
|
||||||
|
parts.splice(i - 1, 2);
|
||||||
|
} else if (!(i === parts.length - 2 && parts[parts.length - 1][0] === ';')) {
|
||||||
|
// not last: remove variable and separator after it
|
||||||
|
parts.splice(i, 2);
|
||||||
|
} else {
|
||||||
|
// removing only variable: nuke whole declaration
|
||||||
|
parts = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
replaced++;
|
||||||
|
return parts.join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
if (replaced !== 1) {
|
||||||
|
throw new Error(`${filename}: no declaration found`);
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.writeFileSync(filename, script);
|
||||||
Loading…
x
Reference in New Issue
Block a user