Skip to content

Instantly share code, notes, and snippets.

@viT-1
Created December 22, 2023 10:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save viT-1/f97aa3e138bd382380bb8f019c3a2d93 to your computer and use it in GitHub Desktop.
Save viT-1/f97aa3e138bd382380bb8f019c3a2d93 to your computer and use it in GitHub Desktop.
#gist-bookmark #js #i18n #vue
@viT-1
Copy link
Author

viT-1 commented Feb 6, 2024

But Template literals are not templates! They can't be stored separately of declarations.

Use simple strings for template instead & custom interpolate function.

function interpolateTemplate(template, ...args) {
	const obj = args[0];

	if (obj instanceof Object) {
		let parts = template.split(/\$\{(?!\d)[\wæøåÆØÅ]*\}/);
		let args = template.match(/[^{\}]+(?=})/g) || [];
		let parameters = args.map(
			(argument) => obj[argument] ||
			(obj[argument] === undefined
				? ""
				: obj[argument])
		);
		return String.raw({ raw: parts }, ...parameters);
	}

	return Object.entries(args).reduce(
		(result, [arg, val]) => result.replace(`$\{${arg}}`, `${val}`),
		template,
	);
}

const result1 = interpolateTemplate("Hello ${0} and ${1}!", "World", "Sun");
const result2 = interpolateTemplate("Hello ${foo} and ${bar}!", { foo: "o-World", bar: "o-Sun" });

console.log(result1);
console.log(result2);

@viT-1
Copy link
Author

viT-1 commented Feb 6, 2024

Also you can use render function in Vue with template format such as Hello, {{foo}}!.

@viT-1
Copy link
Author

viT-1 commented Feb 7, 2024

Tiny Mustache template renderer:

const json = {
	template: 'by formula: {{formula}}',
	formula: 'SP+{{gamma}}*25',
	gamma: '({{delta}}+4)',
	delta: 2,
};

function render (tmpl, obj) {
	const regex = new RegExp('{{([^}]+)}}', 'g');
	var rendered;
	
	const regReplacerFn = function (match, prop) {
		var retVal = obj[prop];

		if (typeof retVal !== 'string' ||
			typeof retVal === 'string' && retVal.indexOf('{{') == -1) {
			return retVal;
		}
		
		return retVal.replace(regex, regReplacerFn);
	};
	
	rendered = tmpl.replace(regex, regReplacerFn);
	
	return rendered;
}

console.log(render(json.template, json));

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment