Clone in a terminal:
Commit 7c52f06
Johan Mattsson - 2013-06-29T20:49:33+00:00
7c52f06d8013a3707e28a0128eeca3409bc39563johan.mattsson.m@gmail.com

customize default character set

Changed files (11)

Diff

diff --git a/birdfont/GtkWindow.vala b/birdfont/GtkWindow.valaindex bd3b4ab..8763fe3 100644--- a/birdfont/GtkWindow.vala+++ b/birdfont/GtkWindow.vala@@ -417,6 +417,10 @@ public class GtkWindow : Gtk.Window, NativeWindow { 		kerning_item.activate.connect (() => { MenuTab.show_kerning_context (); }); 		kerning_item.add_accelerator ("activate", accel_group, 'K', Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE); +		Gtk.MenuItem select_language_item = new Gtk.MenuItem.with_mnemonic (_("Select _character set"));+		file_menu.append (select_language_item);+		select_language_item.activate.connect (() => { MenuTab.select_language (); });+		 		Gtk.MenuItem quit_item = new Gtk.MenuItem.with_mnemonic (_("_Quit")); 		file_menu.append (quit_item); 		quit_item.activate.connect (() => { quit(); });diff --git a/libbirdfont/BirdFont.vala b/libbirdfont/BirdFont.valaindex 73665fa..2262e82 100644--- a/libbirdfont/BirdFont.vala+++ b/libbirdfont/BirdFont.vala@@ -258,6 +258,9 @@ public class BirdFont { 		} 		 		Preferences.set_last_file (get_current_font ().get_path ());+		DefaultGlyphs.create_default_character_sets ();+		DefaultGlyphs.get_glyphs_for_prefered_language ();+ 	}  	static void init_gettext () {diff --git a/libbirdfont/CharDatabase.vala b/libbirdfont/CharDatabase.valaindex 84dfd61..c3676fe 100644--- a/libbirdfont/CharDatabase.vala+++ b/libbirdfont/CharDatabase.vala@@ -114,7 +114,7 @@ class CharDatabase { 		} 		 		if (description == "") {-			description = Font.to_hex (c).replace ("U+", "") + "\t";+			description = Font.to_hex (c).replace ("U+", "") + "\tUNICODE CHARACTER"; 		} 		 		return description;		diff --git a/libbirdfont/DefaultGlyphs.vala b/libbirdfont/DefaultGlyphs.valanew file mode 100644index 0000000..c6d6e9f--- /dev/null+++ b/libbirdfont/DefaultGlyphs.vala@@ -0,0 +1,284 @@+/*+    Copyright (C) 2013 Johan Mattsson++    This program is free software: you can redistribute it and/or modify+    it under the terms of the GNU General Public License as published by+    the Free Software Foundation, either version 3 of the License, or+    (at your option) any later version.++    This program 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 General Public License for more details.++    You should have received a copy of the GNU General Public License+    along with this program.  If not, see <http://www.gnu.org/licenses/>.+*/++namespace BirdFont {++/** Default character sets for several languages. */+public class DefaultGlyphs {+	+	public static DefaultLanguages languages;+	+	public static void create_default_character_sets () {+		languages = new DefaultLanguages ();+		+		add_language (_("Default language"), "", "");+		add_language (_("Private use area"), "PRIVATE_USE", "");+		+		add_language (_("Chinese"), "zh", "");+		add_language (_("English"), "en", "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z");+		add_language (_("Japanese"), "jp", "");+		add_language (_("Javanese"), "jv", "ꦀ ꦁ ꦂ ꦃ ꦄ ꦅ ꦆ ꦇ ꦈ ꦉ ꦊ ꦋ ꦌ ꦍ ꦎ ꦏ ꦐ ꦑ ꦒ ꦓ ꦔ ꦕ ꦖ ꦗ ꦘ ꦙ ꦚ ꦛ ꦜ ꦝ ꦞ ꦟ ꦠ ꦡ ꦢ ꦣ ꦤ ꦥ ꦦ ꦧ ꦨ ꦩ ꦪ ꦫ ꦬ ꦭ ꦮ ꦯ ꦰ ꦱ ꦲ ꦳ ꦴ ꦵ ꦶ ꦷ ꦸ ꦹ ꦺ ꦻ ꦼ ꦽ ꦾ ꦿ ꧀ ꧁ ꧂ ꧃ ꧄ ꧅ ꧆ ꧇ ꧈ ꧉ ꧊ ꧋ ꧌ ꧍ ꧏ ꧐ ꧑ ꧒ ꧓ ꧔ ꧕ ꧖ ꧗ ꧘ ꧙ ꧞ ꧟ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z");+		add_language (_("Russian"), "ro", "А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я");+		add_language (_("Swedish"), "sv", "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Å Ä Ö a b c d e f g h i j k l m n o p q r s t u v w x y z å ä ö");+	}+	+	/** Add a new language to the menu for default character set.+	 * @param language A localized string of the language.+	 * @param language_code ISO code+	 * @param characters all characters and including characters with diacritical marks for the language. For languages with too many glyphs should this string be left empty. See the functions for chinese and japanese.+	 */+	public static void add_language (string language, string language_code, string characters) {+		DefaultLanguages.names.append (language);+		DefaultLanguages.codes.append (language_code);+		DefaultLanguages.characters.append (characters);+	}+	+	/** Add all glyphs for the current locale settings to this glyph range. */+	public static void use_default_range (GlyphRange gr) {+		string language = get_prefered_language_code ();+		+		if (language == "PRIVATE_USE") {+			use_private_area (gr);+		} else if (language.has_prefix ("ja")) {+			use_default_range_japanese (gr);+		} else if (language.has_prefix ("zh")) { // TODO: not just simplified chinese+			use_default_range_chinese (gr);+		} else {+			use_default_range_alphabetic (gr);+		}+	}+	+	private static string get_prefered_language_code () {+		string prefered_language;+		string[] languages = Intl.get_language_names ();+		+		prefered_language = Preferences.get ("language");+		+		if (prefered_language != "") {+			return prefered_language;+		}+		+		if (languages.length == 0) {+			return "";+		}+		+		return languages[0];+	}+	+	public static string get_glyphs_for_prefered_language () {+		string lang = get_prefered_language_code ();+		int i = 0;+		string characters = "";+		+		foreach (unowned string code in DefaultLanguages.codes) {+			if (lang.has_prefix (code)) {+				characters = DefaultLanguages.characters.nth (i).data;+				// Compiler bug, this line causes trouble:+				// return default_characters.nth (i).data;+			}+			i++;+		}+		+		return characters;+	}+	+	private static void use_private_area (GlyphRange gr) {+		gr.add_range (0xe000, 0xf8ff);+	}+	+	private static void use_default_range_alphabetic (GlyphRange gr) {+		string lower_case, upper_case;+		string all_characters;+		+		all_characters = get_glyphs_for_prefered_language ();+		if (all_characters != "") {+			foreach (string c in all_characters.split (" ")) {+				gr.add_single (c.get_char ());+			}+		} else {			+			/// All lower case letters in alphabetic order separated by space+			lower_case = _("a b c d e f g h i j k l m n o p q r s t u v w x y z");+			+			/// All upper case letters in alphabetic order separated by space+			upper_case = _("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z");++			foreach (string c in lower_case.split (" ")) {+				gr.add_single (c.get_char ());+			}++			foreach (string c in upper_case.split (" ")) {+				gr.add_single (c.get_char ());+			}+		}+		+		gr.add_range ('0', '9');+		+		gr.add_single (' '); // TODO: add all spaces here.+		+		gr.add_single ('.');+		gr.add_single ('?');+		+		gr.add_single (',');+		+		gr.add_single ('’');++		gr.add_range ('“', '”');++		gr.add_single ('&');+		+		gr.add_range (':', ';');+		+		gr.add_single ('/'); +		+		gr.add_range ('!', '/');+		+		gr.add_single ('-');+		gr.add_range ('‐', '—');+		gr.add_range ('<', '@');+		gr.add_range ('(', ')');+	}+	+	public static void  use_default_range_japanese (GlyphRange gr) {+		// hiragana+		gr.add_range ('ぁ', 'ゖ');+		gr.add_range ('゙', 'ゟ');++		// halfwidth and fullwidth forms+		gr.add_range ('!', 'ᄒ');+		gr.add_range ('ᅡ', 'ᅦ');+		gr.add_range ('ᅧ', 'ᅬ');+		gr.add_range ('ᅭ', 'ᅲ');+		gr.add_range ('ᅳ', 'ᅵ');+		gr.add_range ('¢', '₩');+		gr.add_range ('│', '○');++		// katakana phonetic extensions+		gr.add_range ('ㇰ', 'ㇿ');++		// kana supplement+		gr.add_single ('𛀀');+		gr.add_single ('𛀁');++		// kanbun+		gr.add_range ('㆐', '㆟');+	}+	+	public static void use_default_range_chinese (GlyphRange gr) {+		string pinyin_tones;+		+		// pinyin+		pinyin_tones  = "ˇ ˉ ˊ ˋ ˙ ā á ǎ à ō ó ǒ ò ē é ě è ī í ǐ ì ū ú ǔ ù ǖ ǘ ǚ ǜ ü Ā Á Ǎ À Ō Ó Ǒ Ò Ē É Ě È";+		gr.add_range ('a', 'z');+		+		foreach (string c in pinyin_tones.split (" ")) {+			gr.add_single (c.get_char ());+		}		++		// CJK punctuations and symbols+		gr.add_range (' ', '々');+		gr.add_range ('〇', '】');+		gr.add_range ('〓', '〟');+		gr.add_range ('︐', '︙'); ++		// CJK numbers and months+		gr.add_range ('0', '9');+		gr.add_range ('㈠', '㈩');+		gr.add_range ('㋀', '㋋');+		gr.add_range ('㉑', '㉟');+		gr.add_range ('㊱', '㊿');+		gr.add_range ('㊀', '㊉');++		// CJK fullwidth letters and symbols+		gr.add_range ('!', '・');+		gr.add_range ('¢', '₩');+		gr.add_single ('│');++		// CJK special characters+		gr.add_range ('㍘', '㏿');+		gr.add_range ('㋌', '㋏');++		// CJK strokes+		gr.add_range ('㇀', '㇢');++		// CJK supplements+		gr.add_range ('⺀', '⺙');+		gr.add_range ('⺛', '⻳');++		// GB2312 (punctuations)+		gr.add_single ('―');+		gr.add_single ('¤');+		gr.add_single ('§');+		gr.add_single ('¨');+		gr.add_single ('°');+		gr.add_single ('±');+		gr.add_single ('×');+		gr.add_single ('÷');++		// GB2312 (greek letters)+		gr.add_range ('Α', 'Ω');+		gr.add_range ('α', 'ω');++		// GB2312 (cyrillic letters)+		gr.add_range ('А', 'я');+		gr.add_single ('ё');+		gr.add_single ('Ё');+		+		// GB2312 (U+4e00 to U+fa20)+		gr.add_range ('一', '龥');+		gr.add_single ('郎');+		gr.add_single ('凉');+		gr.add_single ('秊');+		gr.add_single ('裏');+		gr.add_single ('隣');+		+		gr.add_range ('兀', '﨏');+		gr.add_single ('﨑');+		gr.add_single ('﨓');+		gr.add_single ('﨔');+		gr.add_single ('礼');+		gr.add_single ('﨟');+		gr.add_single ('蘒');+		gr.add_single ('﨡');+		gr.add_single ('﨣');+		gr.add_single ('﨤');+		gr.add_single ('﨧');+		gr.add_single ('﨨');+		gr.add_single ('﨩');+	}+	+	public static void use_full_unicode_range (GlyphRange gr) {+		CharDatabase.get_full_unicode (gr);+		+		if (gr.get_length () == 0) {+			gr.add_range ('\0', (unichar) 0xFFF8);+		}+	}+}++public class DefaultLanguages {+ 	public static List<string> names;+	public static List<string> codes;+	public static List<string> characters;+	+	public DefaultLanguages () {+		names = new List<string> ();+		codes = new List<string> ();+		characters = new List<string> ();		+	}+}++}diff --git a/libbirdfont/GlyphRange.vala b/libbirdfont/GlyphRange.valaindex 7cc3f92..a6588e8 100644--- a/libbirdfont/GlyphRange.vala+++ b/libbirdfont/GlyphRange.vala@@ -31,185 +31,8 @@ public class GlyphRange { 	public unowned List<UniRange> get_ranges () { 		return ranges; 	}-	-	public void use_default_range () {-		string[] languages = Intl.get_language_names ();-		-		if (languages.length == 0) {-			use_default_range_alphabetic ();-			return;-		}-		-		if (languages[0].has_prefix ("ja")) {-			use_default_range_japanese ();-		} else if (languages[0].has_prefix ("zh_CN")) {-			use_default_range_chinese ();-		} else {-			use_default_range_alphabetic ();-		}-	}-	-	public void use_default_range_alphabetic () {-		string lower_case, upper_case;-						-		/// All lower case letters and letters with diacritical marks in alphabetic order separated by space-		lower_case = _("a b c d e f g h i j k l m n o p q r s t u v w x y z");-		-		/// All upper case letters and letters with diacritical marks in alphabetic order separated by space-		upper_case = _("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z");--		foreach (string c in lower_case.split (" ")) {-			add_single (c.get_char ());-		}--		foreach (string c in upper_case.split (" ")) {-			add_single (c.get_char ());-		}-				-		add_range ('0', '9');-		-		add_single (' '); // TODO: add all spaces here.-		-		add_single ('.');-		add_single ('?'); 		-		add_single (',');-		-		add_single ('’');--		add_range ('“', '”');--		add_single ('&');-		-		add_range (':', ';');-		-		add_single ('/'); -		-		add_range ('!', '/');-		-		add_single ('-');-		add_range ('‐', '—');-		add_range ('<', '@');-		add_range ('(', ')');-	}-	-	public void  use_default_range_japanese () {-		// hiragana-		add_range ('ぁ', 'ゖ');-		add_range ('゙', 'ゟ');--		// halfwidth and fullwidth forms-		add_range ('!', 'ᄒ');-		add_range ('ᅡ', 'ᅦ');-		add_range ('ᅧ', 'ᅬ');-		add_range ('ᅭ', 'ᅲ');-		add_range ('ᅳ', 'ᅵ');-		add_range ('¢', '₩');-		add_range ('│', '○');--		// katakana phonetic extensions-		add_range ('ㇰ', 'ㇿ');--		// kana supplement-		add_single ('𛀀');-		add_single ('𛀁');--		// kanbun-		add_range ('㆐', '㆟');-	}-	-	public void use_default_range_chinese () {-		string pinyin_tones;-		-		// pinyin-		pinyin_tones  = "ˇ ˉ ˊ ˋ ˙ ā á ǎ à ō ó ǒ ò ē é ě è ī í ǐ ì ū ú ǔ ù ǖ ǘ ǚ ǜ ü Ā Á Ǎ À Ō Ó Ǒ Ò Ē É Ě È";-		add_range ('a', 'z');-		-		foreach (string c in pinyin_tones.split (" ")) {-			add_single (c.get_char ());-		}		--		// CJK punctuations and symbols-		add_range (' ', '々');-		add_range ('〇', '】');-		add_range ('〓', '〟');-		add_range ('︐', '︙'); --		// CJK numbers and months-		add_range ('0', '9');-		add_range ('㈠', '㈩');-		add_range ('㋀', '㋋');-		add_range ('㉑', '㉟');-		add_range ('㊱', '㊿');-		add_range ('㊀', '㊉');--		// CJK fullwidth letters and symbols-		add_range ('!', '・');-		add_range ('¢', '₩');-		add_single ('│');--		// CJK special characters-		add_range ('㍘', '㏿');-		add_range ('㋌', '㋏');--		// CJK strokes-		add_range ('㇀', '㇢');--		// CJK supplements-		add_range ('⺀', '⺙');-		add_range ('⺛', '⻳');--		// GB2312 (punctuations)-		add_single ('―');-		add_single ('¤');-		add_single ('§');-		add_single ('¨');-		add_single ('°');-		add_single ('±');-		add_single ('×');-		add_single ('÷');--		// GB2312 (greek letters)-		add_range ('Α', 'Ω');-		add_range ('α', 'ω');--		// GB2312 (cyrillic letters)-		add_range ('А', 'я');-		add_single ('ё');-		add_single ('Ё');-		-		// GB2312 (U+4e00 to U+fa20)-		add_range ('一', '龥');-		add_single ('郎');-		add_single ('凉');-		add_single ('秊');-		add_single ('裏');-		add_single ('隣');-		-		add_range ('兀', '﨏');-		add_single ('﨑');-		add_single ('﨓');-		add_single ('﨔');-		add_single ('礼');-		add_single ('﨟');-		add_single ('蘒');-		add_single ('﨡');-		add_single ('﨣');-		add_single ('﨤');-		add_single ('﨧');-		add_single ('﨨');-		add_single ('﨩');-	}-	-	public void use_full_unicode_range () {-		CharDatabase.get_full_unicode (this);-		-		if (len == 0) {-			add_range ('\0', (unichar) 0xFFF8);-		}-	}-	-	// Todo: complete localized alphabetical sort åäö is the right order for example.+	// TODO: complete localized alphabetical sort åäö is not the right order for example. 	public void sort () { 		ranges.sort ((a, b) => { 			bool r = a.start > b.start;diff --git a/libbirdfont/LanguageSelectionTab.vala b/libbirdfont/LanguageSelectionTab.valanew file mode 100644index 0000000..500f3bc--- /dev/null+++ b/libbirdfont/LanguageSelectionTab.vala@@ -0,0 +1,81 @@+/*+    Copyright (C) 2013 Johan Mattsson++    This program is free software: you can redistribute it and/or modify+    it under the terms of the GNU General Public License as published by+    the Free Software Foundation, either version 3 of the License, or+    (at your option) any later version.++    This program 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 General Public License for more details.++    You should have received a copy of the GNU General Public License+    along with this program.  If not, see <http://www.gnu.org/licenses/>.+*/++namespace BirdFont {++public class LanguageSelectionTab : FontDisplay {+	+	public LanguageSelectionTab () {	+		add_html_callback ("select_language", (val) => {+			TabBar tb = MainWindow.get_tab_bar ();+			print (val);+			Preferences.set ("language", val);+			print (Preferences.get ("language"));+			tb.close_display (this);+			Toolbox.select_tool_by_name ("custom_character_set");+		});+	}++	public override string get_name () {+		return _("Character set");+	}++	public override bool is_html_canvas () {+		return true;+	}+	+	public override string get_html () {+		string headline = _("Select default character set");+		StringBuilder c = new StringBuilder ();++		c.append ("""+<html>+<head>+	<script type="text/javascript" src="supplement.js"></script>+	<style type="text/css">@import url("style.css");</style>+</head>+<body>+	+	<div style="width:350px; margin: 50px auto 0 auto;">+		<div class="heading"><h2>""" + headline + """</h2></div>+		+		<form>+		""");+		+		int i = 0;+		string language_code;+		foreach (string language in DefaultLanguages.names) {+			language_code = DefaultLanguages.codes.nth (i).data;+			c.append ("""+				<input class="button" type="button" value=""" + "\"" + language + "\"" +					+ """ onclick="call ('select_language:""" + language_code + """');"/>+				<br />+			""");+			i++;+		}+		+		c.append ("""+		</form>+	</div>+</body>+</html>""");++		return c.str;+	}	+}++}diff --git a/libbirdfont/MenuTab.vala b/libbirdfont/MenuTab.valaindex c5494b9..2c8bdde 100644--- a/libbirdfont/MenuTab.vala+++ b/libbirdfont/MenuTab.vala@@ -533,5 +533,10 @@ c.append (""" 			overwrite.finished (); 		} 	}+	+	/** Display the language selection tab. */+	public static void select_language () {+		MainWindow.get_tab_bar ().add_unique_tab (new LanguageSelectionTab (), 120, false);+	} } }diff --git a/libbirdfont/OverView.vala b/libbirdfont/OverView.valaindex 14c2cbd..3bb02b2 100644--- a/libbirdfont/OverView.vala+++ b/libbirdfont/OverView.vala@@ -951,7 +951,7 @@ public class OverView : FontDisplay { 			return; 		} 		-		full.use_full_unicode_range ();+		DefaultGlyphs.use_full_unicode_range (full); 		 		set_glyph_range (full); 		selected = c;diff --git a/libbirdfont/OverwriteDialog.vala b/libbirdfont/OverwriteDialog.valaindex 56a6895..881b497 100644--- a/libbirdfont/OverwriteDialog.vala+++ b/libbirdfont/OverwriteDialog.vala@@ -55,6 +55,7 @@ public class OverwriteDialog : FontDisplay {  	public override string get_html () { 		string mess = _("The loaded font can be overwritten if you choose to continue with preview.");+		string headline = _("Overwrite?"); 		return """ <html> <head>@@ -64,7 +65,7 @@ public class OverwriteDialog : FontDisplay { <body> 	 	<div style="width:350px; margin: 50px auto 0 auto;">-		<div class="heading"><h2>""" + _("Overwrite?") + """</h2></div>+		<div class="heading"><h2>""" + headline + """</h2></div> 		 		<p>""" + mess + """</p> 		diff --git a/libbirdfont/Preferences.vala b/libbirdfont/Preferences.valaindex ab38b73..d4b37a7 100644--- a/libbirdfont/Preferences.vala+++ b/libbirdfont/Preferences.vala@@ -41,7 +41,7 @@ public class Preferences { 	public static void @set (string k, string v) { 		lock (data) { 			data.replace (k, v);-			save (); // Fixa: save in separate io thread instead.+			save (); 		} 	} @@ -127,8 +127,6 @@ public class Preferences { 			i = line.index_of_char('"', s); 			string val = line.substring (s, i - s); 			-			// (key, val, description);-			 			data.insert (key, val); 		} 	}diff --git a/libbirdfont/Toolbox.vala b/libbirdfont/Toolbox.valaindex cf755f4..a86c89c 100644--- a/libbirdfont/Toolbox.vala+++ b/libbirdfont/Toolbox.vala@@ -209,7 +209,7 @@ public class Toolbox : GLib.Object  { 					MenuTab.new_file (); 				} 				-				gr.use_full_unicode_range ();+				DefaultGlyphs.use_full_unicode_range (gr); 				o.set_glyph_range (gr); 				MainWindow.get_tab_bar ().select_tab_name ("Overview"); 			});@@ -225,7 +225,7 @@ public class Toolbox : GLib.Object  { 				MenuTab.new_file (); 			} 			-			gr.use_default_range ();+			DefaultGlyphs.use_default_range (gr); 			o.set_glyph_range (gr); 			MainWindow.get_tab_bar ().select_tab_name ("Overview"); 		});

Contact

Email: johan.mattsson.m@gmail.com
Mastodon: typo.social/@birdfont
GitHub: johanmattssonm
LinkedIn: johan-mattsson-2ab324112