
W poprzednim wpisie na temat porównywania requestów HTTP w Fiddlerze pokazałem jak wykorzystać integrację z WinMerge, żeby ułatwić sobie szukanie różnic. Przykład uwidocznił problem z porównywaniem gdy parametry zapytania POST są w jednej linii. Znalezienie różnicy w długim ciągu parametrów nie jest zbyt wygodne.
Z pomocą przychodzi nam możliwość pisania własnych wtyczek i skryptów do WinMerge. Mają one postać bibliotek dll bądź „scriptletów” pisanych w COM API (VBScript).
Pluginy do WinMerge są umieszczane w katalogu MergePlugins wewnątrz instalacji. Najprostszym sposobem stowrzenia własnej wtyczki jest skopiowanie istniejącego pliku z rozszerzeniem .sct i przerobienie go pod nasze potrzeby. Skopiujmy więc przykładowy skrypt „insert datetime.sct” i nazwijmy go „request param to new line.sct”. Nowy plik edytujemy i czyścimy z niepotrzebnego kodu.
<scriptlet> <implements type="Automation" id="dispatcher"> <property name="PluginEvent"> <get/> </property> <property name="PluginDescription"> <get/> </property> <method name=""/> </implements> <script language="VBS"> Option Explicit Function get_PluginEvent() get_PluginEvent = "EDITOR_SCRIPT" End Function Function get_PluginDescription() get_PluginDescription = "Basic text functions for the context menu" End Function </script> </scriptlet>
Powyższy listing przedstawia pusty plugin. Teraz musimy oprogramować metodę, która przetworzy nasz tekst. Piszemy więc funkcję, którą wstawiamy przed zamykającym tagiem </script>.
Function RequestParamToNewline(Text) RequestParamToNewline = Replace(Text, "&", VbCrLf & "&") End Function
Dla osób nieznających VBScript już wyjaśniam powyższy kod. W podanej jako parameter zmiennej Text zastępujemy znak oddzielający parametry (&) tym samym znakiem poprzedzonym znakiem nowej linii (VbCrLf w VBScript, co produkuje znane wszystkim znaki nowej linii i powrotu karetki – \r\n). Na koniec zwracamy wartość. Przypisanie wartości nazwie funkcji działa tu jak zwrócenie wartości przez tę funkcję.
Musimy jeszcze poinformować WinMerge jaką funkcję wywołać przy starcie tego skryptu. Nazwę funkcji wpisujemy w węźle method i atrybucie name XMLa rozpoczynającego skrypt. Ostateczna postać skryptu powinna wyglądać tak:
<scriptlet> <implements type="Automation" id="dispatcher"> <property name="PluginEvent"> <get/> </property> <property name="PluginDescription"> <get/> </property> <method name="RequestParamToNewline"/> </implements> <script language="VBS"> Option Explicit Function get_PluginEvent() get_PluginEvent = "EDITOR_SCRIPT" End Function Function get_PluginDescription() get_PluginDescription = "Basic text functions for the context menu" End Function Function RequestParamToNewline(Text) RequestParamToNewline = Replace(Text, "&", VbCrLf & "&") End Function </script> </scriptlet>
Po zapisaniu pliku możemy uruchomić WinMerge i sprawdzić czy nasz skrypt został poprawnie rozpoznany. Jeśli nie ma go na liście to warto zaznaczyć cały tekst w jednym z okienek bo wtedy WinMerge próbuje sprawdzić dostępne pluginy i może wygenerować komunikat z dodatkową informacją.
Nasz skrypt wywołujemy ręcznie. Najpierw zaznaczamy tekst po lewej i wybieramy Edit->Scripts->RequestParamToNewline. Tę samą czynność wykonujemy dla tekstu po prawej. Na koniec klikamy w przycisk „Refresh”, żeby wymusić ponowne porównanie.
Kod źródłowy skryptu możecie znaleźć na moim GitHubie