User:Erutuon/scripts/TemplateScript.js

Note – after saving, you may have to bypass your browser’s cache to see the changes.

  • Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh);
  • Konqueror and Chrome: click Reload or press F5;
  • Opera: clear the cache in Tools → Preferences;
  • Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.

// <nowiki>

$.ajax('//tools-static.wmflabs.org/meta/scripts/pathoschild.templatescript.js', { dataType:'script', cache:true }).then(function() {
	pathoschild.TemplateScript.add([
		{
			name: 'root cat ',
			isMinorEdit: true,
			enabled: false,
			category: 'templates',
			script: function(editor) {
				var ArabicLetter = '[ءبت-غف-وي]';
				var ArabicRoot = RegExp('(' + ArabicLetter + ') (' + ArabicLetter + ') (' + ArabicLetter + ')', 'g');
				editor
					.replace(
						ArabicRoot,
						'\n{{ar-root|$1|$2|$3|notext=1}}'
						)
					.appendEditSummary('add root category');
			}
		},
		{
			name: 'convert to non-gloss def',
			isMinorEdit: true,
			category: 'templates',
			script: function(editor) {
				editor
					.replace(/# ?(\{\{senseid[^\}]+\}\}) ?(\{\{(?:lb|label)[^\}]+\}\}) ?(.+)/g, '# $1 $2 {{non-gloss definition|$3}}')
					.replace(/# ?(\{\{(?:lb|label)[^\}]+\}\}) ?(.+)/g, '# $1 {{non-gloss definition|$2}}')
					.replace(/# ?([^\:\*].+)/g, '# {{non-gloss definition|$1}}')
					.appendEditSummary('add [[T:non-gloss definition]]');
			}
		},
		{
			name: 'selection to non-gloss def',
			isMinorEdit: true,
			category: 'templates',
			script: function(editor) {
				editor
					.replaceSelection(function(selected) {
						var hasNumberedList = selected.includes('#');
						if ( hasNumberedList ) { return selected
							.replace(/# ?(\{\{senseid[^\}]+\}\}) ?(\{\{(?:lb|label)[^\}]+\}\}) ?(.+)/g, '# $1 $2 {{non-gloss definition|$3}}')
							.replace(/# ?(\{\{(?:lb|label)[^\}]+\}\}) ?(.+)/g, '# $1 {{non-gloss definition|$2}}')
							.replace(/# ?(.+)/g, '# {{non-gloss definition|$1}}');
						} else {
							return '{{non-gloss definition|' + selected + '}}';
						}
					})
					.appendEditSummary('add [[T:non-gloss definition]]');	
			}
		},
		{
			name: 'combine POS cats',
			category: 'templates',
			isMinorEdit: true,
			script: function(editor) {
				editor
					.replace(/\[\[Category:((?:[A-Z][\w]+ ?)+) ([a-z][^\]]+)\]\]/g, '{{catlangname||$2}}')
					.replace(/(.*getByCanonicalName\|([^\|\}]+)}}(?:\|[^\|\}]+)+)}}\n?.*getByCanonicalName\|\2}}((?:\|[^\|\}]+)+)/g, '$1$3')
					.replace(/(.*getByCanonicalName\|([^\|\}]+)}}(?:\|[^\|\}]+)+)}}\n?.*getByCanonicalName\|\2}}((?:\|[^\|\}]+)+)/g, '$1$3')
					.replace(/(.*getByCanonicalName\|([^\|\}]+)}}(?:\|[^\|\}]+)+)}}\n?.*getByCanonicalName\|\2}}((?:\|[^\|\}]+)+)/g, '$1$3');
			}
		},
		{
			name: '\'\'\' → ;',
			category: 'formatting',
			isMinorEdit: true,
			enabled: false,
			script: function(editor) {
				editor.replace(/\'\'\'([^\']+)\'\'\'/g, '; $1');
			}
		},
		{
			name: 'chars (grc)',
			category: 'templates',
			script: function(editor) {
				editor.replaceSelection(
					function(selected)
					{
						var hasEquals = selected.includes("=");
						var param = '';
						selected = selected.replace(/\|/g, "!");
						if ( hasEquals ) {
							param = '2=' + selected;
						} else {
							param = selected;
						}
						return '{{subst:chars|grc|' + param + '}}';
					}
				);
			}
		},
		{
			name: 'templatize categories',
			category: 'templates',
			enabled: false,
			script: function(editor) {
				editor
					.replace(/\[\[Category:(\w+)\:([\w ]+)\]\]\n\[\[Category:\1\:([\w ]+)\]\]\n\[\[Category:\1\:([\w ]+)\]\]/g, '{{C|$1|$2|$3|$4}}')
					.replace(/\[\[Category:(\w+)\:([\w ]+)\]\]\n\[\[Category:\1\:([\w ]+)\]\]/g, '{{C|$1|$2|$3}}');
			}
		},
		{
			name: 'ar-root nocat',
			isMinorEdit: true,
			enabled: false,
			category: 'templates',
			script: function(editor) {
				editor
					.replace(/(\{\{ar-root\|[^\}]+)/g, '$1|nocat=1')
					.appendEditSummary('removed from Arabic category');
			}
		},
		{
			name: 'grc verb',
			editSummary: '',
			enabled: false,
			script: function(editor) {
				editor
					.replace(/conj-present(\|form=[^\|\}]+)\|[^\|\}]+(\|[^\|\}]+)\|[^\|\}]+/g, 'conj|pres$1$2')
					.replace(/conj-present\|[^\|\}]+(\|[^\|\}]+)\|[^\|\}]+/g, 'conj|pres$1')
					.replace(/-(perf)ect[^\|\}]*(\|form[^\|\}]+)\|[^\|\}]+\|[^\|\}]+(\|[^\|\}]+)\|[^\|\}]+\|[^\|\}]+(\|[^\|\}]+)/g, '|$1$2$3$4')
					.replace(/-(perf)ect[^\|\}]*\|[^\|\}]+\|[^\|\}]+(\|[^\|\}]+)\|[^\|\}]+\|[^\|\}]+(\|[^\|\}]+)/g, '|$1$2$3')
					.replace(/-(perf)ect[^\|\}]*/g, '|$1')
					.replace(/conj-(imperf)ect(\|form=[^\|\}]+)\|[^\|\}]+\|[^\|\}]+(\|[^\|\}]+)/g, 'conj|$1$2$3')
					.replace(/conj-(imperf)ect\|[^\|\}]+\|[^\|\}]+(\|[^\|\}]+)/g, 'conj|$1$2')
					.replace(/-aorist-(\d\|form[^\|\}]+)\|[^\|\}]*\|[^\|\}]*(\|[^\|\}]*)\|[^\|\}]*(\|[^\|\}]+)\|[^\|\}]+\|[^\|\}]+(\|[^\|\}]+\|[^\|\}]+)\|[^\|\}]+/g, '|aor-$1$2$3$4')
					.replace(/-aorist-(\d)\|[^\|\}]*\|[^\|\}]*(\|[^\|\}]*)\|[^\|\}]*(\|[^\|\}]*)\|[^\|\}]*\|[^\|\}]+(\|[^\|\}]+\|[^\|\}]+)\|[^\|\}]+/g, '|aor-$1$2$3$4')
					.replace(/-aorist-(\d)/g, '|aor-$1')
					.replace(/-pluperfect[^\|\}]*(\|form[^\|\}]+)\|[^\|\}]+(\|[^\|\}]+\|[^\|\}]+\|[^\|\}]+)/g, '|plup$1$2')
					.replace(/-pluperfect[^\|\}]*\|[^\|\}]+(\|[^\|\}]+\|[^\|\}]+\|[^\|\}]+)/g, '|plup$1')
					.replace(/-pluperfect[^\|\}]*/g, '|plup')
					.replace(/-(fut)ure(\|form[^\|\}]+)\|[^\|\}]+(\|[^\|\}]+)\|[^\|\}]+((?:\|[^\|\}]+)?)/g, '|$1$2$3$4')
					.replace(/-(fut)ure\|[^\|\}]+(\|[^\|\}]+)\|[^\|\}]+(\|[^\|\}]+)/g, '|$1$2$3')
					.replace(/-future-/g, '|fut-')
					.replace(/-future ?(p?)[a-z]*(?=\|)/g, '|fut$1')
					.replace(/([a-z]+)σ/g, '$1')
					.replace(/grc-alt/g, 'alter|grc')
					.replace(/etyl(\|[\w\-]+)\|grc}} {{m\1/g, 'der|grc$1')
					.replace(/grc-cite/g, 'Q|grc')
					.replace(/(\{\{m\|[^\|\}]+\|[^\|\}]+\|)\|/g, '$1t=')
					.replace(/ I /g, ' to ')
					.replace(/\{\{prefix\|([^\|\}]+\|[^\|\}]+)/g, '{{affix|$1-')
					.replace(/\|sc=Deva/g, '')
					.replace(/\{\{grc-ipa.*/g, '{{grc-IPA|}}')
					.replace(/\|gloss/g, '|t')
					.replace(/(\{\{...?fix)(\|[^\}]+)\|lang=([\w-]+)/g, '$1|$3$2')
					.replace(/titleapp\=\(\{\{grc\-(\w+)\}\}\)/g, 'dial=$1')
					.replace(/m\|grc\|([^\|\}]+)\|(?:\||t\=)([^\|\}]+)\}\} \+ \{\{m\|grc\|([^\|\}]+)\|(?:\||t=)([^\|\}]+)/g, 'affix|grc|$1|t1=$2|$3|t2=$4')
					.replace(/([^\.] |\()(?:[A-Z][a-z]+ )?[A-Z][a-z]+ \{\{m(\|[^\|\}]+)/g, '$1{{cog$2')
					.replace(/con-ε/g, 'con-e')
					.replace(/con-α/g, 'con-a')
					.replace(/con-ο/g, 'con-o')
					.replace(/-νυμι/g, '-numi')
					.replace(/-((?:pres|imperf))(?:ent|ect)/g, '|$1')
					.replace(/(pres[^\|\}]+)((?:\|form[^\|\}]+)?)(\|[^\|\}]+)\|[^\|\}]+/g, '$1$2$3')
					.replace(/(imperf[^\|\}]+)((?:\|form[^\|\}]+)?)\|[^\|\}]+(\|[^\|\}]+)/g, '$1$2$3')
					.replace(/(grc-verb)[^\}]+/g, '$1')
					.replace(/grc-pron(?:(\|)(?:w=)?)?/g, 'grc-IPA$1')
					.replace(/(grc-conj.+)\|[^\}\|]+η[θτ][ιῐ](?=\W)/g, '$1')
					.replace(/to am(?=\W)/g, 'to be')
					.appendEditSummary('updated conjugation tables and other cleanup, with the help of [[m:TemplateScript|TemplateScript]]');
			}
		},
		{
			name: 'etym link cleanup',
			isMinorEdit: true,
			enabled: false,
			category: 'templates',
			script: function(editor) {
				editor
					.replace(/\{\{etyl\|([^\|\}]+)\|([^\|\}]+)\}\} (?:\'\')?\[\[([^\]]+)\]\](?:\'\')?/g, '{{der|$2|$1|$3}}')
					.appendEditSummary('fix link with the help of [[m:TemplateScript|TemplateScript]]');
			}
		},
		{
			name: 'Lua code',
			isMinorEdit: true,
			enabled: false,
			category: 'templates',
			script: function(editor) {
				editor.replaceSelection(function(selected) {
					var hasEquals = selected.includes("=");
					var param = '';
					if ( hasEquals ) {
						param = '2=' + selected;
					} else {
						param = selected;
					}
					return '{{code|lua|' + param + '}}';
					
				});
			},
		},
		{
			name: 'swung dash',
			enabled: false,
			category: 'characters',
			script: function(editor) {
				editor.replace(/~/g, '⁓');
			}
		},
		{
			name: 'subst',
			category: 'templates',
			enabled: false,
			script: function(editor) {
				editor.replaceSelection(function (selected) {
					return selected
						.replace(/\{\{(?:subst:)?/g, '{{subst:');
				});
			}
		},
		{
			name: 'der and rel',
			category: 'templates',
			enabled: false,
			script: function(editor) {
				editor.replaceSelection(
					function (selected) {
						var sectionType = ( selected.match(/=((?:Der|Rel))/)[1].toLowerCase() || 'der' );
						// Use lang in first l template.
						var langCode = selected.match(/\{\{l\|([a-z-]+)\|[^\|\}]+/)[1];
						var numberOfColumns = ( selected.match(/\{\{top(\d)\}\}/)[1] || '3' );
						
						return selected
								.replace(/\n\* ?\{\{l\|[^\|\}]+\|([^\|\}]+)\}\}/g, '\n|$1')
								.replace(/\n\{\{[^\}]+\}\}/g, '')
								.replace(
									/((?:\n\|[^\|\}\n]+)+)/g,
									'\n{{' + sectionType + numberOfColumns + '\n|lang=' + langCode + '$1\n}}'
									);
					}
				);
			}
			
		},
		{
			name: 'letters template',
			enabled: false,
			category: 'templates',
			script: function(editor) {
				var content = editor.get();
				var hasDoc = content.includes('list doc');
				var lang = content.match(/l(?:-self)\|([^\|\}]+)/)[1];
				var nativeName = content.match(/\|hypernym=(?:\{\{l(?:-self)?\|[^\|\}]+\|)?([^\|\}\n]+)(?:\|[^\|\}]+)?(?:\}\})?/);
				var nativeNameParameter = '';
				if ( nativeName ) {
					nativeNameParameter = '|native name=' + nativeName[1]  + '\n';
				} else {
					nativeNameParameter = '';
				}
				editor
					.replace(
						/list helper 2(?:\n\|.+)+\n\|list=/g,
						'letters\n|lang=' + ( lang || '' ) + '|sc=Latn\n' + nativeNameParameter
						)
					.replace(
						/(?:<!--[^-]+-->)?(\(?)\{\{l(?:-self)?\|[^\|\}]+\|([^\|\}]+)(?:\|[^\|\}]+)?\}\}\s*\{\{l(?:-self)?\|[^\|\}]+\|([^\|\}]+)(?:\|[^\|\}]+)?\}\}(\)?)(?:,? )?/g,
						'|$1$2/$3$4'
						)
					.replace(
						/(?:<!--[^-]+-->)?(\(?)\{\{l(?:-self)?\|[^\|\}]+\|([^\|\}]+)(?:\|[^\|\}]+)?\}\}(\)?)(?:,? )?/g,
						'|$1$2$3'
						)
					.replace(/\|([^\/])\/([^\/])/g, '|$1$2')
					.replace(/<!--[^-]+-->(?=\}\})/g, '')
					.replace(/(\}\})(<noinclude>)/, '$1<!--\n\n-->$2')
					.replace(/\s+$/, '')
					.appendEditSummary('converted to [[Template:letters]] with the help of [[m:TemplateScript|TemplateScript]]');
				
				if ( !hasDoc ) {
					editor
						.append('<!--\n\n--><noinclude>\n{{list doc}}\n</noinclude>')
						.appendEditSummary('added [[Template:list doc]] for documentation');
				}
			}
		},
		{
			name: 'fix T:lang',
			enabled: false,
			script: function(editor) {
				editor
					.replace(/\{\{(lang\|[^\|\}]+\|[^\|\}]+)\|\}\}/g, '{{$1}}')
					.replace(/\{\{(lang[^\}]+)\|lang=[^\|\}]+([^\}]*)\}\}/g, '{{$1$2}}')
					.appendEditSummary('fixing parameters of [[Template:lang]] with the help of [[m:TemplateScript|TemplateScript]]')
					.options({ minor: true });
			}
		},
		{
			name: 'temporary',
			isMinorEdit: true,
//			enabled: false,
			script: function(editor) {
				editor
					.replace(/\[\[adverbial accusative\|Adverbial accusative\]\]/g, '{{adverbial accusative|ar}}')
					.replace(/Adverbial accusative/g, '{{adverbial accusative|ar}}')
					.appendEditSummary('adding [[T:adverbial accusative]], which also categorizes');
			}
		},
		{
			name: 'related and derived cleanup',
			category: 'templates',
			enabled: false,
			script: function(editor) {
				editor
					.replace()
					.replace();
			}
		},
	]);
});

// </nowiki>