Changeset 659
- Timestamp:
- 01/07/14 15:26:22 (10 years ago)
- Location:
- trunk/src/org/expeditee
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/expeditee/io/Conversion.java
r562 r659 669 669 670 670 // floats can also be returned immediately 671 if (output instanceof Float && (Float) output >= 0)671 if (output instanceof Float) // && (Float) output >= 0) // Removed checking if >0, as some floats (e.g. letter spacing) can be negative 672 672 return "" + output; 673 673 -
trunk/src/org/expeditee/io/DefaultFrameReader.java
r656 r659 115 115 116 116 _ItemTags.put('f', Text.class.getMethod("setFont", pFont)); 117 _ItemTags.put('t', Text.class.getMethod("setSpacing", p Int));117 _ItemTags.put('t', Text.class.getMethod("setSpacing", pFloat)); 118 118 _ItemTags.put('T', Text.class.getMethod("appendLine", pString)); 119 119 _ItemTags.put('a', Text.class.getMethod("setWordSpacing", pInt)); 120 _ItemTags.put('b', Text.class.getMethod("setLetterSpacing", p Int));121 _ItemTags.put('m', Text.class.getMethod("setInitialSpacing", p Int));120 _ItemTags.put('b', Text.class.getMethod("setLetterSpacing", pFloat)); 121 _ItemTags.put('m', Text.class.getMethod("setInitialSpacing", pFloat)); 122 122 _ItemTags.put('w', Text.class.getMethod("setWidth", pIntO)); 123 123 _ItemTags.put('k', Text.class.getMethod("setJustification", pJustification)); -
trunk/src/org/expeditee/io/ExpReader.java
r584 r659 199 199 } catch (Exception e) { 200 200 System.out.println("Error running tag method: " + tag); 201 //e.printStackTrace();201 e.printStackTrace(); 202 202 } 203 203 } -
trunk/src/org/expeditee/io/WebParser.java
r644 r659 134 134 frame.setBackgroundColor(rgbStringToColor((String) JavaFX.JSObjectCall.invoke(JavaFX.JSObjectCall.invoke(window, "getComputedStyle", new Object[] { doc }), "getPropertyValue", 135 135 new Object[] { "background-color" }))); 136 137 // Following 2 functions taken from jQuery (Apache 2 License)138 /* JavaFX.WebEngineExecuteScript139 .invoke(webEngine,140 "function getText ( elem ) { var i, node, nodeType = elem.nodeType, ret = ''; if ( nodeType ) { if ( nodeType === 1 || nodeType === 9 ) { if ( typeof elem.textContent === 'string' ) { return elem.textContent; } else if ( typeof elem.innerText === 'string' ) { return elem.innerText.replace( rReturn, '' ); } else { for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } } else { for ( i = 0; (node = elem[i]); i++ ) { if ( node.nodeType !== 8 ) { ret += getText( node ); } } } return ret; };");141 JavaFX.WebEngineExecuteScript142 .invoke(webEngine,143 "function myText(elem) { var i, node, nodeType = elem.nodeType, ret = ''; if (nodeType) { if (nodeType === 1 || nodeType === 9 || nodeType === 11) { if (typeof elem.textContent === 'string') { return elem.textContent; } else if (typeof elem.innerText === 'string') { return elem.innerText.replace(rReturn, ''); } else { for (elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText(elem); } } } else if (nodeType === 3 || nodeType === 4) { return elem.nodeValue; } } else { for (i = 0; (node = elem[i]); i++) { if (node.nodeType !== 8) { ret += getText(node); } } } return ret; }");144 145 JavaFX.WebEngineExecuteScript.invoke(webEngine,146 "var ps = document.getElementsByTagName('p');"147 + "for(var i = 0; i < ps.length; i++) {"148 + "ps[i].innerHTML = myText(ps[i]);"149 + "var span = document.createElement('replacement');"150 + "span.textContent = ps[i].textContent;"151 + " ps[i].innerHTML = span.outerHTML;"152 + "}" );153 */154 136 137 // Functions to be used later in JavaScript 155 138 JavaFX.WebEngineExecuteScript 156 139 .invoke(webEngine, … … 171 154 + " span = document.createElement('wordSpan');" 172 155 + " span.textContent = text + ' ';" 173 + " para.appendChild(span);"156 + " textNode.parentElement.insertBefore(span, textNode);" 174 157 + " if (prevSpan !== null && span.getBoundingClientRect().top > prevSpan.getBoundingClientRect().top) {" 175 158 + " span.textContent = '\\n' + span.textContent;" 176 + " if ( prevPrevSpan !== null && prevPrevSpan.getBoundingClientRect().left == prevSpan.getBoundingClientRect().left) {"159 + " if ( prevPrevSpan !== null && prevPrevSpan.getBoundingClientRect().left == prevSpan.getBoundingClientRect().left) {" 177 160 + " prevPrevSpan.textContent = prevPrevSpan.textContent + prevSpan.textContent;" 178 + " para.removeChild(prevSpan);"161 + " textNode.parentElement.removeChild(prevSpan);" 179 162 + " } else {" 180 163 + " prevPrevSpan = prevSpan;" 181 164 + " }" 182 165 + " prevSpan = span;" 166 + " } else if ( prevSpan !== null) {" 167 + " prevSpan.textContent = prevSpan.textContent + span.textContent;" 168 + " textNode.parentElement.removeChild(span);" 183 169 + " } else {" 184 + " prevSpan.textContent = prevSpan.textContent + span.textContent;" 185 + " para.removeChild(span);" 170 + " prevSpan = span;" 186 171 + " }" 187 172 + "}" 188 173 ); 189 174 175 // Getting an array of HTML elements from the page that will be checked for 'content' (i.e. will be modified to be 176 // properly wrapped in Expeditee) 190 177 Object contentElements = JavaFX.WebEngineExecuteScript.invoke(webEngine, "document.querySelectorAll('p,li');"); 191 178 int contentElementsLength = (Integer) JavaFX.JSObjectGetMember.invoke(contentElements, "length"); 192 179 193 180 for (int i = 0; i < contentElementsLength; i++) { 194 Element currentNode = (Element) JavaFX.JSObjectGetSlot.invoke(contentElements, i);195 196 JavaFX.JSObjectSetMember.invoke(window, "para", currentNode);197 181 182 // Getting the current HTML element, then making it accessable in JavaScript 183 Element currentElement = (Element) JavaFX.JSObjectGetSlot.invoke(contentElements, i); 184 JavaFX.JSObjectSetMember.invoke(window, "para", currentElement); 185 198 186 if ((boolean) (JavaFX.WebEngineExecuteScript.invoke(webEngine, "isContent(para)"))) { 199 187 200 JavaFX.WebEngineExecuteScript.invoke(webEngine, "" 201 + "var span = document.createElement('wordSpan');" 202 + "var prevSpan = span;" 203 + "var prevPrevSpan = null;" 204 ); 188 JavaFX.WebEngineExecuteScript.invoke(webEngine, "para.style.wordBreak = 'normal';"); 189 190 // Creating a TreeWalker that is used to loop over all the TextNodes within the current paragraph 191 JavaFX.WebEngineExecuteScript.invoke(webEngine, "var walker = document.createTreeWalker(para, NodeFilter.SHOW_TEXT, null, false);"); 192 193 Node textNode; 205 194 206 Object paraWords = JavaFX.WebEngineExecuteScript.invoke(webEngine, "para.textContent.split(/\\s+/);");207 int paraWordsLength = (Integer) JavaFX.JSObjectGetMember.invoke(paraWords, "length");208 195 209 JavaFX.WebEngineExecuteScript.invoke(webEngine, "" 210 + "para.innerHTML = '';" 211 + "para.style.wordBreak = 'normal';" 212 ); 213 214 for (int j = 0; j < paraWordsLength; j++) { 215 Object currentWord = JavaFX.JSObjectGetSlot.invoke(paraWords, j); 216 JavaFX.JSObjectCall.invoke(window, "addToSpan", new Object[] { currentWord }); 196 197 // Looping through all the text nodes in the current paragraph 198 while ((textNode = (Node) JavaFX.WebEngineExecuteScript.invoke(webEngine, "walker.nextNode()")) != null) { 199 // Making the current node accesable in JavaScript 200 JavaFX.JSObjectSetMember.invoke(window, "textNode", textNode); 201 202 JavaFX.WebEngineExecuteScript.invoke(webEngine, "" 203 + "var span = null;" 204 + "var prevSpan = null;" 205 + "var prevPrevSpan = null;" 206 ); 207 208 // Splitting the text node's content into individual words 209 Object words = JavaFX.WebEngineExecuteScript.invoke(webEngine, "textNode.textContent.split(/\\s+/);"); 210 int wordsLength = (Integer) JavaFX.JSObjectGetMember.invoke(words, "length"); 211 212 // Clearing all text from the current text node (but not removing it, as it is needed as a reference 213 // point for adding back the words) 214 JavaFX.WebEngineExecuteScript.invoke(webEngine, "textNode.textContent = '';"); 215 216 // Adding each word back to the page 217 for (int j = 0; j < wordsLength; j++) { 218 Object currentWord = JavaFX.JSObjectGetSlot.invoke(words, j); 219 JavaFX.JSObjectCall.invoke(window, "addToSpan", new Object[] { currentWord }); 220 } 221 222 JavaFX.WebEngineExecuteScript.invoke(webEngine, "" 223 + " if (prevPrevSpan !== null && prevPrevSpan.getBoundingClientRect().left == prevSpan.getBoundingClientRect().left) {" 224 + " prevPrevSpan.textContent = prevPrevSpan.textContent + prevSpan.textContent;" 225 + " textNode.parentElement.removeChild(prevSpan);" 226 + " }" 227 ); 217 228 } 218 219 JavaFX.WebEngineExecuteScript.invoke(webEngine, ""220 + " if (prevPrevSpan !== null && prevPrevSpan.getBoundingClientRect().left == prevSpan.getBoundingClientRect().left) {"221 + " prevPrevSpan.textContent = prevPrevSpan.textContent + prevSpan.textContent;"222 + " para.removeChild(prevSpan);"223 + " }"224 );225 229 } 226 230 } … … 232 236 + "var walk = document.createTreeWalker(rootNode, NodeFilter.SHOW_ALL);" 233 237 + "while(node=walk.nextNode()) {" 234 + " textNodes.push(node);" + "}" 238 + " textNodes.push(node);" 239 + "}" 235 240 + "return textNodes;" 236 + "}; "241 + "}; " 237 242 + "getTextNodes(document.body)"); 238 243 … … 243 248 244 249 if (currentNode.getNodeType() == Node.TEXT_NODE || currentNode.getNodeType() == Node.ELEMENT_NODE) { 245 246 System.out.println(i + "/" + nodesLength + " : " + currentNode);247 250 248 251 Object style; … … 267 270 + Float.valueOf(JavaFX.WebEngineExecuteScript.invoke(webEngine, "window.pageYOffset").toString()); 268 271 269 float width = Float.valueOf(JavaFX.JSObjectGetMember.invoke(bounds, "width").toString()) ;272 float width = Float.valueOf(JavaFX.JSObjectGetMember.invoke(bounds, "width").toString()) + 5; 270 273 float height = Float.valueOf(JavaFX.JSObjectGetMember.invoke(bounds, "height").toString()); 271 274 … … 299 302 // Returns "normal" or a value in pixels (e.g. "10px") 300 303 String letterSpacing = (String) JavaFX.JSObjectCall.invoke(style, "getPropertyValue", new Object[] { "letter-spacing" }); 304 305 // Returns a value in pixels (e.g. "10px") 306 String lineHeight = (String) JavaFX.JSObjectCall.invoke(style, "getPropertyValue", new Object[] { "line-height" }); 301 307 302 308 String textTransform = (String) JavaFX.JSObjectCall.invoke(style, "getPropertyValue", new Object[] { "text-transform" }); … … 334 340 weightInt = Integer.parseInt(weight); 335 341 } catch (NumberFormatException nfe) { 336 weightInt = 0;342 // Use default value as set above 337 343 } 338 344 … … 346 352 } 347 353 348 int letterSpacingInt = 0;354 float fontSizeFloat = 12; 349 355 350 356 try { 351 letterSpacingInt = (int) (Integer.parseInt(letterSpacing.substring(0, letterSpacing.length() - 2)) / Float.valueOf(fontSize));357 fontSizeFloat = Float.valueOf(fontSize); 352 358 } catch (NumberFormatException nfe) { 353 letterSpacingInt = 0; 359 // Use default value as set above 360 } 361 362 float letterSpacingFloat = -0.008f; 363 364 try { 365 letterSpacingFloat = (Integer.parseInt(letterSpacing.substring(0, letterSpacing.length() - 2)) / (fontSizeFloat)); 366 } catch (NumberFormatException nfe) { 367 // Use default value as set above 368 } 369 370 float lineSpacingInt = -1; 371 372 try { 373 lineSpacingInt = ((Float.parseFloat(lineHeight.substring(0, lineHeight.length() - 2)) - (fontSizeFloat * 1.22f))); 374 } catch (NumberFormatException nfe) { 375 // Use default value as set above 354 376 } 355 377 … … 368 390 t.setBackgroundColor(rgbStringToColor(bgColor)); 369 391 t.setFont(font); 370 t.setSize( Float.valueOf(fontSize));392 t.setSize(fontSizeFloat); 371 393 t.setFontStyle(fontStyleComplete); 372 t.setLetterSpacing(letterSpacingInt); 394 t.setLetterSpacing(letterSpacingFloat); 395 396 t.setSpacing(lineSpacingInt); 373 397 374 398 if (align.equals("left")) { -
trunk/src/org/expeditee/items/Text.java
r655 r659 39 39 import org.expeditee.gui.FreeItems; 40 40 import org.expeditee.math.ExpediteeJEP; 41 import org.expeditee.settings.UserSettings; 41 42 import org.expeditee.settings.experimental.ExperimentalFeatures; 42 43 import org.nfunk.jep.Node; … … 112 113 private Justification _justification = Justification.left; 113 114 114 private int _spacing = -1;115 private float _spacing = -1; 115 116 116 117 private int _word_spacing = -1; 117 118 118 private int _initial_spacing = -1;119 120 private int _letter_spacing = -1;119 private float _initial_spacing = 0; 120 121 private float _letter_spacing = 0; 121 122 122 123 // used during ranging out … … 1192 1193 * The number of pixels to allow between each line 1193 1194 */ 1194 public void setSpacing( int spacing) {1195 public void setSpacing(float spacing) { 1195 1196 _spacing = spacing; 1196 1197 updatePolygon(); … … 1202 1203 * @return The spacing (inter-line) in pixels of this Text. 1203 1204 */ 1204 public int getSpacing() {1205 public float getSpacing() { 1205 1206 return _spacing; 1206 1207 } … … 1228 1229 * Additional spacing to add between letters. See {@link java.awt.font.TextAttribute#TRACKING} 1229 1230 */ 1230 public void setLetterSpacing( int spacing) {1231 public void setLetterSpacing(float spacing) { 1231 1232 _letter_spacing = spacing; 1232 1233 HashMap<TextAttribute, Object> attr = new HashMap<TextAttribute, Object>(); 1233 1234 attr.put(TextAttribute.TRACKING, spacing); 1234 this._font = this._font.deriveFont(attr); 1235 1236 if (this._font == null) { 1237 this._font = Font.decode(DEFAULT_FONT); 1238 } 1239 1240 this.setFont(this._font.deriveFont(attr)); 1235 1241 } 1236 1242 … … 1238 1244 * @return The spacing (proportional to the font size) between letters. See {@link java.awt.font.TextAttribute#TRACKING} 1239 1245 */ 1240 public int getLetterSpacing() {1246 public float getLetterSpacing() { 1241 1247 return _letter_spacing; 1242 1248 } 1243 1249 1244 public void setInitialSpacing( int spacing) {1250 public void setInitialSpacing(float spacing) { 1245 1251 _initial_spacing = spacing; 1246 1252 } 1247 1253 1248 public int getInitialSpacing() {1254 public float getInitialSpacing() { 1249 1255 return _initial_spacing; 1250 1256 }
Note:
See TracChangeset
for help on using the changeset viewer.