snakeCaseToCamelCase.sh 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #!/bin/bash
  2. ## Need "rpl" package
  3. RPL_INSTALLED=$(dpkg -s rpl)
  4. if [[ -z ${RPL_INSTALLED} ]]; then
  5. echo "This bash need rpl command, you can install it with: sudo apt install rpl"
  6. fi
  7. DIR_HTDOCS=$( cd "$( dirname "${BASH_SOURCE[0]}" )/../../htdocs" >/dev/null && pwd )
  8. PATTERN=""
  9. if [[ -f $1 ]]; then
  10. TFile=("$1") # specific file
  11. elif [[ -n $1 ]]; then
  12. PATTERN=$1 # name of a particular file or pattern (ex: societe.class.php)
  13. else
  14. PATTERN="*.class.php" # *.lib.php
  15. fi
  16. if [[ -n ${PATTERN} ]]; then
  17. TCLASSFILE=$(find "${DIR_HTDOCS}" -name "${PATTERN}" | grep -v "/custom/" | grep -v "/includes/" | grep -v -F -f "${DIR_HTDOCS}/../.gitignore")
  18. TFile=()
  19. I=0
  20. for f in ${TCLASSFILE}; do
  21. TFile[${I}]="${f}"
  22. ((I++))
  23. done
  24. fi
  25. REGEX_FNC_W='^([[:blank:]]*)(public|private|protected)?[ \t]*(static)?[ \t]*[^\$\(]function[ \t]*([a-zA-Z0-9\-\_]*)[\(](.*)[\)][ \t]*([\{]?)$'
  26. INDENT=" "
  27. for f in ${TFile[@]}; do
  28. # echo ${f}
  29. IFS=$'\n'
  30. TLine=($(cat "${f}" | grep -E "${REGEX_FNC_W}"))
  31. for LINE in ${TLine[@]}; do
  32. if [[ ${LINE} =~ ^${REGEX_FNC_W}$ ]]; then
  33. FIRST_INDENT=${BASH_REMATCH[1]} # seem not work
  34. FNC_TYPE=${BASH_REMATCH[2]}
  35. STATIC=${BASH_REMATCH[3]}
  36. FNC_NAME=${BASH_REMATCH[4]}
  37. PARAMETERS_ORIGIN=${BASH_REMATCH[5]}
  38. BRACKET_END=${BASH_REMATCH[6]}
  39. if [[ ${LINE} =~ ^([[:blank:]]*) ]]; then # but this seems work to get indentation
  40. FIRST_INDENT=${BASH_REMATCH[1]}
  41. fi
  42. [[ ${FNC_NAME} =~ ^__ ]] && continue # skip magic function
  43. CAMEL_CASE=$(echo "${FNC_NAME}" | sed -r 's/(_)([a-zA-Z0-9])/\U\2/g')
  44. [[ ${CAMEL_CASE} = ${FNC_NAME} ]] && continue # skip if no difference
  45. #echo A: ${#FIRST_INDENT}
  46. #printf "${FIRST_INDENT}TEST INDENT\n"
  47. #echo B: ${FNC_TYPE}
  48. #echo C: ${STATIC}
  49. #echo D: ${FNC_NAME}
  50. #echo D: ${CAMEL_CASE}
  51. #echo E: ${PARAMETERS_ORIGIN}
  52. #echo F: ${BRACKET_END}
  53. #exit
  54. [[ -n $(cat "${f}" | grep -i "function[[:blank:]]*${CAMEL_CASE}") ]] && continue # skip if already exists
  55. TCommentLine=()
  56. J=1
  57. while :; do
  58. COMMENT=$(cat ${f} | grep -B ${J} ${LINE/\$/\\$} | head -n1 | grep -P '^[\t\ ]*(/\*\*|\*[^/]?|\*/)')
  59. if [[ -n ${COMMENT} ]]; then
  60. TCommentLine[${J}]="${COMMENT}"
  61. ((J++))
  62. else
  63. break
  64. fi
  65. done
  66. COMMENT_ORIGIN=""
  67. COMMENT_ORIGIN_WITH_DEPRECATED=""
  68. COMMENT_DUPLICATE=""
  69. if [[ ${#TCommentLine[@]} -gt 0 ]]; then
  70. for (( idx=${#TCommentLine[@]} ; idx>0 ; idx-- )) ; do
  71. COMMENT_ORIGIN="${COMMENT_ORIGIN}\n${TCommentLine[idx]}"
  72. done
  73. COMMENT_DUPLICATE=${COMMENT_ORIGIN}
  74. COMMENT_ORIGIN_WITH_DEPRECATED=$(echo "${COMMENT_ORIGIN%?} @deprecated\n${FIRST_INDENT} * @see ${CAMEL_CASE}\n${FIRST_INDENT} */")
  75. fi
  76. PARAMETERS=${PARAMETERS_ORIGIN}
  77. TParam=()
  78. I=0
  79. while [[ ${PARAMETERS} =~ (\$[a-zA-Z0-9\_\-]+) ]]; do
  80. TParam[${I}]=${BASH_REMATCH[1]}
  81. PARAMETERS=${PARAMETERS#*"${BASH_REMATCH[1]}"}
  82. ((I++))
  83. done
  84. PARAMS_STR=$(printf ", %s" "${TParam[@]}")
  85. PARAMS_STR=${PARAMS_STR:2}
  86. REPLACE=${LINE}
  87. [[ -z ${BRACKET_END} ]] && REPLACE="${LINE}\n${FIRST_INDENT}{\n${FIRST_INDENT}${INDENT}" || REPLACE="${LINE}\n${FIRST_INDENT}${INDENT}"
  88. [[ -n ${STATIC} ]] && REPLACE="${REPLACE}return self::" || REPLACE="${REPLACE}return \$this->"
  89. REPLACE="${REPLACE}${CAMEL_CASE}(${PARAMS_STR});\n${FIRST_INDENT}}\n\n"
  90. REPLACE="${REPLACE}${FIRST_INDENT}${COMMENT_ORIGIN}\n${FIRST_INDENT}"
  91. [[ -n ${STATIC} ]] && REPLACE="${REPLACE}${STATIC} "
  92. [[ -n ${FNC_TYPE} ]] && REPLACE="${REPLACE}${FNC_TYPE} "
  93. REPLACE="${REPLACE}function ${CAMEL_CASE}(${PARAMETERS_ORIGIN})"
  94. [[ -n ${BRACKET_END} ]] && REPLACE="${REPLACE}\n${FIRST_INDENT}{"
  95. echo " ${FNC_NAME} -> ${CAMEL_CASE}"
  96. if [[ -n ${COMMENT_ORIGIN_WITH_DEPRECATED} ]]; then
  97. rpl -e --quiet "${COMMENT_ORIGIN}" ${COMMENT_ORIGIN_WITH_DEPRECATED} "${f}"
  98. fi
  99. rpl -e --quiet "${LINE}" ${REPLACE} "${f}"
  100. fi
  101. done
  102. done