Merge https://github.com/Mchl/dfhack into develop. Manually remove trailing whitespace, update NEWS.
Conflicts: scripts/forum-dwarves.luadevelop
commit
723d6af9f8
@ -0,0 +1,231 @@
|
||||
-- Save a copy of a text screen in markdown (for reddit among others). Use 'markdown help' for more details.
|
||||
-- This is a derivatiwe work based upon scripts/forum-dwarves.lua by Caldfir and expwnent
|
||||
-- Adapted for markdown by Mchl https://github.com/Mchl
|
||||
|
||||
local args = {...}
|
||||
|
||||
if args[1] == 'help' then
|
||||
print([[
|
||||
description:
|
||||
This script will attempt to read the current df-screen, and if it is a
|
||||
text-viewscreen (such as the dwarf 'thoughts' screen or an item / creature
|
||||
'description') or an announcement list screen (such as announcements and
|
||||
combat reports) then append a marked-down version of this text to the
|
||||
target file (for easy pasting on reddit for example).
|
||||
Previous entries in the file are not overwritten, so you
|
||||
may use the 'markdown' command multiple times to create a single
|
||||
document containing the text from multiple screens (eg: text screens
|
||||
from several dwarves, or text screens from multiple artifacts/items,
|
||||
or some combination).
|
||||
|
||||
usage:
|
||||
markdown [/n] [filename]
|
||||
|
||||
/n - overwrites contents of output file
|
||||
filename - if provided, the data will be saved in md_filename.md instead
|
||||
of default md_export.md
|
||||
|
||||
known screens:
|
||||
The screens which have been tested and known to function properly with
|
||||
this script are:
|
||||
1: dwarf/unit 'thoughts' screen
|
||||
2: item/art 'description' screen
|
||||
3: individual 'historical item/figure' screens
|
||||
4: manual
|
||||
4: announements screen
|
||||
5: combat reports screen
|
||||
6: latest news (when meeting with liaison)
|
||||
There may be other screens to which the script applies. It should be
|
||||
safe to attempt running the script with any screen active, with an
|
||||
error message to inform you when the selected screen is not appropriate
|
||||
for this script.
|
||||
|
||||
target file:
|
||||
The default target file's name is 'md_export.md'. A remider to this effect
|
||||
will be displayed if the script is successful.
|
||||
|
||||
character encoding:
|
||||
The text will likely be using system-default encoding, and as such
|
||||
will likely NOT display special characters (eg:é,õ,ç) correctly. To
|
||||
fix this, you need to modify the character set that you are reading
|
||||
the document with. 'Notepad++' is a freely available program which
|
||||
can do this using the following steps:
|
||||
1: open the document in Notepad++
|
||||
2: in the menu-bar, select
|
||||
Encoding->Character Sets->Western European->OEM-US
|
||||
3: copy the text normally to wherever you want to use it
|
||||
]])
|
||||
return
|
||||
end
|
||||
|
||||
local writemode = 'a'
|
||||
|
||||
-- check if we want to append to an existing file (default) or overwrite previous contents
|
||||
if args[1] == '/n' then
|
||||
writemode = 'w'
|
||||
table.remove(args, 1)
|
||||
end
|
||||
|
||||
local filename
|
||||
|
||||
if args[1] ~= nil then
|
||||
filename = 'md_' .. table.remove(args, 1) .. '.md'
|
||||
else
|
||||
filename = 'md_export.md'
|
||||
end
|
||||
|
||||
local utils = require 'utils'
|
||||
local gui = require 'gui'
|
||||
local dialog = require 'gui.dialogs'
|
||||
|
||||
|
||||
|
||||
|
||||
local scrn = dfhack.gui.getCurViewscreen()
|
||||
local flerb = dfhack.gui.getFocusString(scrn)
|
||||
|
||||
local months = {
|
||||
[1] = 'Granite',
|
||||
[2] = 'Slate',
|
||||
[3] = 'Felsite',
|
||||
[4] = 'Hematite',
|
||||
[5] = 'Malachite',
|
||||
[6] = 'Galena',
|
||||
[7] = 'Limestone',
|
||||
[8] = 'Sandstone',
|
||||
[9] = 'Timber',
|
||||
[10] = 'Moonstone',
|
||||
[11] = 'Opal',
|
||||
[12] = 'Obsidian',
|
||||
}
|
||||
|
||||
local function getFileHandle()
|
||||
return io.open(filename, writemode)
|
||||
end
|
||||
|
||||
local function closeFileHandle(handle)
|
||||
handle:write('\n***\n\n')
|
||||
handle:close()
|
||||
print ('Data exported to "' .. filename .. '"')
|
||||
end
|
||||
|
||||
local function reformat(strin)
|
||||
local strout = strin
|
||||
|
||||
-- [P] tags seem to indicate a new paragraph
|
||||
local newline_idx = string.find(strout, '[P]', 1, true)
|
||||
while newline_idx ~= nil do
|
||||
strout = string.sub(strout, 1, newline_idx - 1) .. '\n***\n\n' .. string.sub(strout, newline_idx + 3)
|
||||
newline_idx = string.find(strout, '[P]', 1, true)
|
||||
end
|
||||
|
||||
-- [R] tags seem to indicate a new 'section'. Let's mark it with a horizontal line.
|
||||
newline_idx = string.find(strout, '[R]', 1, true)
|
||||
while newline_idx ~= nil do
|
||||
strout = string.sub(strout, 1, newline_idx - 1) .. '\n***\n\n' .. string.sub(strout,newline_idx + 3)
|
||||
newline_idx = string.find(strout, '[R]', 1, true)
|
||||
end
|
||||
|
||||
-- No idea what [B] tags might indicate. Just removing them seems to work fine
|
||||
newline_idx = string.find(strout, '[B]', 1, true)
|
||||
while newline_idx ~= nil do
|
||||
strout = string.sub(strout, 1, newline_idx - 1) .. string.sub(strout,newline_idx + 3)
|
||||
newline_idx = string.find(strout, '[B]', 1, true)
|
||||
end
|
||||
|
||||
-- Reddit doesn't support custom colors in markdown. We need to remove all color information :(
|
||||
local color_idx = string.find(strout, '[C:', 1, true)
|
||||
while color_idx ~= nil do
|
||||
strout = string.sub(strout, 1, color_idx - 1) .. string.sub(strout, color_idx + 9)
|
||||
color_idx = string.find(strout, '[C:', 1, true)
|
||||
end
|
||||
|
||||
return strout
|
||||
end
|
||||
|
||||
local function formattime(year, ticks)
|
||||
-- Dwarf Mode month is 33600 ticks long
|
||||
local month = math.floor(ticks / 33600)
|
||||
local dayRemainder = ticks - month * 33600
|
||||
|
||||
-- Dwarf Mode day is 1200 ticks long
|
||||
local day = math.floor(dayRemainder / 1200)
|
||||
local timeRemainder = dayRemainder - day * 1200
|
||||
|
||||
-- Assuming a 24h day each Dwarf Mode tick corresponds to 72 seconds
|
||||
local seconds = timeRemainder * 72
|
||||
|
||||
local H = string.format("%02.f", math.floor(seconds / 3600));
|
||||
local m = string.format("%02.f", math.floor(seconds / 60 - (H * 60)));
|
||||
local i = string.format("%02.f", math.floor(seconds - H * 3600 - m * 60));
|
||||
|
||||
day = day + 1
|
||||
if (day == 1 or day == 21) then
|
||||
day = day .. 'st'
|
||||
elseif (day == 2 or day == 22) then
|
||||
day = day .. 'nd'
|
||||
else
|
||||
day = day .. 'th'
|
||||
end
|
||||
|
||||
return (day .. " " .. months[month + 1] .. " " .. year .. " " .. H .. ":" .. m..":" .. i)
|
||||
end
|
||||
|
||||
if flerb == 'textviewer' then
|
||||
|
||||
local lines = scrn.src_text
|
||||
|
||||
if lines ~= nil then
|
||||
|
||||
local log = getFileHandle()
|
||||
log:write('### ' .. scrn.title .. '\n')
|
||||
|
||||
print('Exporting ' .. scrn.title .. '\n')
|
||||
|
||||
for n,x in ipairs(lines) do
|
||||
log:write(reformat(x.value).." ")
|
||||
-- debug output
|
||||
-- print(x.value)
|
||||
end
|
||||
closeFileHandle(log)
|
||||
end
|
||||
|
||||
elseif flerb == 'announcelist' then
|
||||
|
||||
local lines = scrn.reports
|
||||
|
||||
if lines ~= nil then
|
||||
local log = getFileHandle()
|
||||
local lastTime = ""
|
||||
|
||||
for n,x in ipairs(lines) do
|
||||
local currentTime = formattime(x.year, x.time)
|
||||
if (currentTime ~= lastTime) then
|
||||
lastTime = currentTime
|
||||
log:write('\n***\n\n')
|
||||
log:write('## ' .. currentTime .. '\n')
|
||||
end
|
||||
-- debug output
|
||||
-- print(x.text)
|
||||
log:write(x.text .. '\n')
|
||||
end
|
||||
closeFileHandle(log)
|
||||
end
|
||||
|
||||
|
||||
elseif flerb == 'topicmeeting' then
|
||||
local lines = scrn.text
|
||||
|
||||
if lines ~= nil then
|
||||
local log = getFileHandle()
|
||||
|
||||
for n,x in ipairs(lines) do
|
||||
-- debug output
|
||||
-- print(x.value)
|
||||
log:write(x.value .. '\n')
|
||||
end
|
||||
closeFileHandle(log)
|
||||
end
|
||||
else
|
||||
print 'This is not a textview, announcelist or topicmeeting screen. Can\'t export data, sorry.'
|
||||
end
|
Loading…
Reference in New Issue