private void doUnescape()

in wicket-util/src/main/java/org/apache/wicket/util/string/Entities.java [1057:1140]


	private void doUnescape(Writer writer, String str, int firstAmp) throws IOException
	{
		writer.write(str, 0, firstAmp);
		int len = str.length();
		for (int i = firstAmp; i < len; i++)
		{
			char c = str.charAt(i);
			if (c == '&')
			{
				int nextIdx = i + 1;
				int semiColonIdx = str.indexOf(';', nextIdx);
				if (semiColonIdx == -1)
				{
					writer.write(c);
					continue;
				}
				int amphersandIdx = str.indexOf('&', i + 1);
				if (amphersandIdx != -1 && amphersandIdx < semiColonIdx)
				{
					// Then the text looks like &...&...;
					writer.write(c);
					continue;
				}
				String entityContent = str.substring(nextIdx, semiColonIdx);
				int entityValue = -1;
				int entityContentLen = entityContent.length();
				if (entityContentLen > 0)
				{
					if (entityContent.charAt(0) == '#')
					{ // escaped value content is an integer (decimal or
						// hexidecimal)
						if (entityContentLen > 1)
						{
							char isHexChar = entityContent.charAt(1);
							try
							{
								switch (isHexChar)
								{
									case 'X' :
									case 'x' : {
										entityValue = Integer.parseInt(entityContent.substring(2),
											16);
										break;
									}
									default : {
										entityValue = Integer.parseInt(entityContent.substring(1),
											10);
									}
								}
								if (entityValue > 0xFFFF)
								{
									entityValue = -1;
								}
							}
							catch (NumberFormatException e)
							{
								entityValue = -1;
							}
						}
					}
					else
					{ // escaped value content is an entity name
						entityValue = entityValue(entityContent);
					}
				}

				if (entityValue == -1)
				{
					writer.write('&');
					writer.write(entityContent);
					writer.write(';');
				}
				else
				{
					writer.write(entityValue);
				}
				i = semiColonIdx; // move index up to the semi-colon
			}
			else
			{
				writer.write(c);
			}
		}
	}