CapitaliseStringImpl.java 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * Copyright (c) 2025. Andrew Grant Carrick Software. All rights reserved
  3. *
  4. */
  5. package scot.carricksoftware.grants.capitalisation;
  6. import org.apache.logging.log4j.LogManager;
  7. import org.apache.logging.log4j.Logger;
  8. import org.springframework.stereotype.Component;
  9. import java.util.Locale;
  10. @Component
  11. public class CapitaliseStringImpl implements CapitaliseString {
  12. private static final Logger logger = LogManager.getLogger(CapitaliseStringImpl.class);
  13. @SuppressWarnings("DuplicatedCode")
  14. @Override
  15. public String capitalise(String input) {
  16. logger.info("CapitaliseStringImpl::capitalise");
  17. if (input == null) {
  18. return "";
  19. } else if (input.length() < 3) {
  20. return input;
  21. } else {
  22. logger.debug("CapitalisationImpl::getCapitalisation");
  23. String[] parts = input.split(" ");
  24. StringBuilder result = new StringBuilder();
  25. for (String part : parts) {
  26. result.append(doPart(part)).append(" ");
  27. }
  28. result = new StringBuilder(result.toString().trim());
  29. parts = result.toString().split("-");
  30. if (parts.length > 1) {
  31. result = new StringBuilder();
  32. for (String part : parts) {
  33. if (!result.isEmpty()) {
  34. result = new StringBuilder(result.append("-"));
  35. }
  36. result.append(doPart(part));
  37. }
  38. }
  39. return result.toString();
  40. }
  41. }
  42. @SuppressWarnings("DuplicatedCode")
  43. private String doPart(String input) {
  44. String result = input;
  45. if (input.length() >= 3) {
  46. String work = input.toLowerCase(Locale.ENGLISH);
  47. result = work.substring(0, 1).toUpperCase(Locale.ENGLISH) + work.substring(1);
  48. String prefix = result.substring(0, 2);
  49. String name = result.substring(2);
  50. if (prefix.equals("Mc")) {
  51. result = prefix + doPart(name);
  52. } else {
  53. prefix = result.substring(0, 3);
  54. if (prefix.equals("Mac")) {
  55. result = prefix + input.charAt(3) + result.substring(4);
  56. }
  57. }
  58. }
  59. return result;
  60. }
  61. }