You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AreaTreeBuilder.java 26KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761
  1. /*
  2. * $Id$
  3. * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  4. * For details on use and redistribution please refer to the
  5. * LICENSE file included with these sources.
  6. */
  7. package org.apache.fop.tools;
  8. import org.apache.fop.apps.*;
  9. import org.apache.fop.configuration.*;
  10. import org.apache.fop.area.*;
  11. import org.apache.fop.area.inline.*;
  12. import org.apache.fop.area.inline.Character;
  13. import org.apache.fop.render.*;
  14. import org.apache.fop.render.pdf.*;
  15. import org.apache.fop.render.svg.*;
  16. import org.apache.fop.render.xml.*;
  17. import org.apache.fop.layout.FontInfo;
  18. import org.apache.fop.layout.FontState;
  19. import org.apache.fop.fo.FOUserAgent;
  20. import org.apache.log.*;
  21. import org.apache.log.format.*;
  22. import org.apache.log.output.io.*;
  23. import org.apache.log.output.*;
  24. import java.io.*;
  25. import java.util.*;
  26. import java.awt.geom.Rectangle2D;
  27. import java.util.StringTokenizer;
  28. import javax.xml.parsers.DocumentBuilderFactory;
  29. import org.w3c.dom.*;
  30. import org.apache.batik.dom.svg.SVGDOMImplementation;
  31. import org.apache.batik.dom.util.DOMUtilities;
  32. /**
  33. * Area tree tester.
  34. * The purpose of this class is to create and render an area tree
  35. * for the purpose of testing the area tree and rendering.
  36. * This covers the set of possible properties that can be set
  37. * on the area tree for rendering.
  38. * As this is not for general purpose there is no attempt to handle
  39. * invalid area tree xml.
  40. *
  41. * Tests: different renderers, saving and loading pages with serialization
  42. * out of order rendering
  43. */
  44. public class AreaTreeBuilder {
  45. private Logger log;
  46. /**
  47. */
  48. public static void main(String[] args) {
  49. AreaTreeBuilder atb = new AreaTreeBuilder();
  50. atb.runTests(args[0], args[1], args[2]);
  51. System.exit(0);
  52. }
  53. public AreaTreeBuilder() {
  54. setupLogging();
  55. }
  56. private void setupLogging() {
  57. Hierarchy hierarchy = Hierarchy.getDefaultHierarchy();
  58. PatternFormatter formatter = new PatternFormatter("[%{priority}]: %{message}\n%{throwable}");
  59. LogTarget target = null;
  60. target = new StreamTarget(System.out, formatter);
  61. hierarchy.setDefaultLogTarget(target);
  62. log = hierarchy.getLoggerFor("test");
  63. log.setPriority(Priority.DEBUG);
  64. }
  65. /**
  66. *
  67. */
  68. protected void runTests(String in, String type, String out) {
  69. log.debug("Starting tests");
  70. runTest(in, type, out);
  71. log.debug("Finished");
  72. }
  73. /**
  74. */
  75. protected void runTest(String in, String type, String out) {
  76. Renderer rend = null;
  77. if ("xml".equals(type)) {
  78. rend = new XMLRenderer();
  79. } else if ("pdf".equals(type)) {
  80. rend = new PDFRenderer();
  81. } else if ("svg".equals(type)) {
  82. rend = new SVGRenderer();
  83. }
  84. FontInfo fi = new FontInfo();
  85. rend.setupFontInfo(fi);
  86. rend.setUserAgent(new FOUserAgent());
  87. AreaTree.StorePagesModel sm = AreaTree.createStorePagesModel();
  88. TreeLoader tl = new TreeLoader(fi);
  89. tl.setTreeModel(sm);
  90. try {
  91. InputStream is =
  92. new BufferedInputStream(new FileInputStream(in));
  93. tl.buildAreaTree(is);
  94. renderAreaTree(sm, rend, out);
  95. } catch (IOException e) {
  96. log.error("error reading file" + e.getMessage(), e);
  97. }
  98. }
  99. protected void renderAreaTree(AreaTree.StorePagesModel sm,
  100. Renderer rend, String out) {
  101. try {
  102. OutputStream os =
  103. new BufferedOutputStream(new FileOutputStream(out));
  104. rend.setLogger(log);
  105. rend.startRenderer(os);
  106. int count = 0;
  107. int seqc = sm.getPageSequenceCount();
  108. while (count < seqc) {
  109. Title title = sm.getTitle(count);
  110. rend.startPageSequence(title);
  111. int pagec = sm.getPageCount(count);
  112. int c = 0;
  113. while (c < pagec) {
  114. PageViewport page = sm.getPage(count, c);
  115. c++;
  116. // save the page to a stream for testing
  117. ObjectOutputStream tempstream = new ObjectOutputStream(
  118. new BufferedOutputStream(
  119. new FileOutputStream("temp.ser")));
  120. page.savePage(tempstream);
  121. tempstream.close();
  122. File temp = new File("temp.ser");
  123. log.debug("page serialized to: " + temp.length());
  124. temp = null;
  125. ObjectInputStream in = new ObjectInputStream(
  126. new BufferedInputStream(
  127. new FileInputStream("temp.ser")));
  128. page.loadPage(in);
  129. in.close();
  130. rend.renderPage(page);
  131. }
  132. count++;
  133. }
  134. rend.stopRenderer();
  135. os.close();
  136. } catch (Exception e) {
  137. log.error("error rendering output", e);
  138. }
  139. }
  140. }
  141. // this loads an area tree from an xml file
  142. // the xml format is the same as the xml renderer output
  143. class TreeLoader {
  144. AreaTree areaTree;
  145. AreaTree.AreaTreeModel model;
  146. FontInfo fontInfo;
  147. FontState currentFontState;
  148. TreeLoader(FontInfo fi) {
  149. fontInfo = fi;
  150. }
  151. public void setTreeModel(AreaTree.AreaTreeModel mo) {
  152. model = mo;
  153. }
  154. public void buildAreaTree(InputStream is) {
  155. Document doc = null;
  156. try {
  157. DocumentBuilderFactory fact =
  158. DocumentBuilderFactory.newInstance();
  159. fact.setNamespaceAware(true);
  160. doc = fact.newDocumentBuilder().parse(is);
  161. } catch (Exception e) {
  162. e.printStackTrace();
  163. }
  164. Element root = null;
  165. root = doc.getDocumentElement();
  166. areaTree = new AreaTree();
  167. areaTree.setTreeModel(model);
  168. readAreaTree(root);
  169. }
  170. public void readAreaTree(Element root) {
  171. NodeList childs = root.getChildNodes();
  172. for (int i = 0; i < childs.getLength(); i++) {
  173. Node obj = childs.item(i);
  174. if (obj.getNodeName().equals("pageSequence")) {
  175. readPageSequence((Element) obj);
  176. }
  177. }
  178. }
  179. public void readPageSequence(Element root) {
  180. Title title = null;
  181. boolean started = false;
  182. NodeList childs = root.getChildNodes();
  183. for (int i = 0; i < childs.getLength(); i++) {
  184. Node obj = childs.item(i);
  185. if (obj.getNodeName().equals("title")) {
  186. if (started) {
  187. // problem
  188. } else {
  189. title = readTitle((Element) obj);
  190. model.startPageSequence(title);
  191. started = true;
  192. }
  193. } else if (obj.getNodeName().equals("pageViewport")) {
  194. if (!started) {
  195. model.startPageSequence(null);
  196. started = true;
  197. }
  198. PageViewport viewport = readPageViewport((Element) obj);
  199. areaTree.addPage(viewport);
  200. }
  201. }
  202. }
  203. public Title readTitle(Element root) {
  204. Title title = new Title();
  205. List childs = getInlineAreas(root);
  206. for (int i = 0; i < childs.size(); i++) {
  207. InlineArea obj = (InlineArea) childs.get(i);
  208. title.addInlineArea(obj);
  209. }
  210. return title;
  211. }
  212. public PageViewport readPageViewport(Element root) {
  213. Rectangle2D bounds = getRectangle(root, "bounds");
  214. PageViewport viewport = null;
  215. NodeList childs = root.getChildNodes();
  216. for (int i = 0; i < childs.getLength(); i++) {
  217. Node obj = childs.item(i);
  218. if (obj.getNodeName().equals("page")) {
  219. Page page = readPage((Element) obj);
  220. viewport = new PageViewport(page, bounds);
  221. }
  222. }
  223. return viewport;
  224. }
  225. public Page readPage(Element root) {
  226. String bounds = root.getAttribute("bounds");
  227. Page page = new Page();
  228. NodeList childs = root.getChildNodes();
  229. for (int i = 0; i < childs.getLength(); i++) {
  230. Node obj = childs.item(i);
  231. if (obj.getNodeName().equals("regionViewport")) {
  232. readRegionViewport(page, (Element) obj);
  233. }
  234. }
  235. return page;
  236. }
  237. Rectangle2D getRectangle(Element root, String attr) {
  238. String rect = root.getAttribute(attr);
  239. StringTokenizer st = new StringTokenizer(rect, " ");
  240. int x = 0, y = 0, w = 0, h = 0;
  241. if (st.hasMoreTokens()) {
  242. String tok = st.nextToken();
  243. x = Integer.parseInt(tok);
  244. }
  245. if (st.hasMoreTokens()) {
  246. String tok = st.nextToken();
  247. y = Integer.parseInt(tok);
  248. }
  249. if (st.hasMoreTokens()) {
  250. String tok = st.nextToken();
  251. w = Integer.parseInt(tok);
  252. }
  253. if (st.hasMoreTokens()) {
  254. String tok = st.nextToken();
  255. h = Integer.parseInt(tok);
  256. }
  257. Rectangle2D r2d = new Rectangle2D.Float(x, y, w, h);
  258. return r2d;
  259. }
  260. public RegionViewport readRegionViewport(Page page, Element root) {
  261. RegionViewport reg = new RegionViewport(getRectangle(root, "rect"));
  262. NodeList childs = root.getChildNodes();
  263. for (int i = 0; i < childs.getLength(); i++) {
  264. Node obj = childs.item(i);
  265. if (obj.getNodeName().equals("regionBefore")) {
  266. reg.setRegion(readRegion((Element) obj, Region.BEFORE));
  267. page.setRegion(Region.BEFORE, reg);
  268. } else if (obj.getNodeName().equals("regionStart")) {
  269. reg.setRegion(readRegion((Element) obj, Region.START));
  270. page.setRegion(Region.START, reg);
  271. } else if (obj.getNodeName().equals("regionBody")) {
  272. reg.setRegion(readRegion((Element) obj, Region.BODY));
  273. page.setRegion(Region.BODY, reg);
  274. } else if (obj.getNodeName().equals("regionEnd")) {
  275. reg.setRegion(readRegion((Element) obj, Region.END));
  276. page.setRegion(Region.END, reg);
  277. } else if (obj.getNodeName().equals("regionAfter")) {
  278. reg.setRegion(readRegion((Element) obj, Region.AFTER));
  279. page.setRegion(Region.AFTER, reg);
  280. }
  281. }
  282. return reg;
  283. }
  284. public Region readRegion(Element root, int type) {
  285. Region reg;
  286. if (type == Region.BODY) {
  287. BodyRegion br = new BodyRegion();
  288. NodeList childs = root.getChildNodes();
  289. for (int i = 0; i < childs.getLength(); i++) {
  290. Node obj = childs.item(i);
  291. if (obj.getNodeName().equals("beforeFloat")) {
  292. BeforeFloat bf = readBeforeFloat((Element) obj);
  293. br.setBeforeFloat(bf);
  294. } else if (obj.getNodeName().equals("mainReference")) {
  295. MainReference mr = readMainReference((Element) obj);
  296. br.setMainReference(mr);
  297. } else if (obj.getNodeName().equals("footnote")) {
  298. Footnote foot = readFootnote((Element) obj);
  299. br.setFootnote(foot);
  300. }
  301. }
  302. reg = br;
  303. } else {
  304. reg = new Region(type);
  305. List blocks = getBlocks(root);
  306. for (int i = 0; i < blocks.size(); i++) {
  307. Block obj = (Block) blocks.get(i);
  308. reg.addBlock(obj);
  309. }
  310. }
  311. return reg;
  312. }
  313. public BeforeFloat readBeforeFloat(Element root) {
  314. BeforeFloat bf = new BeforeFloat();
  315. List blocks = getBlocks(root);
  316. for (int i = 0; i < blocks.size(); i++) {
  317. Block obj = (Block) blocks.get(i);
  318. bf.addBlock(obj);
  319. }
  320. return bf;
  321. }
  322. public MainReference readMainReference(Element root) {
  323. MainReference mr = new MainReference();
  324. List spans = getSpans(root);
  325. for (int i = 0; i < spans.size(); i++) {
  326. Span obj = (Span) spans.get(i);
  327. mr.addSpan(obj);
  328. }
  329. return mr;
  330. }
  331. List getSpans(Element root) {
  332. ArrayList list = new ArrayList();
  333. NodeList childs = root.getChildNodes();
  334. for (int i = 0; i < childs.getLength(); i++) {
  335. Node obj = childs.item(i);
  336. if (obj.getNodeName().equals("span")) {
  337. List flows = getFlows((Element) obj);
  338. Span span = new Span(flows.size());
  339. for (int j = 0; j < flows.size(); j++) {
  340. Flow flow = (Flow) flows.get(j);
  341. span.addFlow(flow);
  342. }
  343. list.add(span);
  344. }
  345. }
  346. return list;
  347. }
  348. List getFlows(Element root) {
  349. ArrayList list = new ArrayList();
  350. NodeList childs = root.getChildNodes();
  351. for (int i = 0; i < childs.getLength(); i++) {
  352. Node obj = childs.item(i);
  353. if (obj.getNodeName().equals("flow")) {
  354. Flow flow = new Flow();
  355. List blocks = getBlocks((Element) obj);
  356. for (int j = 0; j < blocks.size(); j++) {
  357. Block block = (Block) blocks.get(j);
  358. flow.addBlock(block);
  359. }
  360. list.add(flow);
  361. }
  362. }
  363. return list;
  364. }
  365. public Footnote readFootnote(Element root) {
  366. Footnote foot = new Footnote();
  367. List blocks = getBlocks(root);
  368. for (int i = 0; i < blocks.size(); i++) {
  369. Block obj = (Block) blocks.get(i);
  370. foot.addBlock(obj);
  371. }
  372. return foot;
  373. }
  374. List getBlocks(Element root) {
  375. ArrayList list = new ArrayList();
  376. NodeList childs = root.getChildNodes();
  377. for (int i = 0; i < childs.getLength(); i++) {
  378. Node obj = childs.item(i);
  379. if (obj.getNodeName().equals("block")) {
  380. Block block = new Block();
  381. List props = getProperties((Element) obj);
  382. for (int count = 0; count < props.size(); count++) {
  383. block.addProperty((Property) props.get(count));
  384. }
  385. addBlockChildren(block, (Element) obj);
  386. list.add(block);
  387. }
  388. }
  389. return list;
  390. }
  391. protected void addBlockChildren(Block block, Element root) {
  392. NodeList childs = root.getChildNodes();
  393. int type = -1;
  394. for (int i = 0; i < childs.getLength(); i++) {
  395. Node obj = childs.item(i);
  396. if (obj.getNodeName().equals("block")) {
  397. if (type == 2) {
  398. // error
  399. }
  400. Block b = new Block();
  401. addBlockChildren(b, (Element) obj);
  402. block.addBlock(b);
  403. type = 1;
  404. } else if (obj.getNodeName().equals("lineArea")) {
  405. if (type == 1) {
  406. // error
  407. }
  408. LineArea line = new LineArea();
  409. List props = getProperties((Element) obj);
  410. for (int count = 0; count < props.size(); count++) {
  411. line.addProperty((Property) props.get(count));
  412. }
  413. String height = ((Element) obj).getAttribute("height");
  414. int h = Integer.parseInt(height);
  415. line.setHeight(h);
  416. List inlines = getInlineAreas((Element) obj);
  417. for (int j = 0; j < inlines.size(); j++) {
  418. InlineArea inline = (InlineArea) inlines.get(j);
  419. line.addInlineArea(inline);
  420. }
  421. block.addLineArea(line);
  422. type = 2;
  423. }
  424. }
  425. }
  426. // children of element are inline areas
  427. List getInlineAreas(Element root) {
  428. ArrayList list = new ArrayList();
  429. NodeList childs = root.getChildNodes();
  430. for (int i = 0; i < childs.getLength(); i++) {
  431. Node obj = childs.item(i);
  432. if (obj.getNodeName().equals("char")) {
  433. Character ch =
  434. new Character(getString((Element) obj).charAt(0));
  435. addProperties((Element) obj, ch);
  436. try {
  437. currentFontState =
  438. new FontState(fontInfo, "sans-serif", "normal",
  439. "normal", 12000, 0);
  440. } catch (FOPException e) {
  441. }
  442. ch.setWidth(currentFontState.width(ch.getChar()));
  443. ch.setOffset(currentFontState.getCapHeight());
  444. list.add(ch);
  445. } else if (obj.getNodeName().equals("space")) {
  446. Space space = new Space();
  447. String width = ((Element) obj).getAttribute("width");
  448. int w = Integer.parseInt(width);
  449. space.setWidth(w);
  450. list.add(space);
  451. } else if (obj.getNodeName().equals("viewport")) {
  452. Viewport viewport = getViewport((Element) obj);
  453. if (viewport != null) {
  454. list.add(viewport);
  455. }
  456. } else if (obj.getNodeName().equals("leader")) {
  457. Leader leader = getLeader((Element) obj);
  458. if (leader != null) {
  459. list.add(leader);
  460. }
  461. } else if (obj.getNodeName().equals("word")) {
  462. Word word = getWord((Element) obj);
  463. if (word != null) {
  464. list.add(word);
  465. }
  466. } else {
  467. }
  468. }
  469. return list;
  470. }
  471. Viewport getViewport(Element root) {
  472. Area child = null;
  473. NodeList childs = root.getChildNodes();
  474. for (int i = 0; i < childs.getLength(); i++) {
  475. Node obj = childs.item(i);
  476. if (obj.getNodeName().equals("container")) {
  477. child = getContainer((Element) obj);
  478. } else if (obj.getNodeName().equals("foreignObject")) {
  479. child = getForeignObject((Element) obj);
  480. } else if (obj.getNodeName().equals("image")) {
  481. child = getImage((Element) obj);
  482. }
  483. }
  484. if (child == null) {
  485. return null;
  486. }
  487. Viewport viewport = new Viewport(child);
  488. String str = root.getAttribute("width");
  489. if (str != null && !"".equals(str)) {
  490. int width = Integer.parseInt(str);
  491. viewport.setWidth(width);
  492. }
  493. return viewport;
  494. }
  495. Container getContainer(Element root) {
  496. Container cont = new Container();
  497. List blocks = getBlocks(root);
  498. for (int i = 0; i < blocks.size(); i++) {
  499. Block obj = (Block) blocks.get(i);
  500. cont.addBlock(obj);
  501. }
  502. return cont;
  503. }
  504. ForeignObject getForeignObject(Element root) {
  505. Document doc;
  506. String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
  507. NodeList childs = root.getChildNodes();
  508. for (int i = 0; i < childs.getLength(); i++) {
  509. Node obj = childs.item(i);
  510. if (obj instanceof Element) {
  511. //System.out.println(obj.getNodeName());
  512. Element rootEle = (Element) obj;
  513. String space = rootEle.getAttribute("xmlns");
  514. if (svgNS.equals(space)) {
  515. try {
  516. DocumentBuilderFactory fact =
  517. DocumentBuilderFactory.newInstance();
  518. fact.setNamespaceAware(true);
  519. doc = fact. newDocumentBuilder().newDocument();
  520. Node node = doc.importNode(obj, true);
  521. doc.appendChild(node);
  522. DOMImplementation impl =
  523. SVGDOMImplementation.getDOMImplementation();
  524. // due to namespace problem attributes are not cloned
  525. // serializing causes an npe
  526. //doc = DOMUtilities.deepCloneDocument(doc, impl);
  527. ForeignObject fo = new ForeignObject(doc, svgNS);
  528. return fo;
  529. } catch (Exception e) {
  530. e.printStackTrace();
  531. }
  532. } else {
  533. try {
  534. DocumentBuilderFactory fact =
  535. DocumentBuilderFactory.newInstance();
  536. fact.setNamespaceAware(true);
  537. doc = fact. newDocumentBuilder().newDocument();
  538. Node node = doc.importNode(obj, true);
  539. doc.appendChild(node);
  540. ForeignObject fo = new ForeignObject(doc, space);
  541. return fo;
  542. } catch (Exception e) {
  543. e.printStackTrace();
  544. }
  545. }
  546. }
  547. }
  548. return null;
  549. }
  550. Image getImage(Element root) {
  551. String url = root.getAttribute("url");
  552. Image image = new Image(url);
  553. return image;
  554. }
  555. Leader getLeader(Element root) {
  556. Leader leader = new Leader();
  557. String rs = root.getAttribute("ruleStyle");
  558. if ("solid".equals(rs)) {
  559. leader.setRuleStyle(Leader.SOLID);
  560. } else if ("dotted".equals(rs)) {
  561. leader.setRuleStyle(Leader.DOTTED);
  562. } else if ("dashed".equals(rs)) {
  563. leader.setRuleStyle(Leader.DASHED);
  564. } else if ("double".equals(rs)) {
  565. leader.setRuleStyle(Leader.DOUBLE);
  566. } else if ("groove".equals(rs)) {
  567. leader.setRuleStyle(Leader.GROOVE);
  568. } else if ("ridge".equals(rs)) {
  569. leader.setRuleStyle(Leader.RIDGE);
  570. }
  571. String rt = root.getAttribute("ruleThickness");
  572. int thick = Integer.parseInt(rt);
  573. leader.setRuleThickness(thick);
  574. rt = root.getAttribute("width");
  575. if (rt != null && !"".equals(rt)) {
  576. thick = Integer.parseInt(rt);
  577. leader.setWidth(thick);
  578. }
  579. leader.setOffset(currentFontState.getCapHeight());
  580. addProperties(root, leader);
  581. return leader;
  582. }
  583. Word getWord(Element root) {
  584. String str = getString(root);
  585. Word word = new Word();
  586. word.setWord(str);
  587. addProperties(root, word);
  588. int width = 0;
  589. for (int count = 0; count < str.length(); count++) {
  590. width += currentFontState.width(str.charAt(count));
  591. }
  592. word.setWidth(width);
  593. word.setOffset(currentFontState.getCapHeight());
  594. return word;
  595. }
  596. public void addProperties(Element ele, InlineArea inline) {
  597. List props = getProperties(ele);
  598. for (int count = 0; count < props.size(); count++) {
  599. inline.addProperty((Property) props.get(count));
  600. }
  601. String str = ele.getAttribute("width");
  602. }
  603. public List getProperties(Element ele) {
  604. ArrayList list = new ArrayList();
  605. String str = ele.getAttribute("props");
  606. StringTokenizer st = new StringTokenizer(str, ";");
  607. while (st.hasMoreTokens()) {
  608. String tok = st.nextToken();
  609. int index = tok.indexOf(":");
  610. String id = tok.substring(0, index);
  611. String val = tok.substring(index + 1);
  612. Property prop = new Property();
  613. if ("internal-link".equals(id)) {
  614. prop.propType = Property.INTERNAL_LINK;
  615. prop.data = val;
  616. list.add(prop);
  617. } else if ("external-link".equals(id)) {
  618. prop.propType = Property.EXTERNAL_LINK;
  619. prop.data = val;
  620. list.add(prop);
  621. } else if ("font-family".equals(id)) {
  622. prop.propType = Property.FONT_FAMILY;
  623. prop.data = val;
  624. list.add(prop);
  625. } else if ("font-size".equals(id)) {
  626. prop.propType = Property.FONT_SIZE;
  627. prop.data = Integer.valueOf(val);
  628. list.add(prop);
  629. } else if ("font-weight".equals(id)) {
  630. prop.propType = Property.FONT_WEIGHT;
  631. prop.data = val;
  632. list.add(prop);
  633. } else if ("font-style".equals(id)) {
  634. prop.propType = Property.FONT_STYLE;
  635. prop.data = val;
  636. list.add(prop);
  637. } else if ("color".equals(id)) {
  638. prop.propType = Property.COLOR;
  639. prop.data = val;
  640. list.add(prop);
  641. } else if ("background".equals(id)) {
  642. prop.propType = Property.BACKGROUND;
  643. prop.data = val;
  644. list.add(prop);
  645. } else if ("underline".equals(id)) {
  646. prop.propType = Property.UNDERLINE;
  647. prop.data = new Boolean(val);
  648. list.add(prop);
  649. } else if ("overline".equals(id)) {
  650. prop.propType = Property.OVERLINE;
  651. prop.data = new Boolean(val);
  652. list.add(prop);
  653. } else if ("linethrough".equals(id)) {
  654. prop.propType = Property.LINETHROUGH;
  655. prop.data = new Boolean(val);
  656. list.add(prop);
  657. } else if ("offset".equals(id)) {
  658. prop.propType = Property.OFFSET;
  659. prop.data = Integer.valueOf(val);
  660. list.add(prop);
  661. } else if ("shadow".equals(id)) {
  662. prop.propType = Property.SHADOW;
  663. prop.data = val;
  664. list.add(prop);
  665. }
  666. }
  667. return list;
  668. }
  669. public List getRanges(Element ele) {
  670. ArrayList list = new ArrayList();
  671. String str = ele.getAttribute("ranges");
  672. StringTokenizer st = new StringTokenizer(str, ";");
  673. while (st.hasMoreTokens()) {
  674. String tok = st.nextToken();
  675. }
  676. return list;
  677. }
  678. public String getString(Element ele) {
  679. String str = "";
  680. NodeList childs = ele.getChildNodes();
  681. if (childs.getLength() == 0) {
  682. return null;
  683. }
  684. for (int i = 0; i < childs.getLength(); i++) {
  685. Node obj = childs.item(i);
  686. str = str + obj.getNodeValue();
  687. }
  688. return str;
  689. }
  690. }