From 9ca12434484a801147f854b34c9c90fad1272489 Mon Sep 17 00:00:00 2001
From: Joe Cool <snoopyjc@gmail.com>
Date: Sun, 10 Apr 2022 01:41:52 -0400
Subject: [PATCH] a/p use actual format case (fixes #2570)

---
 bits/10_ssf.js               |  2 +-
 packages/ssf/bits/82_eval.js |  2 +-
 packages/ssf/ssf.flow.js     |  2 +-
 packages/ssf/ssf.js          |  2 +-
 packages/ssf/test/dateNF.js  | 23 ++++++++++++++++++++++-
 5 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/bits/10_ssf.js b/bits/10_ssf.js
index 7a47e55..7b76850 100644
--- a/bits/10_ssf.js
+++ b/bits/10_ssf.js
@@ -734,7 +734,7 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
 			case 'A': case 'a': case '上':
 				var q={t:c, v:c};
 				if(dt==null) dt=SSF_parse_date_code(v, opts);
-				if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;}
+				if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? fmt.charAt(i+2) : c; q.t = 'T'; hr='h';i+=3;}
 				else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
 				else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
 				else { q.t = "t"; ++i; }
diff --git a/packages/ssf/bits/82_eval.js b/packages/ssf/bits/82_eval.js
index 47a02c8..90f0064 100644
--- a/packages/ssf/bits/82_eval.js
+++ b/packages/ssf/bits/82_eval.js
@@ -34,7 +34,7 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
 			case 'A': case 'a': case '上':
 				var q={t:c, v:c};
 				if(dt==null) dt=parse_date_code(v, opts);
-				if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;}
+				if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? fmt.charAt(i+2) : c; q.t = 'T'; hr='h';i+=3;}
 				else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
 				else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
 				else { q.t = "t"; ++i; }
diff --git a/packages/ssf/ssf.flow.js b/packages/ssf/ssf.flow.js
index de5006a..9fa401a 100644
--- a/packages/ssf/ssf.flow.js
+++ b/packages/ssf/ssf.flow.js
@@ -729,7 +729,7 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
 			case 'A': case 'a': case '上':
 				var q={t:c, v:c};
 				if(dt==null) dt=parse_date_code(v, opts);
-				if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;}
+				if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? fmt.charAt(i+2) : c; q.t = 'T'; hr='h';i+=3;}
 				else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
 				else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
 				else { q.t = "t"; ++i; }
diff --git a/packages/ssf/ssf.js b/packages/ssf/ssf.js
index cfeadc8..d93de3c 100644
--- a/packages/ssf/ssf.js
+++ b/packages/ssf/ssf.js
@@ -722,7 +722,7 @@ function eval_fmt(fmt, v, opts, flen) {
 			case 'A': case 'a': case '上':
 				var q={t:c, v:c};
 				if(dt==null) dt=parse_date_code(v, opts);
-				if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;}
+				if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? fmt.charAt(i+2) : c; q.t = 'T'; hr='h';i+=3;}
 				else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
 				else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
 				else { q.t = "t"; ++i; }
diff --git a/packages/ssf/test/dateNF.js b/packages/ssf/test/dateNF.js
index 5b6685f..f8d6f21 100644
--- a/packages/ssf/test/dateNF.js
+++ b/packages/ssf/test/dateNF.js
@@ -34,7 +34,7 @@ describe('asian formats', function() {
 				//[ 'ปปปป',   '๒๔๗๖'],
 				[ 'b2yyyy', '1352'],
 				[ 'b2eeee', '1352'],
-				[ 'b2bbbb', '1895'],
+				[ 'b2bbbb', '1895']
 				//[ 'b2ปปปป', '๑๘๙๕']
 			]
 		].forEach(function(row) {
@@ -48,3 +48,24 @@ describe('asian formats', function() {
 		assert.equal(SSF.format('\u0E27/\u0E14/\u0E1B\u0E1B\u0E1B\u0E1B \u0E0A\u0E0A:\u0E19\u0E19:\u0E17\u0E17', 12345.67), "๑๘/๑๐/๒๔๗๖ ๑๖:๐๔:๔๘");
 	});
 });
+describe('meridiem', function() {
+	it('should force am/pm uppercase', function() {
+		for(var i = 0; i < 16; ++i) {
+			var a = ((i & 8) ? "A" : "a") + ((i & 4) ? "M" : "m");
+			var p = ((i & 2) ? "P" : "p") + ((i & 1) ? "M" : "m");
+			var fmt = a + "/" + p;
+			assert.equal(SSF.format(fmt, 0.25), "AM");
+			assert.equal(SSF.format(fmt, 0.75), "PM");
+		}
+	});
+	it('should use actual case for a/p', function() {
+		for(var i = 0; i < 12; ++i) {
+			var a = ((i & 2) ? "A" : "a");
+			var p = ((i & 1) ? "P" : "p");
+			var w = ["", 'm', 'M'][i>>2];
+			var fmt = a + "/" + p + ["", '"m"', '"M"'][i>>2];
+			assert.equal(SSF.format(fmt, 0.25), a + w);
+			assert.equal(SSF.format(fmt, 0.75), p + w);
+		}
+	});
+});
\ No newline at end of file