<<
path:
root/public/blog.git/html/src/gen/update.jai
blob: 0ada8732ed1ed6194477b0f86ebcc6d74413dde7
[raw]
[clear marker]
3update_metadata_in_posts :: (posts: [..]Markdown_File) {
4 re_pattern_datetime=, ok := re.compile(PATTERN_RE_DATETIME);
7 posts_updated: [..]string;
10 metadata, post := entries_make_header_and_body(it.content);
11 updated_metadata := update_metadata(metadata);
12 joined := join_metadata_and_body(updated_metadata, post);
13 array_add(*posts_updated, joined);
16 assert(posts_updated.count == posts.count, "This should not happen!");
19 fp := posts[it_index].fn;
20 file_write_or_exit(fp, it);
21 log("> Updated: %", fp);
25is_correct_field_date_format :: (value: string) -> bool {
26 matched, captures := re.match(value, re_pattern_datetime);
27 this_allocation_is_not_a_leak(captures.data);
35re_pattern_datetime: re.Regexp;
47/** Note: If there are multiple occurrences of 'published' or 'updated'
48 it will use the last found item.
50update_metadata :: (metadata: string) -> string {
51 metadata_trimmed := trim(metadata);
52 meta := split(metadata_trimmed, "\n");
54 published_count := count_occurrences_in_field(meta, PATTERN_PUBLISHED);
55 updated_count := count_occurrences_in_field(meta, PATTERN_UPDATED);
57 if published_count > 1
58 then log_metadata_error_and_exit(metadata, PATTERN_PUBLISHED, published_count);
61 then log_metadata_error_and_exit(metadata, PATTERN_UPDATED, updated_count);
67 normalized := trim(it);
69 if starts_with(normalized, PATTERN_PUBLISHED) {
70 add_time_to_array(*buf, normalized, PATTERN_PUBLISHED);
72 else if starts_with(normalized, PATTERN_UPDATED) {
73 add_time_to_array(*buf, normalized, PATTERN_UPDATED);
76 array_add(*buf, normalized);
80 if !published_count then add_current_date_and_ms(*buf, PATTERN_PUBLISHED);
81 if !updated_count then add_current_date_and_ms(*buf, PATTERN_UPDATED);
83 s := join(..buf, "\n", after_last=true,, temp);
84 return copy_string(s);
87log_metadata_error_and_exit :: (metadata: string, pattern: string, counter: int) {
89 "Field pattern `%` was found % time(s) in the following header:",
93 log_error("-- Metadata Preview -----------\n%", slice(metadata, 0, 255));
97count_occurrences_in_field :: (metadata: []string, pattern: string) -> count: int {
102 if starts_with(trimmed, pattern) then counter += 1;
108join_metadata_and_body :: (metadata: string, body: string) -> string {
109 return join(metadata, METADATA_MARKER, "\n\n", body);
112make_metadata_field :: (pattern: string, value: string, ms: string) -> string {
113 return tprint("%%(%)", pattern, value, ms);
116add_time_to_array :: (buf: *[..]string, value: string, $pattern: string) {
117 if is_correct_field_date_format(value) {
118 array_add(buf, value);
122 value, ms := convert_input_to_ms(value, pattern.count);
123 metadata_field := make_metadata_field(pattern, value, ms);
124 array_add(buf, metadata_field);
127convert_input_to_ms :: (
128 source: string, pattern_length: int
130 -> (value: string, ms: string)
135 sliced := slice(source, pattern_length, source.count);
136 trimmed := trim(sliced);
138 input_kind := determine_input_kind(trimmed);
140 if #complete input_kind == {
142 ms = current_time_as_ms();
143 value = milliseconds_to_date(ms);
145 ms = parse_to_int(trimmed);
146 value = milliseconds_to_date(ms);
148 ms = date_to_milliseconds(trimmed);
151 ms = date_to_milliseconds(trimmed);
154 ms = current_time_as_ms();
155 value = milliseconds_to_date(ms);
156 case .ALREADY_PARSED;
160 ms_as_string := tprint("%", ms);
161 return value, ms_as_string;
164add_current_date_and_ms :: (buf: *[..]string, pattern: string) {
165 ms := current_time_as_ms();
166 ms_as_string := tprint("%", ms);
167 value := milliseconds_to_date(ms);
168 metadata_field := make_metadata_field(pattern, value, ms_as_string);
169 array_add(buf, metadata_field);
172determine_input_kind :: (value: string) -> (kind: Input_Kind = .EMPTY) {
175 if !value || is_whole_thing_whitespace(value) {
178 else if is_number_format(value) {
181 else if is_date_time_format(value, PARSER_FORMAT_DATETIME_DELIMITER_COUNT) {
184 else if is_date_time_format(value, PARSER_FORMAT_DATE_DELIMITER_COUNT) {
187 else if is_current_dt_format(value) {
191 assert(false, "You shouldn't be here!");
197current_time_as_ms :: () -> int {
198 now := current_time_consensus();
199 ms := to_milliseconds(now);
203date_to_milliseconds :: (s: string) -> int {
205 date := split(s, "-");
207 if date.count != 3 && date.count != 5 {
208 log_error("Date string must have 3 or 5 items");
212 for date if it_index == {
213 case 0; ct.year = parse_to_int(it, s32);
214 case 1; ct.month_starting_at_0 = parse_to_int(it, s8) - 1;
215 case 2; ct.day_of_month_starting_at_0 = parse_to_int(it, s8) - 1;
216 case 3; ct.hour = parse_to_int(it, s8);
217 case 4; ct.minute = parse_to_int(it, s8);
222 apollo := calendar_to_apollo(ct);
223 ms := to_milliseconds(apollo);
228milliseconds_to_date :: (ms: int) -> string {
229 a := milliseconds_to_apollo(ms);
230 cal := to_calendar(a, .UTC);
232 year := tprint("%", cal.year);
233 month := string_pad_left(
234 tprint("%", cal.month_starting_at_0 + 1),
237 day := string_pad_left(
238 tprint("%", cal.day_of_month_starting_at_0 + 1),
242 joined := join(year, month, day, separator="-");
246is_whole_thing_whitespace :: (s: string) -> bool {
247 for s if !is_space(it) return false;
251is_number_format :: (s: string) -> bool {
252 for s if !is_digit(it) return false;
256is_date_time_format :: (value: string, $delimiter_count: int) -> bool {
258 for value if it == PARSER_FORMAT_DT_DELIMITER then count_is += 1;
259 return delimiter_count == count_is;
262is_current_dt_format :: (value: string) -> bool {
263 return value == METADATA_CMD_CURRENT_DT;