Browse Source
2. Removed iterator plugin as it was not being used. 3. Added initial support for html5 video with flash fallback. 4. Added responsive scaling for embedded youtube and vimeo videos. 5. Improved footer styleing.unreleased_contents
Brandon Mathis
14 years ago
7 changed files with 386 additions and 110 deletions
@ -1,49 +0,0 @@ |
|||||
## |
|
||||
## Author: Jose Gonzalez - https://github.com/josegonzalez |
|
||||
## Source URL: https://github.com/josegonzalez/josediazgonzalez.com/blob/master/_plugins/iterator.rb |
|
||||
## |
|
||||
|
|
||||
#module Jekyll |
|
||||
#class Site |
|
||||
#alias_method :orig_site_payload, :site_payload |
|
||||
|
|
||||
## Constuct an array of hashes that will allow the user, using Liquid, to |
|
||||
## iterate through the keys of _kv_hash_ and be able to iterate through the |
|
||||
## elements under each key. |
|
||||
## |
|
||||
## Example: |
|
||||
## categories = { 'Ruby' => [<Post>, <Post>] } |
|
||||
## make_iterable(categories, :index => 'name', :items => 'posts') |
|
||||
## Will allow the user to iterate through all categories and then iterate |
|
||||
## though each post in the current category like so: |
|
||||
## {% for category in site.categories %} |
|
||||
## h1. {{ category.name }} |
|
||||
## <ul> |
|
||||
## {% for post in category.posts %} |
|
||||
## <li>{{ post.title }}</li> |
|
||||
## {% endfor %} |
|
||||
## </ul> |
|
||||
## {% endfor %} |
|
||||
## |
|
||||
## Returns [ {<index> => <kv_hash_key>, <items> => kv_hash[<kv_hash_key>]}, ... ] |
|
||||
|
|
||||
#def make_iterable(kv_hash, options) |
|
||||
#options = {:index => 'name', :items => 'items'}.merge(options) |
|
||||
#result = [] |
|
||||
#kv_hash.sort.each do |key, value| |
|
||||
#result << { options[:index] => key, options[:items] => value } |
|
||||
#end |
|
||||
#result |
|
||||
#end |
|
||||
|
|
||||
#def site_payload |
|
||||
#payload = orig_site_payload |
|
||||
#payload['site']['iterable'].merge!({ |
|
||||
#'categories' => make_iterable(self.categories, :index => 'name', :items => 'posts'), |
|
||||
#'tags' => make_iterable(self.tags, :index => 'name', :items => 'posts') |
|
||||
#}) |
|
||||
#payload |
|
||||
#end |
|
||||
|
|
||||
#end |
|
||||
#end |
|
@ -0,0 +1,298 @@ |
|||||
|
/*! SWFObject v2.2 <http://code.google.com/p/swfobject/> |
||||
|
is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
|
||||
|
*/ |
||||
|
|
||||
|
var swfobject = function() { |
||||
|
|
||||
|
var UNDEF = "undefined", |
||||
|
OBJECT = "object", |
||||
|
SHOCKWAVE_FLASH = "Shockwave Flash", |
||||
|
SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash", |
||||
|
FLASH_MIME_TYPE = "application/x-shockwave-flash", |
||||
|
EXPRESS_INSTALL_ID = "SWFObjectExprInst", |
||||
|
|
||||
|
win = window, |
||||
|
doc = document, |
||||
|
nav = navigator, |
||||
|
|
||||
|
plugin = false, |
||||
|
regObjArr = [], |
||||
|
objIdArr = [], |
||||
|
storedAltContent, |
||||
|
storedAltContentId, |
||||
|
storedCallbackFn, |
||||
|
storedCallbackObj, |
||||
|
autoHideShow = true, |
||||
|
|
||||
|
/* Centralized function for browser feature detection |
||||
|
- User agent string detection is only used when no good alternative is possible |
||||
|
- Is executed directly for optimal performance |
||||
|
*/ |
||||
|
ua = function() { |
||||
|
var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF, |
||||
|
u = nav.userAgent.toLowerCase(), |
||||
|
p = nav.platform.toLowerCase(), |
||||
|
windows = p ? /win/.test(p) : /win/.test(u), |
||||
|
mac = p ? /mac/.test(p) : /mac/.test(u), |
||||
|
webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
|
||||
|
ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
|
||||
|
playerVersion = [0,0,0], |
||||
|
d = null; |
||||
|
if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) { |
||||
|
d = nav.plugins[SHOCKWAVE_FLASH].description; |
||||
|
if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
|
||||
|
plugin = true; |
||||
|
ie = false; // cascaded feature detection for Internet Explorer
|
||||
|
d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1"); |
||||
|
playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10); |
||||
|
playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10); |
||||
|
playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0; |
||||
|
} |
||||
|
} |
||||
|
else if (typeof win.ActiveXObject != UNDEF) { |
||||
|
try { |
||||
|
var a = new ActiveXObject(SHOCKWAVE_FLASH_AX); |
||||
|
if (a) { // a will return null when ActiveX is disabled
|
||||
|
d = a.GetVariable("$version"); |
||||
|
if (d) { |
||||
|
ie = true; // cascaded feature detection for Internet Explorer
|
||||
|
d = d.split(" ")[1].split(","); |
||||
|
playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
catch(e) {} |
||||
|
} |
||||
|
return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac }; |
||||
|
}() |
||||
|
|
||||
|
|
||||
|
/* Main function |
||||
|
- Will preferably execute onDomLoad, otherwise onload (as a fallback) |
||||
|
*/ |
||||
|
function main() { |
||||
|
if (plugin) { testPlayerVersion(); } |
||||
|
else { matchVersions(); } |
||||
|
} |
||||
|
|
||||
|
/* Detect the Flash Player version for non-Internet Explorer browsers |
||||
|
- Detecting the plug-in version via the object element is more precise than using the plugins collection item's description: |
||||
|
a. Both release and build numbers can be detected |
||||
|
b. Avoid wrong descriptions by corrupt installers provided by Adobe |
||||
|
c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports |
||||
|
- Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available |
||||
|
*/ |
||||
|
function testPlayerVersion() { |
||||
|
var b = doc.getElementsByTagName("body")[0]; |
||||
|
var o = createElement(OBJECT); |
||||
|
o.setAttribute("type", FLASH_MIME_TYPE); |
||||
|
var t = b.appendChild(o); |
||||
|
if (t) { |
||||
|
var counter = 0; |
||||
|
(function(){ |
||||
|
if (typeof t.GetVariable != UNDEF) { |
||||
|
var d = t.GetVariable("$version"); |
||||
|
if (d) { |
||||
|
d = d.split(" ")[1].split(","); |
||||
|
ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; |
||||
|
} |
||||
|
} |
||||
|
else if (counter < 10) { |
||||
|
counter++; |
||||
|
setTimeout(arguments.callee, 10); |
||||
|
return; |
||||
|
} |
||||
|
b.removeChild(o); |
||||
|
t = null; |
||||
|
matchVersions(); |
||||
|
})(); |
||||
|
} |
||||
|
else { |
||||
|
matchVersions(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* Cross-browser dynamic SWF creation |
||||
|
*/ |
||||
|
function createSWF(attObj, parObj, id) { |
||||
|
var r, el = getElementById(id); |
||||
|
if (ua.wk && ua.wk < 312) { return r; } |
||||
|
if (el) { |
||||
|
if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
|
||||
|
attObj.id = id; |
||||
|
} |
||||
|
if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
|
||||
|
var att = ""; |
||||
|
for (var i in attObj) { |
||||
|
if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries
|
||||
|
if (i.toLowerCase() == "data") { |
||||
|
parObj.movie = attObj[i]; |
||||
|
} |
||||
|
else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
|
||||
|
att += ' class="' + attObj[i] + '"'; |
||||
|
} |
||||
|
else if (i.toLowerCase() != "classid") { |
||||
|
att += ' ' + i + '="' + attObj[i] + '"'; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
var par = ""; |
||||
|
for (var j in parObj) { |
||||
|
if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries
|
||||
|
par += '<param name="' + j + '" value="' + parObj[j] + '" />'; |
||||
|
} |
||||
|
} |
||||
|
el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>'; |
||||
|
objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)
|
||||
|
r = getElementById(attObj.id); |
||||
|
} |
||||
|
else { // well-behaving browsers
|
||||
|
var o = createElement(OBJECT); |
||||
|
o.setAttribute("type", FLASH_MIME_TYPE); |
||||
|
for (var m in attObj) { |
||||
|
if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries
|
||||
|
if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
|
||||
|
o.setAttribute("class", attObj[m]); |
||||
|
} |
||||
|
else if (m.toLowerCase() != "classid") { // filter out IE specific attribute
|
||||
|
o.setAttribute(m, attObj[m]); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
for (var n in parObj) { |
||||
|
if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element
|
||||
|
createObjParam(o, n, parObj[n]); |
||||
|
} |
||||
|
} |
||||
|
el.parentNode.replaceChild(o, el); |
||||
|
r = o; |
||||
|
} |
||||
|
} |
||||
|
return r; |
||||
|
} |
||||
|
|
||||
|
function createObjParam(el, pName, pValue) { |
||||
|
var p = createElement("param"); |
||||
|
p.setAttribute("name", pName); |
||||
|
p.setAttribute("value", pValue); |
||||
|
el.appendChild(p); |
||||
|
} |
||||
|
|
||||
|
/* Cross-browser SWF removal |
||||
|
- Especially needed to safely and completely remove a SWF in Internet Explorer |
||||
|
*/ |
||||
|
/* Functions to optimize JavaScript compression |
||||
|
*/ |
||||
|
function getElementById(id) { |
||||
|
var el = null; |
||||
|
try { |
||||
|
el = doc.getElementById(id); |
||||
|
} |
||||
|
catch (e) {} |
||||
|
return el; |
||||
|
} |
||||
|
|
||||
|
function createElement(el) { |
||||
|
return doc.createElement(el); |
||||
|
} |
||||
|
|
||||
|
/* Flash Player and SWF content version matching |
||||
|
*/ |
||||
|
function hasPlayerVersion(rv) { |
||||
|
var pv = ua.pv, v = rv.split("."); |
||||
|
v[0] = parseInt(v[0], 10); |
||||
|
v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
|
||||
|
v[2] = parseInt(v[2], 10) || 0; |
||||
|
return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* Filter to avoid XSS attacks |
||||
|
*/ |
||||
|
function urlEncodeIfNecessary(s) { |
||||
|
var regex = /[\\\"<>\.;]/; |
||||
|
var hasBadChars = regex.exec(s) != null; |
||||
|
return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s; |
||||
|
} |
||||
|
|
||||
|
return { |
||||
|
/* Public API |
||||
|
- Reference: http://code.google.com/p/swfobject/wiki/documentation
|
||||
|
*/ |
||||
|
|
||||
|
embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, flashvarsObj, parObj, attObj, callbackFn) { |
||||
|
var callbackObj = {success:false, id:replaceElemIdStr}; |
||||
|
if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) { |
||||
|
widthStr += ""; // auto-convert to string
|
||||
|
heightStr += ""; |
||||
|
var att = {}; |
||||
|
if (attObj && typeof attObj === OBJECT) { |
||||
|
for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
|
||||
|
att[i] = attObj[i]; |
||||
|
} |
||||
|
} |
||||
|
att.data = swfUrlStr; |
||||
|
att.width = widthStr; |
||||
|
att.height = heightStr; |
||||
|
var par = {}; |
||||
|
if (parObj && typeof parObj === OBJECT) { |
||||
|
for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
|
||||
|
par[j] = parObj[j]; |
||||
|
} |
||||
|
} |
||||
|
if (flashvarsObj && typeof flashvarsObj === OBJECT) { |
||||
|
for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
|
||||
|
if (typeof par.flashvars != UNDEF) { |
||||
|
par.flashvars += "&" + k + "=" + flashvarsObj[k]; |
||||
|
} |
||||
|
else { |
||||
|
par.flashvars = k + "=" + flashvarsObj[k]; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if (hasPlayerVersion(swfVersionStr)) { // create SWF
|
||||
|
var obj = createSWF(att, par, replaceElemIdStr); |
||||
|
callbackObj.success = true; |
||||
|
callbackObj.ref = obj; |
||||
|
} |
||||
|
if (callbackFn) { callbackFn(callbackObj); } |
||||
|
} |
||||
|
else if (callbackFn) { callbackFn(callbackObj); } |
||||
|
}, |
||||
|
|
||||
|
ua: ua, |
||||
|
|
||||
|
getFlashPlayerVersion: function() { |
||||
|
return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] }; |
||||
|
}, |
||||
|
|
||||
|
hasFlashPlayerVersion: hasPlayerVersion, |
||||
|
|
||||
|
createSWF: function(attObj, parObj, replaceElemIdStr) { |
||||
|
if (ua.w3) { |
||||
|
return createSWF(attObj, parObj, replaceElemIdStr); |
||||
|
} |
||||
|
else { |
||||
|
return undefined; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
getQueryParamValue: function(param) { |
||||
|
var q = doc.location.search || doc.location.hash; |
||||
|
if (q) { |
||||
|
if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark
|
||||
|
if (param == null) { |
||||
|
return urlEncodeIfNecessary(q); |
||||
|
} |
||||
|
var pairs = q.split("&"); |
||||
|
for (var i = 0; i < pairs.length; i++) { |
||||
|
if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) { |
||||
|
return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1))); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return ""; |
||||
|
} |
||||
|
}; |
||||
|
}(); |
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue