The Source Luke...

Minified versions can be Forked from the GitHub repository or by clicking the Download button below.


View source on GitHub Download TypeSetting.js

typesetting.js version 1.1

Raw | Master

var typesetting = (function() {

    function injector(t, splitter, klass, after, runner, reset) {
        var a = (t.innerText || t.textContent),
            inject = '',
            runner = runner || false, 
            reset = reset || false,
            i = 1,
            run_up = true;
        a = a.split(splitter);
        if (a.length) {
            a.forEach(function(item) {
                inject += '' + item + '' + after;
                if( !!runner && !reset ) {
                    if( run_up && i < runner ) {
                        i++;
                    } else if( run_up && i >= runner ) {
                        run_up = false;
                        i--;
                    } else if( !run_up && i > 1 ) {
                        i--;
                    } else {
                        run_up = true;
                        i++;
                    }
                } else if( !!reset && !runner ) {
                    i = i < reset ? i+1 : 1;
                } else if( !reset && !runner ) {
                    i++;
                } else {
                    throw('Error: Cannot set property runner and reset');
                    return;
                }
            });
            t.innerHTML = inject; 
        }
    }

    function replaceNodeWith(element, search, replace) {
        var elements = element.childNodes;
        for (var i = 0, l = elements.length; i < l; i++) {
            if (elements[i].tagName === search) {
                element.replaceChild(document.createTextNode(replace), elements[i]);
            }
        }
    }

    function collectElements(queryString, context) { // setup for later on
        context = context || document;
        return Sizzle(queryString, context);
    }

    var typesetting = {
        letters: function(queryString, options) {
            options = options || {};
            var elements = collectElements(queryString);
            elements.forEach(function(item) {
                injector(
                    item, 
                    '', 
                    (options.baseClass || 'char'), 
                    (options.after || ''), 
                    (options.runner || false), 
                    (options.reset || false)
                );
            });
            return elements;
        },
        lines: function(queryString, options) {
            options = options || {};
            var elements = collectElements(queryString);
            elements.forEach(function(item) {
                var r = "eefec303079ad17405c889e092e105b0";
                replaceNodeWith(item, 'BR', r);
                injector(
                    item, 
                    r, 
                    (options.baseClass || 'line'), 
                    (options.after || ''), 
                    (options.runner || false), 
                    (options.reset || false)
                );
            });
            return elements;
        },
        words: function(queryString, options) {
            options = options || {};
            var elements = collectElements(queryString);
            elements.forEach(function(item) {
                injector(
                    item, 
                    ' ', 
                    (options.baseClass || 'line'), 
                    (options.after || ''), 
                    (options.runner || false), 
                    (options.reset || false)
                );
            });
            return elements;
        }
    };
    
    return typesetting;
    
})();