시험에 Ltk로 쓰레기 같은 브라우저 (?) 만들기
13261 단어 GUICommonLispLTk공부 메모
소개
Ltk를 실제로 사용해 보자, 우선 쇼보 브라우저적인 무언가를 만들어 보겠습니다.
코드를 작성하는 방법이 Lisp 같지 않다거나 인터페이스 빌어 먹을이거나 츳코미가 썩을 정도가 있겠지만 괜찮다면 교제하십시오 ...
참고로 한 자료
Common Lisp에서 URL에서 페이지 제목 가져오기
Ltk 샘플 모음
Ltk에서 GUI 연습
LTK - a Lisp binding to the Tk toolkit
환경
이번 개발·실행 환경입니다.
주요 언어: CommonLisp
처리 시스템:Clozure CL
GUI 구축 라이브러리: Ltk
OS:Mac OS X 10.11.4(El Capitan)
요구사항
슈퍼 간단한 브라우저의 가짜 같은 것을 만들려고 생각합니다.
구현하는 기능은 우선,
URL을 입력하면 그 페이지의 소스를 파싱하지 않고 그대로 취득해 화면에 표시한다
이것뿐입니다!
브라우저라고 부르기에는 너무나 훌륭하게 애플 리케이션이지만, 이번은 연습이라고 하는 것으로 용서해 주시지 않겠습니까.
따라서 구체적으로 필요한 기능으로,
GUI 관계
Common Lisp에서 URL에서 페이지 제목 가져오기
Ltk 샘플 모음
Ltk에서 GUI 연습
LTK - a Lisp binding to the Tk toolkit
환경
이번 개발·실행 환경입니다.
주요 언어: CommonLisp
처리 시스템:Clozure CL
GUI 구축 라이브러리: Ltk
OS:Mac OS X 10.11.4(El Capitan)
요구사항
슈퍼 간단한 브라우저의 가짜 같은 것을 만들려고 생각합니다.
구현하는 기능은 우선,
URL을 입력하면 그 페이지의 소스를 파싱하지 않고 그대로 취득해 화면에 표시한다
이것뿐입니다!
브라우저라고 부르기에는 너무나 훌륭하게 애플 리케이션이지만, 이번은 연습이라고 하는 것으로 용서해 주시지 않겠습니까.
따라서 구체적으로 필요한 기능으로,
GUI 관계
슈퍼 간단한 브라우저의 가짜 같은 것을 만들려고 생각합니다.
구현하는 기능은 우선,
URL을 입력하면 그 페이지의 소스를 파싱하지 않고 그대로 취득해 화면에 표시한다
이것뿐입니다!
브라우저라고 부르기에는 너무나 훌륭하게 애플 리케이션이지만, 이번은 연습이라고 하는 것으로 용서해 주시지 않겠습니까.
따라서 구체적으로 필요한 기능으로,
GUI 관계
기능
같은 곳입니까?
아티팩트
우선 만든 것은 이런 느낌의 앱(?)입니다. (이 페이지의 URL을 사용하고 있습니다.)
시작시 화면
URL 입력 후 「결정」버튼을 눌렀을 때
이런 느낌만입니다.
내용
코드적으로도 매우 간단합니다.
ltk_gui_test.lisp(ql:quickload :ltk)
(ql:quickload :drakma)
(ql:quickload :plump)
(ql:quickload :clss)
(setf drakma:*header-stream* *standard-output*)
(defparameter *contents* nil)
;;URLとHTMLタグを選択し,コンテンツを取得する
(defun get-html (hostname tag)
(let ((contents (car (map 'list (lambda (val) (plump:text val))
(clss:select tag
(plump:parse
(drakma:http-request hostname)))))))
(setf *contents* contents)))
(defun app ()
(ltk:with-ltk ()
(ltk:wm-title ltk:*tk* "最終的に簡易ブラウザを作ってみたいアプリ")
(let* ((lbl1 (make-instance 'ltk:label :text "URLの入力"
:width 10))
(entry (make-instance 'ltk:entry))
(btn (make-instance 'ltk:button :text "決定"))
(lbl2 (make-instance 'ltk:text :selectborderwidth 500)))
(ltk:pack lbl1)
(ltk:pack entry)
(ltk:pack btn)
(ltk:pack lbl2)
(ltk:bind btn "<ButtonRelease-1>"
(lambda (e)
(declare (ignore e))
(when (ltk:text lbl2)
(get-html (ltk:text entry) "body")
(setf (ltk:text lbl2) *contents*)))))))
입니다.
일단 간단하게 코드의 설명해 둡니다.
사용 라이브러리 정보
초기 설정(ql:quickload :ltk)
(ql:quickload :drakma)
(ql:quickload :plump)
(ql:quickload :clss)
(setf drakma:*header-stream* *standard-output*)
(defparameter *contents* nil)
보시다시피 라이브러리를 설치 한 후 drakma 용 스트림 설정.
*contents*는 나중에 검색할 페이지의 소스를 바인딩합니다.
사용 라이브러리 정보
(솔직히 각 라이브러리를 거의 알지 못합니다)
- drakma : HTTP 클라이언트 라이브러리
- plump : 문자열을 DOM으로 변환하는 라이브러리
- clss : 파서 라이브러리
페이지 소스 가져오기
지정된 URL의 소스 중에서 지정된 태그의 소스 만 검색(defun get-html (hostname tag)
(let ((contents (car (map 'list (lambda (val) (plump:text val))
(clss:select tag
(plump:parse
(drakma:http-request hostname)))))))
(setf *contents* contents)))
아무런 비틀림도 없습니다. 어쩌면 문자 코드 처리조차하지 않습니다.
drakma로 페이지의 소스를 취득해, plump로 DOM화, clss로 지정의 태그만 추출, plump로 캐릭터 라인화해 그것을 contents에 속박.
마지막으로 전역 변수의 *contents*에 바인딩합니다.
인터페이스 설계
마지막으로 인터페이스 구축입니다.
이번에 가장 하고 싶었던 것이 여기군요.
라고는 해도 이 사이트 에서 받은 느낌입니다만...
인터페이스 설명(defun app ()
(ltk:with-ltk ()
(ltk:wm-title ltk:*tk* "最終的に簡易ブラウザを作ってみたいアプリ")
(let* ((lbl1 (make-instance 'ltk:label :text "URLの入力"
:width 10))
(entry (make-instance 'ltk:entry))
(btn (make-instance 'ltk:button :text "決定"))
(lbl2 (make-instance 'ltk:text :selectborderwidth 500)))
(ltk:pack lbl1)
(ltk:pack entry)
(ltk:pack btn)
(ltk:pack lbl2)
(ltk:bind btn "<ButtonRelease-1>"
(lambda (e)
(declare (ignore e))
(when (ltk:text lbl2)
(get-html (ltk:text entry) "body")
(setf (ltk:text lbl2) *contents*)))))))
버튼 (btn)을 누르면 get-html이 시작되고, 엔트리 (entry)에 쓰여진 URL의 body 태그 내의 소스를 취득해, 그 내용을 텍스트 박스 (lbl2)에 전사하는 것뿐입니다.
결론
스스로 생각하는 부분이 적지 않습니까?
버그 투성이 위에 패키지 관리에 대해서도 이마이치 이해하고 있지 않기 때문에 낭비가 많습니다.
ltk라고 입력하는 것만 빨라졌습니다(^^;)
앞으로 약간의 GUI 구축을 Ltk로 할 수 있도록 공부하고 싶습니다, 네.
아, 공부하고 싶은 것들이 가득합니다 ...
읽어 주신 분, 교제해 주셔서 감사합니다!
Reference
이 문제에 관하여(시험에 Ltk로 쓰레기 같은 브라우저 (?) 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/dbym4820/items/cd54cf51bf9b52b539cf
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
코드적으로도 매우 간단합니다.
ltk_gui_test.lisp
(ql:quickload :ltk)
(ql:quickload :drakma)
(ql:quickload :plump)
(ql:quickload :clss)
(setf drakma:*header-stream* *standard-output*)
(defparameter *contents* nil)
;;URLとHTMLタグを選択し,コンテンツを取得する
(defun get-html (hostname tag)
(let ((contents (car (map 'list (lambda (val) (plump:text val))
(clss:select tag
(plump:parse
(drakma:http-request hostname)))))))
(setf *contents* contents)))
(defun app ()
(ltk:with-ltk ()
(ltk:wm-title ltk:*tk* "最終的に簡易ブラウザを作ってみたいアプリ")
(let* ((lbl1 (make-instance 'ltk:label :text "URLの入力"
:width 10))
(entry (make-instance 'ltk:entry))
(btn (make-instance 'ltk:button :text "決定"))
(lbl2 (make-instance 'ltk:text :selectborderwidth 500)))
(ltk:pack lbl1)
(ltk:pack entry)
(ltk:pack btn)
(ltk:pack lbl2)
(ltk:bind btn "<ButtonRelease-1>"
(lambda (e)
(declare (ignore e))
(when (ltk:text lbl2)
(get-html (ltk:text entry) "body")
(setf (ltk:text lbl2) *contents*)))))))
입니다.
일단 간단하게 코드의 설명해 둡니다.
사용 라이브러리 정보
초기 설정
(ql:quickload :ltk)
(ql:quickload :drakma)
(ql:quickload :plump)
(ql:quickload :clss)
(setf drakma:*header-stream* *standard-output*)
(defparameter *contents* nil)
보시다시피 라이브러리를 설치 한 후 drakma 용 스트림 설정.
*contents*는 나중에 검색할 페이지의 소스를 바인딩합니다.
사용 라이브러리 정보
(솔직히 각 라이브러리를 거의 알지 못합니다)
- drakma : HTTP 클라이언트 라이브러리
- plump : 문자열을 DOM으로 변환하는 라이브러리
- clss : 파서 라이브러리
페이지 소스 가져오기
지정된 URL의 소스 중에서 지정된 태그의 소스 만 검색
(defun get-html (hostname tag)
(let ((contents (car (map 'list (lambda (val) (plump:text val))
(clss:select tag
(plump:parse
(drakma:http-request hostname)))))))
(setf *contents* contents)))
아무런 비틀림도 없습니다. 어쩌면 문자 코드 처리조차하지 않습니다.
drakma로 페이지의 소스를 취득해, plump로 DOM화, clss로 지정의 태그만 추출, plump로 캐릭터 라인화해 그것을 contents에 속박.
마지막으로 전역 변수의 *contents*에 바인딩합니다.
인터페이스 설계
마지막으로 인터페이스 구축입니다.
이번에 가장 하고 싶었던 것이 여기군요.
라고는 해도 이 사이트 에서 받은 느낌입니다만...
인터페이스 설명
(defun app ()
(ltk:with-ltk ()
(ltk:wm-title ltk:*tk* "最終的に簡易ブラウザを作ってみたいアプリ")
(let* ((lbl1 (make-instance 'ltk:label :text "URLの入力"
:width 10))
(entry (make-instance 'ltk:entry))
(btn (make-instance 'ltk:button :text "決定"))
(lbl2 (make-instance 'ltk:text :selectborderwidth 500)))
(ltk:pack lbl1)
(ltk:pack entry)
(ltk:pack btn)
(ltk:pack lbl2)
(ltk:bind btn "<ButtonRelease-1>"
(lambda (e)
(declare (ignore e))
(when (ltk:text lbl2)
(get-html (ltk:text entry) "body")
(setf (ltk:text lbl2) *contents*)))))))
버튼 (btn)을 누르면 get-html이 시작되고, 엔트리 (entry)에 쓰여진 URL의 body 태그 내의 소스를 취득해, 그 내용을 텍스트 박스 (lbl2)에 전사하는 것뿐입니다.
결론
스스로 생각하는 부분이 적지 않습니까?
버그 투성이 위에 패키지 관리에 대해서도 이마이치 이해하고 있지 않기 때문에 낭비가 많습니다.
ltk라고 입력하는 것만 빨라졌습니다(^^;)
앞으로 약간의 GUI 구축을 Ltk로 할 수 있도록 공부하고 싶습니다, 네.
아, 공부하고 싶은 것들이 가득합니다 ...
읽어 주신 분, 교제해 주셔서 감사합니다!
Reference
이 문제에 관하여(시험에 Ltk로 쓰레기 같은 브라우저 (?) 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/dbym4820/items/cd54cf51bf9b52b539cf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)