Source code
Revision control
Copy as Markdown
Other Tools
#!/usr/bin/env perl
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# This tool is used to prepare a list of valid language subtags from the
# Run as
#
# perl genLanguageTagList.pl language-subtag-registry > gfxLanguageTagList.cpp
#
# where language-subtag-registry is a copy of the IANA registry file.
use strict;
my $timestamp = gmtime();
print <<__END;
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
/*
* Derived from the IANA language subtag registry by genLanguageTagList.pl.
*
* Created on $timestamp.
*
* * * * * This file contains MACHINE-GENERATED DATA, do not edit! * * * * *
*/
__END
my $isLanguage = 0;
while (<>) {
# strip leading/trailing whitespace, if any
chomp;
s/^\s+//;
s/\s+$//;
# assume File-Date precedes the actual list;
# record the date, and begin assignment to an array of valid tags
if (m/^File-Date:\s*(.+)$/) {
print "// Based on IANA registry dated $1\n\n";
print "static const uint32_t sLanguageTagList[] = {";
next;
}
if (m/^%%/) {
$isLanguage = 0;
next;
}
# we only care about records of type 'language'
if (m/^Type:\s*(.+)$/) {
$isLanguage = ($1 eq 'language');
next;
}
# append the tag to our string, with ";" as a delimiter
if ($isLanguage && m/^Subtag:\s*([a-z]{2,3})\s*$/) {
my $tagstr = $1;
print "\n TRUETYPE_TAG(",
join(",", map { $_ eq " " ? " 0 " : "'" . $_ . "'" } split(//, substr($tagstr . " ", 0, 4))),
"), // ", $tagstr;
next;
}
if ($isLanguage && m/^Description:\s*(.+)$/) {
print " = $1";
$isLanguage = 0; # only print first Description field
next;
}
}
# at end of file, terminate our assignment to the array of tags
print <<__END;
0x0 // end of language code list
};
/*
* * * * * This file contains MACHINE-GENERATED DATA, do not edit! * * * * *
*/
__END