(require 'json) (require 'thingatpt) (setq wordnik-api-key "fa815fa92045b7fa23699014d0a01c081b3d9c3c761292bf3") (defun wordnik-get-syn-buffer-for-word (word) (url-retrieve-synchronously (concat "http://api.wordnik.com//v4/word.json/" word "/relatedWords?relationshipTypes=synonym&limitPerRelationshipType=25&api_key=" wordnik-api-key))) (defun thesaurus-process-http-headers () "In the buffer created by `url-retrieve-synchronously', there are HTTP headers, and content. This fn removes the headers from the buffer, parsing the Content-Length header to verify that a substantive response was received. This implementation deletes each line until finding a blank line, which in correctly-formatted HTTP messages signals the end of the headers and the beginning of the message content. " (let ((clength -1)) (while (/= (point) (line-end-position)) (when (and (< clength 0) (re-search-forward "^[Cc]ontent-[Ll]ength ?: *\\(.*\\)$" (line-end-position) t)) (setq clength (string-to-number (match-string 1))) (goto-char (line-beginning-position))) (delete-region (point) (line-end-position)) (delete-char 1)) (delete-char 1) clength)) (defun wn/synonym-list (word) "Look up synonyms for (word) on wordnik and return them as an array of strings" (let ((buf (wordnik-get-syn-buffer-for-word word))) (if buf (progn (with-current-buffer buf (goto-char (point-min)) (thesaurus-process-http-headers) (let ((json-object-type 'alist)) (cdr (assoc 'words (elt (json-read-from-string (buffer-substring-no-properties (point) (line-end-position))) 0))))))))) (defun wn/synonym-at-point () (interactive) (let ((word (word-at-point))) (message "Synonyms for %s: %S" word (wn/synonym-list word)))) (provide 'wordnik-synonym)