2014-07-25 4 views
0

PageDown을 사용하여 내 사이트의 사용자가 댓글, 블로그 게시물 등을 추가 할 수있게했습니다. 서버 측에서 Java를 사용하고 있습니다 (구체적으로 봄). 데이터베이스에서 PageDown 편집기의 출력은 정상적으로 처리됩니다.편집기에서 Pagedown의 렌더링 마커 다운

이제 마크 업을 읽고 의견과 블로그 게시물을 편집자가 아닌 HTML로 사이트에서 렌더링해야합니다.

PageDown 변환기에는 html로 클라이언트 측에서 호출 할 수있는 makeHtml() 함수가 있습니다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<html> 
<head> 
<title>PageDown Test</title> 

<link rel="stylesheet" type="text/css" href="PageDown/demo.css" /> 

<script type="text/javascript" src="PageDown/Markdown.Converter.js"></script> 
<script type="text/javascript" src="PageDown/Markdown.Sanitizer.js"></script> 
<script type="text/javascript" src="PageDown/Markdown.Editor.js"></script> 
<script type="text/javascript">var converter = Markdown.getSanitizingConverter();</script> 
</head> 

<body> 
    <h1>PageDown Test</h1> 
    <script type="text/javascript">document.write(converter.makeHtml('${input}'));</script> 
</body> 
</html> 

$ {입력} 변수 형태로 사용자가 제출 한 가격 인하를 포함 : 나는 함께 약간의 테스트를 넣었습니다. 그러나 입력이 여러 줄이면 대부분 중단됩니다.

내 다음 옵션은 서버 측에서이 작업을 수행하는 것입니다. 내 서버는 모두 Java이고 Java로 구현 된 PageDown.Sanitizer를 찾을 수 없기 때문에 자바에서 자바 스크립트 라이브러리를 호출해야합니다.

나는 마크 다운을 클라이언트에 렌더링하는 표준 방법으로 인터넷 검색을 시도했지만 마크 업 편집기를 계속 사용하고 있는데, 나는 이미 작동하고있다. 클라이언트 쪽에서 또는 서버 쪽에서 (자바에서) 이렇게하는 표준 방법이 있습니까?

나는 무엇을하고 있는지 전혀 모른다. 그래서 어떤 충고도 받아 들여진다.

+0

PageDown 사람들에게 어떻게 이런 질문을 했습니까? 또한, ** 왜 ** 마크 다운을 렌더링하려고합니까? 있는 그대로 서버 측에 저장해서는 안되며 클라이언트로 전송해야합니까?요청하면 PageDown에서 렌더링하는 표준 방법이있을 것입니다. – markspace

+0

답장을 보내 주셔서 감사합니다. 나는 PageDown이 StackOverflow가 사용하는 것만 큼 (StackOverflow가 사용하는 것) 충분히 인기가 있다고 생각했다. 그리고 markdown을 클라이언트 쪽에서 ** sanitized ** html로 변환하려고합니다. 나는 그것을 서버에 그대로 보관하고있다. 그 부분이 끝났습니다. 이제는 클라이언트에게 출력을 시도하고 있습니다 (편집자가 아닌 독서). –

+0

** "sanitized"**는 무엇을 의미합니까? – markspace

답변

0

내가 무슨 일이 일어 났는지 모르겠지만 아무도 다른 사람이 아직없는 것 같아서 여기에 아이디어가 있습니다.

나는 source to the sanitizer you mentioned을 찾았으며 허용되는 태그의 흰색 목록의 정규식 일뿐입니다. 솔직히 말하면 다른 모든 것은 거부됩니다.

// (tags that can be opened/closed) | (tags that stand alone) 
var basic_tag_whitelist = /^(<\/?(b|blockquote|code|del|dd|dl|dt|em|h1|h2|h3|i|kbd|li|ol|p|pre|s|sup|sub|strong|strike|ul)>|<(br|hr)\s?\/?>)$/i; 
// <a href="url..." optional title>|</a> 
var a_white = /^(<a\shref="((https?|ftp):\/\/|\/)[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+"(\stitle="[^"<>]+")?\s?>|<\/a>)$/i; 

// <img src="url..." optional width optional height optional alt optional title 
var img_white = /^(<img\ssrc="(https?:\/\/|\/)[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+"(\swidth="\d{1,3}")?(\sheight="\d{1,3}")?(\salt="[^"<>]*")?(\stitle="[^"<>]*")?\s?\/?>)$/i; 

저는 이것을 자바 정규식으로 변환하는 것이 너무 어렵다고 생각하지 않습니다. 여기에 첫 번째 정규식 문자열을 사용합니다.

Pattern white = Pattern.compile("^(<\\/?(b|blockquote|code|del|dd|dl|dt|em|h1|h2|h3|i|kbd|li|ol|p|pre|s|sup|sub|strong|strike|ul)>|<(br|hr)\\s?\\/?>)$"); 

    String test = "foo<p>bar"; 
    Matcher matcher = white.matcher(test); 
    for(int i = 0;;) { 
    int start = test.indexOf("<",i); 
    if(start < 0) break; 
    int end = test.indexOf(">", start); 
    if(end < 0) break; 
    matcher.region(start, end+1); 
    System.out.println(test.subSequence(start, end)); 
    System.out.println(matcher.matches()); 
    i = end; 
    } 

흰색 태그가 발견되면 "true"를 출력합니다. 그렇지 않으면 첫 번째 '<'을 '& lt;'이되도록 mangle해야합니다. (HTML 리터럴을 입력 할 수 없습니다. PageDown :-)에서 버그를 찾은 것 같아요.

인바운드 (게시) 경로 또는 아웃 바운드 (가져 오기) 경로에서이 작업을 수행할지 여부는 사용자에 따라 다르지만, 후자는 사용자에게 화이트 목록을 조정할 수있는 기능을 제공하므로 더 유연 할 수 있습니다 사용자 권한 또는 나중에 화이트리스트로의 변경.

행운을 비네.

편집 :

원하는 사항 : 자바에서 자바 스크립트를 실행할 수 있습니다. Oracle JDK는 Nashorn JavaScript engine built in입니다. 변수를 앞뒤로 전달할 수 있도록 바인딩을 사용하여 작업해야 할 것입니다.

Open JDK에는 JavaScript 엔진이 포함되어 있는지 잘 모릅니다. 나는 그렇게 생각하지 않는다. 아직 진행 중입니다.

+0

고마워, 나는 이것을 시험해 보겠다. 나는 좀 더 "표준적인"접근법을 원했지만, 나는 분명히 뭔가 빠져 있다고 가정했다. 나는 PageDown 위생이 코드 블록 내부에있는 html 태그를 만지지는 않지만, 코드가 코드를 제거 할 것이라고 생각하는 반면, 이것이 지나치게 단순화 된 것 같습니다. 그래서 필자는 직접 구문 분석을 수행하는 대신 표준 솔루션을 원했습니다. –

+0

또한 ScriptEngine 클래스를 사용하여 자바에서 자바 스크립트를 확실히 호출 할 수 있습니다. 사실이 잘 작동하지만 서버에서 모든 처리를 수행하는 것이 이상하게 보입니다. 그것이 실제로가는 길이라면 나는 징징 대는 것을 멈추고 그냥 그렇게 할 것입니다. 하하. –