[Gambas-user] [gb.eval.highlight] Spaces and syntax highlighting
Adrien Prokopowicz
adrien.prokopowicz at ...626...
Wed Jun 20 01:08:23 CEST 2012
Le dimanche 17 juin 2012 19:59:32 Benoît Minisini a écrit :
> Le 17/06/2012 15:49, Adrien Prokopowicz a écrit :
> > Le dimanche 17 juin 2012 15:38:22 Benoît Minisini a écrit :
> >> Le 12/06/2012 23:52, Adrien Prokopowicz a écrit :
> >>> Hi,
> >>>
> >>> I noticed that the Higlight.Analyze() method doesn't like when the
> >>> Gambas code hasn't spaces between operators, commas and a few other
> >>> ones.
> >>>
> >>> There is a good example of that problem here :
> >>> http://www.gambasforge.org/wiki/testHighlight
> >>>
> >>> Maybe this behaviour is intended, in order to keep Gambas code clean,
> >>> but I
> >>> haven't found any function to add these spaces, like in the IDE.
> >>> Do you know where I can find this ?
> >>>
> >>> Regards,
> >>> Adrien.
> >>
> >> Do you have some code to show? Maybe you don't use the Analyze() method
> >> correctly...
> >
> > Here is the function that makes the conversion Gambas string -> html :
> >
> > Public Sub GambasToHtml(sValue As String) As XmlElement
> >
> > Dim sLignes, s, sCode As String
> > Dim i, nbLignes, lenligne As Integer
> > Dim sTypes As String[] = ["", "normal", "keyword", "function",
> > "operator", "symbol", "number", "string", "comment", "", "",
> > "datatype", "", "", "", "", "error", "help", "preprocessor"] Dim
> > Positions, Types, Lengths As New Integer[]
> > Dim lignes As String[]
> > Dim tableau As New HtmlTable
> > Dim elmt As XmlElement
> > Dim conteneur As New XmlElement("code")
> >
> > If Not sValue Then Return
> > 'sret = "<table class=\"code\"><tr><td class=\"numlignes\">"
> > tableau.ClassName = "code"
> > tableau[0, 0].ClassName = "numlignes"
> > tableau[0, 1].ClassName = "code"
> > tableau[0, 1].AppendChild(conteneur)
> > sValue = Replace$(sValue, "\r\n", "\n") 'Compatibilité win/mac/linux
> > sValue = Trim$(sValue) 'Espaces indésirables
> > lignes = Split(sValue, "\r\n", "", False)
> > For Each s In lignes
> >
> > Highlight.Analyze(s)
> >
> > If Highlight.Positions.Count = 0 Then
> >
> > conteneur.AppendText(s)
> > conteneur.AppendFromText("<br />")
> > 'sCode&= s& "<br />"
> > Inc nbLignes
> > Continue
> >
> > Endif
> > Positions = Highlight.Positions
> > Types = Highlight.Types
> > Lengths.Clear()
> >
> > For i = 0 To Highlight.Symbols.Max
> >
> > Lengths.Push(Len(Highlight.Symbols[i]))
> >
> > Next
> >
> > lenligne = Len(s)
> >
> > For i = 1 To lenligne
> >
> > If Positions.Count<= 0
> >
> > 'sCode&= String.Mid(s, i, 1)
> > conteneur.AppendText(Mid(s, i, 1))
> >
> > Else If i = (Positions[0] + 1)
> >
> > 'sCode&= "<span class=\""& sTypes[Types[0]]& "\">"&
> > String.Mid$(s, Positions[0] + 1, Lengths[0])& "</span>" elmt =
> > New XmlElement("span")
> > elmt.ClassName = sTypes[Types[0]]
> > elmt.TextContent = Mid$(s, Positions[0] + 1, Lengths[0])
> > conteneur.AppendChild(elmt)
> > i += (Lengths[0] - 1)
> > Positions.Extract(0)
> > Lengths.Extract(0)
> > Types.Extract(0)
> >
> > ' Else If Mid$(s, i, 1) = " "
> > ' 'sCode&= " "
> > ' tableau[0, 1].AppendFromText(" ")
> > Else
> >
> > 'sCode&= String.Mid$(s, i, 1)
> > conteneur.AppendText(String.Mid(s, i, 1))
> >
> > Endif
> >
> > Next
> > 'sCode&= "<br />"
> > conteneur.AppendFromText("<br />")
> > Inc nbLignes
> >
> > Next
> >
> > For i = 1 To nbLignes
> >
> > sLignes&= (i& "<br />\n")
> >
> > Next
> >
> > tableau[0, 0].AppendFromText(sLignes)
> >
> > ' sCode = Replace$(sCode, "&","&")
> > ' sCode = Replace$(sCode, "<","<")
> > ' sCode = Replace$(sCode, ">",">")
> > ' sCode = RegexpReplace(sCode, "<(/?(span|br).*)>", "<&1>")
> > ' sCode = Replace$(sCode, " ", " ")
> > ' sRet&= "</td><td class=\"code\">"
> > ' sret&= sCode
> > ' sRet&= "</td></tr></table>"
> > ' Return XmlElement.FromText(sRet)[0]
> > elmt = New XmlElement("div")
> > elmt.ClassName = "code"
> > elmt.AppendChild(tableau)
> > Return elmt
> >
> > End
> >
> >
> > The full code is available here : (svn checkout)
> > https://gambasforge.svn.sourceforge.net/svnroot/gambasforge/trunk
> >
> >
> > Regards,
> > Adrien.
>
> The Positions are relative to the string returned by
> Highlight.TextAfter. In other words, you just have to add a "s =
> Highlight.TextAfter" line just after the Highlight.Analyze call.
>
> Beware that there was a bug: the value returned by Highlight.TextAfter
> was the original string when the Rewrite argument of Highlight.Analyze()
> was FALSE. Use revision #4844 that fixes that bug.
>
> Otherwise, I suggest you set the Rewrite argument.
>
> Regards,
It works with s = Highlight.TextAfter, thanks !
Regards,
Adrien.
More information about the User
mailing list