Bug 1570370 - Part 7: Remove no longer used JS code generation parts from make_intl_data. r=jwalden

Also removes the "Native"-suffix from function names.

Differential Revision: https://phabricator.services.mozilla.com/D40073

--HG--
extra : moz-landing-system : lando
This commit is contained in:
André Bargull 2019-10-11 19:25:49 +00:00
Родитель f33f8b0f24
Коммит dd190dd631
4 изменённых файлов: 18 добавлений и 1928 удалений

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -1,371 +0,0 @@
// Generated by make_intl_data.py. DO NOT EDIT.
// Version: CLDR-35.1
// URL: https://unicode.org/Public/cldr/35.1/core.zip
/**
* Mapping from deprecated BCP 47 Unicode extension types to their preferred
* values.
*
* Spec: https://www.unicode.org/reports/tr35/#Unicode_Locale_Extension_Data_Files
*/
var deprecatedUnicodeExtensionTypes = {
ca: {
// Ethiopic calendar, Amete Alem (epoch approx. 5493 B.C.E)
"ethiopic-amete-alem": "ethioaa",
// Civil (algorithmic) Arabic calendar
"islamicc": "islamic-civil",
},
kb: {
// The second level to be backwards
"yes": "true",
},
kc: {
// The case level is inserted in front of tertiary
"yes": "true",
},
kh: {
// Hiragana to be sorted before all non-variable on quaternary level
"yes": "true",
},
kk: {
// Convert text into Normalization Form D before calculating collation weights
"yes": "true",
},
kn: {
// A sequence of decimal digits is sorted at primary level with its numeric value
"yes": "true",
},
ks: {
// The primary level
"primary": "level1",
// The tertiary level
"tertiary": "level3",
},
ms: {
// UK System of measurement: feet, pints, etc.; pints are 20oz
"imperial": "uksystem",
},
rg: {
"cn11": "cnbj",
"cn12": "cntj",
"cn13": "cnhe",
"cn14": "cnsx",
"cn15": "cnmn",
"cn21": "cnln",
"cn22": "cnjl",
"cn23": "cnhl",
"cn31": "cnsh",
"cn32": "cnjs",
"cn33": "cnzj",
"cn34": "cnah",
"cn35": "cnfj",
"cn36": "cnjx",
"cn37": "cnsd",
"cn41": "cnha",
"cn42": "cnhb",
"cn43": "cnhn",
"cn44": "cngd",
"cn45": "cngx",
"cn46": "cnhi",
"cn50": "cncq",
"cn51": "cnsc",
"cn52": "cngz",
"cn53": "cnyn",
"cn54": "cnxz",
"cn61": "cnsn",
"cn62": "cngs",
"cn63": "cnqh",
"cn64": "cnnx",
"cn65": "cnxj",
"cz10a": "cz110",
"cz10b": "cz111",
"cz10c": "cz112",
"cz10d": "cz113",
"cz10e": "cz114",
"cz10f": "cz115",
"cz611": "cz663",
"cz612": "cz632",
"cz613": "cz633",
"cz614": "cz634",
"cz615": "cz635",
"cz621": "cz641",
"cz622": "cz642",
"cz623": "cz643",
"cz624": "cz644",
"cz626": "cz646",
"cz627": "cz647",
"czjc": "cz31",
"czjm": "cz64",
"czka": "cz41",
"czkr": "cz52",
"czli": "cz51",
"czmo": "cz80",
"czol": "cz71",
"czpa": "cz53",
"czpl": "cz32",
"czpr": "cz10",
"czst": "cz20",
"czus": "cz42",
"czvy": "cz63",
"czzl": "cz72",
"fra": "frges",
"frb": "frnaq",
"frc": "frara",
"frd": "frbfc",
"fre": "frbre",
"frf": "frcvl",
"frg": "frges",
"frh": "frcor",
"fri": "frbfc",
"frj": "fridf",
"frk": "frocc",
"frl": "frnaq",
"frm": "frges",
"frn": "frocc",
"fro": "frhdf",
"frp": "frnor",
"frq": "frnor",
"frr": "frpdl",
"frs": "frhdf",
"frt": "frnaq",
"fru": "frpac",
"frv": "frara",
"laxn": "laxs",
"lud": "lucl",
"lug": "luec",
"lul": "luca",
"mrnkc": "mr13",
"nzn": "nzauk",
"nzs": "nzcan",
"omba": "ombj",
"omsh": "omsj",
"plds": "pl02",
"plkp": "pl04",
"pllb": "pl08",
"plld": "pl10",
"pllu": "pl06",
"plma": "pl12",
"plmz": "pl14",
"plop": "pl16",
"plpd": "pl20",
"plpk": "pl18",
"plpm": "pl22",
"plsk": "pl26",
"plsl": "pl24",
"plwn": "pl28",
"plwp": "pl30",
"plzp": "pl32",
"tteto": "tttob",
"ttrcm": "ttmrc",
"ttwto": "tttob",
"twkhq": "twkhh",
"twtnq": "twtnn",
"twtpq": "twnwt",
"twtxq": "twtxg",
},
sd: {
"cn11": "cnbj",
"cn12": "cntj",
"cn13": "cnhe",
"cn14": "cnsx",
"cn15": "cnmn",
"cn21": "cnln",
"cn22": "cnjl",
"cn23": "cnhl",
"cn31": "cnsh",
"cn32": "cnjs",
"cn33": "cnzj",
"cn34": "cnah",
"cn35": "cnfj",
"cn36": "cnjx",
"cn37": "cnsd",
"cn41": "cnha",
"cn42": "cnhb",
"cn43": "cnhn",
"cn44": "cngd",
"cn45": "cngx",
"cn46": "cnhi",
"cn50": "cncq",
"cn51": "cnsc",
"cn52": "cngz",
"cn53": "cnyn",
"cn54": "cnxz",
"cn61": "cnsn",
"cn62": "cngs",
"cn63": "cnqh",
"cn64": "cnnx",
"cn65": "cnxj",
"cz10a": "cz110",
"cz10b": "cz111",
"cz10c": "cz112",
"cz10d": "cz113",
"cz10e": "cz114",
"cz10f": "cz115",
"cz611": "cz663",
"cz612": "cz632",
"cz613": "cz633",
"cz614": "cz634",
"cz615": "cz635",
"cz621": "cz641",
"cz622": "cz642",
"cz623": "cz643",
"cz624": "cz644",
"cz626": "cz646",
"cz627": "cz647",
"czjc": "cz31",
"czjm": "cz64",
"czka": "cz41",
"czkr": "cz52",
"czli": "cz51",
"czmo": "cz80",
"czol": "cz71",
"czpa": "cz53",
"czpl": "cz32",
"czpr": "cz10",
"czst": "cz20",
"czus": "cz42",
"czvy": "cz63",
"czzl": "cz72",
"fra": "frges",
"frb": "frnaq",
"frc": "frara",
"frd": "frbfc",
"fre": "frbre",
"frf": "frcvl",
"frg": "frges",
"frh": "frcor",
"fri": "frbfc",
"frj": "fridf",
"frk": "frocc",
"frl": "frnaq",
"frm": "frges",
"frn": "frocc",
"fro": "frhdf",
"frp": "frnor",
"frq": "frnor",
"frr": "frpdl",
"frs": "frhdf",
"frt": "frnaq",
"fru": "frpac",
"frv": "frara",
"laxn": "laxs",
"lud": "lucl",
"lug": "luec",
"lul": "luca",
"mrnkc": "mr13",
"nzn": "nzauk",
"nzs": "nzcan",
"omba": "ombj",
"omsh": "omsj",
"plds": "pl02",
"plkp": "pl04",
"pllb": "pl08",
"plld": "pl10",
"pllu": "pl06",
"plma": "pl12",
"plmz": "pl14",
"plop": "pl16",
"plpd": "pl20",
"plpk": "pl18",
"plpm": "pl22",
"plsk": "pl26",
"plsl": "pl24",
"plwn": "pl28",
"plwp": "pl30",
"plzp": "pl32",
"tteto": "tttob",
"ttrcm": "ttmrc",
"ttwto": "tttob",
"twkhq": "twkhh",
"twtnq": "twtnn",
"twtpq": "twnwt",
"twtxq": "twtxg",
},
tz: {
// Amundsen-Scott Station, South Pole
"aqams": "nzakl",
// Chongqing, China
"cnckg": "cnsha",
// Harbin, China
"cnhrb": "cnsha",
// Kashgar, China
"cnkhg": "cnurc",
// Havana, Cuba
"cuba": "cuhav",
// Cairo, Egypt
"egypt": "egcai",
// Dublin, Ireland
"eire": "iedub",
// 5 hours behind UTC
"est": "utcw05",
// Greenwich Mean Time
"gmt0": "gmt",
// Hong Kong SAR China
"hongkong": "hkhkg",
// 10 hours behind UTC
"hst": "utcw10",
// Reykjavik, Iceland
"iceland": "isrey",
// Tehran, Iran
"iran": "irthr",
// Jerusalem
"israel": "jeruslm",
// Jamaica
"jamaica": "jmkin",
// Tokyo, Japan
"japan": "jptyo",
// Tripoli, Libya
"libya": "lytip",
// 7 hours behind UTC
"mst": "utcw07",
// Denver, United States
"navajo": "usden",
// Warsaw, Poland
"poland": "plwaw",
// Lisbon, Portugal
"portugal": "ptlis",
// Shanghai, China
"prc": "cnsha",
// Taipei, Taiwan
"roc": "twtpe",
// Seoul, South Korea
"rok": "krsel",
// Istanbul, Turkey
"turkey": "trist",
// UTC (Coordinated Universal Time)
"uct": "utc",
// Shiprock (Navajo), United States
"usnavajo": "usden",
// UTC (Coordinated Universal Time)
"zulu": "utc",
},
};

Просмотреть файл

@ -14,9 +14,9 @@
Target "langtags":
This script extracts information about mappings between deprecated and
current Unicode BCP 47 locale identifiers from CLDR and converts it to
JavaScript object definitions in LangTagMappingsGenerated.js. The
definitions are used in Intl.js.
current Unicode BCP 47 locale identifiers from CLDR and converts it to C++
mapping code in LanguageTagGenerated.cpp. The code is used in
LanguageTag.cpp.
Target "tzdata":
@ -105,293 +105,6 @@ def writeMappingsVar(println, mapping, name, description, source, url):
println(u"};")
def writeUpdateLocaleIdMappingsFunction(println,
complex_language_mappings,
complex_region_mappings,
description, source, url):
""" Writes a function definition that performs language tag mapping. """
println(u"")
writeMappingHeader(println, description, source, url)
println(u"""\
/* eslint-disable complexity */
function updateLocaleIdMappings(tag) {
assert(IsObject(tag), "tag is an object");
// Replace deprecated language tags with their preferred values.
var language = tag.language;
if (hasOwn(language, languageMappings)) {
tag.language = languageMappings[language];
} else if (hasOwn(language, complexLanguageMappings)) {
switch (language) {""")
# Merge duplicate language entries.
language_aliases = {}
for (deprecated_language, (language, script, region)) in (
sorted(complex_language_mappings.items(), key=itemgetter(0))
):
key = (language, script, region)
if key not in language_aliases:
language_aliases[key] = []
else:
language_aliases[key].append(deprecated_language)
for (deprecated_language, (language, script, region)) in (
sorted(complex_language_mappings.items(), key=itemgetter(0))
):
key = (language, script, region)
if deprecated_language in language_aliases[key]:
continue
for lang in [deprecated_language] + language_aliases[key]:
println(u"""
case "{}":
""".format(lang).rstrip().strip("\n"))
println(u"""
tag.language = "{}";
""".format(language).rstrip().strip("\n"))
if script is not None:
println(u"""
if (tag.script === undefined)
tag.script = "{}";
""".format(script).rstrip().strip("\n"))
if region is not None:
println(u"""
if (tag.region === undefined)
tag.region = "{}";
""".format(region).rstrip().strip("\n"))
println(u"""
break;
""".rstrip().strip("\n"))
println(u"""
default:
assert(false, "language not handled: " + language);
}
}
// No script replacements are currently present.
// Replace deprecated subtags with their preferred values.
var region = tag.region;
if (region !== undefined) {
if (hasOwn(region, regionMappings)) {
tag.region = regionMappings[region];
} else if (hasOwn(region, complexRegionMappings)) {
switch (region) {""".lstrip("\n"))
# |non_default_replacements| is a list and hence not hashable. Convert it
# to a string to get a proper hashable value.
def hash_key(default, non_default_replacements):
return (default, str(sorted(str(v) for v in non_default_replacements)))
# Merge duplicate region entries.
region_aliases = {}
for (deprecated_region, (default, non_default_replacements)) in (
sorted(complex_region_mappings.items(), key=itemgetter(0))
):
key = hash_key(default, non_default_replacements)
if key not in region_aliases:
region_aliases[key] = []
else:
region_aliases[key].append(deprecated_region)
for (deprecated_region, (default, non_default_replacements)) in (
sorted(complex_region_mappings.items(), key=itemgetter(0))
):
key = hash_key(default, non_default_replacements)
if deprecated_region in region_aliases[key]:
continue
for region in [deprecated_region] + region_aliases[key]:
println(u"""
case "{}":
""".format(region).rstrip().strip("\n"))
for (language, script, region) in sorted(non_default_replacements, key=itemgetter(0)):
if script is None:
println(u"""
if (tag.language === "{}") {{
""".format(language).rstrip().strip("\n"))
else:
println(u"""
if (tag.language === "{}" && tag.script === "{}") {{
""".format(language, script).rstrip().strip("\n"))
println(u"""
tag.region = "{}";
break;
}}
""".format(region).rstrip().strip("\n"))
println(u"""
tag.region = "{}";
break;
""".format(default).rstrip().strip("\n"))
println(u"""
default:
assert(false, "region not handled: " + region);
}
}
// No variant replacements are currently present.
// No extension replacements are currently present.
// Private use sequences are left as is.
}
}
/* eslint-enable complexity */
""".strip("\n"))
def writeGrandfatheredMappingsFunction(println,
grandfathered_mappings,
description, source, url):
""" Writes a function definition that maps grandfathered language tags. """
println(u"")
writeMappingHeader(println, description, source, url)
println(u"""\
function updateGrandfatheredMappings(tag) {
assert(IsObject(tag), "tag is an object");
// We're mapping regular grandfathered tags to non-grandfathered form here.
// Other tags remain unchanged.
//
// regular = "art-lojban"
// / "cel-gaulish"
// / "no-bok"
// / "no-nyn"
// / "zh-guoyu"
// / "zh-hakka"
// / "zh-min"
// / "zh-min-nan"
// / "zh-xiang"
//
// Therefore we can quickly exclude most tags by checking every
// |unicode_locale_id| subcomponent for characteristics not shared by any of
// the regular grandfathered (RG) tags:
//
// * Real-world |unicode_language_subtag|s are all two or three letters,
// so don't waste time running a useless |language.length > 3| fast-path.
// * No RG tag has a "script"-looking component.
// * No RG tag has a "region"-looking component.
// * The RG tags that match |unicode_locale_id| (art-lojban, cel-gaulish,
// zh-guoyu, zh-hakka, zh-xiang) have exactly one "variant". (no-bok,
// no-nyn, zh-min, and zh-min-nan require BCP47's extlang subtag
// that |unicode_locale_id| doesn't support.)
// * No RG tag contains |extensions| or |pu_extensions|.
if (tag.script !== undefined ||
tag.region !== undefined ||
tag.variants.length !== 1 ||
tag.extensions.length !== 0 ||
tag.privateuse !== undefined)
{
return;
}""")
# From Unicode BCP 47 locale identifier <https://unicode.org/reports/tr35/>.
#
# Doesn't allow any 'extensions' subtags.
re_unicode_locale_id = re.compile(
r"""
^
# unicode_language_id = unicode_language_subtag
# unicode_language_subtag = alpha{2,3} | alpha{5,8}
(?P<language>[a-z]{2,3}|[a-z]{5,8})
# (sep unicode_script_subtag)?
# unicode_script_subtag = alpha{4}
(?:-(?P<script>[a-z]{4}))?
# (sep unicode_region_subtag)?
# unicode_region_subtag = (alpha{2} | digit{3})
(?:-(?P<region>([a-z]{2}|[0-9]{3})))?
# (sep unicode_variant_subtag)*
# unicode_variant_subtag = (alphanum{5,8} | digit alphanum{3})
(?P<variants>(-([a-z0-9]{5,8}|[0-9][a-z0-9]{3}))+)?
# pu_extensions?
# pu_extensions = sep [xX] (sep alphanum{1,8})+
(?:-(?P<privateuse>x(-[a-z0-9]{1,8})+))?
$
""", re.IGNORECASE | re.VERBOSE)
is_first = True
for (tag, modern) in sorted(grandfathered_mappings.items(), key=itemgetter(0)):
tag_match = re_unicode_locale_id.match(tag)
assert tag_match is not None
tag_language = tag_match.group("language")
assert tag_match.group("script") is None, (
"{} does not contain a script subtag".format(tag))
assert tag_match.group("region") is None, (
"{} does not contain a region subtag".format(tag))
tag_variants = tag_match.group("variants")
assert tag_variants is not None, (
"{} contains a variant subtag".format(tag))
assert tag_match.group("privateuse") is None, (
"{} does not contain a privateuse subtag".format(tag))
tag_variant = tag_variants[1:]
assert "-" not in tag_variant, (
"{} contains only a single variant".format(tag))
modern_match = re_unicode_locale_id.match(modern)
assert modern_match is not None
modern_language = modern_match.group("language")
modern_script = modern_match.group("script")
modern_region = modern_match.group("region")
modern_variants = modern_match.group("variants")
modern_privateuse = modern_match.group("privateuse")
println(u"""
// {} -> {}
""".format(tag, modern).rstrip())
println(u"""
{}if (tag.language === "{}" && tag.variants[0] === "{}") {{
""".format("" if is_first else "else ", tag_language, tag_variant).rstrip().strip("\n"))
is_first = False
println(u"""
tag.language = "{}";
""".format(modern_language).rstrip().strip("\n"))
if modern_script is not None:
println(u"""
tag.script = "{}";
""".format(modern_script).rstrip().strip("\n"))
if modern_region is not None:
println(u"""
tag.region = "{}";
""".format(modern_region).rstrip().strip("\n"))
if modern_variants is not None:
println(u"""
tag.variants = {};
""".format(sorted(modern_variants[1:].split("-"))).rstrip().strip("\n"))
else:
println(u"""
tag.variants.length = 0;
""".rstrip().strip("\n"))
if modern_privateuse is not None:
println(u"""
tag.privateuse = "{}";
""".format(modern_privateuse).rstrip().strip("\n"))
println(u"""
}""".rstrip().strip("\n"))
println(u"""
}""".lstrip("\n"))
def writeMappingsBinarySearch(println, fn_name, type_name, name, validate_fn, mappings,
tag_maxlength, description, source, url):
""" Emit code to perform a binary search on language tag subtags.
@ -508,8 +221,8 @@ bool js::intl::LanguageTag::{0}({1} {2}) {{
}""".lstrip("\n"))
def writeComplexLanguageTagMappingsNative(println, complex_language_mappings,
description, source, url):
def writeComplexLanguageTagMappings(println, complex_language_mappings,
description, source, url):
println(u"")
writeMappingHeader(println, description, source, url)
println(u"""
@ -567,8 +280,8 @@ void js::intl::LanguageTag::performComplexLanguageMappings() {
""".strip("\n"))
def writeComplexRegionTagMappingsNative(println, complex_region_mappings,
description, source, url):
def writeComplexRegionTagMappings(println, complex_region_mappings,
description, source, url):
println(u"")
writeMappingHeader(println, description, source, url)
println(u"""
@ -651,8 +364,8 @@ void js::intl::LanguageTag::performComplexRegionMappings() {
""".strip("\n"))
def writeGrandfatheredMappingsFunctionNative(println, grandfathered_mappings,
description, source, url):
def writeGrandfatheredMappingsFunction(println, grandfathered_mappings,
description, source, url):
""" Writes a function definition that maps grandfathered language tags. """
println(u"")
writeMappingHeader(println, description, source, url)
@ -1067,38 +780,6 @@ def readSupplementalData(supplemental_dtd_file, supplemental_metadata_file, like
def writeCLDRLanguageTagData(println, data, url):
""" Writes the language tag data to the Intl data file. """
source = u"CLDR Supplemental Data, version {}".format(data["version"])
grandfathered_mappings = data["grandfatheredMappings"]
language_mappings = data["languageMappings"]
complex_language_mappings = data["complexLanguageMappings"]
region_mappings = data["regionMappings"]
complex_region_mappings = data["complexRegionMappings"]
writeMappingsVar(println, grandfathered_mappings, "grandfatheredMappings",
"Mappings from grandfathered tags to preferred values.", source, url)
writeMappingsVar(println, language_mappings, "languageMappings",
"Mappings from language subtags to preferred values.", source, url)
writeMappingsVar(println, {key: True for key in complex_language_mappings},
"complexLanguageMappings",
"Language subtags with complex mappings.", source, url)
writeMappingsVar(println, region_mappings, "regionMappings",
"Mappings from region subtags to preferred values.", source, url)
writeMappingsVar(println, {key: True for key in complex_region_mappings},
"complexRegionMappings",
"Region subtags with complex mappings.", source, url)
writeUpdateLocaleIdMappingsFunction(println, complex_language_mappings,
complex_region_mappings,
"Canonicalize Unicode BCP 47 locale identifiers.",
source, url)
writeGrandfatheredMappingsFunction(println, grandfathered_mappings,
"Canonicalize grandfathered locale identifiers.",
source, url)
def writeCLDRLanguageTagDataNative(println, data, url):
""" Writes the language tag data to the Intl data file. """
println(generatedFileWarning)
println(u"""
@ -1186,14 +867,14 @@ static inline const char* SearchReplacement(
complex_region_mappings.keys(), region_maxlength,
"Region subtags with complex mappings.", source, url)
writeComplexLanguageTagMappingsNative(println, complex_language_mappings,
"Language subtags with complex mappings.", source, url)
writeComplexRegionTagMappingsNative(println, complex_region_mappings,
"Region subtags with complex mappings.", source, url)
writeComplexLanguageTagMappings(println, complex_language_mappings,
"Language subtags with complex mappings.", source, url)
writeComplexRegionTagMappings(println, complex_region_mappings,
"Region subtags with complex mappings.", source, url)
writeGrandfatheredMappingsFunctionNative(println, grandfathered_mappings,
"Canonicalize grandfathered locale identifiers.", source,
url)
writeGrandfatheredMappingsFunction(println, grandfathered_mappings,
"Canonicalize grandfathered locale identifiers.", source,
url)
def writeCLDRLanguageTagLikelySubtagsTest(println, data, url):
@ -1322,7 +1003,7 @@ if (typeof reportCompare === "function")
def updateCLDRLangTags(args):
""" Update the LangTagMappingsCLDRGenerated.js file. """
""" Update the LanguageTagGenerated.cpp file. """
url = args.url
branch = args.branch
revision = args.revision
@ -1404,17 +1085,8 @@ def updateCLDRLangTags(args):
print("Writing Intl data...")
with io.open(out, mode="w", encoding="utf-8", newline="") as f:
println = partial(print, file=f)
println(u"// Generated by make_intl_data.py. DO NOT EDIT.")
writeCLDRLanguageTagData(println, data, url)
print("Writing Intl data...")
native_out = "LanguageTagGenerated.cpp"
# native_out = os.path.splitext(out)[0] + ".cpp"
with io.open(native_out, mode="w", encoding="utf-8", newline="") as f:
println = partial(print, file=f)
writeCLDRLanguageTagDataNative(println, data, url)
print("Writing Intl test data...")
test_file = os.path.join(os.path.dirname(os.path.abspath(__file__)),
"../../tests/non262/Intl/Locale/likely-subtags-generated.js")
@ -2696,7 +2368,7 @@ if __name__ == "__main__":
parser_cldr_tags.add_argument("--revision", default="HEAD",
help="Git revision (default: %(default)s)")
parser_cldr_tags.add_argument("--out",
default="LangTagMappingsGenerated.js",
default="LanguageTagGenerated.cpp",
help="Output file (default: %(default)s)")
parser_cldr_tags.add_argument("files",
nargs="*",

Просмотреть файл

@ -481,11 +481,9 @@ selfhosted_inputs = [
'builtin/intl/CurrencyDataGenerated.js',
'builtin/intl/DateTimeFormat.js',
'builtin/intl/IntlObject.js',
'builtin/intl/LangTagMappingsGenerated.js',
'builtin/intl/NumberFormat.js',
'builtin/intl/PluralRules.js',
'builtin/intl/RelativeTimeFormat.js',
'builtin/intl/UnicodeExtensionsGenerated.js',
] if CONFIG['ENABLE_INTL_API'] else [])
# Prepare self-hosted JS code for embedding