Hey Leute,
Ich schicke mir gerade mit einem Bekannten Übungsaufgaben hin und her. Da wollte ich gerne die Ergebnisse in der gleichen Datei, jedoch nicht sofort sichtbar, haben. HTML-Dateien mit Spoilern bieten sich da an. Dann habe ich ein kleines Tool gebastelt, dass mir etwas Schreibarbeit sparen sollte und diese Dateien erstellt. Es funktioniert so wie html. Man kapselt einfach seinen sichtbaren Text und seinen versteckten Text mit den entsprechenden Schlagworten und das Skript erstellt im Textdatei-Verzeichnis eine html-Datei, die direkt ausgeführt wird.
Das ist total plump und war für mich nun leider doch nicht das Richtige. Vielleicht kann das hier aber mal jemand nutzen. Im Anhang findet sich das Skript mit einer Beispieldatei. (Skript ausführen, Beispieldatei auswählen, fertig.).
Das Skript erstellt eine Config-Datei, in der man seine eigenen Schlagworte und Farben einstellen kann.
Spoiler anzeigen
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.15.0 (Beta)
Script Function:
Erstellt einfache html-Dateien aus mit Containern zum Verstecken con Code (Soll für Übungen dienen).
Elemente müssen in eine Textdatei geschrieben und gekapselt werden.
(Standardschlagworte: )
1-mal Titel (0TitelStart ... 0TitelEnde)
x-mal Textfelder mit einer Beschreibung und/oder Aufgabe. (0TextStart ... 0TextEnde)
x-mal Codefelder mit zu versteckendem Text oder Code. (0CodeStart ... 0CodeEnde)
x-mal Markierungen im Code. (0MarkierungStart ...0MarkierungEnde
#ce ----------------------------------------------------------------------------
#include <Array.au3>
$hIniFile = @ScriptDir & "\Übungen-Einstellungen.txt"
If Not FileExists($hIniFile) Then _IniWrite()
#Region Deklarationen
Global $sStartTitle = IniRead($hIniFile, "Einstellungen", "Startmarkierung für Titel", "0TitelStart")
Global $sEndTitle = IniRead($hIniFile, "Einstellungen", "Endmarkierung für Titel", "0TitelEnde")
Global $sStartText = IniRead($hIniFile, "Einstellungen", "Startmarkierung für Text", "0TextStart")
Global $sEndText = IniRead($hIniFile, "Einstellungen", "Endmarkierung für Text", "0TextEnde")
Global $sStartCode = IniRead($hIniFile, "Einstellungen", "Startmarkierung für Code", "0CodeStart")
Global $sEndCode = IniRead($hIniFile, "Einstellungen", "Endmarkierung für Code", "0CodeEnde")
Global $sStartMark = IniRead($hIniFile, "Einstellungen", "Startmarkierung für Markierungen", "0MarkierungStart")
Global $sEndMark = IniRead($hIniFile, "Einstellungen", "Endmarkierung für Markierungen", "0MarkierungEnde")
Global $WindowBKColor = IniRead($hIniFile, "Einstellungen", "Hintergrund-Farbe Fenster", "#E6E6E6")
Global $CodeBKColor = IniRead($hIniFile, "Einstellungen", "Hintergrund-Farbe Codefeld", "#FE9A2E")
Global $MarkBKColor = IniRead($hIniFile, "Einstellungen", "Hintergrund-Farbe Markierungen", "#FFFF00")
#EndRegion Deklarationen
Global $sFileOpenDialog = FileOpenDialog("Wähle die Übungsdatei aus", @ScriptDir & "\", "Textdatei (*.txt)", 1)
If @error Then Exit
Global $s_htmlFile = StringTrimRight($sFileOpenDialog, 3) & "html"
Global $aOrder = _ParseTestFile()
_Write_HTML()
ShellExecute($s_htmlFile)
Func _ParseTestFile()
Local $sString = FileRead($sFileOpenDialog)
Local $aTitle = StringRegExp($sString, '(?s)' & $sStartTitle & '(.*?)' & $sEndTitle, 1)
If @error Then
Exit MsgBox(0, 'Fehler-Abbruch', 'Titel konnte nicht gefunden werden.')
EndIf
StringReplace($aTitle[0], @LF, '')
If @extended > 3 Then Exit MsgBox(0, 'Fehler-Abbruch', 'Maximal dreizeiliger Titel erlaubt.')
Local $sTitle = StringReplace($aTitle[0], @CRLF, @LF)
StringReplace(StringLeft($sTitle, 2), @LF, '')
If @extended > 0 Then $sTitle = StringTrimLeft($sTitle, @extended)
StringReplace(StringRight($sTitle, 2), @LF, '')
If @extended > 0 Then $sTitle = StringTrimRight($sTitle, @extended)
$sTitle = StringReplace($sTitle, @LF, '<br>')
StringReplace($sString, $sStartCode, "")
$iCodeStart = @extended
StringReplace($sString, $sEndCode, "")
$iCodeEnd = @extended
If $iCodeStart <> $iCodeEnd Then Exit MsgBox(0, 'Fehler-Abbruch', 'Codefelder nicht ausbalanciert. (Immer Starten und Beenden.)')
StringReplace($sString, $sStartText, "")
$iTextStart = @extended
StringReplace($sString, $sEndText, "")
$iTextEnd = @extended
If $iTextStart <> $iTextEnd Then Exit MsgBox(0, 'Fehler-Abbruch', 'Textfelder nicht ausbalanciert.. (Immer Starten und Beenden.)')
Local $aText = StringRegExp($sString, '(?s)' & $sStartText & '(.*?)' & $sEndText, 3)
If Not @error Then
If UBound($aText) <> $iTextStart Then Exit MsgBox(0, 'Fehler-Abbruch', 'Textfelder nicht ausbalanciert. (Reihenfolge von Starten und Beenden stimmt nicht immer.)')
Else
MsgBox(0, 'Hinweis', 'Keine Textfelder gefunden.', 5)
EndIf
Local $aCode = StringRegExp($sString, '(?s)' & $sStartCode & '(.*?)' & $sEndCode, 3)
If Not @error Then
If UBound($aCode) <> $iCodeStart Then Exit MsgBox(0, 'Fehler-Abbruch', 'Codefelder nicht ausbalanciert. (Reihenfolge von Starten und Beenden stimmt nicht immer.)')
Else
MsgBox(0, 'Hinweis', 'Keine Codefelder gefunden.', 5)
EndIf
Local $iOldCodeStartPos = 1, $iOldTextStartPos = 1
Local $aTextTemp[$iTextStart + 1][3], $aCodeTemp[$iCodeStart][3]
$aTextTemp[0][0] = "Titel"
$aTextTemp[0][1] = 0
$aTextTemp[0][2] = $sTitle
For $i = 1 To $iTextEnd
$iTextStartPos = StringInStr($sString, $sStartText, 1, 1, $iOldTextStartPos)
If $iTextStartPos <> 0 Then
$aTextTemp[$i][0] = "Text"
$aTextTemp[$i][1] = $iTextStartPos
$aTextTemp[$i][2] = $aText[$i - 1]
EndIf
$iTextEndPos = StringInStr($sString, $sEndText, 1, 1, $iTextStartPos)
Local $sSub = StringTrimLeft(StringLeft($sString, $iTextEndPos), $iTextStartPos)
If StringInStr($sSub, $sStartCode) Or StringInStr($sSub, $sEndCode, 1) Then
Exit MsgBox(0, 'Fehler-Abbruch', 'Codefeld-Marker innerhalb eines Textfeldes gefunden!')
EndIf
$iOldTextStartPos = $iTextEndPos
Next
For $i = 1 To $iCodeEnd
$iCodeStartPos = StringInStr($sString, $sStartCode, 1, 1, $iOldCodeStartPos)
If $iCodeStartPos <> 0 Then
$aCodeTemp[$i - 1][0] = "Code"
$aCodeTemp[$i - 1][1] = $iCodeStartPos
$aCodeTemp[$i - 1][2] = $aCode[$i - 1]
EndIf
$iCodeEndPos = StringInStr($sString, $sEndCode, 1, 1, $iCodeStartPos)
Local $sSub = StringTrimLeft(StringLeft($sString, $iCodeEndPos), $iCodeStartPos)
If StringInStr($sSub, $sStartText) Or StringInStr($sSub, $sEndText, 1) Then
Exit MsgBox(0, 'Fehler-Abbruch', 'Textfeld-Marker innerhalb eines Codefeldes gefunden!')
EndIf
$iOldCodeStartPos = $iCodeEndPos
Next
_ArrayConcatenate($aTextTemp, $aCodeTemp)
_ArraySort($aTextTemp, 0, 1, 0, 1)
;~ _ArrayDisplay($aTextTemp)
Return $aTextTemp
EndFunc ;==>_ParseTestFile
Func _Write_HTML()
Local $sString = _HTML_head()
$sString &= _HTML_title()
For $i = 1 To UBound($aOrder) - 1
If $aOrder[$i][0] = "Text" Then
$sString &= _HTML_text($i)
Else
$sString &= _HTML_code($i)
EndIf
Next
$sString &= _HTML_footer()
Local $hFileOpen = FileOpen($s_htmlFile, 2)
If @error Then Exit MsgBox(0, 'Fehler-Abbruch', 'Beim Erstellen der Datei ist ein Fehler aufgetreten. Keine Schreibrechte?')
FileWrite($hFileOpen, $sString)
FileClose($hFileOpen)
EndFunc ;==>_Write_HTML
Func _HTML_head()
Local $sString = '<html>' & @LF
$sString &= ' <head>' & @LF
$sString &= ' <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">' & @LF
$sString &= ' <style type="text/css">' & @LF
$sString &= ' body {background-color: ' & $WindowBKColor & ';}' & @LF
$sString &= ' h1 {text-align: center;}' & @LF
$sString &= ' div {text-align: center;}' & @LF
$sString &= ' </style>' & @LF
$sString &= ' </head>' & @LF
$sString &= ' <body>' & @LF
Return $sString
EndFunc ;==>_HTML_head
Func _HTML_title()
Local $sString = ' <h1>' & $aOrder[0][2] & '</h1>' & @LF
$sString &= ' <br>' & @LF
Return $sString
EndFunc ;==>_HTML_title
Func _HTML_footer()
Local $sString = ' </body>' & @LF
$sString &= '</html>' & @LF
Return $sString
EndFunc ;==>_HTML_footer
Func _HTML_code($iIndex)
Local $sString = ' <div>' & @LF
$sString &= ' <button title="" type="button"' & @LF
$sString &= ' onclick="' & @LF
$sString &= " if(document.getElementById('spoiler" & $iIndex & "') .style.display=='none')" & @LF
$sString &= " {document.getElementById('spoiler" & $iIndex & "') .style.display=''}" & @LF
$sString &= " else{document.getElementById('spoiler" & $iIndex & "') .style.display='none'" & @LF
$sString &= ' }">Einblenden / Ausblenden</button>' & @LF
$sString &= ' </div>' & @LF
$sString &= ' <div id="spoiler' & $iIndex & '" style="display:none;' & @LF
$sString &= ' border: 2px black dashed;' & @LF
$sString &= ' margin: 20px;' & @LF
$sString &= ' padding: 5px;' & @LF
$sString &= ' text-align: left;' & @LF
$sString &= ' background-color: ' & $CodeBKColor & '">' & @LF
$sCodeString = StringReplace($aOrder[$iIndex][2], @CRLF, @LF)
$sCodeString = StringReplace($sCodeString, @TAB, " ")
Local $sMarkStyle = '<div style="background-color: ' & $MarkBKColor & '; margin: 0px; padding: 0px; text-align: left;">'
$sCodeString = StringReplace($sCodeString, @LF & $sStartMark & @LF, $sMarkStyle, 0, 1)
$sCodeString = StringReplace($sCodeString, @LF & $sStartMark, $sMarkStyle, 0, 1)
$sCodeString = StringReplace($sCodeString, $sStartMark & @LF, $sMarkStyle, 0, 1)
$sCodeString = StringReplace($sCodeString, $sStartMark, $sMarkStyle, 0, 1)
If StringInStr($sCodeString, $sMarkStyle) Then
$sCodeString = StringReplace($sCodeString, @LF & $sEndMark & @LF, '</div>', 0, 1)
$sCodeString = StringReplace($sCodeString, @LF & $sEndMark, '</div>', 0, 1)
$sCodeString = StringReplace($sCodeString, $sEndMark & @LF, '</div>', 0, 1)
$sCodeString = StringReplace($sCodeString, $sEndMark, '</div>', 0, 1)
EndIf
If StringLeft($sCodeString, 1) == @LF Then $sCodeString = StringTrimLeft($sCodeString, 1)
If StringRight($sCodeString, 1) == @LF Then $sCodeString = StringTrimRight($sCodeString, 1)
Local $aCodeSplit = StringSplit($sCodeString, @LF)
;~ _ArrayDisplay($aCodeSplit)
For $i = 1 To $aCodeSplit[0]
$sString &= ' ' & $aCodeSplit[$i] & '<br>' & @LF
Next
$sString = StringTrimRight($sString, 5) & @LF
$sString &= ' <center><button title="" type="button"' & @LF
$sString &= ' onclick="' & @LF
$sString &= " document.getElementById('spoiler" & $iIndex & "') .style.display='none'" & @LF
$sString &= ' ">Ausblenden</button></center>' & @LF
$sString &= ' </div>' & @LF
$sString &= ' <br><br>' & @LF
Return $sString
EndFunc ;==>_HTML_code
Func _HTML_text($iIndex)
Local $sString = ' <div>' & @LF
$sTextString = StringReplace($aOrder[$iIndex][2], @CRLF, @LF)
If StringInStr(StringLeft($sTextString, 1), @LF) Then $sTextString = StringTrimLeft($sTextString, 1)
If StringInStr(StringRight($sTextString, 1), @LF) Then $sTextString = StringTrimRight($sTextString, 1)
$sTextString = StringReplace($sTextString, @TAB, " ")
Local $aTextSplit = StringSplit($sTextString, @LF)
For $i = 1 To $aTextSplit[0]
$sString &= ' <FONT SIZE="4">' & $aTextSplit[$i] & '</FONT><br>' & @LF
Next
$sString &= ' <br>' & @LF
$sString &= ' </div>' & @LF
Return $sString
EndFunc ;==>_HTML_text
Func _IniWrite()
Local $sString = "[Einstellungen]" & @CRLF & @CRLF & "----------------------------------------" & @CRLF & @CRLF
$sString &= "// Schlagworte für die Container. Groß und Kleinschreibung müssen beachtet werden." & @CRLF
$sString &= "// Habe hier mit Zahlen begonnen, damit nicht mal versehentlich Variablen die gleichen Namen bekommen." & @CRLF & @CRLF
$sString &= "// Ein Titel muss angegeben werden (darf maximal vierzeilig sein)." & @CRLF & @CRLF & @CRLF
$sString &= "Startmarkierung für Titel=0TitelStart" & @CRLF & "Endmarkierung für Titel=0TitelEnde" & @CRLF & @CRLF & @CRLF
$sString &= "Startmarkierung für Text=0TextStart" & @CRLF & "Endmarkierung für Text=0TextEnde" & @CRLF & @CRLF & @CRLF
$sString &= "Startmarkierung für Code=0CodeStart" & @CRLF & "Endmarkierung für Code=0CodeEnde" & @CRLF & @CRLF & @CRLF
$sString &= "Startmarkierung für Markierungen=0MarkierungStart" & @CRLF & "Endmarkierung für Markierungen=0MarkierungEnde" & @CRLF
$sString &= @CRLF & @CRLF & "----------------------------------------" & @CRLF & @CRLF
$sString &= "// Farben im HTML-Farbcodes. Bspw. hier zu finden: http://html-color-codes.info/webfarben_hexcodes/" & @CRLF & @CRLF & @CRLF
$sString &= "Hintergrund-Farbe Fenster=#E6E6E6" & @CRLF & "Hintergrund-Farbe Codefeld=#FE9A2E" & @CRLF & "Hintergrund-Farbe Markierungen=#FFFF00"
FileWrite($hIniFile, $sString)
EndFunc ;==>_IniWrite
Alles anzeigen