Skip to content

Commit 686ad76

Browse files
committed
use book assets instead hook
When gitbook changes page it add _=timestamp in request script. It breaks inserting jsfiddle frame
1 parent 929dcae commit 686ad76

File tree

4 files changed

+114
-5
lines changed

4 files changed

+114
-5
lines changed

index.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1-
var replace = require('./src/replace');
1+
//var replace = require('./src/replace');
22
module.exports = {
3+
book: {
4+
assets: "./src",
5+
js: [
6+
"plugin.js"
7+
]
8+
}/*,
39
hooks: {
410
'page': function (page) {
511
var config = this.getConfig('pluginsConfig') || {};
612
page.sections[0].content = replace(page.sections[0].content, config.jsfiddle);
713
return page;
814
}
9-
}
15+
}*/
1016
};

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "gitbook-plugin-jsfiddle",
33
"description": "JSFiddle Integration into GitBook",
44
"main": "index.js",
5-
"version": "1.0.0-alpha.7",
5+
"version": "1.0.0-alpha.8",
66
"author": {
77
"name": "Konstantin Krivlenia"
88
},

src/plugin.js

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
require(["gitbook", "jquery"], function (gitbook, $) {
2+
var matcher = /\/\/jsfiddle.net\/.+/;
3+
var localConfig = {
4+
jsfiddle: {
5+
type: 'script',
6+
tabs: ['js', 'html', 'css', 'result'],
7+
theme: 'light'
8+
}
9+
};
10+
var extractConfigFromURL = function (href) {
11+
var match = /(#)(.+)$/ig.exec(href);
12+
if (match && match[2]) {
13+
return match[2].split('&').reduce(function (params, param) {
14+
var splitParam = param.split('=');
15+
if (splitParam[0] === 'tabs') {
16+
splitParam[1] = splitParam[1].split(',');
17+
}
18+
params[splitParam[0]] = splitParam[1];
19+
return params;
20+
}, {});
21+
}
22+
return {};
23+
};
24+
var generateAdditionalParams = function (config) {
25+
var params = '/';
26+
if (config.theme) {
27+
params += config.theme + '/';
28+
}
29+
var colors = Object.keys(config).reduce(function (colors, key) {
30+
31+
if (['href', 'type', 'theme', 'tabs', 'width', 'height'].indexOf(key) !== -1) {
32+
return colors;
33+
}
34+
35+
colors += key + '=' + config[key] + '&';
36+
return colors;
37+
}, '');
38+
39+
colors = colors.replace(/&$/, '');
40+
if (colors) {
41+
return params + '?' + colors;
42+
}
43+
return params;
44+
};
45+
46+
var generateUrl = function (config) {
47+
var additionalParam = generateAdditionalParams(config);
48+
console.log(additionalParam);
49+
var type = config.type == 'frame' ? 'embedded' : 'embed';
50+
return config.href + type + '/' + config.tabs.join(',') + additionalParam;
51+
};
52+
53+
var creator = {
54+
script: function (config) {
55+
var script = document.createElement('script');
56+
script.src = generateUrl(config);
57+
script.async = true;
58+
return script;
59+
},
60+
frame: function (config) {
61+
return $([
62+
'<iframe',
63+
' width=',
64+
'"' + (config.width ? config.width : '100%') + '"',
65+
' height=',
66+
'"' + (config.height ? config.height : '300') + '"',
67+
' src="' + generateUrl(config) + '"',
68+
' allowfullscreen="allowfullscreen" frameborder="0"',
69+
'>',
70+
'</iframe>'
71+
].join(''))[0];
72+
}
73+
};
74+
75+
var createEmbedNode = function (href, config) {
76+
var normalURL = href.replace(/#.+$/, '');
77+
var configFromUrl = extractConfigFromURL(href);
78+
var mergedConfig = $.extend({href: normalURL}, config, configFromUrl);
79+
return creator[mergedConfig.type](mergedConfig);
80+
};
81+
82+
function embedAllLink(config) {
83+
localConfig.jsfiddle = $.extend(localConfig.jsfiddle || {}, config.jsfiddle);
84+
85+
$(".book-body a").each(function (index, link) {
86+
if (link.href && matcher.test(link.href)) {
87+
link.parentNode.insertBefore(createEmbedNode(link.href, localConfig.jsfiddle), link.nextSibling);
88+
link.parentNode.removeChild(link);
89+
}
90+
});
91+
}
92+
93+
gitbook.events.bind("start", function (e, config) {
94+
matcher = /(http|https):\/\/jsfiddle.net\/.+/;
95+
embedAllLink(config);
96+
});
97+
98+
gitbook.events.bind("page.change", function () {
99+
if (matcher) {
100+
embedAllLink(localConfig);
101+
}
102+
});
103+
});

src/replace.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ var domutils = require('domutils');
44
var matcher = /\/\/jsfiddle.net\/.+/;
55
var _ = require('lodash');
66

7-
var defautsConfig = {
7+
var defaultsConfig = {
88
type: 'script',
99
tabs: ['js', 'html', 'css', 'result'],
1010
theme: 'light'
@@ -84,7 +84,7 @@ var creator = {
8484
var createEmbedNode = function (href, config) {
8585
var normalURL = href.replace(/#.+$/, '');
8686
var configFromUrl = extractConfigFromURL(href);
87-
var mergedConfig = _.defaults({href: normalURL}, configFromUrl, config, defautsConfig);
87+
var mergedConfig = _.defaults({href: normalURL}, configFromUrl, config, defaultsConfig);
8888
return htmlToDom(creator[mergedConfig.type](mergedConfig))[0];
8989
};
9090

0 commit comments

Comments
 (0)