This is a little coding exercise, inspired by this recent thread.
Below script opens the text file /usr/share/zoneinfo/iso3166.tab, which contains all ISO 3166 country codes, generates associated country flags and feeds the result to gtkdialog.
Not tremendously useful but maybe entertaining and educational. Lots of flags I've never seen - and some countries I've never heard of
Flags can be enlarged and copied and they are surprisingly detailed, given that they are not images but characters.
The script uses only 1 call to sed and 1 call to gtkdialog, which makes it relatively fast.
The script requires a font containing colored emojis. Works best with NotoColorEmoji.ttf. This font is included in Bookworm64, F96-CE and many other "modern" Puppies.
emojione-android.ttf is a font installed in Fossapup64 9.5. Produces round flags
TwemojiMozilla.ttf is shipped with *fox browsers but would not work work when copied to the TTF directory. Don't know why.
Code: Select all
#! /bin/bash
## Adds flag glyphs to country codes of text file /usr/share/zoneinfo/iso3166.tab
## Requires font NotoColorEmoji.ttf
function make_flags {
H='\xf0\x9f\x87\x' #common hex part of "regional indicators" (first letter A = codepoint 1F1E6 = \xf0\x9f\x87\xa6)
sed -r "
/^#/d #remove comments
s/&/&/ #pangofy ampersands
s/(..)\t(.*)/\1 <b>\1<\/b> \2/ #duplicate country codes
s/^A(.*)/${H}a6\1/ ; s/^(.)A(.*)/\1${H}a6\2/
s/^B(.*)/${H}a7\1/ ; s/^(.)B(.*)/\1${H}a7\2/
s/^C(.*)/${H}a8\1/ ; s/^(.)C(.*)/\1${H}a8\2/
s/^D(.*)/${H}a9\1/ ; s/^(.)D(.*)/\1${H}a9\2/
s/^E(.*)/${H}aa\1/ ; s/^(.)E(.*)/\1${H}aa\2/
s/^F(.*)/${H}ab\1/ ; s/^(.)F(.*)/\1${H}ab\2/
s/^G(.*)/${H}ac\1/ ; s/^(.)G(.*)/\1${H}ac\2/
s/^H(.*)/${H}ad\1/ ; s/^(.)H(.*)/\1${H}ad\2/
s/^I(.*)/${H}ae\1/ ; s/^(.)I(.*)/\1${H}ae\2/
s/^J(.*)/${H}af\1/ ; s/^(.)J(.*)/\1${H}af\2/
s/^K(.*)/${H}b0\1/ ; s/^(.)K(.*)/\1${H}b0\2/
s/^L(.*)/${H}b1\1/ ; s/^(.)L(.*)/\1${H}b1\2/
s/^M(.*)/${H}b2\1/ ; s/^(.)M(.*)/\1${H}b2\2/
s/^N(.*)/${H}b3\1/ ; s/^(.)N(.*)/\1${H}b3\2/
s/^O(.*)/${H}b4\1/ ; s/^(.)O(.*)/\1${H}b4\2/
s/^P(.*)/${H}b5\1/ ; s/^(.)P(.*)/\1${H}b5\2/
s/^Q(.*)/${H}b6\1/ ; s/^(.)Q(.*)/\1${H}b6\2/
s/^R(.*)/${H}b7\1/ ; s/^(.)R(.*)/\1${H}b7\2/
s/^S(.*)/${H}b8\1/ ; s/^(.)S(.*)/\1${H}b8\2/
s/^T(.*)/${H}b9\1/ ; s/^(.)T(.*)/\1${H}b9\2/
s/^U(.*)/${H}ba\1/ ; s/^(.)U(.*)/\1${H}ba\2/
s/^V(.*)/${H}bb\1/ ; s/^(.)V(.*)/\1${H}bb\2/
s/^W(.*)/${H}bc\1/ ; s/^(.)W(.*)/\1${H}bc\2/
s/^X(.*)/${H}bd\1/ ; s/^(.)X(.*)/\1${H}bd\2/
s/^Y(.*)/${H}be\1/ ; s/^(.)Y(.*)/\1${H}be\2/
s/^Z(.*)/${H}bf\1/ ; s/^(.)Z(.*)/\1${H}bf\2/
s/../<span font=\"$1\">&<\/span>/ #enclose first 2 letters (=flags) in pango span tag
" /usr/share/zoneinfo/iso3166.tab
} ;export -f make_flags
export MAIN_DIALOG='<window title="ISO 3166 country codes" allow-shrink="true" width-request="400" height-request="650" window_position="1">
<vbox>
<vbox scrollable="true">
<text use-markup="true" xalign="0" wrap="false" selectable="true" can-focus="false">
<variable export="false">vTEXT</variable>
<input>make_flags ${vSPIN:-58}</input>
</text>
</vbox>
<hbox>
<text label="Flag size:"></text>
<spinbutton space-expand="false" range-min="10" range-step="8" range-max="200" >
<variable>vSPIN</variable>
<default>58</default>
<action>refresh:vTEXT</action>
</spinbutton>
<button label="Close" has-focus="true" width-request="100"></button>
</hbox>
</vbox>
</window>'
gtkdialog
[Edit] Clarified font requirements