1 /* 2 * Copyright (C) 2004, 2008 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 #include "HTMLInterchange.h" 28 29 #include "Text.h" 30 #include "TextIterator.h" 31 #include <wtf/StdLibExtras.h> 32 #include <wtf/unicode/CharacterNames.h> 33 34 namespace WebCore { 35 36 namespace { 37 38 String convertedSpaceString() 39 { 40 DEFINE_STATIC_LOCAL(String, convertedSpaceString, ()); 41 if (convertedSpaceString.isNull()) { 42 convertedSpaceString = "<span class=\""; 43 convertedSpaceString += AppleConvertedSpace; 44 convertedSpaceString += "\">"; 45 convertedSpaceString.append(noBreakSpace); 46 convertedSpaceString += "</span>"; 47 } 48 return convertedSpaceString; 49 } 50 51 } // end anonymous namespace 52 53 String convertHTMLTextToInterchangeFormat(const String& in, const Text* node) 54 { 55 // Assume all the text comes from node. 56 if (node->renderer() && node->renderer()->style()->preserveNewline()) 57 return in; 58 59 Vector<UChar> s; 60 61 unsigned i = 0; 62 unsigned consumed = 0; 63 while (i < in.length()) { 64 consumed = 1; 65 if (isCollapsibleWhitespace(in[i])) { 66 // count number of adjoining spaces 67 unsigned j = i + 1; 68 while (j < in.length() && isCollapsibleWhitespace(in[j])) 69 j++; 70 unsigned count = j - i; 71 consumed = count; 72 while (count) { 73 unsigned add = count % 3; 74 switch (add) { 75 case 0: 76 append(s, convertedSpaceString()); 77 s.append(' '); 78 append(s, convertedSpaceString()); 79 add = 3; 80 break; 81 case 1: 82 if (i == 0 || i + 1 == in.length()) // at start or end of string 83 append(s, convertedSpaceString()); 84 else 85 s.append(' '); 86 break; 87 case 2: 88 if (i == 0) { 89 // at start of string 90 append(s, convertedSpaceString()); 91 s.append(' '); 92 } else if (i + 2 == in.length()) { 93 // at end of string 94 append(s, convertedSpaceString()); 95 append(s, convertedSpaceString()); 96 } else { 97 append(s, convertedSpaceString()); 98 s.append(' '); 99 } 100 break; 101 } 102 count -= add; 103 } 104 } else 105 s.append(in[i]); 106 i += consumed; 107 } 108 109 return String::adopt(s); 110 } 111 112 } // namespace WebCore 113