class EL_WORD_SEPARATION_ADAPTER

(source code)

Client examples: BASE_AUTOTEST_APP

description

Adapt Eiffel identifiers to other word separation conventions and vice-versa

note
	description: "Adapt Eiffel identifiers to other word separation conventions and vice-versa"

	author: "Finnian Reilly"
	copyright: "Copyright (c) 2001-2022 Finnian Reilly"
	contact: "finnian at eiffel hyphen loop dot com"

	license: "MIT license (See: en.wikipedia.org/wiki/MIT_License)"
	date: "2023-11-04 11:05:09 GMT (Saturday 4th November 2023)"
	revision: "15"

class
	EL_WORD_SEPARATION_ADAPTER

obsolete
	"Use EL_NAME_TRANSLATER descendant (remove)"

inherit
	ANY

	EL_MODULE_NAMING

feature -- Name exporting

	to_camel_case (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := camel_case_string (name_in, To_default, keeping_ref)
		end

	to_camel_case_upper (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := camel_case_string (name_in, To_upper, keeping_ref)
		end

	to_english (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := empty_name_out
			export_to_english (name_in, Result)
			if keeping_ref then
				Result := Result.twin
			end
		end

	to_kebab_case (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := kebab_case_string (name_in, To_default, keeping_ref)
		end

	to_kebab_case_lower (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := kebab_case_string (name_in, To_lower, keeping_ref)
		end

	to_kebab_case_upper (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := kebab_case_string (name_in, To_upper, keeping_ref)
		end

	to_kebab_case_title (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := kebab_case_string (name_in, To_title, keeping_ref)
		end

	to_snake_case_lower (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := snake_case_string (name_in, To_lower, keeping_ref)
		end

	to_snake_case_upper (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := snake_case_string (name_in, To_upper, keeping_ref)
		end

	to_snake_case_title (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := snake_case_string (name_in, To_title, keeping_ref)
		end

	to_english_title (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := empty_name_out
			export_to_title (name_in, Result, ' ')
			if keeping_ref then
				Result := Result.twin
			end
		end

feature -- Name importing

	from_camel_case (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := camel_case_string (name_in, From_default, keeping_ref)
		end

	from_camel_case_upper (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := camel_case_string (name_in, From_upper, keeping_ref)
		end

	from_english (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := empty_name_out
			Naming.from_separated (name_in, Result, ' ')
			if keeping_ref then
				Result := Result.twin
			end
		end

	from_kebab_case (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := kebab_case_string (name_in, From_default, keeping_ref)
		end

	from_kebab_case_upper (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := kebab_case_string (name_in, From_upper, keeping_ref)
		end

	from_snake_case_lower (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := snake_case_string (name_in, From_lower, keeping_ref)
		end

	from_snake_case_upper (name_in: STRING; keeping_ref: BOOLEAN): STRING
		do
			Result := snake_case_string (name_in, From_upper, keeping_ref)
		end

feature {NONE} -- Implementation

	camel_case_string (name_in: STRING; case: INTEGER; keeping_ref: BOOLEAN): STRING
		do
			Result := empty_name_out
			inspect case
				when From_default then
					Naming.from_camel_case (name_in, Result)

				when From_lower then
					Result.append (name_in)

				when From_upper then
					import_from_camel_case_upper (name_in, Result)

				when To_default then
					Naming.to_camel_case (name_in, Result, False)

				when To_lower then
					Naming.to_camel_case_lower (name_in, Result)

				when To_upper then
					Naming.to_camel_case_upper (name_in, Result)
			else
				Naming.to_camel_case (name_in, Result, False)
			end
			if keeping_ref then
				Result := Result.twin
			end
		end

	empty_name_out: STRING
		do
			Result := Once_name_out
			Result.wipe_out
		end

	export_to_english (name_in, english_out: STRING)
		do
			Naming.to_english (name_in, english_out, Naming.Empty_word_set)
		end

	export_to_title (name_in, title_out: STRING; separator_out: CHARACTER)
		do
			Naming.to_title (name_in, title_out, separator_out, Naming.Empty_word_set)
		end

	import_from_camel_case_upper (name_in, a_name_out: STRING)
		-- redefine in descendant to change `boundary_hints' in 3rd argument to
		-- `from_upper_camel_case'
		do
			Naming.from_camel_case_upper (name_in, a_name_out, Naming.no_words)
		end

	kebab_case_string (name_in: STRING; case: INTEGER; keeping_ref: BOOLEAN): STRING
		do
			Result := empty_name_out
			inspect case
				when From_default then
					Naming.from_kebab_case (name_in, Result)

				when To_default then
					Naming.to_kebab_case (name_in, Result)

				when To_lower then
					Naming.to_kebab_case_lower (name_in, Result)

				when To_upper then
					Naming.to_kebab_case_upper (name_in, Result)

				when To_title then
					Naming.to_title (name_in, Result, '-', Naming.empty_word_set)
			else
				Naming.from_kebab_case (name_in, Result)
			end
			if keeping_ref then
				Result := Result.twin
			end
		end

	snake_case_string (name_in: STRING; case: INTEGER; keeping_ref: BOOLEAN): STRING
		do
			inspect case
				when From_lower, To_default, To_lower then
					Result := name_in
			else
				Result := empty_name_out
				inspect case
					when From_upper then
						Naming.from_snake_case_upper (name_in, Result)
					when To_upper then
						Naming.to_snake_case_upper (name_in, Result)
					when To_lower then
						Naming.to_snake_case_lower (name_in, Result)
					when To_title then
						Naming.to_title (name_in, Result, '_', Naming.empty_word_set)

				else
					Result := name_in
				end
			end
			if keeping_ref then
				Result := Result.twin
			end
		end

feature {NONE} -- Constants

	From_default: INTEGER = 4

	From_lower: INTEGER = 5

	From_upper: INTEGER = 6

	Once_name_out: STRING
		once
			create Result.make (30)
		end

	To_default: INTEGER = 0

	To_lower: INTEGER = 1

	To_upper: INTEGER = 2

	To_title: INTEGER = 3

end