2009-07-27 6 views
0

나는 간단한 내용 ()을 사용하여 구문 분석 및 저장을위한 자바 클래스를 생성합니다. CSS 스타일 시트. 이 클래스는 CSS 선택자를 사용하여 비 -HTML 객체를 그리는 데 사용됩니다. 내 순진한 접근 방식은 기본적으로이 스타일 시트를 저장하려면자바 용 CSS 클래스

Map<String,Map<String,Object>> 

을 사용하는 것입니다. 이 정보를 저장하는 다른 방법 (영리한)이 될 수 있습니까?

+0

나는 당신이하려는 것을 정말로 이해하지 못합니다. "CSS 선택자를 사용하여 비 -HTML 객체를 페인트하는 방법"은 무엇입니까? 지도에 어떤 문자열과 물체가 있을까요? 이 방법을 사용하는 –

+0

의 경우 현재 요소에 적용 할 스타일을 어떻게 빨리 알 수 있습니까? – geowa4

+1

@ 마이클 : 그는 자신의 UI를 "스킨"하기 위해 CSS를 사용하려고합니다. – geowa4

답변

0

다음과 같은 경우에 충분해야합니다.1. "개체"주위에 클래스 계층 구조를 만들 계획입니다. "Color", "BackgroundInformation"등이 있습니다. 오른쪽에 나타날 수있는 것들이 많이 있습니다. 2. CSS 선택기를 구문 분석하고 빌드 할 수있는 Object로 먼저 "String"을 대체해야합니다. 유사 주위 로직, (1) 내가 좋아하는 무언가를 추천 할 것입니다

1

: CSSValue 당신이 CSSColor, CSSNumber, CSSString, CSSList<CSSValue> 같은 것들로 확장됩니다 추상 클래스 또는 인터페이스입니다

Map<String, Map<String, CSSValue>> 

.

이렇게하면 코드가 훨씬 깨끗해집니다.

4

물론 질문은 무엇입니까? 왜?

CSS 파서 (적어도 견고한 파서)는 중요하지 않습니다. 수입품, @media, 브라우저 별 지시문 등을 준비해야합니다. 하지만 나는 너를 모으고있다.

그럼 뭐하고 있니?

너무 값이 너무 일반적인 개체입니다. 몇 가지 공통 기본 클래스가 있고 하위 클래스가 다음을 나타냅니다.

  • 단일 값 (숫자 및 측정 단위 (백분율 포함));
  • 문자열 목록 (예 : font-family);
  • 복합/복합 값 (예 : 테두리 및 배경 지원).
  • URL;
  • 열거 된 값 (예 : 접기 또는 테두리 붕괴를위한 분리). 및
  • 등등.

즉, 결과의 유효성을 검사한다고 가정합니다.

+0

감사합니다. 흥미로운 의견입니다. – Pierre

1

이것은 매우 순진한 해결책입니다. 당신이 CSS selector의 같은 문자열을 사용하는 경우

  • 것은, 주어진 항목에 대한 올바른 선택인지 결정하기 어려울 것 : 여기가 내 머리 위로 떨어져 생각할 수 그것으로 결함이다. 클래스에서 그 기능을 포장하는 것이 더 좋습니다.
  • 내장 된지도는 하나의 일치하는 요소 만 제공하지만 CSS의 핵심은 모든 요소가 하나의 요소에 적용되는 여러 스타일을 계단식으로 연결할 수 있다는 것입니다. 일치하는 모든 스타일을 검색 할 수있는 방법이 필요합니다.
  • 개체를 사용하는 것은 좋지 않습니다.모든 스타일을 확장 할 인터페이스 또는 추상 클래스를 만듭니다. 타입 캐스팅이 적어지고 공유 기능을 푸시 다운 할 수 있다는 이점이 있습니다.

나는 모두 CSSMap<CSSSelector, List<CSSStyle>>과 같은 역할을합니다.

1

이 모델은 Map으로 모델링되었지만 이 아니며 Map이 아닙니다. 및 CSSStyles 및 모든 주변 기능을 포함하는 CSS 개체가 필요합니다.

스타일이 어떻게 캐스케이드으로 결정되는지와 같은 추가 기능을 제공합니다. 다른 측정 값을 처리, 유효화 입력 등 CSS 시트와 관련된 모든 기능이이 객체에 포함됩니다. 아마도 그것의 일부로 .css를 파싱하는 것입니다 (조심하지 않으면 공장에 대한 토론을 시작합니다).

기본 구현에는지도가 포함될 수 있지만이 객체가 수행해야하는 작업에 대해 먼저 생각해야한다고 생각합니다.

간단히 말해 Map 인 경우 추가 기능이 없습니다. 아니면 오히려 어디로 가나 요?

1

나는 CSS를 사용하고있는 것처럼 가장하지 않는 것 같아요. 넌 아니야. CSS 셀렉터는 여러분이 묘사하는 것보다 훨씬 더 복잡하며 실제 CSS 파서/정규 표현식을 사용할 수 있더라도 HTML이 아닌 데이터에 실제 CSS를 적용하려는 많은 열린 질문과 모순에 빠질 가능성이 큽니다.

그래서 CSS와 유사한 기능의 작은 하위 집합, 즉 직접 선택자 만 있으면됩니다. 이를 위해 Pesto와 jjnguy가 유형 안전성을 높이는 것이 더 나을 것이라고 말한 것처럼 중첩 된지도 구조는 괜찮습니다.

당신이 대답 할 수있는 나머지 질문은 : 자신의 파서를 작성해야하는 의사 CSS 구문으로 스타일 정보를 표현하는 것이 실제로 이치에 맞습니까? 스타일 정보를 쓰는 사람은 누구입니까? 그들은 CSS에 익숙합니까? 그렇다면 더 복잡한 선택자를 사용할 수 없다는 것에 짜증을 내지 않습니까? 그렇지 않다면 CSS처럼 보이게하기 위해 모든 노력을 기울여야합니다. 속성 파일과 같은 간단한 것을 사용하지 않거나 XML 또는 JSON과 같은 기존 구문 분석기를 사용하여 더 많은 구조체를 원한다면 어떻습니까?

1

나는 당시에해야 할 일에 적합한 작은 규모로 비슷한 일을했다.

먼저 나는 클래스 계층 구조로이를 했어야하지만 내 목적으로이 전에 필요하지 않았다

private enum TextAlignment { 

    LEFT, 
    RIGHT, 
    CENTER, 
    JUSTIFY, 
    NONE; 
} 

private enum TextDecoration { 
    BLINK, 
    UNDERLYIN, 
    OVERLINE, 
    LINE_THROUGH, 
    NONE; 
} 

내가

예에 관심이있는 모든 일반적인 스타일 속성에 대한 열거 형을 사용 태그 포맷하기 단순히 포맷터 함수에 태그에 적용 할 스타일 목록을 보냈습니다.

일련의 case 문은 style 요소에 스타일을 추가하고 html 형식의 태그를 다시 문자열로 반환합니다.

private String tag(String tag ,String data, TextAlignment aline, boolean bold, Color bgColor, Color fgColor, boolean blink) { 
    StringBuilder sb = new StringBuilder(data.length() + 128); 
    sb.append("<"); 
    sb.append(tag); 
    sb.append(" style=\""); 

    switch (aline) { 
     case NONE: 
      break; 
     default: 
      sb.append("text-align:"); 
      sb.append(aline.toString().toLowerCase()); 
      sb.append(";"); 
      break; 

    } 

    if (fgColor != null) { 
     sb.append("color:"); 
     String rgb = Integer.toHexString(fgColor.getRGB()); 
     sb.append(rgb.substring(2, rgb.length())); 
     sb.append(";"); 

    } 

    if (bgColor != null) { 
     sb.append("background-color:"); 
     String rgb = Integer.toHexString(bgColor.getRGB()); 
     sb.append(rgb.substring(2, rgb.length())); 
     sb.append(";"); 
    } 

..........

당신은 아이디어를 얻습니다.