/* * Copyright 2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package rife.render; import rife.template.Template; import rife.template.ValueRenderer; /** *

Swap case of a template value.

* *

Usage:

* *
 *   <!--v render:rife.render.SwapCase:valueId/-->
 *   {{v render:rife.render.SwapCase:valueId/}}
 * 
* * @author Erik C. Thauvin * @since 1.0 */ public class SwapCase implements ValueRenderer { /** * Swaps the case of a String. * * @param src the String to swap the case of * @return the modified String or null */ public static String swapCase(final String src) { if (src == null || src.isEmpty()) { return src; } int offset = 0; var len = src.length(); var buff = new int[len]; for (var i = 0; i < len; ) { int newCodePoint; var curCodePoint = src.codePointAt(i); if (Character.isUpperCase(curCodePoint) || Character.isTitleCase(curCodePoint)) { newCodePoint = Character.toLowerCase(curCodePoint); } else if (Character.isLowerCase(curCodePoint)) { newCodePoint = Character.toUpperCase(curCodePoint); } else { newCodePoint = curCodePoint; } buff[offset++] = newCodePoint; i += Character.charCount(newCodePoint); } return new String(buff, 0, offset); } /** * {@inheritDoc} */ @Override public String render(Template template, String valueId, String differentiator) { if (template.hasValueId(differentiator)) { return swapCase(template.getValue(differentiator)); } else { return ""; } } }