summaryrefslogtreecommitdiff
path: root/build-tools/lib/wordwrap
diff options
context:
space:
mode:
Diffstat (limited to 'build-tools/lib/wordwrap')
-rw-r--r--build-tools/lib/wordwrap/LICENSE4
-rw-r--r--build-tools/lib/wordwrap/index.js76
2 files changed, 80 insertions, 0 deletions
diff --git a/build-tools/lib/wordwrap/LICENSE b/build-tools/lib/wordwrap/LICENSE
new file mode 100644
index 00000000..e65c0b24
--- /dev/null
+++ b/build-tools/lib/wordwrap/LICENSE
@@ -0,0 +1,4 @@
+Copyright 2011 James Halliday (mail@substack.net)
+
+This project is free software released under the MIT license:
+http://www.opensource.org/licenses/mit-license.php
diff --git a/build-tools/lib/wordwrap/index.js b/build-tools/lib/wordwrap/index.js
new file mode 100644
index 00000000..c9bc9452
--- /dev/null
+++ b/build-tools/lib/wordwrap/index.js
@@ -0,0 +1,76 @@
+var wordwrap = module.exports = function (start, stop, params) {
+ if (typeof start === 'object') {
+ params = start;
+ start = params.start;
+ stop = params.stop;
+ }
+
+ if (typeof stop === 'object') {
+ params = stop;
+ start = start || params.start;
+ stop = undefined;
+ }
+
+ if (!stop) {
+ stop = start;
+ start = 0;
+ }
+
+ if (!params) params = {};
+ var mode = params.mode || 'soft';
+ var re = mode === 'hard' ? /\b/ : /(\S+\s+)/;
+
+ return function (text) {
+ var chunks = text.toString()
+ .split(re)
+ .reduce(function (acc, x) {
+ if (mode === 'hard') {
+ for (var i = 0; i < x.length; i += stop - start) {
+ acc.push(x.slice(i, i + stop - start));
+ }
+ }
+ else acc.push(x)
+ return acc;
+ }, [])
+ ;
+
+ return chunks.reduce(function (lines, rawChunk) {
+ if (rawChunk === '') return lines;
+
+ var chunk = rawChunk.replace(/\t/g, ' ');
+
+ var i = lines.length - 1;
+ if (lines[i].length + chunk.length > stop) {
+ lines[i] = lines[i].replace(/\s+$/, '');
+
+ chunk.split(/\n/).forEach(function (c) {
+ lines.push(
+ new Array(start + 1).join(' ')
+ + c.replace(/^\s+/, '')
+ );
+ });
+ }
+ else if (chunk.match(/\n/)) {
+ var xs = chunk.split(/\n/);
+ lines[i] += xs.shift();
+ xs.forEach(function (c) {
+ lines.push(
+ new Array(start + 1).join(' ')
+ + c.replace(/^\s+/, '')
+ );
+ });
+ }
+ else {
+ lines[i] += chunk;
+ }
+
+ return lines;
+ }, [ new Array(start + 1).join(' ') ]).join('\n');
+ };
+};
+
+wordwrap.soft = wordwrap;
+
+wordwrap.hard = function (start, stop) {
+ return wordwrap(start, stop, { mode : 'hard' });
+};