Created
August 10, 2012 01:07
-
-
Save billymoon/3309906 to your computer and use it in GitHub Desktop.
Manipulate the content of HTML strings without changing the HTML
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
/** | |
* Manipulate text inside HTML according to passed function | |
* @param html the html string to manipulate | |
* @param manipulator the funciton to manipulate with (will be passed single word) | |
* @returns manipulated string including unmodified HTML | |
* | |
* Currently limited in that manipulator operates on words determined by regex | |
* word boundaries, and must return same length manipulated word | |
* | |
*/ | |
var manipulate = function(html, manipulator) { | |
var block, tag, words, i, | |
final = '', // used to prepare return value | |
tags = [], // used to store tags as they are stripped from the html string | |
x = 0; // used to track the number of characters the html string is reduced by during stripping | |
// remove tags from html string, and use callback to store them with their index | |
// then split by word boundaries to get plain words from original html | |
words = html.replace(/<.+?>/g, function(match, index) { | |
tags.unshift({ | |
match: match, | |
index: index - x | |
}); | |
x += match.length; | |
return ''; | |
}).split(/\b/); | |
// loop through each word and build the final string | |
// appending the word, or manipulated word if not a boundary | |
for (i = 0; i < words.length; i++) { | |
final += i % 2 ? words[i] : manipulator(words[i]); | |
} | |
// loop through each stored tag, and insert into final string | |
for (i = 0; i < tags.length; i++) { | |
final = final.slice(0, tags[i].index) + tags[i].match + final.slice(tags[i].index); | |
} | |
// ready to go! | |
return final; | |
}; | |
/** | |
* Test our function with various input | |
*/ | |
var reverse, rutherford, shuffle, text, titleCase; | |
// set our test html string | |
text = "<h2>Header</h2><p>all the <span class=\"bright\">content</span> here</p>\nQuick<em>Draw</em>McGraw\n<em>going</em><i>home</i>"; | |
// function used to reverse words | |
reverse = function(s) { | |
return s.split('').reverse().join(''); | |
}; | |
// function used by rutherford to return a shuffled array | |
shuffle = function(a) { | |
return a.sort(function() { | |
return Math.round(Math.random()) - 0.5; | |
}); | |
}; | |
// function used to shuffle the middle of words, leaving each end undisturbed | |
rutherford = function(inc) { | |
var m = inc.match(/^(.?)(.*?)(.)$/); | |
return m[1] + shuffle(m[2].split('')).join('') + m[3]; | |
}; | |
// function to make word Title Cased | |
titleCase = function(s) { | |
return s.replace(/./, function(w) { | |
return w.toUpperCase(); | |
}); | |
}; | |
console.log(manipulate(text, reverse)); | |
console.log(manipulate(text, rutherford)); | |
console.log(manipulate(text, titleCase)); |
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
name: Manipulate the content of HTML strings without changing the HTML | |
description: Partial solution to problem posed on Stack Overlflow: http://stackoverflow.com/questions/11884839/manipulate-the-content-of-html-strings-without-changing-the-html | |
authors: | |
- Billy Moon |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment