Wikipedia:Dugnadskontor/Quote attributter i HTML-tags

Quote attributter i HTML-tags rediger


Lagt inn av: Stigmj (diskusjon) 8. mar. 2016 kl. 14:44 (CET)[svar]
Det ble påbegynt en jobb tidligere med å legge på "hermetegn" på attributt-verdier i rå HTML-tags. Denne jobben ble avbrutt på grunn av uenigheter om nødvendigheten av disse endringene. Dette dugnadsforslaget går på å revurdere denne jobben.


Tekniske detaljer på foreslått kjøring rediger

Hvilket script som kjøres med lenke til kildekode/hjemmeside.
Hvilke parametre som benyttes.
  • python pwb.py replace.py -fix:qaf-1 -fix:qaf-2 -xml:nowiki-20160305-pages-articles.xml
def check_quotes(m):
	output = ''
	if m.group(3):
		import regex
		checkfoo = regex.match(u'(\w+\s*=\s+\w+\s*=)', m.group(3))
		checkfoo2 = regex.match(u'( = .* = .*)', m.group(3))
		if checkfoo or checkfoo2:
			#this one has some problems. Let's skip it..
			output = m.group(3)
		else:
			#first, let's check for corner cases (<ref attribute = value>) and sanitize them (<ref attribute=value>)
			corners = m.group(3).split()
			stack = list()
			doubleapostrophes = 0
			singleapostrophes = 0
			checkit = ""
			# <span id="test" inline name = barfoo snafu>
			for corner in corners:
				if "=" in corner and corner[len(corner)-1:] != '=' and corner != "=" and len(stack) == 0:
					# this is a valid tag, put it back
					checks = regex.finditer(u'((?P<attr>\w+)=(?P<value>(?:((?P<quote>["\'])[^"\']*(?P=quote))|([^\=\>\s]+))))', corner)
					for check in checks:
						if '"' not in corner and "'" not in corner: # test for " or '
							if checkit != '':
								checkit = checkit + ' '
							checkit = checkit + check.group('attr') + '="' + check.group('value') + '"'
						elif not (corner.count('"') % 2 or corner.count("'") % 2):
							if checkit != '':
								checkit = checkit + ' '
							checkit = checkit + corner 
						else:
							# <tag attr="multiple value.."
							stack.append(check.group('attr'))
							stack.append("=")
							stack.append(check.group('value'))
				elif corner == '=' and len(stack) == 1:
					#this is a equal sign, push it on the stack
					stack.append(corner)
				elif corner != '=' and corner[len(corner)-1:] != '=' and len(stack) == 0 and not (doubleapostrophes or singleapostrophes):
					# this is either a loner or a new attribute, push it on the stack
					stack.append(corner)
				elif corner != '=' and "=" not in corner and len(stack) == 1:
					# this is either a loner or a new attribute, push it on the stack and put the previous back.
					if checkit != '':
						checkit = checkit + ' '
					old = stack.pop()
					checkit = checkit + old
					stack.append(corner)
				elif corner != '=' and len(stack) >2 and (doubleapostrophes or singleapostrophes): 
					# <span id="test" inline name = "barfoo snafu">
					# this goes on the stack as it's part of a string (snafu")
					stack.append(corner)
				elif "=" in corner and corner[:1] != '=' and corner != "=" and len(stack) > 0:
					# this is a valid tag, put it back
					if checkit != '':
						checkit = checkit + ' '
					old = stack.pop()
					checkit = checkit + old + ' '
					checkit = checkit + corner
				elif (doubleapostrophes or singleapostrophes):
					# this goes to checkit
					if checkit != '':
						checkit = checkit + ' '
					checkit = checkit + corner
				elif corner != '=' and "=" not in corner and len(stack) == 2:
					# this goes on the stack as it's the value
					if not (doubleapostrophes or singleapostrophes) and '"' not in corner and "'" not in corner:
						# add apostrophes right away
						stack.append('"' + corner + '"')
					else:
						stack.append(corner)
				elif corner != '=' and "=" not in corner and len(stack) > 2 and (doubleapostrophes or singleapostrophes):
					# this goes on the stack as it's part of the value 
					stack.append(corner)
				elif corner != '=' and "=" not in corner and len(stack) > 2 and not (doubleapostrophes or singleapostrophes):
					# this is not supposed to happen, put it back.
					if checkit != '':
						checkit = checkit + ' '
					checkit = checkit + corner
				elif corner[:1] == '=' and corner != "=" and len(stack) == 1:
					if (corner.count('"') % 2 or corner.count("'") % 2):
						# <tag attr ="value follows"> og <tag attr ='value follows'>
						#put it on the stack
						stack.append('=')
						stack.append(corner[1:])
					else:
						# <tag attr =value> or <tag attr ="value"> or <tag attr ='value'>
						if checkit != '':
							checkit = checkit + ' '
						old = stack.pop()
						checkit = checkit + old + corner
				elif corner[len(corner)-1:] == '=' and corner != "=" and len(stack) == 0:
					# <tag attr= 
					#put it on the stack
					stack.append(corner[0:len(corner)-1])
					stack.append('=')

				#check if we have a starting apostrophe
				if corner.count('"') % 2 and doubleapostrophes == 0:
					doubleapostrophes = corner.count('"')
				elif corner.count('"') % 2 and doubleapostrophes:
					doubleapostrophes = 0
				if corner.count("'") % 2 and singleapostrophes == 0:
					singleapostrophes = corner.count("'")
				elif corner.count("'") % 2 and singleapostrophes:
					singleapostrophes = 0

 				# check if the stack should be emptied
 				if len(stack) > 2 and not (doubleapostrophes or singleapostrophes):
					if checkit != '':
						checkit = checkit + ' '
					checkit = checkit + ''.join(stack[:2])
					checkit = checkit + ' '.join(stack[2:])
					stack[:] = [] 
				
			#now let's add the stack to the checkit
			
			if len(stack) == 1:
				if checkit != '':
					checkit = checkit + ' '
				checkit = checkit + ''.join(stack)
			if len(stack) >= 3:
				if checkit != '':
					checkit = checkit + ' '
				checkit = checkit + ''.join(stack[:2])
				checkit = checkit + ' '.join(stack[2:])
			if output != '':
				output = output + ' '
			output = output + checkit
			
	first = m.group(2)
	firstlen = len(first)
	if m.group(4)[:1] == '/' and (m.group(2)[firstlen-1] != ' ' or ( m.group(3) and m.group(3)[len(m.group(3))-1] != ' ')):
		output =  output + ' '
	if m.group(2)[firstlen-1] == '/':
		first = m.group(2)[:firstlen-1] + " /"
	return first + output + m.group(4)

fixes['qaf-1']= {
	'regex': True,
	'nocase': True,
	'recursive': True,
	'allowoverlap': False,
	'msg': {
		'_default':u'[[WP:D/Botjobb/1|Fix HTML-tags]]',
	},
	'replacements': [
		(ur'((\<(?:b[^\w>]|bdi[^\w>]|del[^\w>]|i[^\w>]|ins[^\w>]|u[^\w>]|font[^\w>]|big[^\w>]|small[^\w>]|sub[^\w>]|sup[^\w>]|h[1-6][^\w>]|cite[^\w>]|code[^\w>]|em[^\w>]|s[^\w>]|strike[^\w>]|strong[^\w>]|tt[^\w>]|var[^\w>]|div[^\w>]|center[^\w>]|blockquote[^\w>]|ol[^\w>]|ul[^\w>]|li[^\w>]|d[ltd][^\w>]|caption[^\w>]|pre[^\w>]|ruby[^\w>]|r[bpt][^\w>]|rtc[^\w>]|p[^\w>]|span[^\w>]|abbr[^\w>]|dfn[^\w>]|kbd[^\w>]|samp[^\w>]|data[^\w>]|time[^\w>]|mark[^\w>]|w*br[^\w>]|hr[^\w>]|ddmeta[^\w>]|link[^\w>]|table[^\w>]|t[rdh][^\w>]|div[^\w>]|kbd[^\w>]|q[^\w>]|ruby[^\w>]|bdotd[^\w>]|img[^\w>]|categorytree[^\w>]|ce[^\w>]|charinsert[^\w>]|gallery[^\w>]|graph[^\w>]|hiero[^\w>]|imagemap[^\w>]|indicator[^\w>]|inputbox[^\w>]|math[^\w>]|nowiki[^\w>]|poem[^\w>]|pre[^\w>]|ref[^\w>]|references[^\w>]|score[^\w>]|section[^\w>]|templatedata[^\w>]|timeline[^\w>]))([^\>]*?)( *\/*\>))', check_quotes),
		(ur'(\<((?:span|div))([^\>]*?)( *\/\>))', ur'<\2\3></\2>'),
	],
	'exceptions': {
		'inside-tags': [
			'nowiki',
			'syntaxhighlight',
			'source',
			'pre',
			'math',
			'ce',
			'comment',
		],
	}
}

fixes['qaf-2']= {
	'regex': True,
	'nocase': True,
	'recursive': True,
	'allowoverlap': False,
	'msg': {
		'_default':u'[[WP:D/Botjobb/1|Fix HTML-tags 2]]',
	},
	'replacements': [
		(ur'((\<(?:source[^\w>]|syntaxhighlight[^\w>]))([^\>]*?)( *\/*\>))', check_quotes),
	],
	'exceptions': {
		'inside-tags': [
			'nowiki', 
			'pre',
			'comment',
		],
	}
}
Lenke til eventuelt datagrunnlag der dette er mulig å fremvise.

Testkjøring rediger

Bevis på testkjøring uten at noen faktiske endringer er utført. Legges helst inn som en underside av denne jobben

Diskusjon rediger

Hvis konsensus er for kjøringen, skal det settes en dato / tid for når kjøringen i henhold til retningslinjene kan utføres tidligst.

@Jeblad, Danmichaelo, Asav, Toreau, 4ing, Jon Harald Søby: Pinger noen brukere som kan hende er interessert i denne diskusjonen.

Det har nylig kommet en endring i MediaWiki som gjør at attributter med tomme verdier tolkes i henhold til HTML5 spec'en og derfor krever enten hermetegn (<tag attributt1="" attributt2="bar">) eller at det benyttes helt tomme attributter uten "=" (<tag attributt1 attributt2="bar">). Det er kun et fåtall sider som hadde problemer med dette og disse er fikset, men det leder inn på spørsmålet om det skal kjøres en botjobb for å legge på hermetegn på alle attributter for å være konsekvente på dette eller ikke.

Jeg har tidligere gått i mot disse endringene da jeg ikke så dette som en nødvendig endring og jeg mener fortsatt at det ikke er strengt tatt nødvendig. Ja, det er en fordel hvis datasettet skal gjenbrukes i etterkant (for å være mer i tråd med XML-standarden), men for Wikipedia sin del og dens definisjoner av hva innholdet er kodet som, trenger ikke dette. Spørsmålet er om det er noen som mener at vi bør gjøre dette uansett? Stigmj (diskusjon) 8. mar. 2016 kl. 14:44 (CET)[svar]

Hvis det ikke er noen som helst negative konsekvenser ved å gjøre disse endringene, ønsker jeg at det utføres. Jeg er generelt for standardisering også i tilfeller hvor det strengt tatt ikke er nødvendig, fordi det gjør det lettere å forholde seg til for oss som ikke er tekniske, når færrest mulig varianter er i bruk. --Wikijens (diskusjon) 8. mar. 2016 kl. 16:34 (CET)[svar]
Enig. Standardisering mot utenforstående prosjekter er viktig og ønskelig. Asav (diskusjon) 9. mar. 2016 kl. 10:37 (CET)[svar]
Hvis det først skal kjøres en standardisering av disse attributtene, er det vel greit å fikse opp følgende i samme sleng?
<br/> til <br />
<references/> til <references />
Og tilsvarende self-termineringer av av andre tagger (blant annet "ref"), altså at vi legger på et mellomrom mellom siste tegn og "/"'en på slutten.
Jeg har lagd et script for å utføre både innlegging av hermetegn og fiksing av disse mellomrommene. Scriptet og testkjøring er referert under tekniske detaljer for kjøringen ovenfor. Stigmj (diskusjon) 16. mar. 2016 kl. 23:59 (CET)[svar]
Jeg støtter også disse siste forslagene (men blander meg ikke i om de utføres samlet eller som separate botjobber). Selvom dette kanskje kan virke som flisespikkeri for mange, vil jeg igjen uttrykke at jeg setter stor pris på slik rydding og standardisering av kode, og sender herved en takk til Stigmj, Jeblad og andre som bidrar med denslags. --Wikijens (diskusjon) 17. mar. 2016 kl. 14:37 (CET)[svar]
Såvidt jeg husker er det en konstruksjon som går igjen <foo bar=baz bugger>. Den siste «bugger» skaper problemer problemer etter skifte av modell for parsingen. Forventningen er at dette skal være <foo bar="baz" bugger="">, noe det ikke lengre er. Muligens er dette problemet på en annen wiki, kanskje best å gjøre en sjekk først. — Jeblad 24. mar. 2016 kl. 21:47 (CET)[svar]
Uhmm... nå ble jeg litt usikker på hva du mener. Så vidt jeg kan se, så tolker mediawiki dette akkurat som det du mener at det skal tolkes, altså at "bugger" noteres ihht. "Empty attribute syntax" fra HTML5-spec'en. Stigmj (diskusjon) 24. mar. 2016 kl. 23:10 (CET)[svar]
Formen <foo bar=baz bugger> tolkes som <foo bar="baz bugger">. — Jeblad 31. mar. 2016 kl. 16:48 (CEST)[svar]
Se på Wikipedia:Dugnadskontor/Quote attributter i HTML-tags/Tester og linje 23 og 24 hvor jeg har lagt inn to referanser med forskjellig notasjon. Det ser ut for meg at det ikke stemmer helt det du sier. Alternativt så tolker MW akkurat referanse-tagger annerledes enn andre. Stigmj (diskusjon) 31. mar. 2016 kl. 17:30 (CEST)[svar]
Anf. tegn rundt attributter blir kanskje optimalisert vekk i output etterhvert (mw:HTML5#Medium_term), men det kan sikkert fortsatt være praktisk å ha dem i kildedataene. Jeg har ikke noe imot at jobben kjøres, og scriptet virker jo forseggjort. – Danmichaelo (δ) 28. mar. 2016 kl. 00:48 (CEST)[svar]
Hvorvidt noe blir optimalisert vekk når vi genererer html5 er ikke det samme som at noe blir optimalisert vekk når xml blir generert, eller når andre formater blir generert. Hvorvidt noe kan bli optimalisert vekk kommer også an på hvorvidt det genereres kode som er tvetydig. Uansett er det noe merkelig å se at en jobb det ble gjort så mye for å få stoppet nå synes viktig å få gjennomført. Jeg på hva som er bakgrunnen for det her, men antakelig er det ingen rasjonell grunn. — Jeblad 31. mar. 2016 kl. 16:56 (CEST)[svar]

Fikser nå også tilfellene med "selv-closing tags" for div og span (<div id="foobar"/> og <span id="foobar"/>) -- Stigmj (diskusjon) 17. mai 2016 kl. 19:57 (CEST)[svar]