import embeddedLanguages from '../embeddedLanguages.mjs';
import {merge, scopes} from '../util.mjs';

const elements = merge(embeddedLanguages.map(embeddedLanguage => ({
	[`tagged-template-literal-block-${embeddedLanguage.id}`]: {
		begin: `(${embeddedLanguage.tags.join('|')})(\`)`,
		end: '`',
		beginCaptures: {
			1: {
				name: scopes(
					'entity.name.function.tagged-template.js',
					'entity.name.embedded-source',
				),
			},
			2: {
				name: scopes(
					'string.template.js',
					'punctuation.definition.string.template.begin.js',
					'punctuation.definition.embedded-source.begin',
				),
			},
		},
		endCaptures: {
			0: {
				name: scopes(
					'string.template.js',
					'punctuation.definition.string.template.end.js',
					'punctuation.definition.embedded-source.end',
				),
			},
		},
		contentName: embeddedLanguage.embedScopeBlock,
		patterns: [
			{
				include: embeddedLanguage.sourceScope,
			},
		],
	},
})));

export default {
	scopeName: 'embedded-string-highlighting.injection',
	injectionSelector: 'L:source.js -string -comment',
	repository: elements,
	patterns: Object.keys(elements).map(ruleKey => ({
		include: `#${ruleKey}`,
	})),
};