#!/bin/bash # shellcheck disable=2002,2004,2028,2034,2053,2068,2086,2116,2143,2207 ## Need "rpl" package RPL_INSTALLED=$(dpkg -s rpl) if [[ -z ${RPL_INSTALLED} ]]; then echo "This bash need rpl command, you can install it with: sudo apt install rpl" fi DIR_HTDOCS=$( cd "$( dirname "${BASH_SOURCE[0]}" )/../../htdocs" >/dev/null && pwd ) PATTERN="" if [[ -f $1 ]]; then TFile=("$1") # specific file elif [[ -n $1 ]]; then PATTERN=$1 # name of a particular file or pattern (ex: societe.class.php) else PATTERN="*.class.php" # *.lib.php fi if [[ -n ${PATTERN} ]]; then TCLASSFILE=$(find "${DIR_HTDOCS}" -name "${PATTERN}" | grep -v "/custom/" | grep -v "/includes/" | grep -v -F -f "${DIR_HTDOCS}/../.gitignore") TFile=() I=0 for f in ${TCLASSFILE}; do TFile[${I}]="${f}" ((I++)) done fi REGEX_FNC_W='^([[:blank:]]*)(public|private|protected)?[ \t]*(static)?[ \t]*[^\$\(]function[ \t]*([a-zA-Z0-9\-\_]*)[\(](.*)[\)][ \t]*([\{]?)$' INDENT=" " for f in ${TFile[@]}; do # echo ${f} IFS=$'\n' TLine=($(cat "${f}" | grep -E "${REGEX_FNC_W}")) for LINE in ${TLine[@]}; do if [[ ${LINE} =~ ^${REGEX_FNC_W}$ ]]; then FIRST_INDENT=${BASH_REMATCH[1]} # seem not work FNC_TYPE=${BASH_REMATCH[2]} STATIC=${BASH_REMATCH[3]} FNC_NAME=${BASH_REMATCH[4]} PARAMETERS_ORIGIN=${BASH_REMATCH[5]} BRACKET_END=${BASH_REMATCH[6]} if [[ ${LINE} =~ ^([[:blank:]]*) ]]; then # but this seems work to get indentation FIRST_INDENT=${BASH_REMATCH[1]} fi [[ ${FNC_NAME} =~ ^__ ]] && continue # skip magic function CAMEL_CASE=$(echo "${FNC_NAME}" | sed -r 's/(_)([a-zA-Z0-9])/\U\2/g') [[ ${CAMEL_CASE} = ${FNC_NAME} ]] && continue # skip if no difference #echo A: ${#FIRST_INDENT} #printf "${FIRST_INDENT}TEST INDENT\n" #echo B: ${FNC_TYPE} #echo C: ${STATIC} #echo D: ${FNC_NAME} #echo D: ${CAMEL_CASE} #echo E: ${PARAMETERS_ORIGIN} #echo F: ${BRACKET_END} #exit [[ -n $(cat "${f}" | grep -i "function[[:blank:]]*${CAMEL_CASE}") ]] && continue # skip if already exists TCommentLine=() J=1 while :; do COMMENT=$(cat ${f} | grep -B ${J} ${LINE/\$/\\$} | head -n1 | grep -P '^[\t\ ]*(/\*\*|\*[^/]?|\*/)') if [[ -n ${COMMENT} ]]; then TCommentLine[${J}]="${COMMENT}" ((J++)) else break fi done COMMENT_ORIGIN="" COMMENT_ORIGIN_WITH_DEPRECATED="" COMMENT_DUPLICATE="" if [[ ${#TCommentLine[@]} -gt 0 ]]; then for (( idx=${#TCommentLine[@]} ; idx>0 ; idx-- )) ; do COMMENT_ORIGIN="${COMMENT_ORIGIN}\n${TCommentLine[idx]}" done COMMENT_DUPLICATE=${COMMENT_ORIGIN} COMMENT_ORIGIN_WITH_DEPRECATED=$(echo "${COMMENT_ORIGIN%?} @deprecated\n${FIRST_INDENT} * @see ${CAMEL_CASE}\n${FIRST_INDENT} */") fi PARAMETERS=${PARAMETERS_ORIGIN} TParam=() I=0 while [[ ${PARAMETERS} =~ (\$[a-zA-Z0-9\_\-]+) ]]; do TParam[${I}]=${BASH_REMATCH[1]} PARAMETERS=${PARAMETERS#*"${BASH_REMATCH[1]}"} ((I++)) done PARAMS_STR=$(printf ", %s" "${TParam[@]}") PARAMS_STR=${PARAMS_STR:2} REPLACE=${LINE} [[ -z ${BRACKET_END} ]] && REPLACE="${LINE}\n${FIRST_INDENT}{\n${FIRST_INDENT}${INDENT}" || REPLACE="${LINE}\n${FIRST_INDENT}${INDENT}" [[ -n ${STATIC} ]] && REPLACE="${REPLACE}return self::" || REPLACE="${REPLACE}return \$this->" REPLACE="${REPLACE}${CAMEL_CASE}(${PARAMS_STR});\n${FIRST_INDENT}}\n\n" REPLACE="${REPLACE}${FIRST_INDENT}${COMMENT_ORIGIN}\n${FIRST_INDENT}" [[ -n ${STATIC} ]] && REPLACE="${REPLACE}${STATIC} " [[ -n ${FNC_TYPE} ]] && REPLACE="${REPLACE}${FNC_TYPE} " REPLACE="${REPLACE}function ${CAMEL_CASE}(${PARAMETERS_ORIGIN})" [[ -n ${BRACKET_END} ]] && REPLACE="${REPLACE}\n${FIRST_INDENT}{" echo " ${FNC_NAME} -> ${CAMEL_CASE}" if [[ -n ${COMMENT_ORIGIN_WITH_DEPRECATED} ]]; then rpl -e --quiet "${COMMENT_ORIGIN}" ${COMMENT_ORIGIN_WITH_DEPRECATED} "${f}" fi rpl -e --quiet "${LINE}" ${REPLACE} "${f}" fi done done