extends /layout.pug
block titleContainer
block content
	h1
		a(href='/') #[i.fas.fa-arrow-circle-left]
		|  Publication statistics
	h2 Time to publication
	p.
		Inspired by #[a(href='https://mastodon.social/@fussballinguist/111288814708880725', target='_blank') Simon Meier-Vieracker],
		I track how long the peer review and production process takes for each of my publications.
		Journal articles are red; conference proceedings yellow; book chapters blue.
		Light color indicates time waiting for reviews; dark color typesetting; diamonds date of publication.
	#chart-publications
	script(src='https://code.highcharts.com/gantt/highcharts-gantt.js')
	script
		.
			const colors = {
				bookchapter: {
					review: '#3C59C2',
					editing: '#010D3B',
					published: '#010D3B'
				},
				confproceedings: {
					review: '#FFCE2B',
					editing: '#E1AE00',
					published: '#E1AE00'
				},
				journalarticle: {
					review: '#C5001F',
					editing: '#53000D',
					published: '#53000D'
				},
			};
			let shorttitles = [];
			let series = [];
			function entry(type_, shorttitle, title, review_intervals, editing_intervals = [], published = {}) {
				shorttitles.push(shorttitle);
				let data = [];
				for (let interval of review_intervals)
					data.push({
						start: Date.parse(interval[0]),
						end: Date.parse(interval[1]) || Date.now(),
						name: 'Review',
						color: colors[type_]['review'],
						y: shorttitles.length - 1
					});
				for (let interval of editing_intervals)
					data.push({
						start: Date.parse(interval[0]),
						end: Date.parse(interval[1]) || Date.now(),
						name: 'Copy editing',
						color: colors[type_]['editing'],
						y: shorttitles.length - 1
					});
				for (let way of Object.keys(published))
					data.push({
						start: Date.parse(published[way]),
						milestone: true,
						name: 'Published (' + way + ')',
						color: colors[type_]['published'],
						y: shorttitles.length - 1
					});
				series.push({name: title, data: data, borderRadius: 0});
			}
		.
			entry('journalarticle', 'Orientalia (2018)', 'A case study of reciprocal middles in Biblical Hebrew: The niphal of לחם',
				[['2017-11-8', '2017-11-28'], ['2017-12-21', '2018-1-4']], [['2018-1-9', '2018-1-24']], {print: '2018-12-1'})
			entry('journalarticle', 'JSS (2020)', 'Prepositions and the grammaticalization of Ancient Hebrew bipartite reciprocal markers (Journal of Semitic Studies)',
				[['2018-3-9', '2018-5-1'], ['2018-5-8', '2018-5-21']], [['2018-5-21', '2019-12-16']], {print: '2020-2-17'})
			entry('journalarticle', 'JSOT (2020)', '“When dust was poured out”: Creation in Job 38.36–38 (Journal for the Study of the Old Testament)',
				[['2018-8-11', '2018-9-26']], [['2018-9-27', '2019-7-31']], {online: '2019-12-27', print: '2020-3-12'})
			entry('confproceedings', 'IFL (2019)', 'With John van Groningen and Rinus Plasmeijer: Lazy interworking of compiled and interpreted code for sandboxing and distributed systems (Implementation & Application of Functional Languages)',
				[['2019-6-15', '2019-8-1'], ['2019-11-30', '2020-2-11']], [['2020-3-3', '2021-2-26']], {online: '2021-7-15'})
			entry('bookchapter', 'FS Van Wolde (2022)', 'Voice, discourse prominence, and aspect: The niphal and passive qal of yālad',
				[['2021-1-4', '2021-2-19'], ['2021-3-11', '2022-9-15']], [['2022-9-15', '2022-9-30']], {print: '2022-11-7'})
			entry('journalarticle', 'JHS (2022)', 'Lip̄nē ‘in the face of’: A Locative preposition with a threatening connotation (Journal of Hebrew Scriptures)',
				[['2021-7-8', '2021-9-16'], ['2021-10-4', '2021-12-23']], [['2021-12-23', '2022-9-12']], {online: '2022-9-12'})
			entry('journalarticle', 'S&P (2024)', 'With Johan Rooryck: Formalizing spatial-causal polysemy of Agent prepositions (Semantics & Pragmatics)',
				[['2022-7-4', '2022-9-12'], ['2023-3-6', '2023-6-5'], ['2023-7-30', '2023-10-20'], ['2023-11-10', '2023-12-20'], ['2024-1-8', '2024-1-14'], ['2024-1-15', '2024-3-3']], [['2024-3-4', '2024-5-27']], {online: '2024-3-4', print: '2024-6-4'})
			entry('journalarticle', 'Linguistics (2023)', 'With Johan Rooryck: The interpretation of [+distal] in demonstratives and complementizers',
				[['2022-10-24', '2023-2-23'], ['2023-3-17', '2023-6-9']], [['2023-6-13', '2023-7-18']], {online: '2023-8-5', print: '2023-9-26'})
			entry('journalarticle', 'BJALL (2024)', 'With Martijn Beukenhorst: Semantic properties of prepositions: The distinction between causal min ‘from’ and bə ‘in’ (Brill\'s Journal of Afroasiatic Languages & Linguistics)',
				[['2022-12-29', '2023-5-4'], ['2023-8-22', '2023-9-28'], ['2023-11-2', '2023-11-23'], ['2024-1-5', '2024-1-12']], [['2024-1-22', '2024-3-19']], {online: '2024-4-4', print: '2024-12-16'})
			entry('journalarticle', 'In preparation', 'Complementation and Common Ground: Discursive effects in Biblical Hebrew',
				[['2023-9-22', '2024-6-30'], ['2024-12-20']])
			entry('journalarticle', 'HIPHIL Novum (2024)', 'Large Language Models and Biblical Hebrew: Limitations, pitfalls, opportunities',
				[['2024-3-18', '2024-5-4'], ['2024-5-6', '2024-5-7']], [['2024-5-7', '2024-6-4']], {online: '2024-6-4'})
			entry('journalarticle', 'LiTy (forthc.)', 'Iconic features in nominal reduplication',
				[['2024-5-1', '2024-5-18'], ['2024-9-13', '2024-12-1'], ['2024-12-28', '2025-5-13'], ['2025-7-16', '2025-7-28']], [['2025-7-28']])
		.
			Highcharts.ganttChart('chart-publications', {
				credits: {enabled: false},
				time: {useUTC: false},
				chart: {
					spacingLeft: 0,
					spacingRight: 0,
					zooming: {type: 'x'},
				},
				scrollbar: {
					enabled: true,
					showFull: false,
				},
				xAxis: [{
					max: Date.now(),
					grid: {enabled: false},
					labels: {align: 'left', distance: 0, padding: 0},
					tickInterval: 1000 * 60 * 60 * 24 * 365,
					tickLength: 0,
					gridLineWidth: 1,
				}],
				yAxis: {
					title: null,
					grid: {enabled: false},
					type: 'category',
					categories: shorttitles,
					staticScale: 25,
				},
				tooltip: {
					pointFormatter: function () {
						const start = this.series.chart.time.dateFormat('%Y-%m-%d', this.start);
						if (!this.end) { /* milestone */
							return `${this.name} on ${start}`;
						}
						const days = Math.floor((this.end - this.start) / 1000 / 60 / 60 / 24);
						const end = this.series.chart.time.dateFormat('%Y-%m-%d', this.end);
						return `In ${this.name} for ${days} day(s); ${start}–${end}`;
					},
				},
				series,
			});
	h2 Time to review
	p.
		I also keep track of reviews I have performed for journals.
		The chart below shows how many reviews I have performed/declined for different journals, and how long they took.
		Negative times indicate declined review requests.
	#chart-reviews
	script.
		function makeSeries(journal, color, data) {
			return {
				name: journal,
				color,
				marker: {
					radius: 10,
					symbol: 'circle',
				},
				data,
			};
		}
		Highcharts.chart('chart-reviews', {
			credits: {enabled: false},
			chart: {
				type: 'scatter',
				spacingLeft: 0,
				spacingRight: 0,
			},
			title: null,
			xAxis: [{
				type: 'datetime',
				min: Date.parse('2023-01-01'),
				max: Date.now(),
				labels: {align: 'left', distance: 0, padding: 0},
				crossing: 0,
				tickLength: 0,
				gridLineWidth: 1,
			}],
			yAxis: {
				title: 'days',
				tickInterval: 10
			},
			tooltip: {
				pointFormatter: function(){
					return `Review ${this.y < 0 ? 'declined' : 'performed'} in ${Math.abs(this.y)} day(s)`;
				},
			},
			series: [
				makeSeries('DGfS (conference)', '#506ba0', [
					[Date.parse('2025-09-04'), 4],
					[Date.parse('2025-09-04'), 7],
				]),
				makeSeries('Glossa', '#905486', [
					[Date.parse('2023-03-23'), 8],
					[Date.parse('2024-02-04'), 8],
					[Date.parse('2024-02-17'), 5],
					[Date.parse('2024-07-10'), 2],
				]),
				makeSeries('Lingua', '#fb6032', [
					[Date.parse('2023-02-22'), -1],
				]),
				makeSeries('Open Mind', '#00aeef', [
					[Date.parse('2023-07-28'), 34],
					[Date.parse('2023-12-11'), 9],
				]),
				makeSeries('Religions', '#00699e', [
					[Date.parse('2025-08-29'), 3],
				]),
				makeSeries('The New Scholar', '#dbbe9e', [
					[Date.parse('2023-05-05'), 1],
				]),
			],
		});