105 lines
3.8 KiB
Nix
105 lines
3.8 KiB
Nix
{ core, urls, ... }:
|
|
let
|
|
inherit(core) debug list string type;
|
|
|
|
fromSet = { area, country, suffix } @ number: number;
|
|
splitRest = string.splitAt "[ ]+";
|
|
|
|
p2 = "2[07]|2[0-9]{2}";
|
|
p3 = "3[0-469]|3[0-9]{2}";
|
|
p4 = "42[0-9]|4[0-9]";
|
|
p5 = "5[09][0-9]|5[1-8]";
|
|
p6 = "6[0-6]|6[7-9][0-9]";
|
|
p8 = "8[1246]|8[035789][0-9]";
|
|
p9 = "9[0-58]|9[679][0-9]";
|
|
restRegEx = "([0-9 /-]+)";
|
|
internationalRegEx = "[+](1|${p2}|${p3}|${p4}|${p5}|${p6}|7|${p8}|${p9})[ -]?${restRegEx}";
|
|
nationalRegEx = "0${restRegEx}";
|
|
|
|
formatTeX
|
|
= number:
|
|
let
|
|
number' = parse number;
|
|
rest = string.concatWith "\\," number'.suffix;
|
|
in
|
|
urls.formatTeXboxed "tel:${number}"
|
|
(
|
|
if number'.country != null
|
|
then
|
|
if number'.area != null
|
|
then
|
|
"${number'.country}\\,${number'.area}\\,${rest}"
|
|
else
|
|
"${number'.country}\\,${rest}"
|
|
else
|
|
rest
|
|
);
|
|
|
|
parse
|
|
= number:
|
|
let
|
|
international = string.match internationalRegEx number;
|
|
national = string.match nationalRegEx number;
|
|
|
|
country
|
|
= if international != null then "+${list.head international}"
|
|
else if national != null then "0"
|
|
else null;
|
|
|
|
rest
|
|
= if international != null then list.get international 1
|
|
else if national != null then list.head national
|
|
else number;
|
|
|
|
defaultAreaAndSuffix
|
|
= {
|
|
area = null;
|
|
suffix = splitRest rest;
|
|
};
|
|
|
|
areaAndSuffix
|
|
= if country != null
|
|
&& country != "0"
|
|
then
|
|
{
|
|
"+49"
|
|
= let
|
|
foo = string.match "(1?[0-9]{2})([0-9 -]+)" rest;
|
|
in
|
|
if foo != null
|
|
then
|
|
debug.info "areaAndSuffix"
|
|
{
|
|
text = "foo != null";
|
|
show = true;
|
|
}
|
|
{
|
|
area = list.get foo 0;
|
|
suffix = splitRest (list.get foo 1);
|
|
}
|
|
else
|
|
debug.info "areaAndSuffix"
|
|
{
|
|
text = "foo == null";
|
|
data = rest;
|
|
}
|
|
defaultAreaAndSuffix;
|
|
}.${country} or defaultAreaAndSuffix
|
|
else
|
|
defaultAreaAndSuffix;
|
|
in
|
|
type.matchPrimitiveOrPanic number
|
|
{
|
|
set = fromSet number;
|
|
string
|
|
= {
|
|
inherit country;
|
|
area = areaAndSuffix.area;
|
|
suffix = areaAndSuffix.suffix;
|
|
};
|
|
};
|
|
in
|
|
{
|
|
inherit formatTeX parse;
|
|
}
|