1313import re
1414import base64
1515from queue import Queue
16+ import html
1617
1718# Placeholder for APRS functionality
1819from aprspy import APRS
@@ -682,6 +683,14 @@ def decode_aprs(self, line):
682683
683684 return None
684685
686+ def handle_js_result (self , result ):
687+ if result is None :
688+ print ("[JS Error] JavaScript execution failed or returned None." )
689+ elif isinstance (result , str ) and result .strip () == "" :
690+ print ("[JS Error] JavaScript returned an empty string." )
691+ #else:
692+ #print("[JS Result]:", result)
693+
685694 def handle_serial_data (self , line ):
686695 timestamp = datetime .now ().strftime ("[%H:%M:%S]" )
687696
@@ -730,8 +739,9 @@ def handle_serial_data(self, line):
730739 lat = getattr (packet , "latitude" , None )
731740 lon = getattr (packet , "longitude" , None )
732741 src = getattr (packet , "source" , "" )
742+ info = getattr (packet , "info" , "" )
733743
734- symbol_description = symbol_map .get (f'{ packet .symbol_table } { packet .symbol_id } ' , 'Unknown' )
744+ # symbol_description = symbol_map.get(f'{packet.symbol_table}{packet.symbol_id}', 'Unknown')
735745 symbol_code = f"{ packet .symbol_table } { packet .symbol_id } "
736746 emoji = emoji_map .get (symbol_code , "📍" ) # default pin if unknown
737747
@@ -742,45 +752,76 @@ def handle_serial_data(self, line):
742752 # Remove existing marker if present
743753 if key in self .marker_registry :
744754 prev_marker = self .marker_registry [key ]
745- js_remove = f"map.removeLayer({ prev_marker } );"
746- self .map_view .page ().runJavaScript (js_remove )
755+ js_remove = f"""
756+ try {{
757+ map.removeLayer({ prev_marker } );
758+ 'success';
759+ }} catch (err) {{
760+ console.error('[Remove Marker Error]', err);
761+ '[Remove Marker Error] ' + err.toString();
762+ }}
763+ """
764+ self .map_view .page ().runJavaScript (js_remove , self .handle_js_result )
765+
747766
748767 # Add new marker with emoji (without recentering the map)
749- popup_text = f"{ emoji } { src } "
768+ #popup_text = f"{emoji} {src}"
769+ #info.replace("`", "\\`").replace("$", "\\$")
770+ info .replace ("\\ " , "\\ \\ " ).replace ("'" , "\\ '" ).replace ("\" " , "\\ \" " ).replace ("\n " , "\\ n" ).replace ("\r " , "" )
771+ popup_text = f"{ emoji } { src } <br>{ info } "
772+ #popup_text = f"{emoji} {src}" + (f"<br>{html.escape(info)}" if info else "")
750773 js_add = f"""
751- var zoom = map.getZoom();
752- var scale = 1 + (zoom - 10) * 0.25;
753- var { marker_id } = L.marker([{ lat } , { lon } ], {{
754- icon: L.divIcon({{
755- className: 'emoji-icon',
756- html: '{ emoji } ',
757- iconSize: null
758- }})
759- }}).addTo(map).bindPopup('{ popup_text } ');
760- document.querySelectorAll('.emoji-icon').forEach(function(el) {{ el.style.fontSize = (24 * scale) + 'px'; }});
774+ try {{
775+ var zoom = map.getZoom();
776+ var scale = 1 + (zoom - 10) * 0.25;
777+ var { marker_id } = L.marker([{ lat } , { lon } ], {{
778+ icon: L.divIcon({{
779+ className: 'emoji-icon',
780+ html: '{ emoji } ',
781+ iconSize: null
782+ }})
783+ }}).addTo(map).bindPopup(`{ popup_text } `);
784+ document.querySelectorAll('.emoji-icon').forEach(function(el) {{
785+ el.style.fontSize = (24 * scale) + 'px';
786+ }});
787+ 'success'
788+ }} catch (err) {{
789+ 'JS Error: ' + err.message
790+ }}
761791 """
762- self .map_view .page ().runJavaScript (js_add )
792+ #self.map_view.page().runJavaScript(js_add)
793+ self .map_view .page ().runJavaScript (js_add , self .handle_js_result )
794+
763795
764796 # Add zoom scaling logic
765797 js_scale = """
766- map.off('zoomend');
767- map.on('zoomend', function() {
768- var zoom = map.getZoom();
769- var scale = 1 + (zoom - 10) * 0.25;
770- var icons = document.getElementsByClassName('emoji-icon');
771- for (var i = 0; i < icons.length; i++) {
772- icons[i].style.fontSize = (24 * scale) + 'px';
773- }
774- });
798+ try {
799+ map.off('zoomend');
800+ map.on('zoomend', function() {
801+ var zoom = map.getZoom();
802+ var scale = 1 + (zoom - 10) * 0.25;
803+ var icons = document.getElementsByClassName('emoji-icon');
804+ for (var i = 0; i < icons.length; i++) {
805+ icons[i].style.fontSize = (24 * scale) + 'px';
806+ }
807+ });
808+ 'success';
809+ } catch (err) {
810+ console.error('[Zoom Scale Error]', err);
811+ '[Zoom Scale Error] ' + err.toString();
812+ }
775813 """
776- self .map_view .page ().runJavaScript (js_scale )
777814
778- # Optionally open popup (this doesn't pan the map)
815+ #self.map_view.page().runJavaScript(js_scale)
816+ self .map_view .page ().runJavaScript (js_scale , self .handle_js_result )
817+
818+ # Optionally open popup
779819 #js_popup = f"{marker_id}.openPopup();"
780820 #self.map_view.page().runJavaScript(js_popup)
781821
782822 # Store reference
783823 self .marker_registry [key ] = marker_id
824+
784825 except Exception as e :
785826 #self.msg_output.appendPlainText(f"{timestamp} Failed to parse APRS: {e}")
786827 pass
0 commit comments