Thanks! Invoking string.find(str,"^"..pre) is certainly much easier. This sort of thing would be a nice general-purpose helper function. Denis Maier and I should have a "wish list" of desired helpers and features (mostly related to bibliographies/publication support) ready for you (and Alan) sometime soon. But for now, it looks like I still need to work out errors that arise when I pass a macro as the "str" input to be searched. I've defined a \loc macro that accepts an assignment and outputs a formatted string, and later, I want to check if this macro (after it has been fully expanded) starts with a certain prefix. A minimal (non-)working example follows: ``` \starttexdefinition loc [#1] \doifassignmentelse{#1} { % if an assignment, then parse and format accordingly \getparameters[loc][#1] % Was a section number specified? \doifdefined{locsec} { § \locsec\btxcomma } } { % otherwise, just print the input as-is #1 } \stoptexdefinition \def\DoIfPrefixElse#1#2{\ctxlua{commands.doifelse(string.find("#2","^".."#1"))}} \def\currentbtxloctext{\loc[sec=31]} \starttext \DoIfPrefixElse{§}{\currentbtxloctext}{YES}{NOP} \stoptext ``` Lua is throwing an "invalid escape sequence near '"\l'" error, which is presumably because the macro \loc[sec=31] is not being expanded. How do I fix this? Thanks! Joey On Fri, Nov 26, 2021 at 3:46 AM Hans Hagen via ntg-context < ntg-context@ntg.nl> wrote: > On 11/26/2021 7:42 AM, Joey McCollum via ntg-context wrote: > > I wasn't aware of a general-purpose "doifstartswith" macro in ConTeXt > > (the \doifnextcharelse macro only works one character at a time, and the > > \doifinstring macros may capture substrings that are not prefixes), and > > I'd like to develop one for something I'm working on. I've been trying > > to do this in Lua, as that seemed like the most natural approach. > > Normally, something like this would work fine as a foundation: > > > > ``` > > function isprefix(prefix, str) > > if string.sub(str, 1, string.len(prefix)) == prefix then > > return true > > end > > return false > > end > > ``` > > how about > > if string.find(str,"^"..prefix) then > > in: > > \starttext > > > \def\DoIfPrefixElse#1#2{\ctxlua{commands.doifelse(string.find("#2","^".."#1"))}} > > \DoIfPrefixElse{pre}{prefix}{YES}{NOP} > \DoIfPrefixElse{pre}{suffix}{YES}{NOP} > > \stoptext > > utf strings are just sequences of bytes so matching works > > when you want to do more in lua you can decide for > > \startluacode > interfaces.implement { > name = "DoIfPrefixElse", > arguments = { "argument", "argument" }, > actions = function(pre,str) > commands.doifelse(string.find(str,"^"..pre)) > end > } > \stopluacode > > \DoIfPrefixElse{pre}{prefix}{YES}{NOP} > \DoIfPrefixElse{pre}{suffix}{YES}{NOP} > > but in any case: make sure that you don't clash with built in ... > > if needed i can make a set of fast(er) ones but someone has to collect a > list of 'handy helpers' first > > Hans > > > ----------------------------------------------------------------- > Hans Hagen | PRAGMA ADE > Ridderstraat 27 | 8061 GH Hasselt | The Netherlands > tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl > ----------------------------------------------------------------- > > ___________________________________________________________________________________ > If your question is of interest to others as well, please add an entry to > the Wiki! > > maillist : ntg-context@ntg.nl / > http://www.ntg.nl/mailman/listinfo/ntg-context > webpage : http://www.pragma-ade.nl / http://context.aanhet.net > archive : https://bitbucket.org/phg/context-mirror/commits/ > wiki : http://contextgarden.net > > ___________________________________________________________________________________ >