Skip to content

Instantly share code, notes, and snippets.

@tribela
Last active August 29, 2015 14:19
Show Gist options
  • Save tribela/e70708928c5aecab91ea to your computer and use it in GitHub Desktop.
Save tribela/e70708928c5aecab91ea to your computer and use it in GitHub Desktop.
Hex editor clock
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<link rel="stylesheet" href="style.css" type="text/css" media="all" charset="utf-8">
<script src="script.js" type="text/javascript"></script>
<title>Hex editor</title>
</head>
<body>
<section class="fixedwidth">
<section class="fake"><!--
--><span class="address"></span><!--
--><span class="hex"><!--
--><span class="dummy"></span><!--
--><span class="dummy"></span><!--
--></span><!--
--><span class="str"></span><!--
--></section>
<section class="current"><!--
--><span class="address"></span><!--
--><span class="hex"><!--
--><span class="selected"></span><!--
--></span><!--
--><span class="str"></span><!--
--></section>
</section>
</body>
</html>
function getTime() {
var dateObj = new Date();
var year = dateObj.getFullYear();
var month = dateObj.getMonth() + 1;
var date = dateObj.getDate();
var hours = dateObj.getHours();
var minutes = dateObj.getMinutes();
var dateString = ('0000' + year).slice(-4) +
('00' + month).slice(-2) +
('00' + date).slice(-2);
var timeString = ('00' + hours).slice(-2) +
('00' + minutes).slice(-2);
return {
date: dateString,
time: timeString,
};
}
function makeRandomHex(length) {
return ('00000000' + (Math.random()*0xff).toString(16)).slice(-length);
}
function getHexChar(str) {
var result = '';
str = str.replace(/\s/gi, '');
for (var i = 0; i < str.length; i += 2) {
var hex = str.slice(i, i + 2);
var number = parseInt(hex, 16);
var ch = String.fromCharCode(number);
if (/[ -~]/.test(ch)) {
result += ch;
} else {
result += '.';
}
}
return result;
}
function shuffleClock() {
var sections = document.querySelector('.fixedwidth');
var currentHex = document.querySelector('.current .hex');
for (var i = sections.children.length; i > 1; i -= 1) {
sections.appendChild(
sections.children[Math.floor(Math.random() * i)]);
}
for (var i = currentHex.children.length; i > 1; i -= 1) {
currentHex.appendChild(
currentHex.children[Math.floor(Math.random() * i)]);
}
}
function updateClock() {
var times = getTime();
shuffleClock();
var rows = document.querySelectorAll('.fixedwidth section');
var dummys = document.querySelectorAll('.dummy');
var current = document.querySelector('.current');
var offset = 0;
while ((current = current.previousSibling) != null) {
if (current instanceof Element) {
offset -= 1;
}
}
document.querySelector('.current .selected').textContent = times.time + ' ';
for (var i = 0; i < dummys.length; i += 1) {
dummys[i].textContent = makeRandomHex(4) + ' ';
}
for (var i = 0; i < rows.length; i += 1) {
var row = rows[i];
var address = ('00000000' + (parseInt(times.date, 16) + offset + i).toString(16)).slice(-8);
var hexElement = row.querySelector('.hex');
row.querySelector('.address').textContent = address + ' ';
row.querySelector('.str').textContent = getHexChar(hexElement.textContent);
}
setTimeout(updateClock, 60000 - Date.now() % 60000);
}
function initialise() {
var current = document.querySelector('.current');
var currentHex = document.querySelector('.current .hex');
var fake = document.querySelector('.fake');
var dummy = document.querySelector('.dummy');
var tester = document.createElement('span');
var fontWidth;
var fontHeight;
tester.textContent = 'm';
tester.classList.add('dummy');
document.querySelector('.fixedwidth .fake').appendChild(tester);
fontWidth = tester.offsetWidth;
fontHeight = tester.offsetHeight;
console.log(fontWidth, fontHeight);
tester.remove();
console.log(((document.body.offsetWidth / (fontWidth)) - 8) / 6);
for (var i = 2; i < ((document.body.offsetWidth / (fontWidth)) - 10) / 7; i += 1) {
dummy.parentElement.appendChild(dummy.cloneNode(true));
currentHex.appendChild(dummy.cloneNode(true));
}
dummy.remove();
for (var i = 2; i < (window.innerHeight / fontHeight); i += 1) {
fake.parentElement.appendChild(fake.cloneNode(true));
}
fake.remove();
setTimeout(updateClock, 0);
}
window.addEventListener('load', initialise);
html {
background: black;
text-align: center;
font-size: 20px;
}
.fixedwidth {
display: inline-block;
font-family: 'ubuntu mono', monospace;
text-align: left;
color: grey;
white-space: nowrap;
letter-spacing: 0em;
}
.current .address, .selected {
color: red;
font-weight: bold;
border-radius: 4px;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment