2009-07-27 33 views
0

我正在創建一個java類來解析和存儲簡單的CSS樣式表的內容。該類將用於使用CSS選擇器繪製非html對象。我天真的做法是基本上使用一個一個用於Java的CSS類

Map<String,Map<String,Object>> 

來存儲這個樣式表。 這是存儲這些信息的任何(聰明的)方式嗎?

+0

我真的不明白你要做什麼。你如何「使用CSS選擇器繪製非html對象」?什麼字符串和對象會在你的地圖中? – 2009-07-27 14:09:15

+0

用這種方法,你怎麼會很快知道什麼風格適用於你的當前元素? – geowa4 2009-07-27 14:10:37

回答

0

這應該是足夠的,如果你: 1.計劃圍繞你的「對象」建立類層次結構,例如「顏色」,「背景信息」等,因爲有很多可能出現在右邊的東西 2.我認爲你應該用一些能夠解析CSS選擇器的對象替換第一個「字符串」並建立起來圍繞它的邏輯,類似於(1)

1

我建議是這樣的:

Map<String, Map<String, CSSValue>> 

CSSValue是一個抽象類或接口,你將事情擴大像CSSColorCSSNumberCSSStringCSSList<CSSValue>

這將使您的代碼更清潔。

4

問題當然是:爲什麼?

一個CSS解析器(至少一個健壯的)是不平凡的。您需要迎合導入,@media,瀏覽器特定指令等等。但我認爲你不是追求強大的東西。

那麼你在追求什麼?

對象太過於普通了。有一些共同的基類和子類來表示:

  • 單個值(數字加上可選的度量單位,包括百分比);
  • 字符串列表(例如font-family);
  • 複合/複合值(如邊框和背景支持);
  • 網址;枚舉值(例如摺疊或分離邊界摺疊);和
  • 等。

也就是說,假設您要驗證結果。

1

這是一個非常天真的解決方案。下面是我能想到的缺點:

  • 如果您使用字符串作爲CSS選擇器,將很難確定它是否是給定項目的有效選擇器。最好在課堂中包裝這個功能。
  • 內置地圖只會給你一個匹配元素,但CSS的一點是你可以級聯多個樣式,這些樣式都適用於一個元素。您需要一種方法來檢索所有匹配的樣式。
  • 使用對象是一個壞主意。創建一個接口或抽象類來擴展你的所有樣式。您將不需要進行類型轉換,並且可以降低共享功能。

總之,我會做一些像CSSMap<CSSSelector, List<CSSStyle>>

1

您正在將此建模爲Map,但這是而不是 a Map。您需要一個包含(說)CSSSelectorsCSSStyles以及所有周圍功能的CSS對象。

它將提供額外的功能,如確定如何風格級聯處理不同的測量,驗證輸入等與CSS表單相關的所有功能都將放在此對象中。也許解析一個.css作爲它的一部分(如果我們不小心的話,我們將討論工廠)。

底層實現可能涉及一個Map,但我認爲你需要首先考慮這個對象需要做什麼。

如果(然而)你只是有一個Map,那麼沒有額外的功能。或者說,它到底在哪裏?

1

我不認爲假裝你使用CSS是有意義的;你不是。 CSS選擇器比你描述的要複雜得多,即使你可以使用真正的CSS解析器/匹配器,你也可能遇到很多開放的問題和矛盾,試圖將真正的CSS應用到非HTML數據。

所以你想要的是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語句將樣式添加到樣式元素中,並以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(";"); 
    } 

..........

你明白了嗎

相關問題