pagedesk¶
/usr/local/m2/setting.json 다음 영역에 대해 기술한다.
{
"functions": {
"contents": {
"pagedesk": {
...
}
}
}
}
How to use¶
명령어 리스트¶
명령어 |
파라미터 |
동작 |
|---|---|---|
|
|
기본편집 기능인 https://example.com/view.html/pagedesk/edit/default
|
|
|
POST /pagedesk/edit/query HTTP/1.1
Host: example.com
Content-Type: text/plain
Content-Length: 2043
<html>
<body>
...
</body>
</html>
|
|
|
HTML 원본이 없는 경우, 사전 정의된 템플릿으로 HTML을 생성한다. {url}/pagedesk/edit/default/template/{name}
# 이미지 원본 요청시 템플릿을 사용하여, HTML을 생성한다.
https://example.com/image.jpg/pagedesk/edit/default/template/imgtpl
|
|
|
원본 HTML 중 셀렉터의 영역을 추출하여, HTML을 생성한다. # default 옵션 사용시 dom.extract 설정에 따른다.
https://example.com/view.html/pagedesk/edit/default/extract/default
# 인라인 명령시 설정값은 무시한다. 물론 설정 활성화는 필수이다.
# :id - id 영역추출
# .class - class 영역추출
# tag - tag 영역추출
https://example.com/view.html/pagedesk/edit/default/extract/selector=:id
# attribute
https://example.com/view.html/pagedesk/edit/default/extract/selector=iframe;attribute=srcdoc
# includeSelf
https://example.com/view.html/pagedesk/edit/default/extract/selector=div;includeSelf=true
|
함수 결과물 안내¶
이 함수는 HTML 원본을 편집하는 목적으로 개발되었으며, 함수가 만들어 낸 결과물의 첫 줄에 다음과 같은 주석이 포함된다.
# Content-Type: text/html
<!-- // through m2 pagedesk // -->
<html>
<head>
...
</head>
<body>
...
</body>
</html>
# Content-Type: application/json
{
"prddesc": "<!-- // through m2 pagedesk // --><html><head></head><body></body></html>"
}
위 주석을 통해 pagedesk가 만들어낸 결과물임을 태깅한다.
만약 pagedesk가 획득한 원본에 위 주석이 존재한다면, 이미 처리된 것으로 간주하여 추가 편집하지 않는다.
meta¶
"meta" : {
"enable" : false,
"keyword": "pagedesk",
"maxSourceSize": 1,
"maxDomSourceSize": 0
}
enable (기본: false)pagedesk 활성화
keyword (기본: pagedesk)pagedesk 키워드
maxSourceSize (기본: 1MB)처리가능한 최대 원본 텍스트 크기 (단위: MB)
maxDomSourceSize (기본: 0MB)dom 기능동작이 가능한 최대 원본 텍스트 크기 (단위: MB).
0인 경우maxSourceSize를 사용한다.
template¶
클라이언트 요청 시 원본없이 요청 정보만으로 사전 정의된 문서를 생성한다.
"template": {
"enable": false,
"list": [
{
"name": "imgtpl",
"type": "html",
"body": "<div><img src='${URL}'></div>"
}
]
}
enable (기본: false)기능 활성화
list¶
템플릿 정의 후 /template/[name] 명령어를 통해 선택한다.
name템플릿 명
type (기본: html)문서 타입을 정의한다.
html요청 Content-Type을text/html로 정의한다.json요청 Content-Type을application/json으로 정의한다.
body문서 본문을 정의한다.
아래 예약어를 사용할 수 있다.
예약어
설명
표현 예
실행 예
URL
요청 URL
${URL}https://foo.com/dir/image.jpg?seq=1234
replace¶
{
"functions": {
"contents": {
"pagedesk": {
"replace": {
...
}
}
}
}
}
pre¶
소스가 유입되는 시점에 문자열을 치환한다.
"pre": {
"enable" : false,
"list" : [
{
"src": "://foo.com/",
"dest": "://new.foo.com/"
},
{
"src" : ".bar.com/image/",
"dest" : ".bar.com/s3/image/",
"flags": "gi"
}
]
}
enable (기본: false)문자열 사전치환 활성화
list문자열 치환 리스트
src대상 문자열
dest반환 문자열
flags (기본: g)
post¶
모든 가공이 완료된 후 응답되기 직전에 문자열을 치환한다.
"post": {
"enable" : false,
"list" : [
{
"src" : "://foo.com/",
"dest" : "://new.foo.com/"
},
{
"src" : ".bar.com/image/",
"dest" : ".bar.com/s3/image/"
}
]
}
enable (기본: false)문자열 사후치환 활성화
list문자열 치환 리스트
src대상 문자열
dest반환 문자열
flags (기본: g)
html¶
"enable" : false
enable (기본: false)텍스트 html 문서를 인식한다. 이 모듈이 정상적으로 로딩되어야 dom 처리가 가능하다.
in¶
replace.pre 가 수행된 텍스트를 html 소스로 입력시킨다.
"in": {
"at": null,
"escaped": true
}
at텍스트가 HTML이 아닌 경우(i.e.
JSON), HTML의 위치 지시자escapedtrue라면 소스 텍스트가 escape character 치환 처리가 된 것으로 인지하여 unescape 처리한다.
out¶
처리가 완료된 html의 출력형태를 구성한다.
"out": {
"at": null,
"escaped": true
}
at편집된 HTML을 소스 텍스트의 위치 지시자에 삽입한다. 이 값이
null이라면 편집된 HTML이 출력 텍스트가 된다.escapedtrue라면 소스 텍스트에 삽입전 escape 처리한다.
dom¶
DOM(Document Object Model)에 기반하여 태그를 추가/삭제한다.
{
"functions": {
"contents": {
"pagedesk": {
"dom": {
...
}
}
}
}
}
extract¶
extract 명령어 지원을 위한 설정. DOM 생성 직후 실행한다.
"extract" : {
"enable": false,
"selector": "#productDetail",
"attribute": null,
"includeSelf": false
}
enable (기본: false)요소 추출 활성화
selector (기본: null)추출 대상 셀렉터
attribute (기본: null)대상 요소의 속성에서 추출
includeSelf (기본: false)추출 대상에 셀프 요소 포함 여부
# 원본
<section>
<iframe srcdoc="<div><img src=image.jpg></div>">
</section>
# selector=section
<iframe srcdoc="<div><img src=image.jpg></div>">
# selector=section; includeSelf=true
<section>
<iframe srcdoc="<div><img src=image.jpg></div>">
</section>
# selector=iframe; attribute=srcdoc
<div><img src=image.jpg></div>
insert¶
"insert" : {
"enable" : false,
"action": "appendChild",
"list" : [
{
"selector" : "#aa.b.c",
"action" : "appendChild",
"html" : "<p>this is sample</p>"
}
]
}
enable (기본: false)태그삽입 활성화
action (기본: appendChild)태그삽입 위치
appendChild대상 노드의 마지막 child로 삽입insertBefore대상 노드의 이전 sibling으로 삽입insertAfter대상 노드의 다음 sibling으로 삽입wrapInnerHtml대상 노드의 모든 자식 노드를html로 감싼다.<div id="desc"> <h3>Heading</h3> <p>Paragraph</p> </div>
<div id="desc">하위 태그를 감싸고 싶다면 아래와 같이 설정한다.{ "selector" : "#desc", "action" : "wrapInnerHtml", # wrapInnerHtml 에서는 닫는 태그를 넣지 않는다. "html" : "<div id="wrapdesc">" # 넣더라도 무시된다. }
위 설정을 통해 출력되는
DOM은 다음과 같다.<div id="desc"> <div id="wrapdesc"> <h3>Heading</h3> <p>Paragraph</p> </div> </div>
list태그 삽입 리스트
selector셀렉터
action이 아이템에만 적용할 태그 삽입위치. 생략시 상위 레벨의
action값 사용.html삽입할 html 태그
remove¶
"remove" : {
"enable" : false,
"includeChild" : true,
"elements" : [
"applet",
"acronym",
"bgsound",
"dir",
"frame",
"frameset",
"noframes",
"hgroup",
"isindex",
"listing",
"nextid",
"noembed",
"strike",
"xmp",
"basefont",
"big",
"blink",
"center",
"font",
"marquee",
"menu",
"menuitem",
"multicol",
"nobr",
"spacer",
"tt",
"rb",
"rtc"
]
}
enable (기본: false)태그삭제 활성화
includeChild (기본: true)자식태그 포함 삭제 기본 값
elements삭제할 태그목록
Note
만약 태그별로 자식포함 includeChild 를 조절하고 싶다면 다음과 같이 객체표현으로 지정가능하다.
"remove" : {
"enable" : false,
"includeChild" : true,
"elements" : [
"applet",
{"tag": "acronym", "includeChild" : false},
"bgsound",
{"tag": "dir", "includeChild" : true}
... (생략 )...
]
}
anchor¶
"anchor": {
"enable": false,
"enableLink": true,
"target": {
"framename": "_blank",
"overwrite": true
}
}
enable (기본: false)<a> 태그 컨트롤
enableLink (기본: true)false라면 href 속성을 삭제한다.
target (기본: _blank)<a target> 속성을 처리한다.
framenamenull인 경우 target을 정의하지 않는다._blank|_self|_parent|_top브라우저 예약어를 정의한다.[framename]그 외 사전 정의된 프레임 명을 삽입한다.
overwritetrue항상framename을 삽입한다.false원본 target 부재시 삽입한다.
matchingList (기본: [])매칭 리스트
domain도메인 매칭 패턴
Note
만약
example.com도메인에만 <a> 태그의 링크 기능을 설정하려면matchingList를 사용한다."anchor": { "enable": true, "enableLink": false, "matchingList": [ { "domain": "(.*).example.com", "enableLink": true, "target": { "framename": "_self" } } ] }
refctrl¶
상품기술서 등 HTML 본문에서 참조되는 임의의 리소스가 허가된 도메인이 아닐 경우(또는 해당할 경우) 참조되지 않도록 상품기술서를 변경한다.
"refctrl" : {
"enable" : false,
"mode" : "whitelist",
"domains" : [ "www.youtube.com", "youtu.be" ],
"tags" : [
{
"name" : "iframe",
"attr" : "src",
"action" : "removeTag"
},
{
"name" : "embed",
"attr" : "src",
"action" : "removeAttr",
"domains" : [ "www.safe.com" ],
}
]
}
참조되는 리소스(i.e src 또는 href 등) 에 대해 domains 필드에 기반하여 리소스 참조 정책을 수정한다.
enable (기본: false)참조소스 제어 활성화 설정.
true인 경우에만 참조 소스를 제어한다.mode도메인 목록인
domain설정 사용 정책whitelist (기본)도메인 목록에 존재하지 않는 리소스 참조만 허용한다. 다시 말해 존재하지 않는다면 수정한다.blacklist도메인 목록에 존재하는 리소스만 수정한다.
domains대상 도메인 목록. 문자열 배열이다.
tags수정대상 태그와 속성, 정책 세트를 구성한다.
name태그 명칭attr태그가 리소스를 참조하는 속성. 예를 들어<iframe>의 경우src속성이며,<a>의 경우href이다.action수정 정책. 다음 값 중 하나를 가진다.removeTag (기본)해당 태그를 삭제한다.removeAttr해당 속성을 삭제한다.replaceAttr속성명을 변경한다. 값은 그대로 유지된다.insertAttr추가 속성을 삽입한다.
domains (기본: null)이 태그.속성에 한정하여 적용할 도메인 목록
다음과 같이 HTML 내 알 수 없는 리소스를 <iframe> 으로 참조하는 경우 이를 제어하는 방법에 대해 설명한다.
<p>foo bar</p>
<iframe width="560" height="315" src="https://foo.com/embed/xW95ui6xDNM" title="Unknown video player" allowfullscreen></iframe>
<hr>
다음은 YouTube를 제외한 어떠한 <iframe> 참조도 허용하지 않는 설정이다.
# functions.contents.pagedesk.dom
"refctrl" : {
"enable" : true,
"mode" : "whitelist",
"domains" : [ "youtube.com", "www.youtube.com" ],
"tags" : [
{
"name" : "iframe",
"attr" : "src",
"action" : "removeTag"
}
]
}
Note
위 설정에서 "mode" : "blacklist" 으로 설정한다면 YouTube에 대해서만 태그를 수정한다로 의미가 변경된다.
tags.action 값에 따라 태그가 수정 정책을 정교하게 구성한다.
"action" : "removeTag"해당 태그를 삭제한다. 아래와 같이<iframe>태그가 삭제된다.<p>foo bar</p> <hr>
"action" : "removeAttr"해당 태그의 속성을 삭제한다. 아래와 같이attr필드의 값으로 설정한src속성이 삭제된다.<p>foo bar</p> <iframe width="560" height="315" title="Unknown video player" allowfullscreen></iframe> <hr>
"action" : "replaceAttr"해당 태그의 속성 값을 교체한다. 아래와 같이src속성이alt속성으로 대체되었다.<p>foo bar</p> <iframe width="560" height="315" alt="https://foo.com/embed/xW95ui6xDNM" title="Unknown video player" allowfullscreen></iframe> <hr>
대체 속성은 추가적으로
replaceAttr필드를 참조한다.{ "name" : "iframe", "attr" : "src", "action" : "replaceAttr", "replaceAttr" : "alt" }
"action" : "insertAttr"설정된 속성을 추가로 태그에 삽입한다. 아래와 같이 추가속성을 통해 해당 태그가 노출되지 않도록 수정한다.<p>foo bar</p> <iframe width="560" height="315" src="https://foo.com/embed/xW95ui6xDNM" style="display:none;" alt="hidden by m2" title="Unknown video player" allowfullscreen></iframe> <hr>
이를 위해 덧붙여질
insertAttr속성 리스트를 추가 구성해야 한다.{ "name" : "iframe", "attr" : "src", "action" : "insertAttr", "insertAttr" : [ { "name": "style", "value": "display:none;" }, { "name": "alt", "value": "hidden by m2;" } ] }