MSIL Syntax-Highlighting

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    MSIL Syntax-Highlighting

    Hin und wieder wäre ein Code-Tag für MSIL ganz praktisch. Also ein Code-Tag in dieser Richtung: [code=msil][/code] oder [code=il][/code]
    Ich würde Sagen die Farben in ILSpy sehen gut aus:

    Eventuell könnte eine bestehende Sprache umgebaut werden (vermutlich C#, weils ähnlich ist). Das könnte gerne ich machen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Sofern es ein gute Plugin gint, welches die Anforderungen erfüllt : Daumen hoch!

    Andererseits: Wer würde das verwenden? Wenn ich ein Problem im Code habe, werde ich ganz sicher ned den IL Code posten sondern den originalen C# oder VB.Net Code
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @Radinator
    Beispiele:
    eigenes Programm PW Abfrage einbinden.
    C# vs VB.NET
    Extensions in VB-Modulen in Intellisense "verstecken"
    Wenn man z.B. zur Laufzeit Code generiert kann es auch hilfreich sein.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Schadet doch nichts und MSIL ist nun mal ein wichtiger Bestandteil des .Net Frameworks, natürlich wird das keine riesige Verwendung finden, aber letztendlich werden dadurch die unterstützt, die eine Menge wissen und dieses Wissen gerne teilen möchten (Syntax Hightlighting vereinfacht nun mal das Lesen auch für die, die sich damit nicht so gut auskennen).
    Mfg
    Vincent

    Wäre es eventuell möglich, den Namen und das Syntax-Highlighting von Code-Blöcken selbst anzugeben?
    Also sowas zum Beispiel:
    [code=cs,name=MSIL].method public static Foo() { }[/code]
    Das würde dann einen Code-Block rendern, bei dem das Syntax-Highlighting von C# verwendet wird, wo aber oben trotzdem "MSIL-Code" steht. Also so:

    Das hätte den Vorteil, dass man Code-Blöcke mit Sprachen, für die es eigentlich kein Syntax-Highlighting gibt, trotzdem korrekt beschriften kann (um Verwirrung zu vermeiden) und trotzdem zumindest irgendein Syntax-Highlighting verwenden kann.
    Ich kenne mich mit WBB nicht gut aus und weiß nicht, wie kompliziert das wäre.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Geht so ähnlich, wie wir neuerdings wissen: Listings durchnumerieren

    Ich kann die C#-PHP-Klasse gerne hier anhängen, falls das jemand an MSIL anpassen möchte (und kann).
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Ok, ich habe jetzt die Keywords eingefügt, die auch in ILSpy verwendet werden.

    Bei $keywords5 bin ich mir nicht sicher. Ich habs mal drin gelassen, weil es vielleicht gut aussieht, aber vermutlich kann der Teil gelöscht werden.
    Die Farben sollten inetwa folgende sein (kann natürlich gerne angepasst werden):
    $keywords1: #0000FF
    $keywords2: #008000
    $keywords3: #008000
    $keywords4: #0000FF
    Kommentare auch in #008000.

    Den Copyright-Teil oben hab ich auch nicht verändert. Ich bin mir da nämlich nicht ganz sicher.
    Dateien
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Poste doch bitte noch ein paar Quellcodes, mit denen ich das testen kann. Dann kann ich Screenshots hier anhängen und du kannst dann sehen, ob's korrekt ist.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Gerne.
    Spoiler anzeigen

    Quellcode

    1. .assembly Mono.Cecil
    2. {
    3. .custom instance void [System.Core]System.Runtime.CompilerServices.ExtensionAttribute::.ctor() = (
    4. 01 00 00 00
    5. )
    6. .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = (
    7. 01 00 08 00 00 00 00 00
    8. )
    9. .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = (
    10. 01 00 01 00 54 02 16 57 72 61 70 4e 6f 6e 45 78
    11. 63 65 70 74 69 6f 6e 54 68 72 6f 77 73 01
    12. )
    13. .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = (
    14. 01 00 02 00 00 00 00 00
    15. )
    16. .custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = (
    17. 01 00 0a 4d 6f 6e 6f 2e 43 65 63 69 6c 00 00
    18. )
    19. .custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = (
    20. 01 00 0a 4d 6f 6e 6f 2e 43 65 63 69 6c 00 00
    21. )
    22. .custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = (
    23. 01 00 21 43 6f 70 79 72 69 67 68 74 20 c2 a9 20
    24. 32 30 30 38 20 2d 20 32 30 31 31 20 4a 62 20 45
    25. 76 61 69 6e 00 00
    26. )
    27. .hash algorithm 0x00008004 // SHA1
    28. .ver 0:9:5:0
    29. }
    30. .module Mono.Cecil.dll
    31. // MVID: {8C6F4279-D85A-4F17-96CE-5D665861CA0F}
    32. .corflags 0x00000009 // ILOnly, StrongNameSigned
    33. .class public auto ansi sealed beforefieldinit Mono.Cecil.AssemblyDefinition
    34. extends [mscorlib]System.Object
    35. implements Mono.Cecil.ICustomAttributeProvider,
    36. Mono.Cecil.IMetadataTokenProvider,
    37. Mono.Cecil.ISecurityDeclarationProvider
    38. {
    39. .field private class Mono.Cecil.AssemblyNameDefinition name
    40. .field assembly class Mono.Cecil.ModuleDefinition main_module
    41. .field private class Mono.Collections.Generic.Collection`1<class Mono.Cecil.ModuleDefinition> modules
    42. .field private class Mono.Collections.Generic.Collection`1<class Mono.Cecil.CustomAttribute> custom_attributes
    43. .field private class Mono.Collections.Generic.Collection`1<class Mono.Cecil.SecurityDeclaration> security_declarations
    44. .method assembly hidebysig specialname rtspecialname
    45. instance void .ctor () cil managed
    46. {
    47. // Method begins at RVA 0x4287
    48. // Code size 7 (0x7)
    49. .maxstack 8
    50. IL_0000: ldarg.0
    51. IL_0001: call instance void [mscorlib]System.Object::.ctor()
    52. IL_0006: ret
    53. } // end of method AssemblyDefinition::.ctor
    54. .property instance class Mono.Cecil.AssemblyNameDefinition Name()
    55. {
    56. .get instance class Mono.Cecil.AssemblyNameDefinition Mono.Cecil.AssemblyDefinition::get_Name()
    57. .set instance void Mono.Cecil.AssemblyDefinition::set_Name(class Mono.Cecil.AssemblyNameDefinition)
    58. }
    59. .method public hidebysig specialname
    60. instance class Mono.Cecil.AssemblyNameDefinition get_Name () cil managed
    61. {
    62. // Method begins at RVA 0x412f
    63. // Code size 7 (0x7)
    64. .maxstack 8
    65. IL_0000: ldarg.0
    66. IL_0001: ldfld class Mono.Cecil.AssemblyNameDefinition Mono.Cecil.AssemblyDefinition::name
    67. IL_0006: ret
    68. } // end of method AssemblyDefinition::get_Name
    69. .method public hidebysig specialname
    70. instance void set_Name (
    71. class Mono.Cecil.AssemblyNameDefinition 'value'
    72. ) cil managed
    73. {
    74. // Method begins at RVA 0x4137
    75. // Code size 8 (0x8)
    76. .maxstack 8
    77. IL_0000: ldarg.0
    78. IL_0001: ldarg.1
    79. IL_0002: stfld class Mono.Cecil.AssemblyNameDefinition Mono.Cecil.AssemblyDefinition::name
    80. IL_0007: ret
    81. } // end of method AssemblyDefinition::set_Name
    82. } // end of class Mono.Cecil.AssemblyDefinition

    Quellcode

    1. .method public hidebysig
    2. instance void Write (
    3. string fileName,
    4. class Mono.Cecil.WriterParameters parameters
    5. ) cil managed
    6. {
    7. // Method begins at RVA 0x13c54
    8. // Code size 31 (0x1f)
    9. .maxstack 4
    10. .locals init (
    11. [0] class [mscorlib]System.IO.Stream
    12. )
    13. IL_0000: ldarg.1
    14. IL_0001: ldc.i4.2
    15. IL_0002: ldc.i4.3
    16. IL_0003: ldc.i4.0
    17. IL_0004: call class [mscorlib]System.IO.Stream Mono.Cecil.ModuleDefinition::GetFileStream(string, valuetype [mscorlib]System.IO.FileMode, valuetype [mscorlib]System.IO.FileAccess, valuetype [mscorlib]System.IO.FileShare)
    18. IL_0009: stloc.0
    19. .try
    20. {
    21. IL_000a: ldarg.0
    22. IL_000b: ldloc.0
    23. IL_000c: ldarg.2
    24. IL_000d: call instance void Mono.Cecil.ModuleDefinition::Write(class [mscorlib]System.IO.Stream, class Mono.Cecil.WriterParameters)
    25. IL_0012: leave.s IL_001e
    26. } // end .try
    27. finally
    28. {
    29. IL_0014: ldloc.0
    30. IL_0015: brfalse.s IL_001d
    31. IL_0017: ldloc.0
    32. IL_0018: callvirt instance void [mscorlib]System.IDisposable::Dispose()
    33. IL_001d: endfinally
    34. } // end handler
    35. IL_001e: ret
    36. } // end of method ModuleDefinition::Write

    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    So sähe es aus:
    Bilder
    • code1a.gif

      111,15 kB, 1.173×916, 189 mal angesehen
    • code1b.gif

      77,23 kB, 813×903, 200 mal angesehen
    • code2.gif

      76,04 kB, 1.336×803, 228 mal angesehen
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Sieht gut aus.
    Ist es eventuell möglich, Zahlen mit Ziffern von a bis f auch als Zahlen zu highlighten?
    Interessanterweise funktioniert .custom, aber z.B. .module nicht, obwohl beide unter $keywords3 gelistet sind.
    Ich denke, $keywords5 sollte entfernt werden (bzw. ein leeres Array). Das sieht meiner Meinung nach nicht wirklich gut aus, wenn nur sporadisch Dinge rot sind.
    Ansonsten Daumen hoch.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Ist es eventuell möglich, Zahlen mit Ziffern von a bis f auch als Zahlen zu highlighten?

    Ich wüsste nicht wie.

    Niko Ortner schrieb:

    aber z.B. .module nicht,

    Liegt evtl. daran, dass module in $keywords1 auftaucht.

    Niko Ortner schrieb:

    Ich denke, $keywords5 sollte entfernt werden (bzw. ein leeres Array)

    Habe das Array nun geleert und System ist dann nicht mehr rot. Nur der String 'value' ist rot.

    Hier ist übrigens die Highlighter-Datei, auf welche die MsilHighlighter.class.php aufsetzt: github.com/WoltLab/WCF/blob/2.…ter/Highlighter.class.php

    Vielleicht kann man da noch Optimierungsmöglichkeiten für die MsilHighlighter.class.php finden.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Bezüglich a bis f highlighten:
    In der Highlighter-Klasse gibt's diese Methode:

    PHP-Quellcode

    1. protected function highlightNumbers($string) {
    2. $string = preg_replace('!(?<='.$this->separatorsRegEx.')(-?\d+)(?='.$this->separatorsRegEx.')!i', '<span class="hlNumbers">\\0</span>', $string);
    3. return $string;
    4. }

    Ich denke, man müsste die einfach in der MsilHighlighter-Klasse überschreiben und da die richtigen Zeichen hinzufügen:

    PHP-Quellcode

    1. @Override
    2. protected function highlightNumbers($string) {
    3. $string = preg_replace('!(?<='.$this->separatorsRegEx.')(-?[\da-fA-F]+)(?='.$this->separatorsRegEx.')!i', '<span class="hlNumbers">\\0</span>', $string);
    4. return $string;
    5. }

    Der Unterschied: in der Mitte wird aus \d [\da-fA-F]. Eventuell ist es nicht nötig, A-F (in groß) nochmal anzugeben, aber schaden kanns nicht.

    Liegt evtl. daran, dass module in $keywords1 auftaucht

    Sicher? Bei mir gibts das nur unter $keywords3 (als '.module'):


    Dass das 'value' rot ist könnte an den Strings liegen. Ich finde das passt schon so, dann sind lokale Variablen auch markiert. Zum Testen eine Methode mit mehr lokalen Variablen und String-Literalen:

    Quellcode

    1. .method public static int32 Main (string[] Args) cil managed
    2. {
    3. .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = (01 00 00 00)
    4. // Method begins at RVA 0x231c
    5. // Code size 69 (0x45)
    6. .maxstack 3
    7. .entrypoint
    8. .locals init (
    9. [0] int32 Main,
    10. [1] int32 Variable1,
    11. [2] string Variable2,
    12. [3] string i,
    13. [4] int32 VB$t_i4$L0,
    14. [5] string[] VB$t_array$L0
    15. )
    16. IL_0000: ldc.i4.0
    17. IL_0001: stloc.1
    18. IL_0002: ldstr ""
    19. IL_0007: stloc.2
    20. IL_0008: ldarg.0
    21. IL_0009: stloc.s VB$t_array$L0
    22. IL_000b: ldc.i4.0
    23. IL_000c: stloc.s VB$t_i4$L0
    24. IL_000e: br.s IL_0034
    25. // loop start (head: IL_0034)
    26. IL_0010: ldloc.s VB$t_array$L0
    27. IL_0012: ldloc.s VB$t_i4$L0
    28. IL_0014: ldelem.ref
    29. IL_0015: stloc.3
    30. IL_0016: ldloc.1
    31. IL_0017: ldc.i4.s 10
    32. IL_0019: add.ovf
    33. IL_001a: stloc.1
    34. IL_001b: ldloca.s Variable1
    35. IL_001d: call instance string [mscorlib]System.Int32::ToString()
    36. IL_0022: ldstr "StringLiteral"
    37. IL_0027: ldloc.2
    38. IL_0028: call string [mscorlib]System.String::Concat(string, string, string)
    39. IL_002d: stloc.2
    40. IL_002e: ldloc.s VB$t_i4$L0
    41. IL_0030: ldc.i4.1
    42. IL_0031: add.ovf
    43. IL_0032: stloc.s VB$t_i4$L0
    44. IL_0034: ldloc.s VB$t_i4$L0
    45. IL_0036: ldloc.s VB$t_array$L0
    46. IL_0038: ldlen
    47. IL_0039: conv.ovf.i4
    48. IL_003a: blt.s IL_0010
    49. // end loop
    50. IL_003c: ldloc.1
    51. IL_003d: ldloc.2
    52. IL_003e: callvirt instance int32 [mscorlib]System.String::get_Length()
    53. IL_0043: mul.ovf
    54. IL_0044: ret
    55. } // end of method Program::Main
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Ich denke, man müsste die einfach in der MsilHighlighter-Klasse überschreiben und da die richtigen Zeichen hinzufügen:

    Werde ich testen.

    Niko Ortner schrieb:

    Sicher? Bei mir gibts das nur unter $keywords3 (als '.module'):

    Aber es gibt dort module, also ohne Punkt. Ist für den Highlighter offenbar dasselbe.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Marcus Gräfe schrieb:

    Aber es gibt dort module, also ohne Punkt. Ist für den Highlighter offenbar dasselbe.

    Deshalb hab ich den Screenshot angehängt. module (ohne Punkt) wurde nur 1 Mal gefunden, und zwar unter $keywords3. Wenn unter $keywords1 nochmal module stehen würde, dann müsste es dort auch nochmal gefunden werden. Das würde dann so aussehen:

    Ich hab auch nochmal die in Post #11 angehängte Datei heruntergeladen und durchsucht. Auch nur 1 Mal gefunden.
    Deshalb hab ich jetzt die PHP-Datei nochmal angehängt. $keywords5 ist bereits geleert und die highlightNumbers-Methode ist auch überschrieben.
    Dateien
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Du hast recht, "module" taucht tatsächlich nur einmal auf. Ich weiß nicht, wie ich darauf gekommen bin, dass das zwei Mal drin steht. Was mir aber auffällt: assembly und custom tauchen jeweils mit und ohne Punkt auf und werden korrekt gefärbt. Darf der Punkt vielleicht nicht sein, weil dadurch ein regulärer Ausdruck entsteht?

    EDIT: Es kommt übrigens folgende Fehlermeldung:

    Quellcode

    1. Fatal error: Namespace declaration statement has to be the very first statement in the script in \wcf\lib\system\bbcode\highlighter\MsilHighlighter.class.php on line 2

    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum