UserScript • PB-SyntaxHighlighting für Codes im Forum

Fragen und Anregungen zum Forum.
Beiträge die Community betreffend
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: UserScript • PB-SyntaxHighlighting für Codes im Forum

Beitrag von STARGÅTE »

Mit dem neuen Forum-Update / Design möchte ich euch hiermit auch eine neue Version des User Scripts für das Forum-Syntax-Highlighting zur Verfügung stellen. Installieren oder einrichten könnt ihr User Scrips z.B. mit Tampermonkey.
Ja ich weiß, dass es wohl Probleme mit FireFox und GreaseMonkey geben kann, weil es dort kein "lookbehind" gibt. Allerdings komme ich da nicht drum herum. Ich bitte dies zu entschuldigen, vielleicht ändert sich das ja irgendwann mal.

Das eigentliche Java Script gibt es hier:

Code: Alles auswählen

// ==UserScript==
// @namespace     STARGÅTE
// @name          Pure Basic Syntax Highlighting
// @description   Pure Basic Syntax Highlighting (V 2.0.2) (20. May 2021)
// @include       https://purebasic.com/german/*
// @include       https://purebasic.fr/german/*
// @include       https://purebasic.fr/english/*
// @include       https://purebasic.fr/french/*
// @include       https://www.purebasic.com/german/*
// @include       https://www.purebasic.fr/german/*
// @include       https://www.purebasic.fr/english/*
// @include       https://www.purebasic.fr/french/*
// @include       https://forums.purebasic.com/german/*
// @include       https://forums.purebasic.com/english/*
// @include       https://forums.purebasic.fr/german/*
// @include       https://forums.purebasic.fr/english/*
// @include       https://forums.purebasic.fr/french/*
// ==/UserScript==



//--------------------------------------------
// Version 2.0.1 (17. Apr 2021)
//--------------------------------------------



// Farbdefinition für das Syntax Highlighting
// color definition for the syntax highlighting
//===================================================

var PBSH_Highlight = new Object();

// ==PureBasicPreference==

PBSH_Highlight.EnableKeywordBolding = 1;
PBSH_Highlight.TabLength = 2;
PBSH_Highlight.CustomKeywords = 'CompilerCase|CompilerDefault|CompilerElse|CompilerElseIf|CompilerEndIf|CompilerEndSelect|CompilerError|CompilerFor|CompilerIf|CompilerNext|CompilerSelect';
PBSH_Highlight.EditorFontName = 'Consolas';
PBSH_Highlight.EditorFontSize = '10';
PBSH_Highlight.EditorFontStyle = '';
PBSH_Highlight.BackgroundColor = '#101010';
PBSH_Highlight.NormalTextColor = '#A0A0A0';
PBSH_Highlight.BasicKeywordColor = '#5090D0';
PBSH_Highlight.CommentColor = '#C04040';
PBSH_Highlight.ConstantColor = '#FFD000';
PBSH_Highlight.StringColor = '#FFFFFF';
PBSH_Highlight.PureKeywordColor = '#80C040';
PBSH_Highlight.ASMKeywordColor = '#A0A040';
//PBSH_Highlight.PointerColor = '#ADE4B5';
PBSH_Highlight.NumberColor = '#C0C0C0';
//PBSH_Highlight.StructureColor = '#006090';
PBSH_Highlight.LabelColor = '#C080FF';
PBSH_Highlight.ModuleColor = '#208000';
PBSH_Highlight.OperatorColor = '#FFFFFF';
//PBSH_Highlight.SeparatorColor = '#FFFFFF';
PBSH_Highlight.CustomKeywordColor = '#3060E0';

// ==/PureBasicPreference==

//===================================================





// UserScript für die Syntaxhervorhebung
// user script for syntax highlighting
//===================================================

// Regulärer Ausdruck für das SyntaxHighlighting
// regular expressions for the syntax lighting
if (PBSH_Highlight.CustomKeywords == '') PBSH_Highlight.CustomKeywords = 'NoCustomKeywordsDefined';
var PBSH_Syntax = new RegExp(
    /*Comment*/       '(;.*$)|' +
    /*Constant*/      '(\\#\\w*\\$?|\'.*?(?:\'|$))|' +
    /*String*/        '(~"(?:\\\\.|[^\\\\])*?(?:"|$)|"[^"]*?(?:"|$))|' +
    /*CustomKeyword*/ '((?:^[ \\t]+|\\b)(?:'+PBSH_Highlight.CustomKeywords+')\\b)|' +
    /*Keyword*/       '((?:^[ \\t]+|\\b)(?:And|Array|As|Break|CallDebugger|Case|CompilerCase|CompilerDefault|CompilerElse|CompilerElseIf|CompilerEndIf|CompilerEndSelect|CompilerError|CompilerIf|CompilerSelect|CompilerWarning|Continue|Data|DataSection|EndDataSection|Debug|DebugLevel|Declare|DeclareC|DeclareCDLL|DeclareDLL|DeclareModule|EndDeclareModule|Default|Define|Dim|DisableASM|DisableDebugger|DisableExplicit|Else|ElseIf|EnableASM|EnableDebugger|EnableExplicit|End|Enumeration|EnumerationBinary|EndEnumeration|FakeReturn|For|ForEach|ForEver|Global|Gosub|Goto|If|EndIf|Import|EndImport|ImportC|IncludeBinary|IncludeFile|IncludePath|Interface|EndInterface|List|Macro|EndMacro|MacroExpandedCount|Map|Module|EndModule|NewList|NewMap|Next|Not|Or|Procedure|EndProcedure|ProcedureC|ProcedureCDLL|ProcedureDLL|ProcedureReturn|Protected|Prototype|PrototypeC|Read|ReDim|Repeat|Restore|Return|Runtime|Select|EndSelect|Shared|Static|Step|Structure|EndStructure|StructureUnion|EndStructureUnion|Swap|Threaded|To|UndefineMacro|Until|UseModule|UnuseModule|Wend|While|With|EndWith|XIncludeFile|XOr)\\b|\\b[ \\t]+(?:Align|Extends)\\b)|' +
    /*Structure*/     '((?<=\\.)[ \\t]*(?:[^\\Wabcdfilqsuw](?=\\b)|\\w\\w+)|(?<=\\\\)\\w+\\$?[ \\t]*(?![\\w\\( \\t]))|' +
    /*Function*/      '(\\w+\\$?(?=(?:[ \\t]*\\.[ \\t]*\\w+[ \\t]*|[ \\t]*)\\())|' +
    /*ASM*/           '(^[ \\t]*!.*?(?:$|(?=(?<!&gt|&lt|&amp);)))|' +
    /*Pointer*/       '(\\@\\*?[\\w\\$]*|(?:(?<![ \\t\\w$)}\\]])|(?<=\\5))[ \\t]*\\*[\\w\\$]+|\\?\\w*)|' +
    /*Number*/        '((?:\\b\\d+\\.?\\d*(?:e[+\\-]?\\d+)?|\\$[\\dabcdef]+|\\%[01]+))|' +
    /*Module*/        '(\\w+(?=[ \\t]*::))|' +
    /*Label*/         '(^[ \\t]*\\w+\\$?[ \\t]*:(?!:))|' +
    /*Operator*/      '((?:[+*/\\-|!%=~]|::|&gt;|&lt;|&amp;)+)|' +
    /*Seperator*/     '([()\\[\\]\\\\,.:])',
    'gim');

// Hervorheben einer Zeichenkette
// highlighting a string
function PBSH_Highlighting(str, key)
{
    if (PBSH_Highlight[key])
        return '<font color="'+PBSH_Highlight[key]+'">'+str+'</font>';
    else
        return str;
}
function PBSH_Highlighting_Keyword(str, key)
{
    if (PBSH_Highlight[key])
    {
        if (PBSH_Highlight.EnableKeywordBolding)
            return '<font color="'+PBSH_Highlight[key]+'"><b>'+str+'</b></font>';
        else
            return '<font color="'+PBSH_Highlight[key]+'">'+str+'</font>';
    }
    else
        if (PBSH_Highlight.EnableKeywordBolding)
            return '<b>'+str+'</b>';
    else
        return str;
}

// Ersetzen einer Zeichenkette
// replace a string
function PBSH_Replace(str, isComment, isConstant, isString, isCustomKeyword, isKeyword, isStructure, isFunction, isASM, isPointer, isNumber, isModule, isLabel, isOperator, isSeparator)
{
    if (isCustomKeyword)  return PBSH_Highlighting_Keyword(isCustomKeyword, 'CustomKeywordColor');
    else if (isKeyword)   return PBSH_Highlighting_Keyword(isKeyword, 'BasicKeywordColor');
    else if (isComment)   return PBSH_Highlighting(isComment, 'CommentColor');
    else if (isConstant)  return PBSH_Highlighting(isConstant, 'ConstantColor');
    else if (isString)    return PBSH_Highlighting(isString, 'StringColor');
    else if (isFunction)  return PBSH_Highlighting(isFunction, 'PureKeywordColor');
    else if (isASM)       return PBSH_Highlighting(isASM, 'ASMKeywordColor');
    else if (isPointer)   return PBSH_Highlighting(isPointer, 'PointerColor');
    else if (isNumber)    return PBSH_Highlighting(isNumber, 'NumberColor');
    else if (isStructure) return PBSH_Highlighting(isStructure, 'StructureColor');
    else if (isModule)    return PBSH_Highlighting(isModule, 'ModuleColor');
    else if (isLabel)     return PBSH_Highlighting(isLabel, 'LabelColor');
    else if (isOperator)  return PBSH_Highlighting(isOperator, 'OperatorColor');
    else if (isSeparator) return PBSH_Highlighting(isSeparator, 'SeparatorColor');
}

// Durchführen der Syntaxhervorhebung
// perform the syntax highlighting
function PureBasicSyntaxHighlighting()
{
    // Anwenden der Syntaxhervorhebung auf alle <code>-Elemente
    // apply the syntax highlighting on all the <code>-elements
    var allMyDivs = document.getElementsByTagName('code');
    for(var i = 0; i < allMyDivs.length; i++)
    {
        if (PBSH_Highlight.EditorFontName)
            allMyDivs[i].style.font = PBSH_Highlight.EditorFontStyle + " " + PBSH_Highlight.EditorFontSize + "pt " + PBSH_Highlight.EditorFontName;
        if (PBSH_Highlight.BackgroundColor)
            allMyDivs[i].style.backgroundColor = PBSH_Highlight.BackgroundColor;
        if (PBSH_Highlight.NormalTextColor)
            allMyDivs[i].style.color           = PBSH_Highlight.NormalTextColor;
        allMyDivs[i].style.tabSize = PBSH_Highlight.TabLength;
        var code = ''+allMyDivs[i].innerHTML+'';
        code = code.replace(/<br>/gi, '\r\n');
        //code = code.replace(/&nbsp;/gi, '\t');
        code = code.replace(/<\/?[^<>]*>/gi, '');
        code = code.replace(PBSH_Syntax, PBSH_Replace);
        //code = code.replace(/\t/gi, '&nbsp;');
        //code = code.replace(/\r\n/gi, '<br>');
        allMyDivs[i].innerHTML = code;
    }
}

PureBasicSyntaxHighlighting();

//===================================================
Damit jeder sein eigenes gewohntes Theme aus PureBasic nutzen kann, könnt ihr dieses Code in PureBasic ausführen und die Debuggerausgabe in den Bereich oben bei ==PureBasicPreference== einfügen. Es enthält die Editoreinstellungen wie Farben, Tab-Länge und CustomKeywords:

Code: Alles auswählen

EnableExplicit

Procedure.s HTMLColor(Color)
	ProcedureReturn "#"+RSet(Hex(Red(Color)),2,"0")+RSet(Hex(Green(Color)),2,"0")+RSet(Hex(Blue(Color)),2,"0")
EndProcedure

Procedure Export(PreferencesFileName.s)
	Protected Keyword.s, String.s, CustomKeywords.s
	If OpenPreferences(PreferencesFileName)
		PreferenceGroup("Global")
		Debug "PBSH_Highlight.EnableKeywordBolding = "+ReadPreferenceString("EnableKeywordBolding", "1")+";"
		Debug "PBSH_Highlight.TabLength = "+ReadPreferenceString("TabLength", "2")+";"
		PreferenceGroup("CustomKeywords")
		If ExaminePreferenceKeys()
			While NextPreferenceKey() 
				If Left(PreferenceKeyName(), 1) = "W"
					If CustomKeywords : CustomKeywords + "|" : EndIf
					CustomKeywords + PreferenceKeyValue()  
				EndIf
			Wend
		EndIf
		Debug "PBSH_Highlight.CustomKeywords = '"+CustomKeywords+"';"
		PreferenceGroup("Editor")
		Restore PreferenceKeys
		Repeat
			Read.s Keyword
			If Keyword
				String = ReplaceString(ReadPreferenceString(Keyword, ""), ",", " ")
				If Right(Keyword, 5) = "Color" : String = HTMLColor(Val(String)) : EndIf
				If ReadPreferenceInteger(Keyword+"_Disabled", 0)
					Debug "//PBSH_Highlight."+Keyword+" = '"+String+"';"
				Else
					Debug "PBSH_Highlight."+Keyword+" = '"+String+"';"
				EndIf
			EndIf  
		Until Keyword = ""
		ProcedureReturn #True
	EndIf
EndProcedure

Define PreferencesFileName.s

If Not Export(GetUserDirectory(#PB_Directory_ProgramData)+"PureBasic\PureBasic.prefs")
	PreferencesFileName = OpenFileRequester("Preference File", GetHomeDirectory(), "PureBasic.prefs", 0)
	Export(PreferencesFileName)
EndIf

DataSection
	PreferenceKeys:
	Data.s "EditorFontName", "EditorFontSize", "EditorFontStyle", "BackgroundColor", "NormalTextColor"
	Data.s "BasicKeywordColor", "CommentColor", "ConstantColor", "StringColor", "PureKeywordColor"
	Data.s "ASMKeywordColor", "PointerColor", "NumberColor", "StructureColor", "LabelColor", "ModuleColor"
	Data.s "OperatorColor", "SeparatorColor", "CustomKeywordColor", ""
EndDataSection
Sieht dann z.B. so aus:
Bild
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: UserScript • PB-SyntaxHighlighting für Codes im Forum

Beitrag von Bisonte »

Ich nutze das Dark Theme vom Forum und das Script hat wunderbar funktioniert.
Allerdings seitdem Fred da eine Änderung an der Codeansicht vorgenommen hat, funktioniert das Script nicht mehr (Firefox&GreaseMonkey).
Hast du zufälligerweise eine Lösung dafür, damit es wieder läuft ?

Edit: Weder im deutschen noch im englischen Forum zeigt es den Code wie vorher. Die Schrift in der Codeansicht ist komplett - grün im dt. Forum / - weiss im engl. Forum), egal wie der Source aussieht...
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: UserScript • PB-SyntaxHighlighting für Codes im Forum

Beitrag von STARGÅTE »

Hm, also bei mir funktioniert das Script weiterhin, sowohl hier, als auch im englischen Forum.
Hier im deutschen Forum wurde der neue Code-Tag auch noch gar nicht eingebunden.
Im englischen Forum läuft mein Script (welches ich bei mir mit Tampermonkey eingebunden habe) soweit ich das erkennen kann, genau nach dem Script vom Forum selbst, und färbt praktisch wieder um wobei dieser "copy"-Button erhalten bleibt.

Allerdings muss ich bei Firefox auch immer an diese Meldung denken:
STARGÅTE hat geschrieben: 11.08.2019 21:12
(?<=) Warning: The "positive lookbehind" feature may not be supported in all browsers.
(?<!) Warning: The "negative lookbehind" feature may not be supported in all browsers.
Jetzt ist mir auch klar, warum ich damals (vor 10 Jahren) so viel tricksen musste, was ich in der neuen Version wieder rausgeworfen hatte, weil ich es als umständlich einstufte^^

Hm muss ich mir noch mal angucken.
Deswegen gehts auch nicht bei Bisonte ...
Aktuell nutze ich wieder die "lookbehind" sachen im Regex, weil ich einfach keine andere (einfache) Möglichkeit sehe, den Regex sonst auszudrücken. Wenn du eine ältere Version des Scripts nutzt, kannst du mir mal dein Code posten, dann checke ich, was sich geändert hat, damit er die Code-Tags wieder findet.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: UserScript • PB-SyntaxHighlighting für Codes im Forum

Beitrag von Bisonte »

mist, den hab ich natürlich mit deinem neuen schon überschrieben
Aber selbst wenn ich das Script von dieser Seite mit Tampermonkey und FF nutze zeigt es keine anderen Farben an....
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: UserScript • PB-SyntaxHighlighting für Codes im Forum

Beitrag von HeX0R »

Das sieht nun hier tatsächlich ziemlich übel aus:
Bild

Allerdings nur im englischen Forum mit den neuen Tags, hier ist alles wie gehabt
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: UserScript • PB-SyntaxHighlighting für Codes im Forum

Beitrag von STARGÅTE »

Habe im englischen Forum schon ein Update gemacht, um den Schatten und den gelben Rahmen zu löschen:

https://www.purebasic.fr/english/viewto ... 04#p571104
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: UserScript • PB-SyntaxHighlighting für Codes im Forum

Beitrag von HeX0R »

Ähm... o.k., das ist der Grund, wieso ich Code-Spreading überhaupt nicht leiden kann.

Jetzt sieht es zwar nicht mehr so glossy aus, dafür ist alles grün, wie bei Bisonte.
Bild

O.k., Lösung stand im englischen Forum

Code: Alles auswählen

// ==UserScript==
// @run-at document-idle
Antworten