qiita-team-templates 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.editorconfig +14 -0
- data/.gitignore +36 -0
- data/Gemfile +2 -0
- data/Rakefile +1 -0
- data/dist/js/kpt.js +71 -0
- data/dist/js/lean_canvas.js +92 -0
- data/dist/js/problem_solution_canvas.js +95 -0
- data/dist/jst/kpt.js +15 -0
- data/dist/jst/lean_canvas.js +33 -0
- data/dist/jst/problem_solution_canvas_p1.js +17 -0
- data/dist/jst/problem_solution_canvas_p2.js +15 -0
- data/gulpfile.js +47 -0
- data/lib/qiita-team-templates.rb +1 -0
- data/lib/qiita/team/templates.rb +2 -0
- data/lib/qiita/team/templates/engine.rb +8 -0
- data/lib/qiita/team/templates/version.rb +7 -0
- data/package.json +17 -0
- data/qiita-team-templates.gemspec +19 -0
- data/src/js/kpt.js +56 -0
- data/src/js/lean_canvas.js +59 -0
- data/src/js/problem_solution_canvas.js +64 -0
- data/src/jst/kpt.jst +13 -0
- data/src/jst/lean_canvas.jst +26 -0
- data/src/jst/problem_solution_canvas_p1.jst +19 -0
- data/src/jst/problem_solution_canvas_p2.jst +13 -0
- data/vendor/assets/javascripts/qiita_team_templates.js +68 -0
- metadata +28 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47b8d7eb995c408dd8f8674a7e4d11a18e87e3a2
|
4
|
+
data.tar.gz: 3a57235f1a4938dd2712f73d38b7da65adb80f1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f1f64c608f8a42b4fbcf27cfe2a065f53162741593691a88a45d44d4e33d2ac4c1992868c10ab9ecc735a515e70b00c934ae472b15faeef2c249e0215d70d9d
|
7
|
+
data.tar.gz: c8a7398d07e8f08abe738a1ccd973b8e049cf5e9d9686de87ab6f4c1d62699577d1abf18e165797b6c079df1c97e7b8d2cd083ef83e53b504d4c75e2e2a1a789
|
data/.editorconfig
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# This file is for unifying the coding style for different editors and IDEs
|
2
|
+
# editorconfig.org
|
3
|
+
|
4
|
+
root = true
|
5
|
+
|
6
|
+
[*]
|
7
|
+
charset = utf-8
|
8
|
+
end_of_line = lf
|
9
|
+
indent_style = space
|
10
|
+
insert_final_newline = true
|
11
|
+
trim_trailing_whitespace = true
|
12
|
+
|
13
|
+
[*.{js,html}]
|
14
|
+
indent_size = 4
|
data/.gitignore
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
/coverage/
|
5
|
+
/InstalledFiles
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/test/tmp/
|
9
|
+
/test/version_tmp/
|
10
|
+
/tmp/
|
11
|
+
|
12
|
+
## Specific to RubyMotion:
|
13
|
+
.dat*
|
14
|
+
.repl_history
|
15
|
+
build/
|
16
|
+
|
17
|
+
## Documentation cache and generated files:
|
18
|
+
/.yardoc/
|
19
|
+
/_yardoc/
|
20
|
+
/doc/
|
21
|
+
/rdoc/
|
22
|
+
|
23
|
+
## Environment normalisation:
|
24
|
+
/.bundle/
|
25
|
+
/lib/bundler/man/
|
26
|
+
|
27
|
+
# for a library or gem, you might want to ignore these files since the code is
|
28
|
+
# intended to run in multiple environments; otherwise, check them in:
|
29
|
+
Gemfile.lock
|
30
|
+
.ruby-version
|
31
|
+
.ruby-gemset
|
32
|
+
|
33
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
34
|
+
.rvmrc
|
35
|
+
|
36
|
+
node_modules
|
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
data/dist/js/kpt.js
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
/**
|
2
|
+
* @name kpt.js
|
3
|
+
* @description Render KPT on Qiita:Team.
|
4
|
+
* @version 0.1.0
|
5
|
+
*/
|
6
|
+
|
7
|
+
(function (global) {
|
8
|
+
if (!global.Qiita.TeamTemplates) {
|
9
|
+
throw 'Qiita.TeamTemplates is required';
|
10
|
+
}
|
11
|
+
|
12
|
+
var ns = global.Qiita.TeamTemplates; // Namespace
|
13
|
+
|
14
|
+
if (ns.isRegistered('kpt')) {
|
15
|
+
// KPT template has already been registered.
|
16
|
+
return;
|
17
|
+
}
|
18
|
+
|
19
|
+
var getHTML, kptTemplate;
|
20
|
+
|
21
|
+
getHTML = function (h1) {
|
22
|
+
var el, prev, html = '';
|
23
|
+
for (el = h1.nextElementSibling;
|
24
|
+
!/H1|SCRIPT/.test(el.tagName);
|
25
|
+
prev = el, el = el.nextElementSibling, $(prev).remove()) {
|
26
|
+
html += el.outerHTML;
|
27
|
+
}
|
28
|
+
$(h1).remove();
|
29
|
+
return html;
|
30
|
+
}
|
31
|
+
|
32
|
+
// src/jst/kpt.jst
|
33
|
+
kptTemplate = function(obj) {
|
34
|
+
obj || (obj = {});
|
35
|
+
var __t, __p = '', __e = _.escape;
|
36
|
+
with (obj) {
|
37
|
+
__p += '<table class=\'table table-bordered\'>\n <tr>\n <td>\n <h1>Keep</h1>' +
|
38
|
+
((__t = ( keepContent )) == null ? '' : __t) +
|
39
|
+
'\n </td>\n <td rowspan="2">\n <h1>Try</h1>' +
|
40
|
+
((__t = ( tryContent )) == null ? '' : __t) +
|
41
|
+
'\n </td>\n </tr>\n <tr>\n <td><h1>Problem</h1>' +
|
42
|
+
((__t = ( problemContent )) == null ? '' : __t) +
|
43
|
+
'</td>\n </tr>\n</table>\n';
|
44
|
+
|
45
|
+
}
|
46
|
+
return __p
|
47
|
+
};
|
48
|
+
|
49
|
+
ns.register('ktp', function (selector) {
|
50
|
+
var $item, $table, names, data;
|
51
|
+
$item = $(selector);
|
52
|
+
names = ['keepContent', 'problemContent', 'tryContent'];
|
53
|
+
data = {};
|
54
|
+
$item.find('h1').each(function (i) {
|
55
|
+
if (names[i]) { data[names[i]] = getHTML(this); }
|
56
|
+
});
|
57
|
+
$table = $(kptTemplate(data));
|
58
|
+
$table.find('h1').css({
|
59
|
+
marginTop: '0',
|
60
|
+
marginBottom: '20px'
|
61
|
+
});
|
62
|
+
$table.find('td').css({
|
63
|
+
backgroundColor: 'white',
|
64
|
+
verticalAlign: 'top',
|
65
|
+
width: '50%'
|
66
|
+
});
|
67
|
+
$item.prepend($table);
|
68
|
+
});
|
69
|
+
})(this);
|
70
|
+
|
71
|
+
// vim: filetype=jst
|
@@ -0,0 +1,92 @@
|
|
1
|
+
/**
|
2
|
+
* @name lean_canvas.js
|
3
|
+
* @description Render LeanCanvas on Qiita:Team.
|
4
|
+
* @version 0.1.0
|
5
|
+
*/
|
6
|
+
|
7
|
+
(function (global) {
|
8
|
+
if (!global.Qiita.TeamTemplates) {
|
9
|
+
throw 'Qiita.TeamTemplates is required';
|
10
|
+
}
|
11
|
+
|
12
|
+
var ns = global.Qiita.TeamTemplates; // Namespace
|
13
|
+
|
14
|
+
if (ns.isRegistered('lean_canvas')) {
|
15
|
+
// LeanCanvas template has already been registered.
|
16
|
+
return;
|
17
|
+
}
|
18
|
+
|
19
|
+
var getHTML, leanCanvasTemplate;
|
20
|
+
|
21
|
+
getHTML = function (h1) {
|
22
|
+
var el, prev, html = '';
|
23
|
+
for (el = h1.nextElementSibling;
|
24
|
+
!/H1|SCRIPT/.test(el.tagName);
|
25
|
+
prev = el, el = el.nextElementSibling, $(prev).remove()) {
|
26
|
+
html += el.outerHTML;
|
27
|
+
}
|
28
|
+
$(h1).remove();
|
29
|
+
return html;
|
30
|
+
}
|
31
|
+
|
32
|
+
// src/jst/lean_canvas.jst
|
33
|
+
leanCanvasTemplate = function(obj) {
|
34
|
+
obj || (obj = {});
|
35
|
+
var __t, __p = '', __e = _.escape;
|
36
|
+
with (obj) {
|
37
|
+
__p += '<table class=\'table table-bordered\'>\n <tr>\n <td rowspan="2" colspan="2">\n <h4>Problem</h4>' +
|
38
|
+
((__t = ( problem )) == null ? '' : __t) +
|
39
|
+
'\n <h5>Existing Alternatives</h5>' +
|
40
|
+
((__t = ( alternatives )) == null ? '' : __t) +
|
41
|
+
'\n </td>\n <td colspan="2"><h4>Solution</h4>' +
|
42
|
+
((__t = ( solution )) == null ? '' : __t) +
|
43
|
+
'</td>\n <td rowspan="2" colspan="2">\n <h4>Unique Value Proposition</h4>' +
|
44
|
+
((__t = ( uvp )) == null ? '' : __t) +
|
45
|
+
'\n <h5>High-Level Concept</h5>' +
|
46
|
+
((__t = ( concept )) == null ? '' : __t) +
|
47
|
+
'\n </td>\n <td colspan="2"><h4>Unfair Advantage</h4>' +
|
48
|
+
((__t = ( advantage )) == null ? '' : __t) +
|
49
|
+
'</td>\n <td rowspan="2" colspan="2">\n <h4>Customer Segments</h4>' +
|
50
|
+
((__t = ( segments )) == null ? '' : __t) +
|
51
|
+
'\n <h5>Early Adopters</h5>' +
|
52
|
+
((__t = ( early_adopters )) == null ? '' : __t) +
|
53
|
+
'\n </td>\n </tr>\n <tr>\n <td colspan="2"><h4>Key Metrics</h4>' +
|
54
|
+
((__t = ( key_metrics )) == null ? '' : __t) +
|
55
|
+
'</td>\n <td colspan="2"><h4>Channels</h4>' +
|
56
|
+
((__t = ( channels )) == null ? '' : __t) +
|
57
|
+
'</td>\n </tr>\n <tr>\n <td colspan="5"><h4>Cost Structure</h4>' +
|
58
|
+
((__t = ( cost )) == null ? '' : __t) +
|
59
|
+
'</td>\n <td colspan="5"><h4>Revenue Streams</h4>' +
|
60
|
+
((__t = ( revenue )) == null ? '' : __t) +
|
61
|
+
'</td>\n </tr>\n</table>\n';
|
62
|
+
|
63
|
+
}
|
64
|
+
return __p
|
65
|
+
};
|
66
|
+
|
67
|
+
ns.register('lean_canvas', function (selector) {
|
68
|
+
var $item, $table, names, data, template;
|
69
|
+
|
70
|
+
$item = $(selector);
|
71
|
+
|
72
|
+
names = ['problem', 'alternatives', 'segments', 'early_adopters', 'uvp', 'concept',
|
73
|
+
'solution', 'channels', 'revenue', 'cost', 'key_metrics', 'advantage'];
|
74
|
+
data = {};
|
75
|
+
|
76
|
+
$item.find('h1').each(function (i) {
|
77
|
+
if (names[i]) { data[names[i]] = getHTML(this); }
|
78
|
+
});
|
79
|
+
|
80
|
+
$table = $(leanCanvasTemplate(data));
|
81
|
+
$table.find('h4').css('margin-top', '0');
|
82
|
+
$table.find('td').css({
|
83
|
+
backgroundColor: 'white',
|
84
|
+
verticalAlign: 'top',
|
85
|
+
width: '20%'
|
86
|
+
});
|
87
|
+
|
88
|
+
$item.prepend($table);
|
89
|
+
});
|
90
|
+
})(this);
|
91
|
+
|
92
|
+
// vim: filetype=jst
|
@@ -0,0 +1,95 @@
|
|
1
|
+
/**
|
2
|
+
* @name problem_solution_canvas.js
|
3
|
+
* @description Render ProblemSolutionCanvas on Qiita:Team.
|
4
|
+
* @version 0.1.0
|
5
|
+
*/
|
6
|
+
|
7
|
+
(function (global) {
|
8
|
+
if (!global.Qiita.TeamTemplates) {
|
9
|
+
throw 'Qiita.TeamTemplates is required';
|
10
|
+
}
|
11
|
+
|
12
|
+
var ns = global.Qiita.Team; // Namespace
|
13
|
+
|
14
|
+
if (ns.isRegistered('problem_solution_canvas')) {
|
15
|
+
// KPT template has already been registered.
|
16
|
+
return;
|
17
|
+
}
|
18
|
+
|
19
|
+
var getBoxHTML, pscTemplateP1, pscTemplateP2;
|
20
|
+
|
21
|
+
getBoxHTML = function (h2) {
|
22
|
+
var html = '';
|
23
|
+
for (el = h2.nextElementSibling; !_.include(['H1', 'H2', 'SCRIPT'], el.tagName); el = el.nextElementSibling) {
|
24
|
+
html += el.outerHTML;
|
25
|
+
}
|
26
|
+
return [html, el];
|
27
|
+
}
|
28
|
+
|
29
|
+
// src/jst/problem_solution_canvas_p1.jst
|
30
|
+
pscTemplateP1 = function(obj) {
|
31
|
+
obj || (obj = {});
|
32
|
+
var __t, __p = '', __e = _.escape;
|
33
|
+
with (obj) {
|
34
|
+
__p += '<h1>' +
|
35
|
+
((__t = ( title )) == null ? '' : __t) +
|
36
|
+
'</h1>\n<table>\n <tr>\n <td class="currentStatus">\n <h4>CURRENT STATUS</h4>\n ' +
|
37
|
+
((__t = ( currentStatus )) == null ? '' : __t) +
|
38
|
+
'\n </td>\n <td class="leaned">\n <h4>LAST WEEK\'S LESSON LEARNED (AND ACCOMPLISHMENTS)</h4>\n ' +
|
39
|
+
((__t = ( learned )) == null ? '' : __t) +
|
40
|
+
'\n </td>\n </tr>\n <tr>\n <td colspan="2">\n <h4>TOP PROBLEMS</h4>\n ' +
|
41
|
+
((__t = ( problems )) == null ? '' : __t) +
|
42
|
+
'\n </td>\n </tr>\n</table>\n';
|
43
|
+
|
44
|
+
}
|
45
|
+
return __p
|
46
|
+
};
|
47
|
+
|
48
|
+
// src/jst/problem_solution_canvas_p2.jst
|
49
|
+
pscTemplateP2 = function(obj) {
|
50
|
+
obj || (obj = {});
|
51
|
+
var __t, __p = '', __e = _.escape;
|
52
|
+
with (obj) {
|
53
|
+
__p += '<h2>' +
|
54
|
+
((__t = ( title )) == null ? '' : __t) +
|
55
|
+
'</h2>\n<table>\n <tr>\n <td class="solutions">\n <h4>HYPOTHESIZED SOLUTIONS</h4>\n ' +
|
56
|
+
((__t = ( solutions )) == null ? '' : __t) +
|
57
|
+
'\n </td>\n <td class="metrics">\n <h4>METRICS / PROOF + GOALS</h4>\n ' +
|
58
|
+
((__t = ( metrics )) == null ? '' : __t) +
|
59
|
+
'\n </td>\n </tr>\n</table>\n';
|
60
|
+
|
61
|
+
}
|
62
|
+
return __p
|
63
|
+
};
|
64
|
+
|
65
|
+
ns.register('problem_solution_canvas', function (solution) {
|
66
|
+
var $item = $(item_id);
|
67
|
+
|
68
|
+
var html = '';
|
69
|
+
_.each($item.find('h1'), function (h1, i) {
|
70
|
+
var htmlEl, page, h2;
|
71
|
+
page = { title: h1.innerText };
|
72
|
+
h2 = h1.nextElementSibling;
|
73
|
+
if (i === 0) {
|
74
|
+
htmlEl = getBoxHTML(h2);
|
75
|
+
page.currentStatus = htmlEl[0];
|
76
|
+
h2 = htmlEl[1];
|
77
|
+
htmlEl = getBoxHTML(h2);
|
78
|
+
page.learned = htmlEl[0];
|
79
|
+
h2 = htmlEl[1];
|
80
|
+
page.problems = getBoxHTML(h2)[0];
|
81
|
+
html += pscTemplateP1(page);
|
82
|
+
} else {
|
83
|
+
htmlEl = getBoxHTML(h2);
|
84
|
+
page.solutions = htmlEl[0];
|
85
|
+
h2 = htmlEl[1];
|
86
|
+
page.metrics = getBoxHTML(h2)[0];
|
87
|
+
html += pscTemplateP2(page);
|
88
|
+
}
|
89
|
+
});
|
90
|
+
|
91
|
+
$item.html(html);
|
92
|
+
});
|
93
|
+
})(this);
|
94
|
+
|
95
|
+
// vim: filetype=jst
|
data/dist/jst/kpt.js
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
function(obj) {
|
2
|
+
obj || (obj = {});
|
3
|
+
var __t, __p = '', __e = _.escape;
|
4
|
+
with (obj) {
|
5
|
+
__p += '<table class=\'table table-bordered\'>\n <tr>\n <td>\n <h1>Keep</h1>' +
|
6
|
+
((__t = ( keepContent )) == null ? '' : __t) +
|
7
|
+
'\n </td>\n <td rowspan="2">\n <h1>Try</h1>' +
|
8
|
+
((__t = ( tryContent )) == null ? '' : __t) +
|
9
|
+
'\n </td>\n </tr>\n <tr>\n <td><h1>Problem</h1>' +
|
10
|
+
((__t = ( problemContent )) == null ? '' : __t) +
|
11
|
+
'</td>\n </tr>\n</table>\n';
|
12
|
+
|
13
|
+
}
|
14
|
+
return __p
|
15
|
+
}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
function(obj) {
|
2
|
+
obj || (obj = {});
|
3
|
+
var __t, __p = '', __e = _.escape;
|
4
|
+
with (obj) {
|
5
|
+
__p += '<table class=\'table table-bordered\'>\n <tr>\n <td rowspan="2" colspan="2">\n <h4>Problem</h4>' +
|
6
|
+
((__t = ( problem )) == null ? '' : __t) +
|
7
|
+
'\n <h5>Existing Alternatives</h5>' +
|
8
|
+
((__t = ( alternatives )) == null ? '' : __t) +
|
9
|
+
'\n </td>\n <td colspan="2"><h4>Solution</h4>' +
|
10
|
+
((__t = ( solution )) == null ? '' : __t) +
|
11
|
+
'</td>\n <td rowspan="2" colspan="2">\n <h4>Unique Value Proposition</h4>' +
|
12
|
+
((__t = ( uvp )) == null ? '' : __t) +
|
13
|
+
'\n <h5>High-Level Concept</h5>' +
|
14
|
+
((__t = ( concept )) == null ? '' : __t) +
|
15
|
+
'\n </td>\n <td colspan="2"><h4>Unfair Advantage</h4>' +
|
16
|
+
((__t = ( advantage )) == null ? '' : __t) +
|
17
|
+
'</td>\n <td rowspan="2" colspan="2">\n <h4>Customer Segments</h4>' +
|
18
|
+
((__t = ( segments )) == null ? '' : __t) +
|
19
|
+
'\n <h5>Early Adopters</h5>' +
|
20
|
+
((__t = ( early_adopters )) == null ? '' : __t) +
|
21
|
+
'\n </td>\n </tr>\n <tr>\n <td colspan="2"><h4>Key Metrics</h4>' +
|
22
|
+
((__t = ( key_metrics )) == null ? '' : __t) +
|
23
|
+
'</td>\n <td colspan="2"><h4>Channels</h4>' +
|
24
|
+
((__t = ( channels )) == null ? '' : __t) +
|
25
|
+
'</td>\n </tr>\n <tr>\n <td colspan="5"><h4>Cost Structure</h4>' +
|
26
|
+
((__t = ( cost )) == null ? '' : __t) +
|
27
|
+
'</td>\n <td colspan="5"><h4>Revenue Streams</h4>' +
|
28
|
+
((__t = ( revenue )) == null ? '' : __t) +
|
29
|
+
'</td>\n </tr>\n</table>\n';
|
30
|
+
|
31
|
+
}
|
32
|
+
return __p
|
33
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
function(obj) {
|
2
|
+
obj || (obj = {});
|
3
|
+
var __t, __p = '', __e = _.escape;
|
4
|
+
with (obj) {
|
5
|
+
__p += '<h1>' +
|
6
|
+
((__t = ( title )) == null ? '' : __t) +
|
7
|
+
'</h1>\n<table>\n <tr>\n <td class="currentStatus">\n <h4>CURRENT STATUS</h4>\n ' +
|
8
|
+
((__t = ( currentStatus )) == null ? '' : __t) +
|
9
|
+
'\n </td>\n <td class="leaned">\n <h4>LAST WEEK\'S LESSON LEARNED (AND ACCOMPLISHMENTS)</h4>\n ' +
|
10
|
+
((__t = ( learned )) == null ? '' : __t) +
|
11
|
+
'\n </td>\n </tr>\n <tr>\n <td colspan="2">\n <h4>TOP PROBLEMS</h4>\n ' +
|
12
|
+
((__t = ( problems )) == null ? '' : __t) +
|
13
|
+
'\n </td>\n </tr>\n</table>\n';
|
14
|
+
|
15
|
+
}
|
16
|
+
return __p
|
17
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
function(obj) {
|
2
|
+
obj || (obj = {});
|
3
|
+
var __t, __p = '', __e = _.escape;
|
4
|
+
with (obj) {
|
5
|
+
__p += '<h2>' +
|
6
|
+
((__t = ( title )) == null ? '' : __t) +
|
7
|
+
'</h2>\n<table>\n <tr>\n <td class="solutions">\n <h4>HYPOTHESIZED SOLUTIONS</h4>\n ' +
|
8
|
+
((__t = ( solutions )) == null ? '' : __t) +
|
9
|
+
'\n </td>\n <td class="metrics">\n <h4>METRICS / PROOF + GOALS</h4>\n ' +
|
10
|
+
((__t = ( metrics )) == null ? '' : __t) +
|
11
|
+
'\n </td>\n </tr>\n</table>\n';
|
12
|
+
|
13
|
+
}
|
14
|
+
return __p
|
15
|
+
}
|
data/gulpfile.js
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
var fs = require('fs');
|
2
|
+
|
3
|
+
var gulp = require('gulp');
|
4
|
+
var data = require('gulp-data');
|
5
|
+
var jst = require('gulp-jst');
|
6
|
+
var template = require('gulp-template');
|
7
|
+
|
8
|
+
gulp.task('jst', function () {
|
9
|
+
gulp.src('src/jst/*.jst')
|
10
|
+
.pipe(jst())
|
11
|
+
.pipe(gulp.dest('dist/jst'));
|
12
|
+
});
|
13
|
+
|
14
|
+
var defaultTasks = ['jst'];
|
15
|
+
|
16
|
+
// Define template:lean_canvas and template:kpt tasks.
|
17
|
+
['lean_canvas', 'kpt'].forEach(function (name) {
|
18
|
+
var taskName = 'template:' + name;
|
19
|
+
|
20
|
+
defaultTasks.push(taskName);
|
21
|
+
|
22
|
+
gulp.task(taskName, function () {
|
23
|
+
gulp.src('src/js/' + name + '.js')
|
24
|
+
.pipe(data(function (file) {
|
25
|
+
var fname = file.path.split('/').pop();
|
26
|
+
return { template: fs.readFileSync('dist/jst/' + fname) };
|
27
|
+
}))
|
28
|
+
.pipe(template())
|
29
|
+
.pipe(gulp.dest('dist/js'));
|
30
|
+
});
|
31
|
+
});
|
32
|
+
|
33
|
+
defaultTasks.push('template:problem_solution_canvas');
|
34
|
+
|
35
|
+
gulp.task('template:problem_solution_canvas', function () {
|
36
|
+
gulp.src('src/js/problem_solution_canvas.js')
|
37
|
+
.pipe(data(function () {
|
38
|
+
return {
|
39
|
+
templateP1: fs.readFileSync('dist/jst/problem_solution_canvas_p1.js'),
|
40
|
+
templateP2: fs.readFileSync('dist/jst/problem_solution_canvas_p2.js')
|
41
|
+
};
|
42
|
+
}))
|
43
|
+
.pipe(template())
|
44
|
+
.pipe(gulp.dest('dist/js'));
|
45
|
+
});
|
46
|
+
|
47
|
+
gulp.task('default', defaultTasks);
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'qiita/team/templates'
|
data/package.json
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
{
|
2
|
+
"name": "Qiita-Team-Templates",
|
3
|
+
"version": "0.0.0",
|
4
|
+
"description": "Shared templates for teams",
|
5
|
+
"author": "Yuku Takahashi <yuku@qiita.com>",
|
6
|
+
"repository": {
|
7
|
+
"type": "git",
|
8
|
+
"url": "https://github.com/increments/Qiita-Team-Templates.git"
|
9
|
+
},
|
10
|
+
"license": "MIT",
|
11
|
+
"devDependencies": {
|
12
|
+
"gulp": "^3.8.9",
|
13
|
+
"gulp-data": "^1.2.0",
|
14
|
+
"gulp-jst": "^0.1.1",
|
15
|
+
"gulp-template": "^2.1.0"
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "qiita/team/templates/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'qiita-team-templates'
|
7
|
+
spec.version = Qiita::Team::Templates::VERSION
|
8
|
+
spec.authors = ['Yuku Takahashi']
|
9
|
+
spec.email = ['yuku@qiita.com']
|
10
|
+
spec.summary = 'Shared templates for teams'
|
11
|
+
spec.homepage = 'https://github.com/increments/Qiita-Team-Templates'
|
12
|
+
spec.license = 'MIT'
|
13
|
+
|
14
|
+
spec.files = `git ls-files -z`.split("\x0")
|
15
|
+
spec.require_paths = ["lib"]
|
16
|
+
|
17
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
18
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
19
|
+
end
|
data/src/js/kpt.js
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
/**
|
2
|
+
* @name kpt.js
|
3
|
+
* @description Render KPT on Qiita:Team.
|
4
|
+
*/
|
5
|
+
|
6
|
+
(function (global) {
|
7
|
+
if (!global.Qiita.TeamTemplates) {
|
8
|
+
throw 'Qiita.TeamTemplates is required';
|
9
|
+
}
|
10
|
+
|
11
|
+
var ns = global.Qiita.TeamTemplates; // Namespace
|
12
|
+
|
13
|
+
if (ns.isRegistered('kpt')) {
|
14
|
+
// KPT template has already been registered.
|
15
|
+
return;
|
16
|
+
}
|
17
|
+
|
18
|
+
var getHTML, kptTemplate;
|
19
|
+
|
20
|
+
getHTML = function (h1) {
|
21
|
+
var el, prev, html = '';
|
22
|
+
for (el = h1.nextElementSibling;
|
23
|
+
!/H1|SCRIPT/.test(el.tagName);
|
24
|
+
prev = el, el = el.nextElementSibling, $(prev).remove()) {
|
25
|
+
html += el.outerHTML;
|
26
|
+
}
|
27
|
+
$(h1).remove();
|
28
|
+
return html;
|
29
|
+
}
|
30
|
+
|
31
|
+
// src/jst/kpt.jst
|
32
|
+
kptTemplate = <%= template %>;
|
33
|
+
|
34
|
+
ns.register('ktp', function (selector) {
|
35
|
+
var $item, $table, names, data;
|
36
|
+
$item = $(selector);
|
37
|
+
names = ['keepContent', 'problemContent', 'tryContent'];
|
38
|
+
data = {};
|
39
|
+
$item.find('h1').each(function (i) {
|
40
|
+
if (names[i]) { data[names[i]] = getHTML(this); }
|
41
|
+
});
|
42
|
+
$table = $(kptTemplate(data));
|
43
|
+
$table.find('h1').css({
|
44
|
+
marginTop: '0',
|
45
|
+
marginBottom: '20px'
|
46
|
+
});
|
47
|
+
$table.find('td').css({
|
48
|
+
backgroundColor: 'white',
|
49
|
+
verticalAlign: 'top',
|
50
|
+
width: '50%'
|
51
|
+
});
|
52
|
+
$item.prepend($table);
|
53
|
+
});
|
54
|
+
})(this);
|
55
|
+
|
56
|
+
// vim: filetype=jst
|
@@ -0,0 +1,59 @@
|
|
1
|
+
/**
|
2
|
+
* @name lean_canvas.js
|
3
|
+
* @description Render LeanCanvas on Qiita:Team.
|
4
|
+
*/
|
5
|
+
|
6
|
+
(function (global) {
|
7
|
+
if (!global.Qiita.TeamTemplates) {
|
8
|
+
throw 'Qiita.TeamTemplates is required';
|
9
|
+
}
|
10
|
+
|
11
|
+
var ns = global.Qiita.TeamTemplates; // Namespace
|
12
|
+
|
13
|
+
if (ns.isRegistered('lean_canvas')) {
|
14
|
+
// LeanCanvas template has already been registered.
|
15
|
+
return;
|
16
|
+
}
|
17
|
+
|
18
|
+
var getHTML, leanCanvasTemplate;
|
19
|
+
|
20
|
+
getHTML = function (h1) {
|
21
|
+
var el, prev, html = '';
|
22
|
+
for (el = h1.nextElementSibling;
|
23
|
+
!/H1|SCRIPT/.test(el.tagName);
|
24
|
+
prev = el, el = el.nextElementSibling, $(prev).remove()) {
|
25
|
+
html += el.outerHTML;
|
26
|
+
}
|
27
|
+
$(h1).remove();
|
28
|
+
return html;
|
29
|
+
}
|
30
|
+
|
31
|
+
// src/jst/lean_canvas.jst
|
32
|
+
leanCanvasTemplate = <%= template %>;
|
33
|
+
|
34
|
+
ns.register('lean_canvas', function (selector) {
|
35
|
+
var $item, $table, names, data, template;
|
36
|
+
|
37
|
+
$item = $(selector);
|
38
|
+
|
39
|
+
names = ['problem', 'alternatives', 'segments', 'early_adopters', 'uvp', 'concept',
|
40
|
+
'solution', 'channels', 'revenue', 'cost', 'key_metrics', 'advantage'];
|
41
|
+
data = {};
|
42
|
+
|
43
|
+
$item.find('h1').each(function (i) {
|
44
|
+
if (names[i]) { data[names[i]] = getHTML(this); }
|
45
|
+
});
|
46
|
+
|
47
|
+
$table = $(leanCanvasTemplate(data));
|
48
|
+
$table.find('h4').css('margin-top', '0');
|
49
|
+
$table.find('td').css({
|
50
|
+
backgroundColor: 'white',
|
51
|
+
verticalAlign: 'top',
|
52
|
+
width: '20%'
|
53
|
+
});
|
54
|
+
|
55
|
+
$item.prepend($table);
|
56
|
+
});
|
57
|
+
})(this);
|
58
|
+
|
59
|
+
// vim: filetype=jst
|
@@ -0,0 +1,64 @@
|
|
1
|
+
/**
|
2
|
+
* @name problem_solution_canvas.js
|
3
|
+
* @description Render ProblemSolutionCanvas on Qiita:Team.
|
4
|
+
*/
|
5
|
+
|
6
|
+
(function (global) {
|
7
|
+
if (!global.Qiita.TeamTemplates) {
|
8
|
+
throw 'Qiita.TeamTemplates is required';
|
9
|
+
}
|
10
|
+
|
11
|
+
var ns = global.Qiita.Team; // Namespace
|
12
|
+
|
13
|
+
if (ns.isRegistered('problem_solution_canvas')) {
|
14
|
+
// KPT template has already been registered.
|
15
|
+
return;
|
16
|
+
}
|
17
|
+
|
18
|
+
var getBoxHTML, pscTemplateP1, pscTemplateP2;
|
19
|
+
|
20
|
+
getBoxHTML = function (h2) {
|
21
|
+
var html = '';
|
22
|
+
for (el = h2.nextElementSibling; !_.include(['H1', 'H2', 'SCRIPT'], el.tagName); el = el.nextElementSibling) {
|
23
|
+
html += el.outerHTML;
|
24
|
+
}
|
25
|
+
return [html, el];
|
26
|
+
}
|
27
|
+
|
28
|
+
// src/jst/problem_solution_canvas_p1.jst
|
29
|
+
pscTemplateP1 = <%= templateP1 %>;
|
30
|
+
|
31
|
+
// src/jst/problem_solution_canvas_p2.jst
|
32
|
+
pscTemplateP2 = <%= templateP2 %>;
|
33
|
+
|
34
|
+
ns.register('problem_solution_canvas', function (solution) {
|
35
|
+
var $item = $(item_id);
|
36
|
+
|
37
|
+
var html = '';
|
38
|
+
_.each($item.find('h1'), function (h1, i) {
|
39
|
+
var htmlEl, page, h2;
|
40
|
+
page = { title: h1.innerText };
|
41
|
+
h2 = h1.nextElementSibling;
|
42
|
+
if (i === 0) {
|
43
|
+
htmlEl = getBoxHTML(h2);
|
44
|
+
page.currentStatus = htmlEl[0];
|
45
|
+
h2 = htmlEl[1];
|
46
|
+
htmlEl = getBoxHTML(h2);
|
47
|
+
page.learned = htmlEl[0];
|
48
|
+
h2 = htmlEl[1];
|
49
|
+
page.problems = getBoxHTML(h2)[0];
|
50
|
+
html += pscTemplateP1(page);
|
51
|
+
} else {
|
52
|
+
htmlEl = getBoxHTML(h2);
|
53
|
+
page.solutions = htmlEl[0];
|
54
|
+
h2 = htmlEl[1];
|
55
|
+
page.metrics = getBoxHTML(h2)[0];
|
56
|
+
html += pscTemplateP2(page);
|
57
|
+
}
|
58
|
+
});
|
59
|
+
|
60
|
+
$item.html(html);
|
61
|
+
});
|
62
|
+
})(this);
|
63
|
+
|
64
|
+
// vim: filetype=jst
|
data/src/jst/kpt.jst
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
<table class='table table-bordered'>
|
2
|
+
<tr>
|
3
|
+
<td rowspan="2" colspan="2">
|
4
|
+
<h4>Problem</h4><%= problem %>
|
5
|
+
<h5>Existing Alternatives</h5><%= alternatives %>
|
6
|
+
</td>
|
7
|
+
<td colspan="2"><h4>Solution</h4><%= solution %></td>
|
8
|
+
<td rowspan="2" colspan="2">
|
9
|
+
<h4>Unique Value Proposition</h4><%= uvp %>
|
10
|
+
<h5>High-Level Concept</h5><%= concept %>
|
11
|
+
</td>
|
12
|
+
<td colspan="2"><h4>Unfair Advantage</h4><%= advantage %></td>
|
13
|
+
<td rowspan="2" colspan="2">
|
14
|
+
<h4>Customer Segments</h4><%= segments %>
|
15
|
+
<h5>Early Adopters</h5><%= early_adopters %>
|
16
|
+
</td>
|
17
|
+
</tr>
|
18
|
+
<tr>
|
19
|
+
<td colspan="2"><h4>Key Metrics</h4><%= key_metrics %></td>
|
20
|
+
<td colspan="2"><h4>Channels</h4><%= channels %></td>
|
21
|
+
</tr>
|
22
|
+
<tr>
|
23
|
+
<td colspan="5"><h4>Cost Structure</h4><%= cost %></td>
|
24
|
+
<td colspan="5"><h4>Revenue Streams</h4><%= revenue %></td>
|
25
|
+
</tr>
|
26
|
+
</table>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<h1><%= title %></h1>
|
2
|
+
<table>
|
3
|
+
<tr>
|
4
|
+
<td class="currentStatus">
|
5
|
+
<h4>CURRENT STATUS</h4>
|
6
|
+
<%= currentStatus %>
|
7
|
+
</td>
|
8
|
+
<td class="leaned">
|
9
|
+
<h4>LAST WEEK'S LESSON LEARNED (AND ACCOMPLISHMENTS)</h4>
|
10
|
+
<%= learned %>
|
11
|
+
</td>
|
12
|
+
</tr>
|
13
|
+
<tr>
|
14
|
+
<td colspan="2">
|
15
|
+
<h4>TOP PROBLEMS</h4>
|
16
|
+
<%= problems %>
|
17
|
+
</td>
|
18
|
+
</tr>
|
19
|
+
</table>
|
@@ -0,0 +1,68 @@
|
|
1
|
+
/**
|
2
|
+
* @name qiita_team_templates.js
|
3
|
+
*
|
4
|
+
* Qiita.TeamTemplates is initialized as follows:
|
5
|
+
*
|
6
|
+
* Qiita.TeamTemplates = {
|
7
|
+
* // Registered functions.
|
8
|
+
* _map: {},
|
9
|
+
* // Queued selectors.
|
10
|
+
* _queues: {},
|
11
|
+
* // Whether the name has already been registered or not.
|
12
|
+
* isRegistered = function (name) {
|
13
|
+
* return name in this._map;
|
14
|
+
* },
|
15
|
+
* // Register the function as the name.
|
16
|
+
* register: function (name, func) {
|
17
|
+
* this._map[name] = func;
|
18
|
+
* },
|
19
|
+
* // Push the selector to a queue to render when corresponding
|
20
|
+
* // template is registered.
|
21
|
+
* render: function (name, selector) {
|
22
|
+
* this._queues[name] || (this._queues[name] = []);
|
23
|
+
* this._queues[name].push(selector);
|
24
|
+
* }
|
25
|
+
* }
|
26
|
+
*/
|
27
|
+
|
28
|
+
(function (global) {
|
29
|
+
'use strict';
|
30
|
+
|
31
|
+
// Namespace.
|
32
|
+
var ns = global.Qiita.TeamTemplates;
|
33
|
+
|
34
|
+
// Override
|
35
|
+
ns.register = function (name, func) {
|
36
|
+
ns._map[name] = func;
|
37
|
+
if (ns._queues[name]) {
|
38
|
+
// Render queued selectors.
|
39
|
+
ns.run(name);
|
40
|
+
// Clear queue.
|
41
|
+
ns._queues[name] = null;
|
42
|
+
}
|
43
|
+
};
|
44
|
+
|
45
|
+
// Override
|
46
|
+
ns.render = function (name, selector) {
|
47
|
+
if (ns.isRegistered(name)) {
|
48
|
+
ns._map[name](selector);
|
49
|
+
} else {
|
50
|
+
// If the named template has not been registered, push the selector to
|
51
|
+
// the corresponding queue.
|
52
|
+
ns._queues[name] || (ns._queues[name] = []);
|
53
|
+
ns._queues[name].push(selector);
|
54
|
+
}
|
55
|
+
};
|
56
|
+
|
57
|
+
ns.run = function (name) {
|
58
|
+
if (!ns._queues[name]) { return; }
|
59
|
+
for (var i = 0, l = ns._queues[name].length; i < l; i++) {
|
60
|
+
ns.render(name, ns._queues[name][i]);
|
61
|
+
}
|
62
|
+
};
|
63
|
+
|
64
|
+
// Run for preregisted templates.
|
65
|
+
for (var name in ns._map) if (ns._map.hasOwnProperty(name)) {
|
66
|
+
ns.run(name);
|
67
|
+
}
|
68
|
+
})(this);
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qiita-team-templates
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuku Takahashi
|
@@ -44,7 +44,33 @@ email:
|
|
44
44
|
executables: []
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
|
-
files:
|
47
|
+
files:
|
48
|
+
- ".editorconfig"
|
49
|
+
- ".gitignore"
|
50
|
+
- Gemfile
|
51
|
+
- Rakefile
|
52
|
+
- dist/js/kpt.js
|
53
|
+
- dist/js/lean_canvas.js
|
54
|
+
- dist/js/problem_solution_canvas.js
|
55
|
+
- dist/jst/kpt.js
|
56
|
+
- dist/jst/lean_canvas.js
|
57
|
+
- dist/jst/problem_solution_canvas_p1.js
|
58
|
+
- dist/jst/problem_solution_canvas_p2.js
|
59
|
+
- gulpfile.js
|
60
|
+
- lib/qiita-team-templates.rb
|
61
|
+
- lib/qiita/team/templates.rb
|
62
|
+
- lib/qiita/team/templates/engine.rb
|
63
|
+
- lib/qiita/team/templates/version.rb
|
64
|
+
- package.json
|
65
|
+
- qiita-team-templates.gemspec
|
66
|
+
- src/js/kpt.js
|
67
|
+
- src/js/lean_canvas.js
|
68
|
+
- src/js/problem_solution_canvas.js
|
69
|
+
- src/jst/kpt.jst
|
70
|
+
- src/jst/lean_canvas.jst
|
71
|
+
- src/jst/problem_solution_canvas_p1.jst
|
72
|
+
- src/jst/problem_solution_canvas_p2.jst
|
73
|
+
- vendor/assets/javascripts/qiita_team_templates.js
|
48
74
|
homepage: https://github.com/increments/Qiita-Team-Templates
|
49
75
|
licenses:
|
50
76
|
- MIT
|