Browse Source

Use ansilove for ANSI messages.

Steve Thielemann 4 years ago
parent
commit
d54f8fce6b
7 changed files with 41 additions and 2 deletions
  1. BIN
      ansilove
  2. 9 0
      jammin.py
  3. 1 0
      libansilove.so
  4. 1 0
      libansilove.so.1
  5. BIN
      libansilove.so.1.0.0
  6. 24 1
      messages.py
  7. 6 1
      templates/message.html

BIN
ansilove


+ 9 - 0
jammin.py

@@ -13,6 +13,14 @@ def get_buffer(buffer, bsize):
     # return string
 
 
+def get_bytes(buffer, bsize):
+    string = b""
+    for x in range(bsize):
+        string += buffer[x]
+    # return string.decode('cp437').encode('utf-8')
+    return string
+
+
 def get_subfields(subpacket):
     done = 0
     fields = {}
@@ -124,6 +132,7 @@ def read_message(base, number):
         )
         msgtext = get_buffer(buffer, msgheader.TxtLen)
         message["text"] = msgtext
+        message["bytes"] = get_bytes(buffer, msgheader.TxtLen)
         buffer = None
         lib.JAM_DelSubPacket(subpacket[0])
 

+ 1 - 0
libansilove.so

@@ -0,0 +1 @@
+libansilove.so.1

+ 1 - 0
libansilove.so.1

@@ -0,0 +1 @@
+libansilove.so.1.0.0

BIN
libansilove.so.1.0.0


+ 24 - 1
messages.py

@@ -3,6 +3,9 @@ from flask_paginate import Pagination, get_page_parameter, get_page_args
 from flask_caching import Cache
 from flask import request
 import pendulum
+import subprocess
+import base64
+import os
 
 app = Flask(__name__)
 
@@ -63,13 +66,33 @@ def display_messages(area):
     )
 
 
+def ansi_to_png(raw_ansi_bytes, idx):
+    pid = os.getppid()
+    ansifile = "{0}-{1}.ans".format(idx, pid)
+    pngfile = "{0}-{1}.png".format(idx, pid)
+    with open(ansifile, "wb") as fp:
+        fp.write(raw_ansi_bytes)
+    subprocess.run(["./ansilove", "-d", "-o", pngfile, ansifile])
+    with open(pngfile, "rb") as fp:
+        png = fp.read()
+    os.unlink(ansifile)
+    os.unlink(pngfile)
+    return base64.b64encode(png).decode("utf-8")
+
+
+# <img alt="My Image" src="data:image/png;base64,
 @app.route("/read/<area>/<int:msgno>")
 def display_message(area, msgno):
     if area not in bases:
         return render_template("missing-area.html")
 
     message = jammin.read_message(bases[area], msgno)
+
     if "text" in message:
-        message["text"] = message["text"].replace("\r", "\n")  # <br >\n")
+        if "\x1b" in message["text"]:
+            # Ok, the message contains ANSI CODES -- Convert
+            message["png"] = ansi_to_png(message["bytes"].replace(b"\r", b"\n"), msgno)
+        else:
+            message["text"] = message["text"].replace("\r", "\n")  # <br >\n")
 
     return render_template("message.html", message=message, area=area, msgnumber=msgno)

+ 6 - 1
templates/message.html

@@ -28,9 +28,14 @@
 <div class="large-10 cell">{{ message.to }}</div>
 </div>
 
+<div class="grid-x padding-x">
+<div class="large-2 cell">Subject:</div>
+<div class="large-10 cell">{{ message.subject }}</div>
+</div>
+
 <div class="grid-x padding-x">
 <div class="large-2 cell">Text:</div>
-<div class="large-10 cell"><pre>{{ message.text|safe }}</pre></div>
+<div class="large-10 cell">{% if message.png is defined %}<img alt="Message {{ message.MsgNum }}" src="data:image/png;base64,{{ message.png|safe }}">{% else %}<pre>{{ message.text|safe }}</pre>{% endif %}</div>
 </div>
 
 </div>