Added a file PS-DOM with handy utility macros for DOM functionality, e.g. Lispy ways...
[clinton/parenscript.git] / src / namespace.lisp
index 06a527a..4a7a90b 100644 (file)
@@ -9,20 +9,21 @@
       (intern (symbol-name symbol) #.(find-package :parenscript))))
 
 ;;; Symbol obfuscation
-(defvar *obfuscation-table* (make-hash-table))
+(defvar *obfuscated-packages* (make-hash-table))
 
-(defun obfuscate-package (package-designator)
-  (setf (gethash (find-package package-designator) *obfuscation-table*) (make-hash-table)))
+(defun obfuscate-package (package-designator &optional (symbol-map (make-hash-table)))
+  "symbol-map can either be a hash table or a closure that takes a symbol as its only argument."
+  (setf (gethash (find-package package-designator) *obfuscated-packages*) symbol-map))
 
 (defun unobfuscate-package (package-designator)
-  (remhash (find-package package-designator) *obfuscation-table*))
+  (remhash (find-package package-designator) *obfuscated-packages*))
 
 (defun maybe-obfuscate-symbol (symbol)
-  (let ((obfuscated-symbol-table (gethash (symbol-package symbol) *obfuscation-table*)))
-    (if obfuscated-symbol-table
-        (or (gethash symbol obfuscated-symbol-table)
-            (setf (gethash symbol obfuscated-symbol-table) (ps-gensym "G")))
-        symbol)))
+  (ctypecase (gethash (symbol-package symbol) *obfuscated-packages*)
+    (hash-table (let ((symbol-map (gethash (symbol-package symbol) *obfuscated-packages*)))
+                  (or (gethash symbol symbol-map) (setf (gethash symbol symbol-map) (ps-gensym "G")))))
+    (function (funcall (gethash (symbol-package symbol) *obfuscated-packages*) symbol))
+    (null symbol)))
 
 ;;; Interface for printing identifiers
 
@@ -36,5 +37,5 @@ designated package when translating ParenScript code."
 (defun js-translate-symbol (symbol)
   (let ((possibly-obfuscated-symbol (maybe-obfuscate-symbol symbol)))
     (if (ps-package-prefix (symbol-package symbol))
-        (format nil "~A~A" (ps-package-prefix (symbol-package symbol)) (symbol-to-js possibly-obfuscated-symbol))
-        (symbol-to-js possibly-obfuscated-symbol))))
+        (format nil "~A~A" (ps-package-prefix (symbol-package symbol)) (symbol-to-js-string possibly-obfuscated-symbol))
+        (symbol-to-js-string possibly-obfuscated-symbol))))