#elisp goodbye-picasa: picasaweb 이미지를 다운로드해서 교체

1 minute read

picasaweb 이미지를 로컬에 다운로드하고 이미지 주소를 교체하는 스크립트를 짰다. 기존에 올린 이미지는 google photos로 자동으로 이관됐다. 엑박 안 뜨고 잘 나오지만 레거시 지원으로 유지되는 거라서 불안하다. 그래서 간단한 스크립트를 짰다.

ERT: Emacs Lisp Regression Testing

ertel-mock 라이브러리랑 같이 사용했다.

M-x ert

특정 함수만 골라서 테스트할 수 있다. 전체 테스트는 어떻게? t 문자를 입력하면 된다.

with-temp-file

(with-temp-file filename
  (insert-file-contents filename)
  ;; picasaweb 이미지 다운로드
  ;; 블로그 글에 있는 이미지 경로 변경
  )

파일 내용을 변경하고 싶다면? buffer로 파일 내용을 읽고 바꾸고 저장하면 된다. with-temp-buffer 매크로만 알고 있는 터라 buffer에서 내용 변경 다 하고 호출할 파일 저장 함수를 찾고 있었다. 이럴 때 쓰라고 만들어 놓은 with-temp-file 매크로가 있네. with-temp-buffer 매크로 대신 끝나면 파일에 기록하는 with-temp-file 매크로를 사용했다.

search-forward, replace-match

(while (search-forward "from" nil t)
  (replace-match "to"))

buffer 안에서 문자열을 바꿀 때, 사용.

search-forward-regexp, match-string

(while (search-forward-regexp
        "\\([^][ \"\'\(]*googleusercontent[^][ \"\'\)]*\\)"
        nil
        t)
  (add-to-list 'url-list (match-string 1)))

picasaweb 이미지 주소를 검색할 때, 정규식(regular expression)을 사용했다. \\(, \\) 문자로 캡쳐한 문자열을 match-string 함수로 접근할 수 있다.

url-copy-file

(url-copy-file src-path dst-path)

로컬이든 원격이든 알아서 복사해준다.

cl-mapcar

(require 'cl-lib)
(cl-mapcar '(lambda (src dest)
              (list src (concat dest "." (file-name-extension src))))
           img-src-list
           dest-path-list)

url-copy-file 함수에 넘길 인자를 만들 때, 사용했다. picasaweb 이미지 경로와 로컬에 다운로드 받을 이름을 각각 리스트로 만들어놨다. 리스트 원소를 각각 하나씩 빼내서 리스트를 만들어야 하는데, 기본 mapcar는 입력으로 리스트 하나만 허용한다. 두 개를 입력으로 받을 수 있는 게 필요하다. 이럴 땐, 우선 common lisp extension을 찾아보면 된다. cl-mapcar를 사용해서 해결했다.

C-x C-s C-x C-c