You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
3.4 KiB
102 lines
3.4 KiB
require(["gitbook", "jquery"], function (gitbook, $) { |
|
var matcher = /\/\/jsfiddle.net\/.+/; |
|
var defaults = { |
|
type: 'script', |
|
tabs: ['js', 'html', 'css', 'result'], |
|
theme: 'light' |
|
}; |
|
var localConfig = { |
|
jsfiddle: {} |
|
}; |
|
var extractConfigFromURL = function (href) { |
|
var match = /(#)(.+)$/ig.exec(href); |
|
if (match && match[2]) { |
|
return match[2].split('&').reduce(function (params, param) { |
|
var splitParam = param.split('='); |
|
if (splitParam[0] === 'tabs') { |
|
splitParam[1] = splitParam[1].split(','); |
|
} |
|
params[splitParam[0]] = splitParam[1]; |
|
return params; |
|
}, {}); |
|
} |
|
return {}; |
|
}; |
|
var generateAdditionalParams = function (config) { |
|
var params = '/'; |
|
if (config.theme) { |
|
params += config.theme + '/'; |
|
} |
|
var colors = Object.keys(config).reduce(function (colors, key) { |
|
if (['href', 'type', 'theme', 'tabs', 'width', 'height'].indexOf(key) !== -1) { |
|
return colors; |
|
} |
|
colors += key + '=' + config[key] + '&'; |
|
return colors; |
|
}, ''); |
|
|
|
colors = colors.replace(/&$/, ''); |
|
if (colors) { |
|
return params + '?' + colors; |
|
} |
|
return params; |
|
}; |
|
|
|
var generateUrl = function (config) { |
|
var additionalParam = generateAdditionalParams(config); |
|
var type = config.type == 'frame' ? 'embedded' : 'embed'; |
|
return config.href + type + '/' + config.tabs.join(',') + additionalParam; |
|
}; |
|
|
|
var creator = { |
|
script: function (config) { |
|
var script = document.createElement('script'); |
|
script.src = generateUrl(config); |
|
script.async = true; |
|
return script; |
|
}, |
|
frame: function (config) { |
|
return $([ |
|
'<iframe', |
|
' width=', |
|
'"' + (config.width ? config.width : '100%') + '"', |
|
' height=', |
|
'"' + (config.height ? config.height : '300') + '"', |
|
' src="' + generateUrl(config) + '"', |
|
' allowfullscreen="allowfullscreen" frameborder="0"', |
|
'>', |
|
'</iframe>' |
|
].join(''))[0]; |
|
} |
|
}; |
|
|
|
var createEmbedNode = function (href, config) { |
|
var normalURL = href.replace(/#.+$/, ''); |
|
var configFromUrl = extractConfigFromURL(href); |
|
var mergedConfig = $.extend({href: normalURL}, config, configFromUrl); |
|
return creator[mergedConfig.type](mergedConfig); |
|
}; |
|
|
|
function embedAllLink(config) { |
|
localConfig.jsfiddle = $.extend(localConfig.jsfiddle || {}, config.jsfiddle); |
|
$(".book-body a").each(function (index, link) { |
|
if (link.href && matcher.test(link.href)) { |
|
link.parentNode.insertBefore(createEmbedNode(link.href, localConfig.jsfiddle), link.nextSibling); |
|
link.parentNode.removeChild(link); |
|
} |
|
}); |
|
} |
|
|
|
gitbook.events.bind("start", function (e, config) { |
|
localConfig.jsfiddle = $.extend({}, defaults); |
|
matcher = /(http|https):\/\/jsfiddle.net\/.+/; |
|
embedAllLink(config); |
|
}); |
|
|
|
gitbook.events.bind("page.change", function () { |
|
if (matcher) { |
|
embedAllLink(localConfig); |
|
} |
|
}); |
|
|
|
}); |