Community
    • Login

    Trying to create Language for ChordPro Format but I am miserably failing

    Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
    4 Posts 2 Posters 396 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Heinz FaerberH
      Heinz Faerber
      last edited by

      Notepad++ v8.6.2 (64-bit)
      Build time : Jan 14 2024 - 02:16:00
      Path : C:\Program Files\Notepad++\notepad++.exe
      Command Line : “C:\Users\Name\AppData\Roaming\Notepad++\userDefineLang.xml”
      Admin mode : OFF
      Local Conf mode : OFF
      Cloud Config : OFF
      OS Name : Windows 10 Pro (64-bit)
      OS Version : 22H2
      OS Build : 19045.3930
      Current ANSI codepage : 1252
      Plugins :
      mimeTools (3)
      NppConverter (4.5)
      NppExport (0.4)

      ChordPro Format
      Hi
      I am a hobby musician an using Np++ as a text editor to add / place the chords to its appropriate places. While playing around in NP++ I selecting a language I suddenly found some of the lyrics colored. it made me curious if I cold use it to colorize the keywords. So I tried and failed.

      As I am not a Programmer I do not understand the description at
      ivan radic github io udl-documentation except for the Keywords

      Keywords can either have an argument or none like
      {title:Ashes of Love}

      {c:Chorus}

      title: and c: are the Keywords, Ashes of Love and Chorus are arguments

      Start_Of_Chorus here has no argument, but could have

      If a keyword has an argument, there is a separator : between keyword and argument which could be also a number eg. {SOC:2) if the number could be colorized in a different color as text arguments, that would be a bonus.

      [C] represents a Chord to be played

      What I would like to have is:

      Start each keyword with {( in red) followed by the keyword incl. separator :(in blue) argument (in orange) and finally in red a closing }
      Be aware, arguments can be a list of words separated by space, so from the beginning of the argument(s) right after : to the closing } should be in orange

      Exception: if the keyword is c: its argument should be green (because in different languages it’s a comment c: stands for comment.

      Everything within [C] is considered a chord and is always completely in red [C] incl. the bracket.

      It seemed to me that should be easily feasible, but I got nowhere. If you feel you could this easily, I d’ be very grateful.

      Here’s a sample File, extension is .pro

      {title:Ashes of Love}
      {c:Jack Anglin, Jim Anglin, Johnnie Wright}

      {start_of_chorus:2}
      [G]Ashes of love [C]cold [G]as [D]ice
      You made the debt and I’ll pay the [G]price
      [G]Our love is gone [C]there’s [G]no [D]doubt
      Ashes of love, the flames burned [G]out
      {end_of_chorus}

      A [G]love light that gleamed [C]in [G]your [D]eyes
      Has gone out to my sur[G]prise
      [G]We said goodbye and [C]my [G]heart [D]bled
      I can’t revive your love is [G]dead

      {c:Chorus}

      1 Reply Last reply Reply Quote 1
      • Mark OlsonM
        Mark Olson
        last edited by

        @Heinz-Faerber

        So it turns out that the Notepad++ UDL system is not really capable of doing everything you want, specifically coloring the arguments of a {keyword:arguments} differently from the keyword.

        That said, I was able to hack together a lexer that meets some of your requirements. The coloring is shown below, and below that, the XML file generated.

        You can get more advanced syntax coloring with the EnhanceAnyLexer plugin, so if that interests you, let me know.

        67da5fae-fe83-4cae-9b9d-f7868b872efd-image.png

        <NotepadPlus>
            <UserLang name="ChordPro" ext="pro" udlVersion="2.1">
                <Settings>
                    <Global caseIgnored="no" allowFoldOfComments="no" foldCompact="no" forcePureLC="2" decimalSeparator="0" />
                    <Prefix Keywords1="no" Keywords2="no" Keywords3="no" Keywords4="no" Keywords5="no" Keywords6="no" Keywords7="no" Keywords8="no" />
                </Settings>
                <KeywordLists>
                    <Keywords name="Comments">00 01 02 03{c: 04}</Keywords>
                    <Keywords name="Numbers, prefix1"></Keywords>
                    <Keywords name="Numbers, prefix2"></Keywords>
                    <Keywords name="Numbers, extras1"></Keywords>
                    <Keywords name="Numbers, extras2"></Keywords>
                    <Keywords name="Numbers, suffix1"></Keywords>
                    <Keywords name="Numbers, suffix2"></Keywords>
                    <Keywords name="Numbers, range"></Keywords>
                    <Keywords name="Operators1"></Keywords>
                    <Keywords name="Operators2"></Keywords>
                    <Keywords name="Folders in code1, open"></Keywords>
                    <Keywords name="Folders in code1, middle"></Keywords>
                    <Keywords name="Folders in code1, close"></Keywords>
                    <Keywords name="Folders in code2, open"></Keywords>
                    <Keywords name="Folders in code2, middle"></Keywords>
                    <Keywords name="Folders in code2, close"></Keywords>
                    <Keywords name="Folders in comment, open"></Keywords>
                    <Keywords name="Folders in comment, middle"></Keywords>
                    <Keywords name="Folders in comment, close"></Keywords>
                    <Keywords name="Keywords1"></Keywords>
                    <Keywords name="Keywords2"></Keywords>
                    <Keywords name="Keywords3"></Keywords>
                    <Keywords name="Keywords4"></Keywords>
                    <Keywords name="Keywords5"></Keywords>
                    <Keywords name="Keywords6"></Keywords>
                    <Keywords name="Keywords7"></Keywords>
                    <Keywords name="Keywords8"></Keywords>
                    <Keywords name="Delimiters">00[ 01 02] 03{ 04 05} 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23</Keywords>
                </KeywordLists>
                <Styles>
                    <WordsStyle name="DEFAULT" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="COMMENTS" fgColor="2CAF10" bgColor="FFFFFF" fontStyle="3" nesting="0" />
                    <WordsStyle name="LINE COMMENTS" fgColor="EE9B11" bgColor="FFFFFF" fontStyle="1" nesting="0" />
                    <WordsStyle name="NUMBERS" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="KEYWORDS1" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="KEYWORDS2" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="KEYWORDS3" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="KEYWORDS4" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="KEYWORDS5" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="KEYWORDS6" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="KEYWORDS7" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="KEYWORDS8" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="OPERATORS" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="FOLDER IN CODE1" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="FOLDER IN CODE2" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="FOLDER IN COMMENT" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="DELIMITERS1" fgColor="FF0000" bgColor="FFFFFF" fontStyle="1" nesting="0" />
                    <WordsStyle name="DELIMITERS2" fgColor="0000FF" bgColor="FFFFFF" fontStyle="1" nesting="0" />
                    <WordsStyle name="DELIMITERS3" fgColor="000000" bgColor="FFFFFF" fontStyle="1" nesting="0" />
                    <WordsStyle name="DELIMITERS4" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="DELIMITERS5" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="DELIMITERS6" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="DELIMITERS7" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                    <WordsStyle name="DELIMITERS8" fgColor="000000" bgColor="FFFFFF" fontStyle="0" nesting="0" />
                </Styles>
            </UserLang>
        </NotepadPlus>
        

        Let me explain my choices too.

        Coloring the comments ({c:...})
        I went to Comment & Number->Comment style, set the Open to {c: and the Close to }

        • You could also use Delimiters for this.

        If you needed the comments to be only on one line (that is, {c: foo} bar is not a comment but {c: foo} is, you could do the following:

        • Comment & Number->Comment line style
        • use {c: as the Open and } as the Close and leave Continue character blank

        Coloring the chords ([CHORD])

        I went to Operators & Delimiters->Delimiter 1 style, set [ to Open and ] to Close, and set the color to red.

        Coloring the keywords and arguments (all the same color, sorry :c )

        I went to Operators & Delimiters->Delimiter 2 style, set { to Open and } to Close, and set the color to blue.

        1 Reply Last reply Reply Quote 2
        • Mark OlsonM
          Mark Olson
          last edited by

          If you’re still interested, I was able to meet all your requirements by enhancing the UDL above using EnhanceAnyLexer

          The result:

          9273d6e5-b4b1-4116-bb9c-0000a829e777-image.png

          The entry in the EnhanceAnyLexer config file:

          [chordpro]
          ; color each word, 0x66ad1 is the color used, see the description above for more information on the color coding.
          ; start curlybrace of keyword and arguments
          0x0000ff = \{(?=(?!c:)\w+(?::[^}]*)?\})
          ; arguments to a keyword
          0x88888ef = \{\w+(?<!\{c)\K:[^\}]*(?=})
          ; end curlybrace of keyword and arguments
          0x0000ff = \{\w+(?<!\{c)\K(?::[^\}]*)?\K\}
          ; numbers in arguments
          0xcc00dd = :[^\}]*?\K\d+(?=[^\}]*\})
          ; check in the respective styler xml if the following IDs are valid
          excluded_styles = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,20,21,22,23
          

          The keys are BGR colors, so 0x0000ff is pure red, 0x8888ef is orange, and 0xcc00dd is purple.

          See here for an explanation of the regular expressions in the config file. But the key things to understand are:

          • x(?=y) is saying “match x only if it is followed by y, but don’t match the y”
          • \{ and \} match literal { and } because those are special characters in regular expressions
          • [^\}]* matches any number (including zero) of characters other than }.
          • (?<!x)y is saying “match y only it is not directly preceded by x”
          • \K forgets everything that has been matched so far. It is useful here because it allows me to match the keyword (without coloring it the same as the arguments) when determining where the arguments are.
          1 Reply Last reply Reply Quote 3
          • Heinz FaerberH
            Heinz Faerber
            last edited by

            @Mark-Olson said in Trying to create Language for ChordPro Format but I am miserably failing:

            EnhanceAnyLexer

            While reading about UDL I cam across EnhanceAnyLexer so I knew I have to install that plugin :-) Then I copied the Chordpro lexer code into C:\Users\UserName\AppData\Roaming\Notepad++\plugins\config\EnhanceAnyLexer\EnhanceAnyLexerConfig.ini

            Guess what? You’v made my day.

            Everything is working the way I wantet it to be.

            Thank you very much Mark

            1 Reply Last reply Reply Quote 3
            • First post
              Last post
            The Community of users of the Notepad++ text editor.
            Powered by NodeBB | Contributors