Difference between revisions of "User talk:ANSI Soderstrom/Misc useful functions"
m (→printf: bad habbit) |
Omei Qunhua (talk | contribs) (Alternative version) |
||
Line 30: | Line 30: | ||
return "Error, the insertation list is empty!\n(sentence: " + sentence + ")"; | return "Error, the insertation list is empty!\n(sentence: " + sentence + ")"; | ||
} | } | ||
</lsl> | |||
Soderstrom's function got me thinking, but I find this version more useful. The text to be tailored can contain a number of specifically identified insertion points, the order not being important. Insertion points are identified as %0 to %9. Please don't complain that it'll fail if any insertion text includes a % ... I just won't script that possibility. Similarly I wouldn't script a null insertion list :) [[User:Omei Qunhua|Omei Qunhua]] 06:43, 15 May 2013 (PDT) | |||
<lsl> | |||
string CustomiseText(string sentence, list insertation) | |||
{ | |||
integer i; | |||
integer match; | |||
while ( (match = llSubStringIndex(sentence, "%") ) != -1) | |||
{ | |||
i = (integer) llGetSubString(sentence, match+1, match+1); | |||
sentence = llDeleteSubString(sentence, match, match +1); | |||
sentence = llInsertString(sentence, match, llList2String(insertation, i) ); | |||
} | |||
return sentence; | |||
} | |||
string OwnerName; // script will contain code to populate this | |||
string WelcomeMsg = "Hello %0, welcome to this home owned by %1"; // Typically this text might come from a notecard | |||
CustomiseText(WelcomeMsg, llDetectedName(0), OwnerName); | |||
</lsl> | </lsl> |
Revision as of 06:43, 15 May 2013
printf
Your printf will have a problem if the text being inserted contains "%s". I'd recommend either splitting the input string into a list or copying the output into a new string so that it doesn't get the opportunity to chew on it's own tail. -- Strife (talk|contribs) 12:10, 14 May 2013 (PDT)
<lsl> // modify a string in ANSI-C style // returns a string with all replacements for "modifier".... based on the equivalent positions in the list-content string printf(string sentence, list insertation) {
integer count = llGetListLength(insertation); if(count) { list modifiers = ["%s"]; list split = llParseString2List(sentence, [], modifiers); integer last = llGetListLength(split) - 1; integer i = 0; integer k = -1; do { while(!~llListFindList(modifiers, llList2List(split, ++k, k))) { if(k == last) {//this is an error! return (string)split; } } //string splitter = llList2String(split, k); //if (splitter == "%s") split = llListReplaceList(split, llList2List(split, i, i), k, k); } while(count > ++i); return (string)split; } return "Error, the insertation list is empty!\n(sentence: " + sentence + ")";
} </lsl>
Soderstrom's function got me thinking, but I find this version more useful. The text to be tailored can contain a number of specifically identified insertion points, the order not being important. Insertion points are identified as %0 to %9. Please don't complain that it'll fail if any insertion text includes a % ... I just won't script that possibility. Similarly I wouldn't script a null insertion list :) Omei Qunhua 06:43, 15 May 2013 (PDT)
<lsl> string CustomiseText(string sentence, list insertation) {
integer i; integer match; while ( (match = llSubStringIndex(sentence, "%") ) != -1) { i = (integer) llGetSubString(sentence, match+1, match+1); sentence = llDeleteSubString(sentence, match, match +1); sentence = llInsertString(sentence, match, llList2String(insertation, i) ); } return sentence;
}
string OwnerName; // script will contain code to populate this string WelcomeMsg = "Hello %0, welcome to this home owned by %1"; // Typically this text might come from a notecard
CustomiseText(WelcomeMsg, llDetectedName(0), OwnerName);
</lsl>