> Op 26 okt. 2017, om 17:27 heeft David Kastrup <d...@gnu.org> het volgende > geschreven: > > Maurits Lamers <maur...@weidestraat.nl <mailto:maur...@weidestraat.nl>> > writes: > >> Hi, >> >> I am writing an extension to lilypond to support generating some basic >> braille inside an includable .ly file. >> I am trying to map the characters of lyric events into a set of braille dots. >> One of the issues I have is that I have trouble finding a way to do >> this with characters which seem to be multi-byte. >> In this case, these character are defined in text mode as >> >> "’s He" >> >> I have tried quite a few ways of simply getting 5 characters, but the >> first one (which I found out through other means) has charcode 8217. >> None of the functions I could find works to get this character as one >> character, as it seems that even integer->char only allows values >> between 0 and 255. > > Characters in Guile 1.8 are bytes. Where it the problem?
I cannot convert a multi-byte character to a symbol, unless I do some very inelegant hacks. > >> I have fiddled with ly:wide-char->utf-8 and ly:encode-string-for-pdf >> but that doesn't bring much either. > > \markup \char #5000 > > And it's not like > > \markup #(ly:wide-char->utf-8 5000) > > wouldn't work. You just have to work with strings instead of characters. It is not a problem on the input side, it is a problem on the processing side. I set up an engraver to listen to lyric events. As the lyrics have to be mapped to braille, I map every character to a specific braille dot pattern. I have to do this in order to support braille embossers, which mostly still are ascii based and are not in agreement on which dot pattern maps to which ascii character. I also want to be able to support unicode. So, every lyric event, I retrieve the text with (ly:event-property event 'text), which then needs to be processed into braille dots, which I achieve by doing (string->list) or could do through (string-ref str pos). This works for almost all situations, except this one. I get a lyric which contains an inverted comma instead of a apostrophe, and literally defined as: "’s He" This inverted comma is a multi-byte character, but I cannot read it as a character, I can only read it as the separate bytes. This is problematic, because as far as I know these characters could have a different meaning by themselves, as they could each can represent a different character. > >> Because of other limitations, it has to be compatible with Lilypond >> 2.14. > > A really bad idea. Couldn't agree more, but at the moment I don't have much choice, and there doesn't seem much benefit in using 2.18 as it seems to suffer from the same problem. > >> I have a big assoc list which contains the mapping, so I would like to >> be able to perform (assoc-ref mymapping (symbol char)) to do the >> lookup >> What would be the best way of achieving this with multi-byte >> characters? > > Use strings. assoc-ref can work with them. This was a very good lead. With great help from the scheme IRC channel, I figured out that having strings as keys works great, and because they suggested (and provided) an UTF8 byte count counter, I was able to implement a simple function which takes as many characters from the string as required to make a proper match to the assoc list. So, problem solved :) cheers Maurits
_______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user