bpm 1.0.0.beta.4 → 1.0.0.beta.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +11 -0
- data/TODO.md +4 -10
- data/backbone/LICENSE +22 -0
- data/backbone/README +25 -0
- data/backbone/Rakefile +42 -0
- data/backbone/backbone-0.5.1.bpkg +0 -0
- data/backbone/examples/backbone-localstorage.js +84 -0
- data/backbone/examples/todos/destroy.png +0 -0
- data/backbone/examples/todos/index.html +87 -0
- data/backbone/examples/todos/todos.css +311 -0
- data/backbone/examples/todos/todos.js +258 -0
- data/backbone/index.html +2606 -0
- data/backbone/index.js +1 -0
- data/backbone/lib/backbone.js +1149 -0
- data/backbone/lib/index.js +1 -0
- data/backbone/package.json +14 -0
- data/backbone/test/collection.js +345 -0
- data/backbone/test/events.js +70 -0
- data/backbone/test/model.coffee +43 -0
- data/backbone/test/model.js +424 -0
- data/backbone/test/noconflict.js +12 -0
- data/backbone/test/router.js +116 -0
- data/backbone/test/speed.js +45 -0
- data/backbone/test/sync.js +133 -0
- data/backbone/test/test-zepto.html +30 -0
- data/backbone/test/test.html +31 -0
- data/backbone/test/vendor/jquery-1.5.js +8176 -0
- data/backbone/test/vendor/jslitmus.js +649 -0
- data/backbone/test/vendor/json2.js +481 -0
- data/backbone/test/vendor/qunit.css +196 -0
- data/backbone/test/vendor/qunit.js +1364 -0
- data/backbone/test/vendor/underscore-1.1.6.js +807 -0
- data/backbone/test/vendor/zepto-0.6.js +692 -0
- data/backbone/test/view.js +137 -0
- data/lib/bpm/cli/base.rb +22 -7
- data/lib/bpm/package.rb +17 -5
- data/lib/bpm/project.rb +49 -32
- data/lib/bpm/version.rb +1 -1
- data/spec/cli/add_spec.rb +22 -4
- data/spec/cli/fetch_spec.rb +0 -1
- data/spec/cli/init_spec.rb +25 -10
- data/spec/cli/list_spec.rb +103 -62
- data/spec/cli/pack_spec.rb +36 -4
- data/spec/fixtures/packages/backbone/LICENSE +22 -0
- data/spec/fixtures/packages/backbone/README +25 -0
- data/spec/fixtures/packages/backbone/Rakefile +42 -0
- data/spec/fixtures/packages/backbone/examples/backbone-localstorage.js +84 -0
- data/spec/fixtures/packages/backbone/examples/todos/destroy.png +0 -0
- data/spec/fixtures/packages/backbone/examples/todos/index.html +87 -0
- data/spec/fixtures/packages/backbone/examples/todos/todos.css +311 -0
- data/spec/fixtures/packages/backbone/examples/todos/todos.js +258 -0
- data/spec/fixtures/packages/backbone/index.html +2606 -0
- data/spec/fixtures/packages/backbone/lib/backbone.js +1149 -0
- data/spec/fixtures/packages/backbone/lib/index.js +1 -0
- data/spec/fixtures/packages/backbone/package.json +14 -0
- data/spec/fixtures/packages/backbone/test/collection.js +345 -0
- data/spec/fixtures/packages/backbone/test/events.js +70 -0
- data/spec/fixtures/packages/backbone/test/model.coffee +43 -0
- data/spec/fixtures/packages/backbone/test/model.js +424 -0
- data/spec/fixtures/packages/backbone/test/noconflict.js +12 -0
- data/spec/fixtures/packages/backbone/test/router.js +116 -0
- data/spec/fixtures/packages/backbone/test/speed.js +45 -0
- data/spec/fixtures/packages/backbone/test/sync.js +133 -0
- data/spec/fixtures/packages/backbone/test/test-zepto.html +30 -0
- data/spec/fixtures/packages/backbone/test/test.html +31 -0
- data/spec/fixtures/packages/backbone/test/vendor/jquery-1.5.js +8176 -0
- data/spec/fixtures/packages/backbone/test/vendor/jslitmus.js +649 -0
- data/spec/fixtures/packages/backbone/test/vendor/json2.js +481 -0
- data/spec/fixtures/packages/backbone/test/vendor/qunit.css +196 -0
- data/spec/fixtures/packages/backbone/test/vendor/qunit.js +1364 -0
- data/spec/fixtures/packages/backbone/test/vendor/underscore-1.1.6.js +807 -0
- data/spec/fixtures/packages/backbone/test/vendor/zepto-0.6.js +692 -0
- data/spec/fixtures/packages/backbone/test/view.js +137 -0
- data/spec/fixtures/projects/init_app/assets/bpm_libs.js +1 -1
- data/spec/fixtures/projects/init_app/assets/bpm_styles.css +1 -1
- data/spec/fixtures/projects/init_app/new_project.json +1 -10
- data/spec/pipeline_spec.rb +5 -5
- data/spec/plugins/minifier_spec.rb +1 -1
- data/spec/plugins/transport_spec.rb +1 -1
- metadata +116 -28
- data/spec/fixtures/projects/init_app/assets/new_project/bpm_libs.js +0 -6
- data/spec/fixtures/projects/init_app/assets/new_project/bpm_styles.css +0 -5
data/spec/cli/list_spec.rb
CHANGED
@@ -7,68 +7,109 @@ describe "bpm list" do
|
|
7
7
|
start_fake(FakeGemServer.new)
|
8
8
|
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
10
|
+
describe "local" do
|
11
|
+
before do
|
12
|
+
FileUtils.cp_r project_fixture('hello_world'), home
|
13
|
+
cd home('hello_world')
|
14
|
+
end
|
15
|
+
|
16
|
+
it "lists non-development dependencies by default" do
|
17
|
+
bpm "list"
|
18
|
+
output = stdout.read
|
19
|
+
output.should include("ivory (0.0.1)")
|
20
|
+
output.should_not include("jquery (1.4.3)")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "lists development dependencies with --dev option" do
|
24
|
+
bpm "list", "--dev"
|
25
|
+
output = stdout.read
|
26
|
+
output.should_not include("ivory (0.0.1)")
|
27
|
+
output.should include("jquery (1.4.3)")
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should filter output by package name" do
|
31
|
+
bpm "list", "ivory", "spade"
|
32
|
+
output = stdout.read
|
33
|
+
output.should include("ivory (0.0.1)")
|
34
|
+
output.should include("spade (0.5.0)")
|
35
|
+
output.should_not include("optparse")
|
36
|
+
output.should_not include("core-test")
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should complain when called outside of a project" do
|
40
|
+
cd home
|
41
|
+
bpm "list", :track_stderr => true
|
42
|
+
stderr.read.should include("inside of a bpm project")
|
43
|
+
end
|
44
|
+
|
24
45
|
end
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
46
|
+
|
47
|
+
describe "remote" do
|
48
|
+
|
49
|
+
it "lists latest packages by default" do
|
50
|
+
bpm "list", "--remote"
|
51
|
+
|
52
|
+
output = stdout.read
|
53
|
+
output.should include("builder (3.0.0)")
|
54
|
+
output.should include("rake (0.8.7)")
|
55
|
+
end
|
56
|
+
|
57
|
+
it "lists all packages when given the all argument" do
|
58
|
+
bpm "list", "--remote", "-a"
|
59
|
+
|
60
|
+
output = stdout.read
|
61
|
+
output.should include("builder (3.0.0)")
|
62
|
+
output.should include("rake (0.8.7, 0.8.6)")
|
63
|
+
end
|
64
|
+
|
65
|
+
it "filters packages when given an argument" do
|
66
|
+
bpm "list", "builder", "--remote"
|
67
|
+
|
68
|
+
output = stdout.read
|
69
|
+
output.should include("builder (3.0.0)")
|
70
|
+
output.should_not include("rake")
|
71
|
+
end
|
72
|
+
|
73
|
+
it "filters packages when given an argument and shows all versions" do
|
74
|
+
bpm "list", "rake", "-a", "--remote"
|
75
|
+
|
76
|
+
output = stdout.read
|
77
|
+
output.should include("rake (0.8.7, 0.8.6)")
|
78
|
+
output.should_not include("builder")
|
79
|
+
end
|
80
|
+
|
81
|
+
it "filters multiple packages" do
|
82
|
+
bpm "list", "rake", "highline", "--remote"
|
83
|
+
|
84
|
+
output = stdout.read
|
85
|
+
output.should include("highline (1.6.1)")
|
86
|
+
output.should include("rake (0.8.7)")
|
87
|
+
output.should_not include("builder")
|
88
|
+
end
|
89
|
+
|
90
|
+
it "shows prerelease packages" do
|
91
|
+
bpm "list", "--prerelease", "--remote"
|
92
|
+
|
93
|
+
output = stdout.read
|
94
|
+
output.should include("bundler (1.1.pre)")
|
95
|
+
output.should_not include("highline")
|
96
|
+
output.should_not include("rake")
|
97
|
+
output.should_not include("builder")
|
98
|
+
end
|
99
|
+
|
100
|
+
it "says it couldn't find any if none found" do
|
101
|
+
bpm "list", "rails", "--remote", :track_stderr => true
|
102
|
+
|
103
|
+
stderr.read.strip.should == 'No packages found matching "rails".'
|
104
|
+
exit_status.should_not be_success
|
105
|
+
end
|
106
|
+
|
107
|
+
it "says it couldn't find any if none found matching multiple packages" do
|
108
|
+
bpm "list", "rails", "bake", "--remote", :track_stderr => true
|
109
|
+
|
110
|
+
stderr.read.strip.should == 'No packages found matching "rails", "bake".'
|
111
|
+
exit_status.should_not be_success
|
112
|
+
end
|
73
113
|
end
|
114
|
+
|
74
115
|
end
|
data/spec/cli/pack_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
require "libgems/format"
|
3
3
|
|
4
|
-
describe "bpm
|
4
|
+
describe "bpm pack when logged in" do
|
5
5
|
let(:email) { "who@example.com" }
|
6
6
|
|
7
7
|
before do
|
@@ -25,12 +25,12 @@ describe "bpm build when logged in" do
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
describe "bpm
|
28
|
+
describe "bpm pack without logging in" do
|
29
29
|
before do
|
30
30
|
goto_home
|
31
31
|
end
|
32
32
|
|
33
|
-
it "
|
33
|
+
it "pack a bpm from a given package.json" do
|
34
34
|
FileUtils.cp_r package_fixture("core-test"), "."
|
35
35
|
cd "core-test"
|
36
36
|
bpm "pack", "-e", "joe@example.com"
|
@@ -69,7 +69,7 @@ describe "bpm build without logging in" do
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
-
describe "bpm
|
72
|
+
describe "bpm pack with an invalid package.json" do
|
73
73
|
before do
|
74
74
|
goto_home
|
75
75
|
write_api_key("deadbeef")
|
@@ -84,3 +84,35 @@ describe "bpm build with an invalid package.json" do
|
|
84
84
|
output.should include("There was a problem parsing package.json")
|
85
85
|
end
|
86
86
|
end
|
87
|
+
|
88
|
+
describe "bpm pack npm-compatible package" do
|
89
|
+
before do
|
90
|
+
FileUtils.cp_r package_fixture("backbone"), "."
|
91
|
+
cd "backbone"
|
92
|
+
bpm "pack", :track_stderr => true and wait
|
93
|
+
end
|
94
|
+
|
95
|
+
it "successfully packs" do
|
96
|
+
exit_status.should be_success
|
97
|
+
end
|
98
|
+
|
99
|
+
it "implies the summary field" do
|
100
|
+
package = LibGems::Format.from_file_by_path("backbone-0.5.1.bpkg")
|
101
|
+
package.spec.summary.should == package.spec.description
|
102
|
+
end
|
103
|
+
|
104
|
+
it "gets name and version" do
|
105
|
+
package = LibGems::Format.from_file_by_path("backbone-0.5.1.bpkg")
|
106
|
+
package.spec.name.should == "backbone"
|
107
|
+
package.spec.version.should == LibGems::Version.new("0.5.1")
|
108
|
+
end
|
109
|
+
|
110
|
+
it "gets the homepage" do
|
111
|
+
package = LibGems::Format.from_file_by_path("backbone-0.5.1.bpkg")
|
112
|
+
package.spec.homepage.should == 'http://documentcloud.github.com/backbone/'
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2010 Jeremy Ashkenas, DocumentCloud
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
@@ -0,0 +1,25 @@
|
|
1
|
+
____ _ _ _
|
2
|
+
| _ \ | | | | (_)
|
3
|
+
| |_) | __ _ ___| | __| |__ ___ _ __ ___ _ ___
|
4
|
+
| _ < / _` |/ __| |/ /| '_ \ / _ \| '_ \ / _ \ | / __|
|
5
|
+
| |_) | (_| | (__| < | |_) | (_) | | | | __/_| \__ \
|
6
|
+
|____/ \__,_|\___|_|\_\|_.__/ \___/|_| |_|\___(_) |___/
|
7
|
+
_/ |
|
8
|
+
|__/
|
9
|
+
(_'___________________________________________________'_)
|
10
|
+
(_.———————————————————————————————————————————————————._)
|
11
|
+
|
12
|
+
|
13
|
+
Backbone supplies structure to JavaScript-heavy applications by providing models key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing application over a RESTful JSON interface.
|
14
|
+
|
15
|
+
For Docs, License, Tests, and pre-packed downloads, see:
|
16
|
+
http://documentcloud.github.com/backbone/
|
17
|
+
|
18
|
+
To suggest a feature, report a bug, or general discussion:
|
19
|
+
http://github.com/documentcloud/backbone/issues/
|
20
|
+
|
21
|
+
All contributors are listed here:
|
22
|
+
http://github.com/documentcloud/backbone/contributors
|
23
|
+
|
24
|
+
Special thanks to Robert Kieffer for the original philosophy behind Backbone.
|
25
|
+
http://github.com/broofa
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
HEADER = /((^\s*\/\/.*\n)+)/
|
4
|
+
|
5
|
+
desc "rebuild the backbone-min.js files for distribution"
|
6
|
+
task :build do
|
7
|
+
begin
|
8
|
+
require 'closure-compiler'
|
9
|
+
rescue LoadError
|
10
|
+
puts "closure-compiler not found.\nInstall it by running 'gem install closure-compiler"
|
11
|
+
exit
|
12
|
+
end
|
13
|
+
source = File.read 'backbone.js'
|
14
|
+
header = source.match(HEADER)
|
15
|
+
File.open('backbone-min.js', 'w+') do |file|
|
16
|
+
file.write header[1].squeeze(' ') + Closure::Compiler.new.compress(source)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "build the docco documentation"
|
21
|
+
task :doc do
|
22
|
+
check 'docco', 'docco', 'https://github.com/jashkenas/docco'
|
23
|
+
system 'docco backbone.js && docco examples/todos/todos.js examples/backbone-localstorage.js'
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "run JavaScriptLint on the source"
|
27
|
+
task :lint do
|
28
|
+
system "jsl -nofilelisting -nologo -conf docs/jsl.conf -process backbone.js"
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "test the CoffeeScript integration"
|
32
|
+
task :test do
|
33
|
+
check 'coffee', 'CoffeeScript', 'https://github.com/jashkenas/coffee-script.git'
|
34
|
+
system "coffee test/*.coffee"
|
35
|
+
end
|
36
|
+
|
37
|
+
# Check for the existence of an executable.
|
38
|
+
def check(exec, name, url)
|
39
|
+
return unless `which #{exec}`.empty?
|
40
|
+
puts "#{name} not found.\nInstall it from #{url}"
|
41
|
+
exit
|
42
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
// A simple module to replace `Backbone.sync` with *localStorage*-based
|
2
|
+
// persistence. Models are given GUIDS, and saved into a JSON object. Simple
|
3
|
+
// as that.
|
4
|
+
|
5
|
+
// Generate four random hex digits.
|
6
|
+
function S4() {
|
7
|
+
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
|
8
|
+
};
|
9
|
+
|
10
|
+
// Generate a pseudo-GUID by concatenating random hexadecimal.
|
11
|
+
function guid() {
|
12
|
+
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
|
13
|
+
};
|
14
|
+
|
15
|
+
// Our Store is represented by a single JS object in *localStorage*. Create it
|
16
|
+
// with a meaningful name, like the name you'd give a table.
|
17
|
+
var Store = function(name) {
|
18
|
+
this.name = name;
|
19
|
+
var store = localStorage.getItem(this.name);
|
20
|
+
this.data = (store && JSON.parse(store)) || {};
|
21
|
+
};
|
22
|
+
|
23
|
+
_.extend(Store.prototype, {
|
24
|
+
|
25
|
+
// Save the current state of the **Store** to *localStorage*.
|
26
|
+
save: function() {
|
27
|
+
localStorage.setItem(this.name, JSON.stringify(this.data));
|
28
|
+
},
|
29
|
+
|
30
|
+
// Add a model, giving it a (hopefully)-unique GUID, if it doesn't already
|
31
|
+
// have an id of it's own.
|
32
|
+
create: function(model) {
|
33
|
+
if (!model.id) model.id = model.attributes.id = guid();
|
34
|
+
this.data[model.id] = model;
|
35
|
+
this.save();
|
36
|
+
return model;
|
37
|
+
},
|
38
|
+
|
39
|
+
// Update a model by replacing its copy in `this.data`.
|
40
|
+
update: function(model) {
|
41
|
+
this.data[model.id] = model;
|
42
|
+
this.save();
|
43
|
+
return model;
|
44
|
+
},
|
45
|
+
|
46
|
+
// Retrieve a model from `this.data` by id.
|
47
|
+
find: function(model) {
|
48
|
+
return this.data[model.id];
|
49
|
+
},
|
50
|
+
|
51
|
+
// Return the array of all models currently in storage.
|
52
|
+
findAll: function() {
|
53
|
+
return _.values(this.data);
|
54
|
+
},
|
55
|
+
|
56
|
+
// Delete a model from `this.data`, returning it.
|
57
|
+
destroy: function(model) {
|
58
|
+
delete this.data[model.id];
|
59
|
+
this.save();
|
60
|
+
return model;
|
61
|
+
}
|
62
|
+
|
63
|
+
});
|
64
|
+
|
65
|
+
// Override `Backbone.sync` to use delegate to the model or collection's
|
66
|
+
// *localStorage* property, which should be an instance of `Store`.
|
67
|
+
Backbone.sync = function(method, model, options) {
|
68
|
+
|
69
|
+
var resp;
|
70
|
+
var store = model.localStorage || model.collection.localStorage;
|
71
|
+
|
72
|
+
switch (method) {
|
73
|
+
case "read": resp = model.id ? store.find(model) : store.findAll(); break;
|
74
|
+
case "create": resp = store.create(model); break;
|
75
|
+
case "update": resp = store.update(model); break;
|
76
|
+
case "delete": resp = store.destroy(model); break;
|
77
|
+
}
|
78
|
+
|
79
|
+
if (resp) {
|
80
|
+
options.success(resp);
|
81
|
+
} else {
|
82
|
+
options.error("Record not found");
|
83
|
+
}
|
84
|
+
};
|
Binary file
|
@@ -0,0 +1,87 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
|
4
|
+
<head>
|
5
|
+
<title>Backbone Demo: Todos</title>
|
6
|
+
<link href="todos.css" media="all" rel="stylesheet" type="text/css"/>
|
7
|
+
<script src="../../test/vendor/json2.js"></script>
|
8
|
+
<script src="../../test/vendor/jquery-1.5.js"></script>
|
9
|
+
<script src="../../test/vendor/underscore-1.1.6.js"></script>
|
10
|
+
<script src="../../backbone.js"></script>
|
11
|
+
<script src="../backbone-localstorage.js"></script>
|
12
|
+
<script src="todos.js"></script>
|
13
|
+
</head>
|
14
|
+
|
15
|
+
<body>
|
16
|
+
|
17
|
+
<!-- Todo App Interface -->
|
18
|
+
|
19
|
+
<div id="todoapp">
|
20
|
+
|
21
|
+
<div class="title">
|
22
|
+
<h1>Todos</h1>
|
23
|
+
</div>
|
24
|
+
|
25
|
+
<div class="content">
|
26
|
+
|
27
|
+
<div id="create-todo">
|
28
|
+
<input id="new-todo" placeholder="What needs to be done?" type="text" />
|
29
|
+
<span class="ui-tooltip-top" style="display:none;">Press Enter to save this task</span>
|
30
|
+
</div>
|
31
|
+
|
32
|
+
<div id="todos">
|
33
|
+
<ul id="todo-list"></ul>
|
34
|
+
</div>
|
35
|
+
|
36
|
+
<div id="todo-stats"></div>
|
37
|
+
|
38
|
+
</div>
|
39
|
+
|
40
|
+
</div>
|
41
|
+
|
42
|
+
<ul id="instructions">
|
43
|
+
<li>Double-click to edit a todo.</li>
|
44
|
+
<li><a href="../../docs/todos.html">View the annotated source.</a></li>
|
45
|
+
</ul>
|
46
|
+
|
47
|
+
<div id="credits">
|
48
|
+
Created by
|
49
|
+
<br />
|
50
|
+
<a href="http://jgn.me/">Jérôme Gravel-Niquet</a>
|
51
|
+
</div>
|
52
|
+
|
53
|
+
<!-- Templates -->
|
54
|
+
|
55
|
+
<script type="text/template" id="item-template">
|
56
|
+
<div class="todo <%= done ? 'done' : '' %>">
|
57
|
+
<div class="display">
|
58
|
+
<input class="check" type="checkbox" <%= done ? 'checked="checked"' : '' %> />
|
59
|
+
<div class="todo-content"></div>
|
60
|
+
<span class="todo-destroy"></span>
|
61
|
+
</div>
|
62
|
+
<div class="edit">
|
63
|
+
<input class="todo-input" type="text" value="" />
|
64
|
+
</div>
|
65
|
+
</div>
|
66
|
+
</script>
|
67
|
+
|
68
|
+
<script type="text/template" id="stats-template">
|
69
|
+
<% if (total) { %>
|
70
|
+
<span class="todo-count">
|
71
|
+
<span class="number"><%= remaining %></span>
|
72
|
+
<span class="word"><%= remaining == 1 ? 'item' : 'items' %></span> left.
|
73
|
+
</span>
|
74
|
+
<% } %>
|
75
|
+
<% if (done) { %>
|
76
|
+
<span class="todo-clear">
|
77
|
+
<a href="#">
|
78
|
+
Clear <span class="number-done"><%= done %></span>
|
79
|
+
completed <span class="word-done"><%= done == 1 ? 'item' : 'items' %></span>
|
80
|
+
</a>
|
81
|
+
</span>
|
82
|
+
<% } %>
|
83
|
+
</script>
|
84
|
+
|
85
|
+
</body>
|
86
|
+
|
87
|
+
</html>
|