On 2011-06-25 05:17, Harahune wrote:
After chopping up another Greasemonkey script, I've gotten this far.

var words = {
        "what" : "test",
}

Style note: leave off the comma if it's the last in the object definition -- example:
    var words = {
        "what" : "test",
        "x2": "x3"
    }

var matches=new Array()
var replacements=new Array()

for(var word in words) {
                matches.push(new RegExp("\\b"+word+"\\b", 'gi'));
                replacements.push(words[word]);
}

var texts = document.evaluate(".//text()[normalize-space(.)!
='']",document.body,null,6,null), text="";

Style note: I prefer to use built-in constants for clarity, so the `6` here would become `XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE`, per https://developer.mozilla.org/en/XPathResult#Constants

for(var i=0,l=texts.snapshotLength; (this_text=texts.snapshotItem(i));
i++) {
        if(text=this_text.textContent) {

Style note (this is probably from the script you chopped up, but I wanted to mention it anyway): this `if` is confusing, since it's actually setting `text`, then testing if it was set to something non-null. It's also unnecessary, since the XPath expression already ensures it's non-null. I'd just remove the set statement from the if, and maybe move it into the for expression.

Uh, actually, nvm, this for statement is just too horribly messed up, see later for my reconstruction of it.

                for(var x=0,l=matches.length; x<l; x++) {
                        text = text.replace(matches[x],replacements[x]);
                        this_text.textContent = text;
                }
        }
}

This will replace any instance of the word "what" with "test".
However, there's still a few problems. First, I need the variable
"what" in the "words" array to have multiple values, an array within
an array, something like this.

var words = {
        "what" : ["test", "test2", "test3"]
}

Then I need to be able to call it, rather than using
"replacements[x]", with something like words[x][1] to replace it with
"test" or words[x][2] to replace it with "test2". Lastly, I need to be
able to look at the word BEFORE and AFTER the matching word, with
different cases pulling different values of words[x], for one match to
pull words[x][1] and one to pull words[x][2].

Here's where JS has some features that can help you out a good bit. First off, your redefinition of `var words` will in fact work, syntax-perfect. (Technically, you're defining an array inside a hashtable/object -- the curly braces define an object/hashtable, and the square brackets define an array.) Your indexing is also almost correct, just remember that JS arrays are 0-indexed, so use `replacements["what"][0]` for the first replacement possibility ("test").

Adapting the regex to give you words before and after isn't too hard in this case, since you don't need to worry about overlapping matches (it would be pretty rare for the same word to show up twice in a row, or with only one word in between). Probably use something like `new RegExp("\\b(\\w+)\\s+\\b("+word+")\\b\\s+(\\w+)\\b", 'gi')` -- this captures whatever word is on each side. Then use something like this:

for(var i=0,l=texts.snapshotLength; i < l; i++) {
    text = texts.snapshotItem(i).textContent;
    for(var x=0,ml=matches.length; x < ml; x++) {
        function replacer(str, p1, p2, p3, offset, s) {
var wordType = //... however you'd determine which replacement to use
            return p1 + " " + words[p2][wordType] + " " + p3;
        }
        text = text.replace(matches[x], replacer);
        texts.snapshotItem(i).textContent = text;
    }
}

(Read https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace for more info -- this is an awesome function, let me tell you.)

--
cc | pseudonymous |<http://carlclark.mp/>


--
You received this message because you are subscribed to the Google Groups 
"greasemonkey-users" group.
To post to this group, send email to greasemonkey-users@googlegroups.com.
To unsubscribe from this group, send email to 
greasemonkey-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/greasemonkey-users?hl=en.

Reply via email to