1. Project Clover database Tue Dec 20 2016 21:24:09 CET
  2. Package org.xwiki.test.wysiwyg

File StandardFeaturesTest.java

 

Code metrics

2
278
36
1
673
435
37
0.13
7.72
36
1.03

Classes

Class Line # Actions
StandardFeaturesTest 28 278 0% 37 1
0.996835599.7%
 

Contributing tests

This file is covered by 36 tests. .

Source view

1    /*
2    * See the NOTICE file distributed with this work for additional
3    * information regarding copyright ownership.
4    *
5    * This is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU Lesser General Public License as
7    * published by the Free Software Foundation; either version 2.1 of
8    * the License, or (at your option) any later version.
9    *
10    * This software is distributed in the hope that it will be useful,
11    * but WITHOUT ANY WARRANTY; without even the implied warranty of
12    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13    * Lesser General Public License for more details.
14    *
15    * You should have received a copy of the GNU Lesser General Public
16    * License along with this software; if not, write to the Free
17    * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18    * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
19    */
20    package org.xwiki.test.wysiwyg;
21   
22    import org.junit.Test;
23    import org.openqa.selenium.Keys;
24    import org.xwiki.test.wysiwyg.framework.AbstractWysiwygTestCase;
25   
26    import static org.junit.Assert.*;
27   
 
28    public class StandardFeaturesTest extends AbstractWysiwygTestCase
29    {
 
30  5 toggle @Test
31    public void testEmptyWysiwyg()
32    {
33  5 switchToSource();
34  5 assertSourceText("");
35    }
36   
 
37  1 toggle @Test
38    public void testTypingAndDeletion()
39    {
40  1 String text = "az";
41  1 typeText(text);
42  1 assertContent(text);
43  1 typeBackspace(text.length());
44  1 testEmptyWysiwyg();
45    }
46   
 
47  1 toggle @Test
48    public void testBold()
49    {
50  1 typeText("x");
51  1 applyStyleTitle5();
52  1 selectAllContent();
53  1 clickBoldButton();
54  1 assertContent("<h5><strong>x</strong></h5>");
55    }
56   
 
57  1 toggle @Test
58    public void testItalics()
59    {
60  1 typeText("x");
61  1 applyStyleTitle5();
62  1 selectAllContent();
63  1 clickItalicsButton();
64  1 assertContent("<h5><em>x</em></h5>");
65    }
66   
 
67  1 toggle @Test
68    public void testUnderline()
69    {
70  1 typeText("x");
71  1 applyStyleTitle5();
72  1 selectAllContent();
73  1 clickUnderlineButton();
74  1 assertContent("<h5><ins>x</ins></h5>");
75    }
76   
 
77  1 toggle @Test
78    public void testStrikethrough()
79    {
80  1 typeText("x");
81  1 applyStyleTitle5();
82  1 selectAllContent();
83  1 clickStrikethroughButton();
84  1 assertContent("<h5><del>x</del></h5>");
85    }
86   
 
87  1 toggle @Test
88    public void testSubscript()
89    {
90  1 typeText("x");
91  1 applyStyleTitle5();
92  1 selectAllContent();
93  1 clickSubscriptButton();
94  1 assertContent("<h5><sub>x</sub></h5>");
95    }
96   
 
97  1 toggle @Test
98    public void testSuperscript()
99    {
100  1 typeText("x");
101  1 applyStyleTitle5();
102  1 selectAllContent();
103  1 clickSuperscriptButton();
104  1 assertContent("<h5><sup>x</sup></h5>");
105    }
106   
 
107  1 toggle @Test
108    public void testUnorderedList()
109    {
110    // Create a list with 3 items
111  1 typeTextThenEnter("a");
112  1 typeTextThenEnter("b");
113    // We press Enter here to be sure there's no bogus BR after the typed text.
114  1 typeTextThenEnter("c");
115    // Delete the empty line which was created only to avoid bogus BRs. See XWIKI-2732.
116  1 typeBackspace();
117  1 selectAllContent();
118  1 clickUnorderedListButton();
119  1 assertContent("<ul><li>a</li><li>b</li><li>c</li></ul>");
120   
121    // Undo
122  1 clickUnorderedListButton();
123  1 assertContent("a<br>b<br>c");
124   
125    // Create a list with 1 item and delete it
126  1 resetContent();
127  1 typeText("a");
128  1 selectAllContent();
129  1 clickUnorderedListButton();
130  1 typeBackspace(2);
131  1 testEmptyWysiwyg();
132    }
133   
 
134  1 toggle @Test
135    public void testOrderedList()
136    {
137    // Create a list with 3 items
138  1 typeTextThenEnter("a");
139  1 typeTextThenEnter("b");
140    // We press Enter here to be sure there's no bogus BR after the typed text.
141  1 typeTextThenEnter("c");
142    // Delete the empty line which was created only to avoid bogus BRs. See XWIKI-2732.
143  1 typeBackspace();
144  1 selectAllContent();
145  1 clickOrderedListButton();
146  1 assertContent("<ol><li>a</li><li>b</li><li>c</li></ol>");
147   
148    // Undo
149  1 clickOrderedListButton();
150  1 assertContent("a<br>b<br>c");
151   
152    // Create a list with 1 item and delete it
153  1 resetContent();
154  1 typeText("a");
155  1 selectAllContent();
156  1 clickOrderedListButton();
157  1 typeBackspace(2);
158  1 testEmptyWysiwyg();
159    }
160   
 
161  1 toggle @Test
162    public void testStyle()
163    {
164  1 typeText("x");
165  1 selectAllContent();
166   
167  1 applyStyleTitle1();
168  1 assertContent("<h1>x</h1>");
169   
170  1 applyStyleTitle2();
171  1 assertContent("<h2>x</h2>");
172   
173  1 applyStyleTitle3();
174  1 assertContent("<h3>x</h3>");
175   
176  1 applyStyleTitle4();
177  1 assertContent("<h4>x</h4>");
178   
179  1 applyStyleTitle5();
180  1 assertContent("<h5>x</h5>");
181   
182  1 applyStyleTitle6();
183  1 assertContent("<h6>x</h6>");
184   
185  1 applyStylePlainText();
186  1 assertContent("<p>x</p>");
187    }
188   
189    /**
190    * @see XWIKI-2949: A separator (HR) inserted at the beginning of a document is badly displayed and difficult to
191    * remove
192    */
 
193  1 toggle @Test
194    public void testHR()
195    {
196  1 clickHRButton();
197    // Create a heading and then delete it just to remove the bogus BR at the end.
198  1 applyStyleTitle1();
199  1 typeBackspace();
200    // We don't switch to source because we want to see if the Backspace works.
201  1 assertContent("<hr>");
202   
203    // Strange but we need to type Backspace twice although there's nothing else besides the horizontal ruler.
204  1 typeBackspace(2);
205  1 testEmptyWysiwyg();
206  1 switchToWysiwyg();
207   
208  1 typeText("az");
209  1 applyStyleTitle1();
210    // Type Enter then Backspace to remove the bogus BR at the end.
211  1 typeEnter();
212  1 typeBackspace();
213    // Since the left arrow key doesn't move the caret we have to use the Range API instead.
214  1 moveCaret("document.body.firstChild.firstChild", 1);
215  1 clickHRButton();
216  1 assertContent("<h1>a</h1><hr><h1>z</h1>");
217    }
218   
219    /**
220    * @see XWIKI-3012: Exception when opening a WYSIWYG dialog in FF2.0
221    * @see XWIKI-2992: Place the caret after the inserted symbol
222    * @see XWIKI-3682: Trademark symbol is not displayed correctly.
223    */
 
224  1 toggle @Test
225    public void testInsertSymbol()
226    {
227  1 clickSymbolButton();
228  1 getSelenium().click("//div[@title='copyright sign']");
229  1 clickSymbolButton();
230  1 closeDialog();
231  1 clickSymbolButton();
232  1 getSelenium().click("//div[@title='registered sign']");
233  1 clickSymbolButton();
234  1 getSelenium().click("//div[@title='trade mark sign']");
235  1 switchToSource();
236  1 assertSourceText("\u00A9\u00AE\u2122");
237    }
238   
239    /**
240    * The rich text area should remain focused and the text shouldn't be changed.
241    *
242    * @see XWIKI-3043: Prevent tab from moving focus from the new WYSIWYG editor
243    */
 
244  1 toggle @Test
245    public void testTabDefault()
246    {
247  1 typeText("a");
248  1 typeTab();
249  1 typeText("b");
250  1 typeShiftTab();
251  1 typeText("c");
252  1 assertContent("a&nbsp;&nbsp;&nbsp; bc");
253    }
254   
255    /**
256    * The list item should be indented or outdented depending on the Shift key.
257    *
258    * @see XWIKI-3043: Prevent tab from moving focus from the new WYSIWYG editor
259    */
 
260  1 toggle @Test
261    public void testTabInListItem()
262    {
263  1 typeText("x");
264  1 typeShiftEnter();
265    // "y" (lower case only) is misinterpreted.
266    // See http://jira.openqa.org/browse/SIDE-309
267    // See http://jira.openqa.org/browse/SRC-385
268  1 typeText("Y");
269  1 selectAllContent();
270  1 clickUnorderedListButton();
271    // Since the left arrow key doesn't move the caret we have to use the Range API instead.
272  1 moveCaret("document.body.firstChild.childNodes[1].firstChild", 0);
273  1 typeTab();
274  1 assertContent("<ul><li>x<ul><li>Y</li></ul></li></ul>");
275  1 typeShiftTab();
276  1 assertContent("<ul><li>x</li><li>Y</li></ul>");
277    }
278   
279    /**
280    * @see XWIKI-2735: Clicking on the space between two lines hides the cursor
281    */
 
282  1 toggle @Test
283    public void testEmptyLinesAreEditable()
284    {
285  1 switchToSource();
286  1 setSourceText("a\n\n\n\nb");
287  1 switchToWysiwyg();
288    // TODO: Since neither the down arrow key nor the click doesn't seem to move the caret we have to find another
289    // way of placing the caret on the empty lines, without using the Range API.
290    // For the moment let's just test if the empty lines contain a BR.
291  1 assertContent("<p>a</p><p><br></p><p><br></p><p>b</p>");
292    }
293   
294    /**
295    * @see XWIKI-2732: Unwanted BR tags
296    */
 
297  1 toggle @Test
298    public void testUnwantedBRsAreRemoved()
299    {
300  1 typeText("a");
301  1 typeShiftEnter();
302  1 typeText("b");
303  1 typeShiftEnter();
304  1 switchToSource();
305  1 assertSourceText("a\nb\\\\");
306    }
307   
308    /**
309    * @see XWIKI-3138: WYSIWYG 2.0 Preview Error
310    */
 
311  1 toggle @Test
312    public void testPreview()
313    {
314  1 typeText("x");
315  1 selectAllContent();
316  1 clickBoldButton();
317  1 clickEditPreview();
318  1 clickBackToEdit();
319  1 switchToSource();
320  1 assertSourceText("**x**");
321    }
322   
323    /**
324    * @see XWIKI-2993: Insert horizontal line on a selection of unordered list.
325    */
 
326  1 toggle @Test
327    public void testInsertHRInPlaceOfASelectedList()
328    {
329  1 typeTextThenEnter("a");
330  1 typeText("z");
331  1 selectAllContent();
332  1 clickUnorderedListButton();
333  1 clickHRButton();
334  1 switchToSource();
335  1 assertSourceText("----");
336    }
337   
338    /**
339    * @see XWIKI-3053: When a HR is inserted at the beginning of a paragraph an extra empty paragraph is generated
340    * before that HR
341    */
 
342  1 toggle @Test
343    public void testInsertHRInsideParagraph()
344    {
345    // "y" (lower case only) is misinterpreted.
346    // See http://jira.openqa.org/browse/SIDE-309
347    // See http://jira.openqa.org/browse/SRC-385
348  1 typeText("xY");
349  1 applyStyleTitle1();
350  1 applyStylePlainText();
351   
352    // Insert HR at the end of the paragraph.
353  1 clickHRButton();
354   
355    // Move the caret between x and Y.
356  1 moveCaret("document.body.firstChild.firstChild", 1);
357   
358    // Insert HR in the middle of the paragraph.
359  1 clickHRButton();
360   
361    // Move the caret before x.
362  1 moveCaret("document.body.firstChild.firstChild", 0);
363   
364    // Insert HR at the beginning of the paragraph.
365  1 clickHRButton();
366   
367    // We have to assert the HTML content because the arrow keys don't move the caret so we can't test if the user
368    // can edit the generated empty paragraphs. The fact that they contain a BR proves this.
369  1 assertContent("<p><br></p><hr><p>x</p><hr><p>Y</p><hr><p><br></p>");
370    }
371   
372    /**
373    * @see XWIKI-3191: New lines at the end of list items are not preserved by the wysiwyg
374    */
 
375  1 toggle @Test
376    public void testNewLinesAtTheEndOfListItemsArePreserved()
377    {
378  1 String sourceText = "* \\\\\n** \\\\\n*** test1";
379  1 switchToSource();
380  1 setSourceText(sourceText);
381  1 switchToWysiwyg();
382  1 switchToSource();
383  1 assertSourceText(sourceText);
384    }
385   
386    /**
387    * @see XWIKI-3194: Cannot remove just one text style when using the style attribute instead of formatting tags
388    */
 
389  1 toggle @Test
390    public void testRemoveBoldStyleWhenTheStyleAttributeIsUsed()
391    {
392  1 switchToSource();
393  1 setSourceText("hello (% style=\"font-family: monospace; font-weight: bold;\" %)vincent(%%) world");
394  1 switchToWysiwyg();
395   
396    // Select the word in bold.
397  1 selectNodeContents("document.body.firstChild.childNodes[1]");
398  1 waitForBoldDetected(true);
399   
400    // Remove the bold style.
401  1 clickBoldButton();
402  1 waitForBoldDetected(false);
403   
404    // Check the XWiki syntax.
405  1 switchToSource();
406  1 assertSourceText("hello (% style=\"font-family: monospace; font-weight: normal;\" %)vincent(%%) world");
407    }
408   
409    /**
410    * @see XWIKI-2997: Cannot un-bold a text with style Title 1
411    */
 
412  1 toggle @Test
413    public void testRemoveBoldStyleWithinHeading()
414    {
415    // Insert a heading and make sure it has bold style.
416  1 switchToSource();
417  1 setSourceText("(% style=\"font-weight: bold;\" %)\n= Title 1 =");
418  1 switchToWysiwyg();
419   
420    // Select a part of the heading.
421  1 select("document.body.firstChild.firstChild.firstChild", 3, "document.body.firstChild.firstChild.firstChild", 5);
422  1 waitForBoldDetected(true);
423   
424    // Remove the bold style.
425  1 clickBoldButton();
426  1 waitForBoldDetected(false);
427   
428    // Check the XWiki syntax.
429  1 switchToSource();
430  1 assertSourceText("(% style=\"font-weight: bold;\" %)\n= Tit(% style=\"font-weight: normal;\" %)le(%%) 1 =");
431    }
432   
433    /**
434    * @see XWIKI-3111: A link to an email address can be removed by removing the underline style
435    */
 
436  1 toggle @Test
437    public void testRemoveUnderlineStyleFromALink()
438    {
439    // Insert a link to an email address.
440  1 switchToSource();
441    // Links are not underlined anymore in Colibri skin so we apply the underline style to the link label.
442  1 setSourceText("[[__foo__>>mailto:x@y.z||title=\"bar\"]]");
443  1 switchToWysiwyg();
444   
445    // Select the text of the link.
446  1 selectNode("document.body.getElementsByTagName('a')[0]");
447  1 waitForUnderlineDetected(true);
448   
449    // Remove the underline style.
450  1 clickUnderlineButton();
451  1 waitForUnderlineDetected(false);
452   
453    // Check the XWiki syntax.
454  1 switchToSource();
455  1 assertSourceText("[[foo>>mailto:x@y.z||title=\"bar\"]]");
456    }
457   
458    /**
459    * Tests if the state of the tool bar buttons is updated immediately after the editor finished loading.
460    */
 
461  1 toggle @Test
462    public void testToolBarIsUpdatedOnLoad()
463    {
464  1 clickEditPageInWikiSyntaxEditor();
465  1 setFieldValue("content", "**__abc__**");
466  1 clickEditPageInWysiwyg();
467  1 waitForEditorToLoad();
468  1 waitForBoldDetected(true);
469  1 waitForUnderlineDetected(true);
470   
471  1 switchToSource();
472  1 setSourceText("**abc**");
473  1 switchToWysiwyg();
474  1 waitForBoldDetected(true);
475  1 waitForUnderlineDetected(false);
476    }
477   
478    /**
479    * @see XWIKI-2669: New WYSIWYG editor doesn't work when special characters are entered by the user.
480    */
 
481  1 toggle @Test
482    public void testHTMLSpecialChars()
483    {
484  1 typeText("<\"'&#'\">");
485  1 switchToSource();
486  1 assertSourceText("<\"'&#'\">");
487   
488    // Change the source to force a conversion.
489  1 setSourceText("<'\"&#\"'>");
490  1 switchToWysiwyg();
491  1 assertContent("<p>&lt;'\"&amp;#\"'&gt;</p>");
492   
493  1 applyStyleTitle1();
494  1 switchToSource();
495  1 assertSourceText("= <'\"&#\"'> =");
496    }
497   
498    /**
499    * @see XWIKI-4033: When saving after section edit entire page is overwritten.
500    */
 
501  1 toggle @Test
502    public void testSectionEditing()
503    {
504    // Save the current location to be able to get back to it later.
505  1 String location = getSelenium().getLocation();
506   
507    // Create two sections.
508  1 switchToSource();
509  1 setSourceText("= s1 =\n\nabc\n\n= s2 =\n\nxyz");
510  1 clickEditSaveAndView();
511   
512    // Edit the second section.
513  1 open(location + (location.indexOf('?') < 0 ? "?" : "") + "&section=2");
514  1 waitForEditorToLoad();
515  1 typeDelete(2);
516  1 typeText("c2");
517  1 switchToSource();
518  1 assertSourceText("= c2 =\n\nxyz");
519  1 clickEditSaveAndView();
520   
521    // Check the content of the page.
522  1 open(location);
523  1 waitForEditorToLoad();
524  1 switchToSource();
525  1 assertSourceText("= s1 =\n\nabc\n\n= c2 =\n\nxyz");
526    }
527   
528    /**
529    * @see XWIKI-4335: Typing ">" + text in wysiwyg returns a quote
530    */
 
531  1 toggle @Test
532    public void testQuoteSyntaxIsEscaped()
533    {
534  1 typeText("> 1");
535  1 switchToSource();
536  1 switchToWysiwyg();
537  1 assertEquals("> 1", getRichTextArea().getText());
538    }
539   
540    /**
541    * @see XWIKI: Problems removing italics from a definition.
542    */
 
543  1 toggle @Test
544    public void testRemoveItalicsFromDefinition()
545    {
546  1 switchToSource();
547    // Make sure the definitions are displayed with italics to avoid depending on the current skin.
548  1 setSourceText("(% style=\"font-style: italic;\" %)\n(((\n; term1\n: definition1\n:; term2\n:: definition2\n)))");
549  1 switchToWysiwyg();
550  1 selectNodeContents("document.getElementsByTagName('dd')[0].firstChild");
551  1 clickItalicsButton();
552  1 switchToSource();
553  1 assertSourceText("(% style=\"font-style: italic;\" %)\n(((\n; term1\n"
554    + ": (% style=\"font-style: normal;\" %)definition1(%%)\n:; term2\n:: definition2\n)))");
555    }
556   
557    /**
558    * @see XWIKI-4364: Verbatim blocks suffer corruption when previewed using the GWT editor
559    */
 
560  1 toggle @Test
561    public void testMultiLineVerbatimBlock()
562    {
563  1 switchToSource();
564  1 String multiLineVerbatimBlock = "{{{a verbatim block\nwhich is multiline}}}";
565  1 setSourceText(multiLineVerbatimBlock);
566  1 switchToWysiwyg();
567  1 switchToSource();
568  1 assertSourceText(multiLineVerbatimBlock);
569    }
570   
571    /**
572    * @see XWIKI-4399: ((( ))) looses class or style definitions when you edit in WYSIWYG.
573    */
 
574  1 toggle @Test
575    public void testGroupStyleIsPreserved()
576    {
577  1 switchToSource();
578  1 String styledGroup = "(% class=\"abc\" style=\"color: red;\" %)\n(((\ntext\n)))";
579  1 setSourceText(styledGroup);
580  1 switchToWysiwyg();
581  1 switchToSource();
582  1 assertSourceText(styledGroup);
583    }
584   
585    /**
586    * @see XWIKI-4529: XWiki velocity variables are undefined when the edited content is rendered.
587    */
 
588  1 toggle @Test
589    public void testXWikiVarsAreDefined()
590    {
591  1 switchToSource();
592  1 setSourceText("{{velocity}}#if($hasEdit)1#{else}2#end{{/velocity}}");
593  1 switchToWysiwyg();
594  1 assertEquals("1", getRichTextArea().getText());
595    }
596   
597    /**
598    * @see XWIKI-4665: Pressing Meta+G (Jump to page) in the WYSIWYG editor displays the popup inside the rich text
599    * area.
600    */
 
601  1 toggle @Test
602    public void testJavaScriptExtensionsAreNotIncludedInEditMode()
603    {
604    // Type some text to be sure the conversion is triggered when switching to source.
605  1 typeText("x");
606    // Type Ctrl+G to open the "Jump to page" dialog.
607  1 getRichTextArea().sendKeys(Keys.chord(Keys.CONTROL, "g"));
608    // Switch to source and check the result.
609  1 switchToSource();
610  1 assertSourceText("x");
611    // Now check that the "Jump to page" feature works indeed.
612  1 String jumpToPageTitleXPath = "//div[@class = 'xdialog-title' and starts-with(., 'Go to:')]";
613  1 assertElementNotPresent(jumpToPageTitleXPath);
614  1 getSourceTextArea().sendKeys(Keys.chord(Keys.CONTROL, "g"));
615  1 assertElementPresent(jumpToPageTitleXPath);
616   
617    // Ctrl+G is a shortcut for "Find again" on Firefox and it opens the find toolbar at the bottom of the page.
618    // This toolbar can influence the way Selenium/WebDriver computes the position of the buttons on the page
619    // leading to cases where clicking on a button has no action because the click is performed at a different
620    // location or because Selenium thinks the location is outside of the page.
621    // Close the "Jump to page" dialog, switch back to rich text area and close the find toolbar.
622  1 getSourceTextArea().sendKeys(Keys.ESCAPE);
623  1 switchToWysiwyg();
624  1 getRichTextArea().sendKeys(Keys.chord(Keys.CONTROL, "g"), Keys.ESCAPE);
625    }
626   
627    /**
628    * @see XWIKI-4346: Cannot use the WYSIWYG editor in small screen after you have deleted all text in full screen
629    * @see XWIKI-6003: Entering and exiting fullscreen mode resets the scroll offset and the cursor position or the
630    * current selection
631    */
 
632  1 toggle @Test
633    public void testEditInFullScreen()
634    {
635  1 typeText("abc");
636    // Select 'b' to check if the selection is preserved when we switch to full screen editing.
637  1 select("document.body.firstChild", 1, "document.body.firstChild", 2);
638  1 clickEditInFullScreen();
639  1 typeText("1");
640  1 clickExitFullScreen();
641  1 typeText("2");
642  1 switchToSource();
643  1 assertSourceText("a12c");
644    }
645   
646    /**
647    * @see XWIKI-5036: WYSIWYG editor doesn't display when creating a document named #"&ยง-_\
648    */
 
649  1 toggle @Test
650    public void testEditPageWithSpecialSymbolsInName()
651    {
652  1 startCreatePage("Main", "#\"&\u00A7-_\\");
653  1 waitForEditorToLoad();
654  1 typeText("qzr");
655  1 clickEditPreview();
656  1 assertTextPresent("qzr");
657    }
658   
659    /**
660    * @see XWIKI-5250: Merge nested custom styles like font and color before save
661    */
 
662  1 toggle @Test
663    public void testNestedCustomInlineStyles()
664    {
665  1 setContent("<p>ab<span style=\"color: red\">cd<span style=\"background-color: yellow\">ef</span>gh</span>"
666    + "ij<span style=\"font-family: monospace\">kl<span style=\"font-size: 24pt\">mn</span>op</span>rs</p>");
667  1 switchToSource();
668  1 assertEquals("ab(% style=\"color: red\" %)cd(% style=\"color: red; "
669    + "background-color: yellow\" %)ef(% style=\"color: red\" %)gh(%%)"
670    + "ij(% style=\"font-family: monospace\" %)kl(% style=\"font-family: monospace;"
671    + " font-size: 24pt\" %)mn(% style=\"font-family: monospace\" %)op(%%)rs", getSourceText());
672    }
673    }