View a Radio3 user's links, in reverse-chronologic order
<html> | |
<head> | |
<title>View Linkblog</title> | |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<link href="http://fargo.io/code/bootstrap.css" rel="stylesheet"> | |
<script src="http://fargo.io/code/bootstrap.min.js"></script> | |
<link rel="stylesheet" href="http://fargo.io/code/fontAwesome/css/font-awesome.min.css"/> | |
<link href="http://fargo.io/code/ubuntuFont.css" rel="stylesheet" type="text/css"> | |
<script src="http://fargo.io/code/jquery-1.9.1.min.js"></script> | |
<script> | |
//utility routines | |
function dateYesterday (d) { | |
return (new Date (new Date (d) - (24 * 60 * 60 * 1000))); | |
} | |
function dayGreaterThanOrEqual (d1, d2) { | |
d1 = new Date (d1); | |
d1.setHours (0); | |
d1.setMinutes (0); | |
d1.setSeconds (0); | |
d2 = new Date (d2); | |
d2.setHours (0); | |
d2.setMinutes (0); | |
d2.setSeconds (0); | |
return (d1 >= d2); | |
} | |
function padWithZeros (num, ctplaces) { | |
var s = num.toString (); | |
while (s.length < ctplaces) { | |
s = "0" + s; | |
} | |
return (s); | |
} | |
function filledString (ch, ct) { | |
var s = ""; | |
for (var i = 0; i < ct; i++) { | |
s += ch; | |
} | |
return (s); | |
} | |
function trimLeading (s, ch) { | |
while (s.charAt (0) === ch) { | |
s = s.substr (1); | |
} | |
return (s); | |
} | |
function beginsWith (s, possibleBeginning, flUnicase) { | |
if (s.length == 0) { //1/1/14 by DW | |
return (false); | |
} | |
if (flUnicase == undefined) { | |
flUnicase = true; | |
} | |
if (flUnicase) { | |
for (var i = 0; i < possibleBeginning.length; i++) { | |
if (stringLower (s [i]) != stringLower (possibleBeginning [i])) { | |
return (false); | |
} | |
} | |
} | |
else { | |
for (var i = 0; i < possibleBeginning.length; i++) { | |
if (s [i] != possibleBeginning [i]) { | |
return (false); | |
} | |
} | |
} | |
return (true); | |
} | |
function stringLower (s) { | |
return (s.toLowerCase ()); | |
} | |
function stringDelete (s, ix, ct) { | |
var start = ix - 1; | |
var end = (ix + ct) - 1; | |
var s1 = s.substr (0, start); | |
var s2 = s.substr (end); | |
return (s1 + s2); | |
} | |
function secondsSince (when) { | |
var now = new Date (); | |
when = new Date (when); | |
return ((now - when) / 1000); | |
} | |
function urlSplitter (url) { | |
var pattern = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/; | |
var result = pattern.exec (url); | |
if (result == null) { | |
result = []; | |
result [5] = url; | |
} | |
var splitUrl = { | |
scheme: result [1], | |
host: result [3], | |
port: result [4], | |
path: result [5], | |
query: result [6], | |
hash: result [7] | |
}; | |
return (splitUrl); | |
} | |
function readHttpFile (url, callback) { | |
var jxhr = $.ajax ({ | |
url: url, | |
dataType: "text" , | |
timeout: 30000 | |
}) | |
.success (function (data, status) { | |
callback (data); | |
}) | |
.error (function (status) { | |
console.log ("readHttpFile: url == " + url + ", error == " + status.statusText + "."); | |
callback (undefined); | |
}); | |
} | |
function getDatePath (theDate, flLastSeparator) { | |
if (theDate == undefined) { | |
theDate = new Date (); | |
} | |
else { | |
theDate = new Date (theDate); //8/12/14 by DW -- make sure it's a date type | |
} | |
if (flLastSeparator == undefined) { | |
flLastSeparator = true; | |
} | |
var month = padWithZeros (theDate.getMonth () + 1, 2); | |
var day = padWithZeros (theDate.getDate (), 2); | |
var year = theDate.getFullYear (); | |
if (flLastSeparator) { | |
return (year + "/" + month + "/" + day + "/"); | |
} | |
else { | |
return (year + "/" + month + "/" + day); | |
} | |
} | |
function viewLinkblog (idDiv, twitterScreenname, whenLinkblogStart, baseUrl, callback) { | |
var ctDaysOnPage = 25, daysTable; | |
function loadOneDay (theDay, callback) { | |
var urlFolder = baseUrl + twitterScreenname + "/"; | |
var url = urlFolder + getDatePath (theDay) + "history.json", whenReadStart = new Date (); | |
console.log ("loadOneDay: " + theDay); | |
readHttpFile (url, function (jsontext) { | |
if (callback != undefined) { | |
try { | |
var jstruct = JSON.parse (jsontext); | |
callback (jstruct); | |
} | |
catch (err) { | |
callback (); | |
} | |
} | |
}); | |
} | |
function loadDaysTable (callback) { | |
var whenBlogStart = dateYesterday (whenLinkblogStart), whenstart = new Date (); | |
function loadOne (theDay) { | |
loadOneDay (theDay, function (jstruct) { | |
var yesterday = dateYesterday (theDay); | |
if (jstruct != undefined) { | |
daysTable.unshift ({ | |
when: theDay, | |
jstruct: jstruct | |
}); | |
} | |
if ((daysTable.length < ctDaysOnPage) && (dayGreaterThanOrEqual (yesterday, whenBlogStart))) { | |
loadOne (yesterday); | |
} | |
else { | |
if (callback != undefined) { //10/24/14 by DW | |
callback (); | |
} | |
console.log ("loadDaysTable: " + secondsSince (whenstart) + " secs."); | |
} | |
}); | |
} | |
daysTable = new Array (); | |
loadOne (new Date ()); | |
} | |
function addDay (jstruct) { | |
var htmltext = "", indentlevel = 0; | |
var datestring = new Date (jstruct.when).toLocaleDateString (); | |
function add (s) { | |
htmltext += filledString ("\t", indentlevel) + s + "\n"; | |
} | |
add ("<div class=\"divLinkblogDayTitle\">" + datestring + "</div>"); | |
add ("<div class=\"divLinkblogDay\">"); indentlevel++; | |
for (var i = 0; i < jstruct.dayHistory.length; i++) { | |
try { | |
var item = jstruct.dayHistory [i], linktext = "", icon = ""; | |
//set linktext, icon | |
if ((item.link != undefined) && (item.link.length > 0)) { | |
var splitUrl = urlSplitter (trimLeading (item.link, " ")); //10/15/14 by DW -- remove leading blanks | |
var host = splitUrl.host; | |
if (beginsWith (host, "www.")) { | |
host = stringDelete (host, 1, 4); | |
} | |
linktext = " <a class=\"aHost\" href=\"" + item.link + "\" target=\"blank\">" + host + "</a>"; | |
} | |
add ("<p>" + icon + item.text + linktext + "</p>"); | |
} | |
catch (error) { | |
console.log ("appendDay: error == " + error + " while adding item == " + item.text); | |
} | |
} | |
add ("</div>"); indentlevel--; | |
$("#idLinkblogDays").append (htmltext); | |
} | |
loadDaysTable (function () { | |
$("#idLinkblogDays").html (""); | |
for (var i = daysTable.length - 1; i >= 0; i--) { | |
addDay (daysTable [i].jstruct); | |
} | |
}); | |
} | |
function startup () { | |
viewLinkblog ("idLinkblogDays", "davewiner", new Date ("9/1/2014"), "http://radio3.io/users/", function () { | |
}); | |
} | |
</script> | |
<style> | |
body { | |
font-family: Ubuntu; | |
font-size: 18px; | |
background-color: whitesmoke; | |
} | |
.divPageBody { | |
width: 50%; | |
margin-top: 80px; | |
margin-bottom: 400px; | |
margin-left: auto; | |
margin-right: auto; | |
} | |
.divLinkblogDayTitle { | |
font-family: "Ubuntu"; | |
font-size: 22px; | |
font-weight: bold; | |
margin-bottom: 10px; | |
} | |
.divLinkblogDay { | |
font-family: "Ubuntu"; | |
font-size: 16px; | |
margin-bottom: 40px; | |
} | |
</style> | |
</head> | |
<body> | |
<div class="divPageBody"> | |
<div id="idLinkblogDays"> | |
</div> | |
</div> | |
<script> | |
$(document).ready (function () { | |
startup (); | |
}); | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment