How to Switch Tags in Hoplon - clojurescript

If I have the following code and a function to switch from 'p' tag to 'h1' tag:
(def switch-tag (cell p))
And later on in the hlisp
((cell= switch-tag) "Text goes here")
How come when I switch to the h1 tag nothing seems to happen.

I have been unable to solve this your way. Here is a workaround:
(page "index.html")
(def key! (cell true))
(defelem my-elem [_ [child]]
(cell= (if key! (h1 child) (p child))))
(html
(body
(button :click #(swap! key! not) "test")
(my-elem "this is a test")))

Related

reitit.frontend - HTML5Router does not prevent anchor click as should on matching route

if we choose HTML5Router or Fragment router - in both cases reitit should prevent default anchor click behavior
however, ignore-anchor-click function here is never called
https://github.com/metosin/reitit/blob/0.5.18/modules/reitit-frontend/src/reitit/frontend/history.cljs#L109
because a few lines below goog.events/listen is missing true 4th arg - so browser first captures click and never gets to document.click
https://github.com/metosin/reitit/blob/0.5.18/modules/reitit-frontend/src/reitit/frontend/history.cljs#L124
is
(gevents/listen js/document goog.events.EventType.CLICK ignore-anchor-click))
should be - then all works
(gevents/listen js/document goog.events.EventType.CLICK ignore-anchor-click true))
question
is there a way to change this behavior without PR or forking?
solution
copy function code from reitit.frontent.history
using history ref unsubscribe and resubscribe
(let [history (Yzma.frontend.easy/start! _ _ _)]
(goog.events/unlistenByKey (:click-listen-key history))
(goog.events/listen
js/document
goog.events.EventType.CLICK
(fn [event]
(when-let [element (Yzma.frontend.history/closest-by-tag
(Yzma.frontend.history/event-target event) "a")]
(let [uri (.parse goog.Uri (.-href element))]
(when (Yzma.frontend.history/ignore-anchor-click?
(.-router history) event element uri)
(.preventDefault event)
(let [path (str (.getPath uri)
(when (.hasQuery uri)
(str "?" (.getQuery uri)))
(when (.hasFragment uri)
(str "#" (.getFragment uri))))]
(.pushState js/window.history nil "" path)
(Yzma.frontend.history/-on-navigate history path)))))) true))

Render html to racket gui

I'm trying to write a WYSIWYG text editor that allows me to write text in the top window, and have the resulting scribble text rendered in the bottom window. I figured the way I would do this would be to call scribble myfile.rkt in the background periodically, and then render the resulting output to a bottom screen using render-html-to-text. I'm having some trouble getting the render to work. Based on the documentation I need
in : input-port?
dest : (is-a? html-text<%>)
load-img? : any/c
eval-rkt? : any/c
The relevant parts of my script look like this
#lang racket/gui
(require racket/os racket/runtime-path "init.rkt"
browser/htmltext)
(require browser)
(define f (new frame% [label (~a "Dremacs" "#" (gethostname))]
[width 960]
[height 540]))
(define new-cnv (new cnv% [parent f]))
(send t insert ";; This buffer is for text that is not saved, and for Lisp evaluation.
;; To create a file, visit it with C-x C-f and enter text in its buffer.")
(send new-cnv set-editor t)
(define html-renderer%
(interface (html-text<%>)))
(define viewer (new panel%
[parent f]
[min-width 300]
[min-height 300]))
(render-html-to-text (open-input-file "TODO.html") html-renderer% #t #t)
(send f show #t)
But I get the error
render-html-to-text: expects argument of type <html-text<%> object>; given: '(#<input-port:/home/diego/repos/dremacs/dremacs/TODO.html> #<interface:html-renderer%>)
context...:
/usr/share/racket/pkgs/drracket/browser/htmltext.rkt:61:0: render-html-to-text
"/home/diego/repos/dremacs/dremacs/editor.rkt": [running body]
temp37_0
And I'm not sure what I'm doing wrong. Could anyone help?
The html-renderer% is not created correctly.
Use html-text-mixin to turn a text% into something that handles html-text.
But ... don't expect too much from the html-renderer.
It's old and doesn't support stylesheets.
Back in the day it was used to display documentation for DrRacket.

Editing CSV file in Emacs. Visualize first field with different color

I am trying to simplify the editing of a CSV file in Emacs. I would like to hightlight the first field of each row/line in different font foreground color. For example
KEYWORD1,description,value
KEYWORD2,description,value
KEYWORD3,description,value
KEYWORD4,description,value
I would like to highlight KEYWORD1, KEYWORD2, KEYWORD3, and KEYWORD4 in a different color. I tried to install csv-mode but it seems it does not offer this feature. I am using GNU Emacs 24.3.1 on Ubuntu 12.04.
Assuming csv-mode is a normal mode (I did not have it installed), this should work out of the box:
(add-hook 'csv-mode-hook
(lambda ()
(font-lock-add-keywords nil '(("^\\([^,]*\\)," 1 'font-lock-function-name-face)))))
Just replace font-lock-function-name-face with the face of your choice, if you don't like that particular color
I experimented a little bit with text properties, and came up with
(defun csv-highlight-1 ()
(interactive)
(save-excursion
(beginning-of-buffer)
(setq spos t)
(while spos
(setq spos (re-search-forward "^[^,]*," nil t))
(when spos
(let ((mod (buffer-modified-p)) (pos1 (line-beginning-position)) (pos2 (- spos 1)))
(put-text-property pos1 pos2 'font-lock-face '(:foreground "red"))
(put-text-property pos1 pos2 'front-sticky t)
(set-buffer-modified-p mod))))))
It seems to work, but I have to call it manually each time I update the buffer. But maybe that is ok.

Normal instance method calls within a clojure doto

I'm setting up a swing UI in clojure and have a block like:
(doto main-frame
(.setUndecorated true)
(.setExtendedState Frame/MAXIMIZED_BOTH)
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(.setVisible true)
)
But now I want to call
(.setBackground (.getContentPane main-frame) Color/BLACK)
before I set the frame visible, is there a nicer way to do this than ending the doto and using the (.instanceMember instance args*) syntax?
If you really want a single doto, then maybe this will do:
(doto main-frame
(.setUndecorated true)
(.setExtendedState Frame/MAXIMIZED_BOTH)
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(-> (.getContentPane) (.setBackground Color/BLACK))
(.setVisible true))
The above relies on the fact that doto is not confined to Java methods, it just inserts its first argument (evaluated) as first argument of every form that follows.
I'd go with ending the doto though as the above is not very readable. Alternatively, maybe just define a set-background-on-content-pane function (that obviously takes the main-frame) and use that in the doto:
(defn set-bg-on-frame [fr color] (.setBackground (.getContentPane fr) color))
(doto main-frame
.
.
.
(set-bg-on-frame Color/BLACK)
(.setVisible true))

Image Processing, extending JPanel and Simulating Classes in Clojure

there! I'm building an image-processing application in swing/clojure, and right now I need to develop an image panel in which I can click and compute data. Thanks to coobird, I now have a good idea on how to do it in Java, but I still don't get many issues on its integration with Clojure.
Let's take a look at how coobird suggested me doing. First, we should extend a class in Java. In clojure, we do this with the proxy macro, so we'd have something like this:
(def painting-panel
(proxy [JPanel] []))
The next step is to create the class constructor and set some variables.
I can define functions after the second argument of proxy, but how can I create the constructor? Is painting-panel the name of this class (therefore the name of the function I should create)?
How can I deal with class variables? Should I define them with a let, like I did?
Are this and super available for me to use, like I did below?
(def painting-panel
(let [background-image (Image.)
point-clicked (Point.)]
(proxy [JPanel] []
(paintComponent [g]
(do ((.paintComponent super) g)
(doto g
(.drawImage background-image 0 0 nil)
(.fillRect (.x point-clicked) (.y point-clicked) 1 1))))
(painting-panel []; constructor?
((.addMouseListener this)
(proxy [MouseAdapter] []
(mouseClicked [e]
(do
(def point-clicked (.getPoint e))
(.repaint this)))))))))
Suggestions and code corrections are also welcome!
Thank you!
proxy actually creates an instance tada! You don't need to create a constructor.
Yes, but consider using a clojure ref instead. Also using def like that on the second last line is nasty! it creates a global binding for point-clicked when your logic relies on the lexically scoped one created by let.
(proxy-super paintComponent g), and yes "this" is available
This works for me:
(let [click (ref nil)
panel (proxy [javax.swing.JPanel] []
(paintComponent [g]
(proxy-super paintComponent g)
(.drawImage g (.getImage
(javax.swing.ImageIcon. "play.png"))
0 0 (.getWidth this) (.getHeight this) nil)
(if #click
(.fillRect g (:x #click) (:y #click) 10 10))))]
(.addMouseListener panel
(proxy [java.awt.event.MouseAdapter] []
(mouseClicked [e]
(let [p (.getPoint e)]
(dosync (ref-set click {:x (.x p), :y (.y p)})))
(javax.swing.SwingUtilities/invokeLater #(.repaint panel)))))
(doto (javax.swing.JFrame.)
(.setContentPane panel)
(.setSize 200 200)
(.show)))