Update date converter script
I am wanting to update the script below with some additional functionality.
Currently the script converts UK date formats dd/mm/yyyy into a more readable format.
Example:
01/02/2024 becomes Thursday 1st February 2024
I would like to update the script to also be able to handle date ranges.
With the current script it does the below which is ok except for the repeated month and year.
Example:
01/02/2024 – 07/02/2024 becomes Thursday 1st February 2024 – Wednesday 7th February 2024
I would like the result to be Thursday 1st – Wednesday 7th February 2024
So whenever there is a repeat of month and/or year within a range the first instance it is removed or ignored?
01/02/2024 – 07/05/2024 becomes Thursday 1st February – Tuesday 7th May 2024
Not sure if the script can be updated to do this or weather a new script is needed.
Any help appreciated.
#target indesign;
/*
by Oleh Melnyk at 5 April 2017
requested at https://forums.adobe.com/message/9436296#9436296
Edited By :- Manan Joshi
Edited the date format to dd/mm/yyyy or d/m/yyyy
Jan 08 - 2023: Updated to include ordinal indicators st, th, rd
*/
try {
//> START OF doUndoWraper
if (parseFloat(app.version) < 6) // "app.version < 6" if it's running under an earlier version than CS4, as earlier versions don't support "Undo" in scripts
doUndoWrapper();
else
app.doScript(doUndoWrapper, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, "Change Date Format");
//< END OF doUndoWraper
function doUndoWrapper(){
function toUnique(a, b, c) { //array,placeholder,placeholder
b = a.length;
while (c = --b)
while (c--) a[b] !== a[c] || a.splice(c, 1);
return a // not needed ;)
}
function convertDateFormat(date) {
var t = date.split("/");
date = t[1] + "/" + t[0] + "/" + t[2];
var objDate = new Date(date);
var monthName = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var dayName = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var day = objDate.getDate();
var suffix = "th";
if (day % 10 === 1 && day !== 11) {
suffix = "st";
} else if (day % 10 === 2 && day !== 12) {
suffix = "nd";
} else if (day % 10 === 3 && day !== 13) {
suffix = "rd";
}
return dayName[objDate.getDay()] + " " + day + suffix + " " + monthName[objDate.getMonth()] + " " + objDate.getFullYear();
}
app.findGrepPreferences = app.changeGrepPreferences = NothingEnum.nothing; // clear settings
app.findChangeGrepOptions.includeLockedLayersForFind = false; // search in Locked Layers
app.findChangeGrepOptions.includeLockedStoriesForFind = false; // search in Locked Stories
app.findChangeGrepOptions.includeHiddenLayers = false; // search in HiddenLayers
app.findChangeGrepOptions.includeMasterPages = false; // search in Master Pages
app.findChangeGrepOptions.includeFootnotes = true; // search in Footnotes
app.findGrepPreferences.findWhat = "\\d{1,2}\/\\d{1,2}\/\\d{4}";
var whereToSearch = app.activeDocument; // default - search in entire document
var foundPrep = whereToSearch.findGrep();
if (foundPrep.length === 0) {
alert("No matching date formats found in the document.\ndd/mm/yyyy or d/m/yyyy");
return; // No dates found, so exit the script.
}
var foundElements = [];
for(var x = 0; x < foundPrep.length; x++){
foundElements.push(foundPrep[x].contents);
}
var foundUnique = toUnique(foundElements);
for(var i = 0; i < foundUnique.length; i++){
var option = foundUnique[i];
app.findGrepPreferences.findWhat = option;
app.changeGrepPreferences.changeTo = convertDateFormat(option);
whereToSearch.changeGrep();
app.findGrepPreferences = app.changeGrepPreferences = NothingEnum.nothing; // clear find what and change to field
}
}
} catch (error) {
alert(error.message);
}
