Switch to side-by-side view

--- a/src/filters/rclkar
+++ b/src/filters/rclkar
@@ -43,6 +43,16 @@
 </html>
 '''
 
+PY3 = sys.version > '3'
+if PY3:
+    nlbytes = bytes('\n', encoding='iso-8859-1')
+    bsbytes = bytes('\\', encoding='iso-8859-1')
+    nullchar = 0
+else:
+    nlbytes = '\n'
+    bsbytes = '\\'
+    nullchar = chr(0)
+    
 class KarTextExtractor:
     # Afaik, the only charset encodings with null bytes are variations on
     # utf-16 and utf-32 and iso relatives. A hopefully comprehensive
@@ -91,11 +101,12 @@
 
         if not data:
             return data
-
-        firstnull = data.find(chr(0))
-        if firstnull != -1:
+        try:
+            firstnull = data.index(nullchar)
             self.hadnulls = True
             data = data[0 : firstnull]
+        except:
+            pass
         return data
     
 
@@ -117,8 +128,7 @@
                 self.em.rclog("Encode failed: " + str(err))
                 return ""
             
-            data = self.em.htmlescape(data).replace("\n", "<br>\n")
-
+            data = self.em.htmlescape(data).decode('utf-8').replace('\n', '<br>\n')
         return data
 
 
@@ -208,29 +218,29 @@
         title = None
         author = None
         language = None
-        lyrics = ""
-        lyricsN = ""
+        lyrics = b""
+        lyricsN = b""
         self.hadnulls = False
         
         for event in stream.iterevents():
-            edata = ""
+            edata = b""
             if isinstance(event, midi.TextMetaEvent):
                 if not event.data:
                     continue
-                elif event.data[0] == '/' or event.data[0] == '\\':
-                    edata = "\n" + event.data[1:]
-                elif event.data[0] == '[' or event.data[0] == ']':
+                elif event.data[0] == b'/'[0] or event.data[0] == bsbytes[0]:
+                    edata = nlbytes + event.data[1:]
+                elif event.data[0] == b'['[0] or event.data[0] == b']'[0]:
                     edata = event.data[1:]
-                elif event.data[0] == '@':
+                elif event.data[0] == b'@'[0]:
                     if len(event.data) == 1:
                         continue
                     else:
-                        if event.data[1] == 'I':
-                            edata = event.data[2:] + '\n'
-                        elif event.data[1] == 'L':
+                        if event.data[1] == b'I'[0]:
+                            edata = event.data[2:] + nlbytes
+                        elif event.data[1] == b'L'[0]:
                             language = self.nulltrunc(event.data[2:])
                             languageN = event.data[2:]
-                        elif event.data[1] == 'T':
+                        elif event.data[1] == b'T'[0]:
                             if title is None:
                                 title = self.nulltrunc(event.data[2:])
                                 titleN = event.data[2:]
@@ -241,13 +251,13 @@
                     edata = event.data
             elif isinstance(event, midi.LryricsEvent) or \
                      isinstance(event, midi.TrackNameEvent):
-                space = ""
+                space = b""
                 if isinstance(event, midi.TrackNameEvent):
-                    nl = "\n"
+                    nl = nlbytes
                 if not event.data:
                     continue
-                elif event.data[0] == '/' or event.data[0] == '\\':
-                    edata = "\n" + event.data[1:] + nl
+                elif event.data[0] == b'/'[0] or event.data[0] == bsbytes[0]:
+                    edata = nlbytes + event.data[1:] + nl
                 else:
                     edata = event.data + nl
 
@@ -295,7 +305,8 @@
         title = self.reencode(title)
         author = self.reencode(author)
         lyrics = self.reencode(lyrics)
-
+        language = self.reencode(language)
+        
         self.em.setmimetype("text/html")
         docdata = htmltemplate % (title, author, language, lyrics)