# Parse data and output simplified format.
# Usage: parse_simplify <STRING>
function parse_simplify() {
	echo "${*}" | \
		sed -e "s/ /_/g" \
				-e "s/[^[:alnum:]_-]//g" \
				-e "s/_\+/_/g" -e "s/-\+/-/g" \
				-e "s/_-/_/g" -e "s/-_/_/g" \
				-e "s/_\+/_/g" \
				-e "s/^_//" -e "s/_$//"
}

# Parse to PascalCase.
# Usage: parse_pascal <STRING>
function parse_pascal() {
	local IFS=${IFS}_-
	local parts=($(parse_simplify ${1}))
	local result

	# If already in Pascal.
	if [[ "${#parts[@]}" = 1 ]]; then
		echo "${parts[*]^}"
		return 0
	fi

	for part in "${parts[@]}"; do
		local word="${part,,}"
		word="${word^}"
		result="${result}${word}"
	done

	echo "${result}"
}

# Parse to snake_case.
# Usage: parse_snake <STRING>
function parse_snake() {
	local IFS=${IFS}_-
	local parts=($(parse_simplify ${1}))
	local result

	for part in "${parts[@]}"; do
		local word="${part,,}"
		result="${result}_${word}"
	done

	echo "${result#_}"
}

# Parse to kebab-case.
# Usage: parse_kebab <STRING>
function parse_kebab() {
	local IFS=${IFS}_-
	local parts=($(parse_simplify ${1}))
	local result

	for part in "${parts[@]}"; do
		local word="${part,,}"
		result="${result}-${word}"
	done

	echo "${result#-}"
}

# Parse to camelCase.
# Usage: parse_camel <STRING>
function parse_camel() {
	local IFS=${IFS}_-
	local parts=($(parse_simplify ${1}))
	local result

	# If already in camel.
	if [[ "${#parts[@]}" = 1 ]]; then
		echo "${parts[*],}"
		return 0
	fi

	for part in "${parts[@]}"; do
		local word="${part,,}"
		word="${word^}"
		result="${result}${word}"
	done

	echo "${result,}"
}

# Parse to SNAKE_CASE_UPPERCASE.
# Usage: parse_snake_uppercase <STRING>
function parse_snake_uppercase() {
	local IFS=${IFS}_-
	local parts=($(parse_simplify ${1}))
	local result

	for part in "${parts[@]}"; do
		local word="${part^^}"
		result="${result}_${word}"
	done

	echo "${result#_}"
}

# Parse data keeping only alphanumeric characters.
# Usage: parse_alnum <STRING>
function parse_alnum() {
	echo "${*}" | \
		sed -e "s/[^[:alnum:]]//g"
}