[JW Lua] FCString:CreateEnigmaStrings doesn't work on long unicode strings, but on short ones

Jan Angermüller jan at angermueller.com
Wed Jul 8 21:23:30 CEST 2015


Jari,

 >Do you get empty string lengths where i.LuaString seems to result in 
empty strings?
No, the string.len() and i:GetLength() results were indeed never wrong, 
it's only the i.LuaString that troubles me.

The i.LuaString is definitely empty when adding 3 or 4 unicode letters, 
although - weird surprise - i:GetLength() returns the correct unicode 
length. If you look at the console output at the very bottom of the 
mail, you see the weird result: Length>2, but no string output, although 
the output is fine with 1 and 2 letters of the same code.

I attached a modified script where I write the LuaString into a new 
FCTextExpressionDef to show that the empty console output is correct and 
not an "invisible" string coding.
When you open the text expression dialog, the third and fourth 
expression are completely empty - just like the printed result from the 
console. I also attached a screenshot of the created text expression 
definitions: instead of 3 or 4 violin clefs in Bravura, the text area is 
empty.

It took me quite some time to track down this pretty weird behaviour, 
when it first came up two months ago. I did a lot of testing and 
combinations of different characters, and I am pretty sure that it is a 
LuaString problem created through CreateEnigmaStrings.
As a workaround I wrote my own CreateEnigmaStrings routine which solved 
the problem, but probably is much slower than your C++ routine and 
definitely not so well tested.

Best regards,
Jan

function CreateNewTextExpression(textvalue)
     local catdef = finale.FCCategoryDef()
     catdef:Load(1)
     local exprdef = finale.FCTextExpressionDef()
     exprdef:SaveNewTextBlock(textvalue)
     textvalue:TrimEnigmaTags()
     exprdef:SetDescription(textvalue)
     exprdef:AssignToCategory(catdef)
     exprdef:SetUseCategoryPos(false)
     exprdef:SetUseCategoryFont(false)
exprdef:SetVerticalAlignmentPoint(finale.ALIGNVERT_ABOVE_STAFF_BASELINE)
     exprdef:SetVerticalBaselineOffset(0)
     exprdef:SetVerticalEntryOffset(0)
exprdef:SetHorizontalAlignmentPoint(finale.ALIGNHORIZ_LEFTOFALLNOTEHEAD)
     exprdef:SetHorizontalJustification(finale.EXPRJUSTIFY_LEFT)
     exprdef:SetHorizontalOffset(0)
     exprdef:SetBreakMMRest(false)
     exprdef:SaveNew()
end

function SplitEnigma(text)
       --Create enigma strings and print all non-enigma commands 
(i.e.all texts)
       print("String to split:",text.LuaString)
       local splittext=text:CreateEnigmaStrings(true)
       for i in each(splittext) do
           if not i:IsEnigmaCommand() then
              print("String:",i.LuaString,i:GetLength())
i.LuaString="^fontMus(Bravura,8192)^size(24)^nfx(0)"..i.LuaString
              CreateNewTextExpression(i)
           end
       end
end

local text=finale.FCString()
text.LuaString="^fontMus(Bravura,8192)^size(24)^nfx(0)"
text:AppendCharacter(0xe050)
SplitEnigma(text)

text.LuaString="^fontMus(Bravura,8192)^size(24)^nfx(0)"
text:AppendCharacter(0xe050)
text:AppendCharacter(0xe050)
SplitEnigma(text)

text.LuaString="^fontMus(Bravura,8192)^size(24)^nfx(0)"
text:AppendCharacter(0xe050)
text:AppendCharacter(0xe050)
text:AppendCharacter(0xe050)
SplitEnigma(text)

text.LuaString="^fontMus(Bravura,8192)^size(24)^nfx(0)"
text:AppendCharacter(0xe050)
text:AppendCharacter(0xe050)
text:AppendCharacter(0xe050)
text:AppendCharacter(0xe050)

SplitEnigma(text)
text.LuaString="^fontMus(Bravura,8192)^size(24)^nfx(0)"
text:AppendCharacter(123)
text:AppendCharacter(123)
text:AppendCharacter(123)
text:AppendCharacter(123)
SplitEnigma(text)

Running [Unnamed Script] ======>
String to split: ^fontMus(Bravura,8192)^size(24)^nfx(0)
String:  1
String to split: ^fontMus(Bravura,8192)^size(24)^nfx(0)
String:  2
String to split: ^fontMus(Bravura,8192)^size(24)^nfx(0)
String:  3 ---!! empty string output, but length returns 3 !!
String to split: ^fontMus(Bravura,8192)^size(24)^nfx(0)
String:  4 ---!! empty string output, but length returns 4 !!
String to split: ^fontMus(Bravura,8192)^size(24)^nfx(0){{{{
String: {{{{ 4
<======= [Unnamed Script] succeeded (Processing time: 0.010 s).
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://jwmusic.nu/pipermail/jwlua_jwmusic.nu/attachments/20150708/2c6705fc/attachment-0002.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: textexpressiondefs created from output.jpg
Type: image/jpeg
Size: 25345 bytes
Desc: not available
URL: <http://jwmusic.nu/pipermail/jwlua_jwmusic.nu/attachments/20150708/2c6705fc/attachment.jpg>


More information about the JWLua mailing list