[ https://issues.apache.org/jira/browse/FREEMARKER-97?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16500684#comment-16500684 ]
T X commented on FREEMARKER-97: ------------------------------- The JavaScript implementation translates into Java code reasonably easily, and essentially implements the Chicago Manual of Style, which would be suitable as the base implementation: {code:javascript} /* * To Title Case 2.1 – http://individed.com/code/to-title-case/ * Copyright © 2008–2013 David Gouch. Licensed under the MIT License. */ String.prototype.toTitleCase = function(){ var smallWords = /^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|vs?\.?|via)$/i; return this.replace(/[A-Za-z0-9\u00C0-\u00FF]+[^\s-]*/g, function(match, index, title){ if (index > 0 && index + match.length !== title.length && match.search(smallWords) > -1 && title.charAt(index - 2) !== ":" && (title.charAt(index + match.length) !== '-' || title.charAt(index - 1) === '-') && title.charAt(index - 1).search(/[^\s-]/) < 0) { return match.toLowerCase(); } if (match.substr(1).search(/[A-Z]|\../) > -1) { return match; } return match.charAt(0).toUpperCase() + match.substr(1); }); }; {code} Alternatively, there is John Gruber and John Resig's [JavaScript implementation|https://johnresig.com/files/titleCaps.js]: {code:javascript} /* * Title Caps * * Ported to JavaScript By John Resig - http://ejohn.org/ - 21 May 2008 * Original by John Gruber - http://daringfireball.net/ - 10 May 2008 * License: http://www.opensource.org/licenses/mit-license.php */ (function(){ var small = "(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|v[.]?|via|vs[.]?)"; var punct = "([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]*)"; this.titleCaps = function(title){ var parts = [], split = /[:.;?!] |(?: |^)["Ò]/g, index = 0; while (true) { var m = split.exec(title); parts.push( title.substring(index, m ? m.index : title.length) .replace(/\b([A-Za-z][a-z.'Õ]*)\b/g, function(all){ return /[A-Za-z]\.[A-Za-z]/.test(all) ? all : upper(all); }) .replace(RegExp("\\b" + small + "\\b", "ig"), lower) .replace(RegExp("^" + punct + small + "\\b", "ig"), function(all, punct, word){ return punct + upper(word); }) .replace(RegExp("\\b" + small + punct + "$", "ig"), upper)); index = split.lastIndex; if ( m ) parts.push( m[0] ); else break; } return parts.join("").replace(/ V(s?)\. /ig, " v$1. ") .replace(/(['Õ])S\b/ig, "$1s") .replace(/\b(AT&T|Q&A)\b/ig, function(all){ return all.toUpperCase(); }); }; function lower(word){ return word.toLowerCase(); } function upper(word){ return word.substr(0,1).toUpperCase() + word.substr(1); } })(); {code} {quote}Then there's the slight problem that if we support, say, English, French and Spanish out of the box, then why not language X... people can read things into that.{quote} Be open and honest. It takes time, skill, and multi-lingual fluency to develop software that operates on multiple human languages. People are welcome to contribute. It's a good idea to ensure that the implementation is pluggable so that writing different converters is easy. (Also, {{title_case}} isn't applicable to every language -- some writing systems have no concept of upper case and lower case.) > Header capitalization using standard styles > ------------------------------------------- > > Key: FREEMARKER-97 > URL: https://issues.apache.org/jira/browse/FREEMARKER-97 > Project: Apache Freemarker > Issue Type: Wish > Components: engine > Affects Versions: 2.3.28 > Reporter: T X > Priority: Minor > > FreeMarker offers a couple of simple algorithms for changing the case of > titles: > * > [https://freemarker.apache.org/docs/ref_builtins_string.html#ref_builtin_cap_firs|https://freemarker.apache.org/docs/ref_builtins_string.html#ref_builtin_cap_first] > * > [https://freemarker.apache.org/docs/ref_builtins_string.html#ref_builtin_capitalizet|https://freemarker.apache.org/docs/ref_builtins_string.html#ref_builtin_cap_first] > Neither of these capitalize the text in ways that adhere to various standard > styles: > * [Chicago Manual of > Style|https://en.wikipedia.org/wiki/The_Chicago_Manual_of_Style] > * [Associated Press|https://en.wikipedia.org/wiki/AP_Stylebook] > * [MLA Style Manual|https://en.wikipedia.org/wiki/MLA_Style_Manual] > * [APA Style|https://en.wikipedia.org/wiki/APA_style] > Consider the following texts: > * On iPhone the Transcript Extends Outside of Screen Frame > * PEAR And GNA Report Performance > * BCMailPlusFTPClient Sends Document without Document ID > * JWebUnit: Non-PEN Orders main.xhtml Meta Refresh Tag Issue > These are correct as written and must not be adjusted by an algorithm that > changes the text title. There are a couple of web sites that produce the > expected titles (note that the second site capitalizes the word "without," > which implies the algorithm does not use Chicago conventions): > * [https://titlecaseconverter.com/] > * [http://individed.com/code/to-title-case/] > There are a variety of implementations that perform such a feat: > * > [JavaScript|https://github.com/gouch/to-title-case/blob/master/to-title-case.js] > * [Perl|https://gist.github.com/gruber/9f9e8650d68b13ce4d78] > * [PHP|https://gist.github.com/HipsterJazzbo/2532c93a18db7451b0cec529c95b53c4] > These implementations do not require a whitelist. (So "iPhone" and > "ClassName" will remain as given.) Apache Commons' {{WordUtils}} class does > not implement Chicago Style, and I suspect it is also a fairly simple > algorithm. > Since {{?capitalize}} and {{?cap_first}} are taken, I propose {{?title_case}} > with an optional parameter (default is Chicago): > * chicago > * ap > * apa > * mla > -- This message was sent by Atlassian JIRA (v7.6.3#76005)