|
### { |
|
name: "投稿時刻を表示するプラグイン" |
|
version: "1.0.1" |
|
author: "taiy" |
|
description: "ノートメニューに\"投稿時刻を表示\"を追加します。" |
|
permissions: [] |
|
config: { |
|
format: { |
|
type: "string" |
|
label: "書式" |
|
description: "(既定値: YYYY/MM/DD HH:mm:ss.SSS) フォーマットを指定します。Day.jsと同一のトークンが利用できます。(一部非対応)" |
|
default: "YYYY/MM/DD HH:mm:ss.SSS" |
|
} |
|
offset: { |
|
type: "number" |
|
label: "時差" |
|
description: "(既定値: 540) 時差を分単位で指定します。日本標準時(JST)は540です。夏時間には非対応です。" |
|
default: 540 |
|
} |
|
} |
|
} |
|
|
|
#has_format = Core:or((Plugin:config.format = "") (Plugin:config.format = _)) |
|
#c_format = ? has_format "YYYY/MM/DD HH:mm:ss.SSS" . Plugin:config.format |
|
#has_offset = Core:or((Plugin:config.offset = "") (Plugin:config.offset = _)) |
|
#c_offset = ? has_offset 540 . Plugin:config.offset |
|
|
|
? has_format { |
|
Mk:dialog("投稿時刻を表示するプラグインより" `書式の指定がありません。{Str:lf}自動で **YYYY/MM/DD HH:mm:ss.SSS** が適用されます。` "warn") |
|
} |
|
? has_offset { |
|
Mk:dialog("投稿時刻を表示するプラグインより" `時差の指定がありません。{Str:lf}自動で **540** が適用されます。` "warn") |
|
} |
|
|
|
@format(str tokens) { |
|
@sort(arr mapfn) { |
|
@bubbleSort(arr) { |
|
#length = Arr:len(arr) |
|
~ #i, length { |
|
~ #j, (length - i) { |
|
? (Obj:get(arr[j] "index") > Obj:get(arr[(j + 1)] "index")) { |
|
#tmp = arr[j] |
|
arr[j] <- arr[(j + 1)] |
|
arr[(j + 1)] <- tmp |
|
} |
|
} |
|
} |
|
<< arr |
|
} |
|
<< Arr:map(bubbleSort(Arr:map(arr mapfn)) @(obj) { |
|
<< Obj:get(obj "value") |
|
}) |
|
} |
|
@flat(arr) { |
|
@fn_isArr(val) { |
|
<< (Core:type(val) = "arr") |
|
} |
|
@fn_flat(arr) { |
|
arr <- Arr:reduce(arr @(prev val) { |
|
? Core:not(fn_isArr(val)) { |
|
val <- [val] |
|
} |
|
<< Arr:concat(prev val) |
|
} []) |
|
? (Arr:len(Arr:filter(arr fn_isArr)) != 0) { |
|
arr <- fn_flat(arr) |
|
} |
|
<< arr |
|
} |
|
<< fn_flat(Arr:copy(arr)) |
|
} |
|
@at(arr index) { |
|
? (index < 1) << _ |
|
? (Arr:len(arr) < index) << _ |
|
<< arr[index] |
|
} |
|
@startAt(arr) { |
|
<< at(arr 1) |
|
} |
|
@lastAt(arr) { |
|
<< at(arr Arr:len(arr)) |
|
} |
|
|
|
@toStr(strArr) { |
|
<< Arr:join(Arr:map(flat(strArr) @(strObj) { |
|
<< Obj:get(strObj "string") |
|
}) "") |
|
} |
|
|
|
tokens <- sort(Obj:kvs(tokens) @(arr) { |
|
#token = arr[1] |
|
#value = arr[2] |
|
<< { |
|
index: Str:len(token) |
|
value: { |
|
token: token |
|
value: value |
|
} |
|
} |
|
}) |
|
Arr:reverse(tokens) |
|
|
|
str <- Arr:reduce(Str:split(str "") @(prev cur) { |
|
? (cur = "[") { |
|
Arr:push(prev { |
|
string: "" |
|
replaced: yes |
|
}) |
|
} .? (cur = "]") { |
|
Arr:push(prev { |
|
string: "" |
|
replaced: no |
|
}) |
|
} . { |
|
#last = lastAt(prev) |
|
#s = Obj:get(last "string") |
|
Obj:set(last "string" `{s}{cur}`) |
|
} |
|
<< prev |
|
} [{ |
|
string: "" |
|
replaced: no |
|
}]) |
|
|
|
#result = Arr:reduce(tokens @(strArr tokenObj) { |
|
strArr <- flat(strArr) |
|
#t = Obj:get(tokenObj "token") |
|
#v = Obj:get(tokenObj "value") |
|
<< Arr:map(strArr @(strObj) { |
|
#s = Obj:get(strObj "string") |
|
#r = Obj:get(strObj "replaced") |
|
? r { |
|
<< strObj |
|
} |
|
#a = Str:split(s t) |
|
<< Arr:reduce(a @(prev cur index) { |
|
? (cur != "") { |
|
Arr:push(prev { |
|
string: cur |
|
replaced: no |
|
}) |
|
} |
|
? (Arr:len(a) != index) { |
|
Arr:push(prev { |
|
string: v |
|
replaced: yes |
|
}) |
|
} |
|
<< prev |
|
} []) |
|
}) |
|
} str) |
|
|
|
<< toStr(result) |
|
} |
|
|
|
@DateObj(unixtime minuteOffset) { |
|
#YEAR_ONE = 365 |
|
#YEAR_FOUR = 1461 |
|
#YEAR_100 = 36524 |
|
#YEAR_400 = 146097 |
|
#EPOCH_DAY = 719468 |
|
#monthday = [0,31,61,92,122,153,184,214,245,275,306,337] |
|
|
|
#result = { |
|
unixtime: unixtime |
|
minuteOffset: minuteOffset |
|
} |
|
|
|
unixtime <- (unixtime + (minuteOffset * 60000)) |
|
$unixday <- Math:floor((unixtime / 86400000)) |
|
$leap <- 0 |
|
$year <- 0 |
|
$month <- _ |
|
$day <- _ |
|
$n <- _ |
|
|
|
$hour <- (Math:floor((unixtime / 3600000)) % 24) |
|
$minute <- (Math:floor((unixtime / 60000)) % 60) |
|
$second <- (Math:floor((unixtime / 1000)) % 60) |
|
$millisecond <- (unixtime % 1000) |
|
? (unixtime < 0) { |
|
hour <- (hour + 24) |
|
minute <- (minute + 60) |
|
second <- (second + 60) |
|
millisecond <- (millisecond + 1000) |
|
} |
|
|
|
#weekday = ((Math:floor((unixday + 4)) % 7) + 1) |
|
? (weekday < 0) { |
|
weekday <- (weekday + 7) |
|
} |
|
unixday <- (unixday + EPOCH_DAY) |
|
|
|
year <- (year + (400 * Math:floor((unixday / YEAR_400)))) |
|
unixday <- (unixday % YEAR_400) |
|
n <- Math:floor((unixday / YEAR_100)) |
|
year <- (year + (n * 100)) |
|
unixday <- (unixday % YEAR_100) |
|
|
|
? (n = 4) { |
|
leap <- 1 |
|
} . { |
|
year <- (year + (4 * Math:floor((unixday / YEAR_FOUR)))) |
|
unixday <- (unixday % YEAR_FOUR) |
|
|
|
n <- Math:floor((unixday / YEAR_ONE)) |
|
year <- (year + n) |
|
unixday <- (unixday % YEAR_ONE) |
|
? (n = 4) { |
|
leap <- 1 |
|
} |
|
} |
|
? (leap != 0) { |
|
month <- 2 |
|
day <- 29 |
|
} . { |
|
month <- Math:floor((((unixday * 5) + 2) / 153)) |
|
day <- ((unixday - monthday[(month + 1)]) + 1) |
|
month <- (month + 3) |
|
? (month > 12) { |
|
year <- (year + 1) |
|
month <- (month - 12) |
|
} |
|
} |
|
|
|
result.year <- year |
|
result.month <- month |
|
result.day <- day |
|
result.hour <- hour |
|
result.minute <- minute |
|
result.second <- second |
|
result.millisecond <- millisecond |
|
result.weekday <- weekday |
|
|
|
<< result |
|
} |
|
@DateTokenObj(unixtime minuteOffset) { |
|
#d = DateObj(unixtime minuteOffset) |
|
#result = {} |
|
@zeroPadding(n length) { |
|
#num = Str:to_num(n) |
|
#abs = Math:abs(num) |
|
#str = Core:to_str(abs) |
|
#sign = ? (num < 0) "-" . "" |
|
#len = Math:max(0 (length - Str:len(str))) |
|
<< `{sign}{Arr:join(~ len {"0"} "")}{str}` |
|
} |
|
#z = zeroPadding |
|
|
|
result.YY <- z((d.year % 100) 2) |
|
result.YYYY <- z(d.year 4) |
|
result.M <- z(d.month 1) |
|
result.MM <- z(d.month 2) |
|
result.D <- z(d.day 1) |
|
result.DD <- z(d.day 2) |
|
|
|
result.d <- z(d.weekday 1) |
|
|
|
$hour12 <- (d.hour % 12) |
|
? (hour12 = 0) { |
|
hour12 <- 12 |
|
} |
|
result.H <- z(d.hour 1) |
|
result.HH <- z(d.hour 2) |
|
result.h <- z(hour12 1) |
|
result.hh <- z(hour12 2) |
|
result.m <- z(d.minute 1) |
|
result.mm <- z(d.minute 2) |
|
result.s <- z(d.second 1) |
|
result.ss <- z(d.second 2) |
|
result.SSS <- z(d.millisecond 3) |
|
|
|
#tzoffset = Math:abs(d.minuteOffset) |
|
#tzsign = ? (d.minuteOffset < 0) "-" . "+" |
|
#tzhour = z((Math:floor((tzoffset / 60)) % 60) 2) |
|
#tzminute = z((tzoffset % 60) 2) |
|
result.Z <- `{tzsign}{tzhour}:{tzminute}` |
|
result.ZZ <- `{tzsign}{tzhour}{tzminute}` |
|
|
|
result.A <- ? (d.hour < 12) "AM" . "PM" |
|
result.a <- ? (d.hour < 12) "am" . "pm" |
|
|
|
@indicator(n) { |
|
#i = Math:abs(n) |
|
#cent = (i % 100) |
|
? Core:and((10 <= cent) (cent <= 20)) << `{n}th` |
|
#dec = (i % 10) |
|
? dec { |
|
1 => << `{n}st` |
|
2 => << `{n}nd` |
|
3 => << `{n}rd` |
|
} |
|
<< `{n}th` |
|
} |
|
result.Do <- indicator(d.day) |
|
|
|
$hour24 <- (d.hour % 24) |
|
? (hour24 = 0) { |
|
hour24 <- 24 |
|
} |
|
result.k <- z(hour24 1) |
|
result.kk <- z(hour24 2) |
|
result.X <- `{Math:floor((d.unixtime / 1000))}` |
|
result.x <- `{d.unixtime}` |
|
|
|
<< result |
|
} |
|
|
|
@dateformat(fmt str offset) { |
|
<< format(fmt DateTokenObj(Date:parse(str) offset)) |
|
} |
|
|
|
Plugin:register_note_action("投稿時刻を表示" @(note) { |
|
#formated = dateformat(c_format note.createdAt c_offset) |
|
Mk:dialog("投稿時刻" formated "info") |
|
}) |
|
Plugin:register_user_action("作成日時を表示" @(user) { |
|
#formated = dateformat(c_format user.createdAt c_offset) |
|
Mk:dialog("作成日時" formated "info") |
|
}) |