View a Radio3 user's links, in reverse-chronologic order
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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