2009-10-19 2 views
1

파이어 폭스 검색과 같이 강조 표시하기 위해 CSS 속성과 '일치'를 꾸미기 위해 중첩 태그가있는 일부 HTML 텍스트를 변환해야합니다. 나는 단순히 대체 할 수 없다. (예를 들어 사용자가 "img"를 검색했다면) 태그 속성이 아닌 본문 텍스트 내에서 바꾸기 만하면된다. 나는이 문제를 디버깅 할 때Swing Parser의 handleText가 중첩 된 태그를 처리하지 않는 이유는 무엇입니까?

final Pattern pat = Pattern.compile(srch, Pattern.CASE_INSENSITIVE); 
Matcher m = pat.matcher(output); 
if (m.find()) { 
    final StringBuffer ret = new StringBuffer(output.length()+100); 
    lastPos=0; 
    try { 
     new ParserDelegator().parse(new StringReader(output.toString()), 
     new HTMLEditorKit.ParserCallback() { 
      public void handleText(char[] data, int pos) { 
       ret.append(output.subSequence(lastPos, pos)); 
       Matcher m = pat.matcher(new String(data)); 
       ret.append(m.replaceAll("<span class=\"search\">$0</span>")); 
       lastPos=pos+data.length; 
      } 
     }, false); 
     ret.append(output.subSequence(lastPos, output.length())); 
     return ret; 
    } catch (Exception e) { 
return output; 
    } 
} 
return output; 

이 내 문제는,의 handleText이 태그를 포함하는 텍스트를 호출지고있다 :

는 내가이 작업을 수행해야한다고 생각 아주 간단한 HTML 파서를 가지고! 마치 한 단계 깊숙이 들어가는 것과 같습니다. 왜 그런지 알아? 중첩 된 태그의 '적절한'동작을 가능하게하기 위해 HTMLParser에해야 할 일이 있습니까 (많이 사용하지 않았습니까?)?

PS - 나 자신을 알아 냈습니다. 아래 답변을 참조하십시오. 짧은 대답은 사전에 이스케이프 처리 된 HTML이 아닌 HTML을 전달하면 잘 동작합니다. 도! 희망이 다른 사람을 도와줍니다.

<span>example with <a href="#">nested</a> <p>more nesting</p> 
</span> <!-- all this gets thrown together --> 
+0

'handleText'에 대한 API 문서와 일치 ... –

답변

0

XP에서 JDK6을 사용하여 정상적으로 작동하는 것 같습니다. 머리글과 본문 태그로 견본 HTML을 감 쌉니다.

A) 예 B 와) C 중첩) 더 중첩 여기

내가 사용하는 코드는 다음과 같습니다 : I 출력의 세 가지 라인있어 오해의 소지가 질문에 대한

import java.io.*; 
import java.net.*; 
import javax.swing.text.html.parser.*; 
import javax.swing.text.html.*; 

public class ParserCallbackText extends HTMLEditorKit.ParserCallback 
{ 
    public void handleText(char[] data, int pos) 
    { 
     System.out.println(data); 
    } 

    public static void main(String[] args) 
     throws Exception 
    { 
     Reader reader = getReader(args[0]); 
     ParserCallbackText parser = new ParserCallbackText(); 
     new ParserDelegator().parse(reader, parser, true); 
    } 

    static Reader getReader(String uri) 
     throws IOException 
    { 
     // Retrieve from Internet. 
     if (uri.startsWith("http:")) 
     { 
      URLConnection conn = new URL(uri).openConnection(); 
      return new InputStreamReader(conn.getInputStream()); 
     } 
     // Retrieve from file. 
     else 
     { 
      return new FileReader(uri); 
     } 
    } 
} 
+0

확인에 도움이되는 문제에 대한 감사의 말을 남긴 Camickr에게 감사드립니다. 더 나은 테스트 케이스를 제공하지 않아 죄송합니다. 테스트 코드를 통해 샘플을 실행하려고 할 때 문제가 발견되어 도움이되었습니다. - 짐 피 –

0

미안 - 내가 찾아 내 문제가 있었고 내 설명에 포함되지 않았습니다. 입력 문자열이 사전 처리되어 텍스트를 보았습니다.

<span>example with &lt;a href="#"&gt; nested &gt;/a&lt; &gt;p&lt;more nesting&gt;/p&lt; 
</span> <!-- well of course it all gets thrown together --> 
관련 문제