Skip to content

Instantly share code, notes, and snippets.

@madrobby
Forked from 140bytes/LICENSE.txt
Created August 1, 2011 21:34
Show Gist options
  • Save madrobby/1119059 to your computer and use it in GitHub Desktop.
Save madrobby/1119059 to your computer and use it in GitHub Desktop.
lettering.js
function(
a, // a DOM element
b // optional regexp (use /\S+/g for whole words)
) {
a.innerHTML = // replace the html contents
a.textContent.replace( // with the text contents
b || /\S/g, // default regexp: single characters
function(c){ // wrapped in
return '<span class=char' + // spans with classnames (note: no need for attribute quoting)
(a=-~a) + // char1 .. charN. "a" is reused, and initialized.
// ~document.body => -1
// -~document.body => 1
// -~1 => 2
// -~2 => 3 etc.
'>' +
c + // char or word
'</span>'
}
)
}
function(a,b){a.innerHTML=a.textContent.replace(b||/\S/g,function(c){return'<span class=char'+(a=-~a)+'>'+c+'</span>'})}
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2011 Thomas Fuchs <http://mir.aculo.us/>
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.
{
"name": "lettering",
"description": "A clone of lettering.js.",
"keywords": [
"lettering",
"typography",
"css",
"injector"
]
}
<!DOCTYPE html>
<title>Foo</title>
<h1 id="h1">LETTERING.JS</h1>
<style>
/* shamelessly borrowed from lettering.js */
h1{font-weight: normal;text-transform:uppercase;font-family:'League Gothic','Impact',sans-serif;font-size:160px;margin-bottom:-32px;margin-left:10px;color:#c44032;text-shadow:#863027 -4px 4px 0;margin-top:30px;}
h1 span{display:inline-block;position:relative;letter-spacing:-1px;-webkit-transition:all 0.2s ease-out;}
h1 span:hover{top:3px}
h1 .char2, h1 .char11{color:#e36b23;text-shadow:#9b4d1f -4px 4px 0}
h1 .char3, h1 .char10{z-index:10;color:#e6c92e;text-shadow:#9c8b26 -4px 4px 0}
h1 .char4, h1 .char9{color:#5da028;text-shadow:#427021 -4px 4px 0}
h1 .char5, h1 .char8{color:#4584be;text-shadow:#2f597f -4px 4px 0}
h1 .char6, h1 .char7{color:#7073cf;text-shadow:#4a4d88 -4px 4px 0}
h1 .char1{-webkit-transform:rotate(-3deg)}
h1 .char3{top:-1px;-webkit-transform:rotate(2deg)}
h1 .char4{top:-7px}
h1 .char6{top:-7px;-webkit-transform:rotate(2deg)}
h1 .char7{}
h1 .char8{top:1px;-webkit-transform:rotate(-2deg)}
h1 .char9{-webkit-transform:rotate(2deg)}
h1 .char10{top:-65px;width:36px;}
h1 .char10:hover{-webkit-transition-duration:0.4s;}
h1 .char11{top:2px;left:-30px;width:50px;-webkit-transform:rotate(-3deg)}
h1 .char12{left:-24px}
</style>
<script>
var lettering = function(a,b){a.innerHTML=a.textContent.replace(b||/\S/g,function(c){return'<span class=char'+(a=-~a)+'>'+c+'</span>'})}
lettering(document.getElementById('h1'))
</script>
@mathiasbynens
Copy link

Please, think of the mothereffing unquoted attributes!

return'<span class="char'+(++c)+'">'+d+'</span>'
// could be…
return'<span class=char'+(++c)+'>'+d+'</span>'

Also, you could use e.g. <b> instead of <span> (and shorter classnames) but that’s another story.

@madrobby
Copy link
Author

madrobby commented Aug 2, 2011

@mathiasbynens Thanks for this! I do want to keep it compatible with lettering.js, so need to use span and charX.

@madrobby
Copy link
Author

madrobby commented Aug 2, 2011

here's a live version to play around with http://jsfiddle.net/Qz7gP/21/

@p01
Copy link

p01 commented Aug 3, 2011

You can save 2 more bytes using the c=-~c trick

function(a,b,c,d){a.innerHTML=a.textContent.replace(b||/\S/g,function(d){return'<span class=char'+(c=-~c)+'>'+d+'</span>'})}

@jed
Copy link

jed commented Aug 5, 2011

also, you should delete/change the README.

@subzey
Copy link

subzey commented Aug 5, 2011

Few suggestions:

function(a,b){a.innerHTML=a.textContent.replace(b||/\S/g,function(d){return'<span class=char'+ ++a+'>'+d+'</span>'},a=0)}
//         ↑ (1)                                                                               ↑ (2)                ↑ (3)

(1) d placeholder argument in outer function is unnecessary.

(1), (3) c may be dropped and a reused. 3rd arg of .replace is unused, so we can assign a=0 here. a.innerHTML and a.textContent are already «on stack» by the moment of assignment, so value of a is unneeded.

(2) Braces are unneeded in 'foo'+(++i)+'bar', one space is enough for lexer: 'foo'+ ++i+'bar'

@madrobby
Copy link
Author

madrobby commented Aug 5, 2011

Updated and we're now down to 120 bytes.

@mathiasbynens
Copy link

Heads up: @jdalton pointed out this won’t work in IE < 9 because of textContent. You may want to fall back to .innerText or .firstChild.nodeValue (assuming that’s always a text node) if oldIE support is an issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment