Skip to content

Commit

Permalink
Set pattern type in classes (#5)
Browse files Browse the repository at this point in the history
  • Loading branch information
ryonakano authored Mar 16, 2021
1 parent b312b9f commit eca7060
Show file tree
Hide file tree
Showing 9 changed files with 478 additions and 247 deletions.
266 changes: 19 additions & 247 deletions lib/Converter.vala
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,6 @@ namespace ChCase {
* }}}
*/
public class Converter : GLib.Object {
private delegate void SetRegexFunc (
ref GLib.Array<string> patterns,
ref GLib.Array<string> replace_patterns
);

/**
* Currently specified and expected case as representing input text.
Expand Down Expand Up @@ -260,267 +256,43 @@ namespace ChCase {
* @return Result text after conversion
*/
public string convert_case (owned string text) {
var patterns = new GLib.Array<string> ();
var replace_patterns = new GLib.Array<string> ();

SetRegexFunc regex_func = set_regex_func ();
regex_func (ref patterns, ref replace_patterns);

MatchInfo match_info;
try {
for (int i = 0; i < patterns.length; i++) {
var regex = new Regex (patterns.index (i));
for (regex.match (text, 0, out match_info); match_info.matches (); match_info.next ()) {
text = regex.replace (text, text.length, 0, replace_patterns.index (i));
}
}
} catch (RegexError e) {
warning (e.message);
}

return text;
}

private SetRegexFunc set_regex_func () {
PatternType.Pattern regex_pattern;
switch (source_case) {
case Case.SPACE_SEPARATED:
return set_regex_from_space_separated;
case Case.CAMEL:
return set_regex_from_camel_case;
case Case.PASCAL:
return set_regex_from_pascal_case;
case Case.SNAKE:
return set_regex_from_snake_case;
case Case.KEBAB:
return set_regex_from_kebab_case;
case Case.SENTENCE:
return set_regex_from_sentence_case;
default:
assert_not_reached ();
}
}

private void set_regex_from_space_separated (
ref GLib.Array<string> patterns,
ref GLib.Array<string> replace_patterns
) {
switch (result_case) {
case Case.SPACE_SEPARATED:
// The chosen result case is the same with source case, does nothing.
break;
case Case.CAMEL:
patterns.append_val (" (.)");
replace_patterns.append_val ("\\u\\1");
break;
case Case.PASCAL:
patterns.append_val ("( |^)(.)");
replace_patterns.append_val ("\\u\\2");
break;
case Case.SNAKE:
patterns.append_val (" (.)");
replace_patterns.append_val ("_\\1");
break;
case Case.KEBAB:
patterns.append_val ("( )(.)");
replace_patterns.append_val ("-\\2");
break;
case Case.SENTENCE:
patterns.append_val ("^(.)");
replace_patterns.append_val ("\\u\\1");
break;
default:
warning ("Unexpected case, does nothing.");
break;
}
}

private void set_regex_from_camel_case (
ref GLib.Array<string> patterns,
ref GLib.Array<string> replace_patterns
) {
switch (result_case) {
case Case.SPACE_SEPARATED:
patterns.append_val ("(\\S)([A-Z])");
replace_patterns.append_val ("\\1 \\2");
break;
case Case.CAMEL:
// The chosen result case is the same with source case, does nothing.
break;
case Case.PASCAL:
patterns.append_val ("^([a-z])");
replace_patterns.append_val ("\\u\\1");
break;
case Case.SNAKE:
patterns.append_val ("([A-Z])");
replace_patterns.append_val ("_\\l\\1");
break;
case Case.KEBAB:
patterns.append_val ("([A-Z])");
replace_patterns.append_val ("-\\l\\1");
break;
case Case.SENTENCE:
patterns.append_val ("([A-Z])");
replace_patterns.append_val (" \\l\\1");
patterns.append_val ("^(.)");
replace_patterns.append_val ("\\u\\1");
break;
default:
warning ("Unexpected case, does nothing.");
break;
}
}


private void set_regex_from_pascal_case (
ref GLib.Array<string> patterns,
ref GLib.Array<string> replace_patterns
) {
switch (result_case) {
case Case.SPACE_SEPARATED:
patterns.append_val ("(\\S)([A-Z])");
replace_patterns.append_val ("\\1 \\2");
regex_pattern = new PatternType.SpaceSeparated (result_case);
break;
case Case.CAMEL:
patterns.append_val ("^([A-Z])");
replace_patterns.append_val ("\\l\\1");
regex_pattern = new PatternType.Camel (result_case);
break;
case Case.PASCAL:
// The chosen result case is the same with source case, does nothing.
regex_pattern = new PatternType.Pascal (result_case);
break;
case Case.SNAKE:
patterns.append_val ("^([A-Z])");
replace_patterns.append_val ("\\l\\1");
patterns.append_val ("([A-Z])");
replace_patterns.append_val ("_\\l\\1");
regex_pattern = new PatternType.Snake (result_case);
break;
case Case.KEBAB:
patterns.append_val ("^([A-Z])");
replace_patterns.append_val ("\\l\\1");
patterns.append_val ("([A-Z])");
replace_patterns.append_val ("-\\l\\1");
regex_pattern = new PatternType.Kebab (result_case);
break;
case Case.SENTENCE:
patterns.append_val ("([A-Z])");
replace_patterns.append_val (" \\l\\1");
patterns.append_val ("^ (.)");
replace_patterns.append_val ("\\u\\1");
regex_pattern = new PatternType.Sentence (result_case);
break;
default:
warning ("Unexpected case, does nothing.");
break;
}
}

private void set_regex_from_snake_case (
ref GLib.Array<string> patterns,
ref GLib.Array<string> replace_patterns
) {
switch (result_case) {
case Case.SPACE_SEPARATED:
patterns.append_val ("_(.)");
replace_patterns.append_val (" \\1");
break;
case Case.CAMEL:
patterns.append_val ("_(.)");
replace_patterns.append_val ("\\u\\1");
break;
case Case.PASCAL:
patterns.append_val ("(_|^)(.)");
replace_patterns.append_val ("\\u\\2");
break;
case Case.SNAKE:
// The chosen result case is the same with source case, does nothing.
break;
case Case.KEBAB:
patterns.append_val ("(_)(.)");
replace_patterns.append_val ("-\\2");
break;
case Case.SENTENCE:
patterns.append_val ("^(.)");
replace_patterns.append_val ("\\u\\1");
patterns.append_val ("_(.)");
replace_patterns.append_val (" \\1");
break;
default:
warning ("Unexpected case, does nothing.");
break;
assert_not_reached ();
}
}

private void set_regex_from_kebab_case (
ref GLib.Array<string> patterns,
ref GLib.Array<string> replace_patterns
) {
switch (result_case) {
case Case.SPACE_SEPARATED:
patterns.append_val ("-(.)");
replace_patterns.append_val (" \\1");
break;
case Case.CAMEL:
patterns.append_val ("-(.)");
replace_patterns.append_val ("\\u\\1");
break;
case Case.PASCAL:
patterns.append_val ("(-|^)(.)");
replace_patterns.append_val ("\\u\\2");
break;
case Case.SNAKE:
patterns.append_val ("-(.)");
replace_patterns.append_val ("_\\1");
break;
case Case.KEBAB:
// The chosen result case is the same with source case, does nothing.
break;
case Case.SENTENCE:
patterns.append_val ("^(.)");
replace_patterns.append_val ("\\u\\1");
patterns.append_val ("-(.)");
replace_patterns.append_val (" \\1");
break;
default:
warning ("Unexpected case, does nothing.");
break;
MatchInfo match_info;
try {
for (int i = 0; i < regex_pattern.detect_patterns.length; i++) {
var regex = new Regex (regex_pattern.detect_patterns.index (i));
for (regex.match (text, 0, out match_info); match_info.matches (); match_info.next ()) {
text = regex.replace (text, text.length, 0, regex_pattern.replace_patterns.index (i));
}
}
} catch (RegexError e) {
warning (e.message);
}
}

private void set_regex_from_sentence_case (
ref GLib.Array<string> patterns,
ref GLib.Array<string> replace_patterns
) {
switch (result_case) {
case Case.SPACE_SEPARATED:
patterns.append_val ("^([A-Z])");
replace_patterns.append_val ("\\l\\1");
break;
case Case.CAMEL:
patterns.append_val ("^([A-Z])");
replace_patterns.append_val ("\\l\\1");
patterns.append_val (" (.)");
replace_patterns.append_val ("\\u\\1");
break;
case Case.PASCAL:
patterns.append_val (" (.)");
replace_patterns.append_val ("\\u\\1");
break;
case Case.SNAKE:
patterns.append_val ("^([A-Z])");
replace_patterns.append_val ("\\l\\1");
patterns.append_val (" (.)");
replace_patterns.append_val ("_\\1");
break;
case Case.KEBAB:
patterns.append_val ("^([A-Z])");
replace_patterns.append_val ("\\l\\1");
patterns.append_val (" (.)");
replace_patterns.append_val ("-\\1");
break;
case Case.SENTENCE:
// The chosen result case is the same with source case, does nothing.
break;
default:
warning ("Unexpected case, does nothing.");
break;
}
return text;
}
}
}
55 changes: 55 additions & 0 deletions lib/PatternType/Case/Camel.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Copyright 2020-2021 Ryo Nakano
*
* This program or library is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <https://www.gnu.org/licenses/>.
*/

namespace ChCase.PatternType {
public class Camel : Pattern {
public Camel (Case result_case) {
base (result_case);
}

protected override void to_space_separated () {
detect_patterns.append_val ("(\\S)([A-Z])");
replace_patterns.append_val ("\\1 \\2");
}

protected override void to_camel () {
// The chosen result case is the same with source case, does nothing.
}

protected override void to_pascal () {
detect_patterns.append_val ("^([a-z])");
replace_patterns.append_val ("\\u\\1");
}

protected override void to_snake () {
detect_patterns.append_val ("([A-Z])");
replace_patterns.append_val ("_\\l\\1");
}

protected override void to_kebab () {
detect_patterns.append_val ("([A-Z])");
replace_patterns.append_val ("-\\l\\1");
}

protected override void to_sentence () {
detect_patterns.append_val ("([A-Z])");
replace_patterns.append_val (" \\l\\1");
detect_patterns.append_val ("^(.)");
replace_patterns.append_val ("\\u\\1");
}
}
}
Loading

0 comments on commit eca7060

Please sign in to comment.