Перейти к публикации

В ближайшее время постараюсь разобраться с картой сервера/ЛК/бб кодами

Внимание, с 14 февраля до 20 февраля могут проходить работы на сервере, где также находится лаунчсервер. В связи с этим авторизация в лаунчере может не работать

1Ridav

Библиотека Preferences сохранения данных в файлах

Рекомендованные сообщения

http://pastebin.com/Dp8nc55U
 

pastebin get Dp8nc55U /lib/pref.lua

pastebin get Dp8nc55U pref.lua

В свободное время написал такую вот библу для более удобного хранения структурированных данных в файлах.
К примеру часто видел, что в файлах стоит такая вот причуда:

 


Bob
Marley
34
Trololo street

 
Если из слов еще можно понять, что хранится на строке, то с цифрами это сложнее:
 

11
1
true
3

 
Более простой способ привести это в понятный вид - использовать параметризацию.
Файл будет выглядеть так:
 

name=Bob
surname=Marley
age=34
address=Trololo street

 


 
Вот и библа. Ссылка на пастбин сверху.

 

 

Создаем новый файл с данными:

local pref = require("pref") --так же можно использовать local pref = dofile("pref.lua") для загрузки из текущей папки, а не из папки lib
local table = pref.create("newPrefFilePath") --к примеру новый файл "bob"
table["name"] = "Bob"
table["surname"] = "Marley"
table["age"] = 34
table["address"] = "Trololo street"
pref.save(table) -- мы внесли изменения в таблицу, их надо сохранить. Если изменений не вносилось - можно не сохранять

Загружаем существующий файл с данными:

local pref = require("pref") --так же можно использовать local pref = dofile("pref.lua")
local table = pref.load("newPrefFilePath") --к примеру файл "bob"
print(table["name"], table["age"])
--изменений в не производили, так что можно не сохранять
table["age"] = 35
table["weight"] = 70 --Добавили новое поле в существующий файл
pref.save(table) --изменили возраст, сохраним

Функции:

pref.create("путь до нового файла данных")
pref.load("путь до существующего файла данных")
pref.save(таблица с данными)
  • Like 5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Понадобилось нечто подобное, человеческого ини парсера найти не удалось, посмотрел эту либу немного переписал. Возможно кому-то больше понравится моя реализация.

 

Плюсы по сравнению с оригиналом:

1. Объектный подход

2. В таблицах не хранятся никакие лишние данные, только непосредственно те что вы там сохранили, вспомогательные данные и методы хранятся в метатаблице

3. Вытекает из второго в файлы не сохраняются пути до них, сохраняются только ваши данные

 

 

 

--by 1Ridav, rewritten by FredoNook
---http://computercraft.ru
local PWD = os.getenv("PWD")
 
local pref = {}
local meta = {}
 
meta.filename = ""
meta.table = {}
 
local function load(path)
  local table = {}
  local key, value, delimeter
  local len = 0
 
  local f = io.open(path, "r")
  if not f then return nil end
 
  for line in f:lines() do
    len = len + 1
    delimeter = string.find(line, "=")
    key = string.sub(line, 1, delimeter-1)
    value = string.sub(line, delimeter+1, #line)
    table[key] = value
  end
 
  f:close()
  if len == 0 then return nil end
  return table
end
 
function meta.__call(op, path)
  local newmeta = {}
  for n, v in pairs(meta) do
    newmeta[n] = v
  end
  local table = load(PWD..path) or {}
  newmeta.table = table
  newmeta.filename = PWD..path
  newmeta.__index = newmeta
  setmetatable(table, newmeta)
  return table
end
 
function meta:save()
  local f = io.open(self.filename, "w")
  if not f then return false end
  for k, v in pairs(self.table) do
    f:write(k.."="..v.."\n")
  end
  f:close()
  return true
end
 
setmetatable(pref, meta)
return pref

 

 

 

Использование:

preferences = pref("filepath")

В случае если файл найден открывает его и парсит в переменную preferences, в случае если файл отсутствует создает новую таблицу в preferences.

preferences:save()

Сохраняет таблицу в файл (по пути который был задан в pref("filename"))

 

Пример:

pref = require("pref") // подключаем либу

settings = pref("bob.cfg") -- В рабочей директории нет файла bob.cfg поэтому создается новая таблица
settings.fname = "Bob"  -- Добавляем значения к таблице
settings.lname = "Marley"
settings.year = 90
settings.status = "Narcoman"
settings:save() -- сохраняем таблицу в файл bob.cfg в рабочей директории
 
settings = pref("bob.cfg") -- Открываем файл bob.cfg поскольку он есть в рабочей директории
settings.year = 00  -- Меняем значения в загруженной таблице
settings.status = "Icon"
settings:save() -- Сохраняем таблицу в файл bob.cfg в рабочей директории

PS Переписано за пять минут, толком не тестировалось. Возможны ошибки, хотя крайне маловероятны. Feedback welcome.

Изменено пользователем FredoNook
  • Like 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Понадобилось нечто подобное, человеческого ини парсера найти не удалось, посмотрел эту либу немного переписал. Возможно кому-то больше понравится моя реализация.

 

Плюсы по сравнению с оригиналом:

1. Объектный подход

2. В таблицах не хранятся никакие лишние данные, только непосредственно те что вы там сохранили, вспомогательные данные и методы хранятся в метатаблице

3. Вытекает из второго в файлы не сохраняются пути до них, сохраняются только ваши данные

 

 

 

--by 1Ridav, rewritten by FredoNook
---http://computercraft.ru
local PWD = os.getenv("PWD")
 
local pref = {}
local meta = {}
 
meta.filename = ""
meta.table = {}
 
local function load(path)
  local table = {}
  local key, value, delimeter
  local len = 0
 
  local f = io.open(path, "r")
  if not f then return nil end
 
  for line in f:lines() do
    len = len + 1
    delimeter = string.find(line, "=")
    key = string.sub(line, 1, delimeter-1)
    value = string.sub(line, delimeter+1, #line)
    table[key] = value
  end
 
  f:close()
  if len == 0 then return nil end
  return table
end
 
function meta.__call(op, path)
  local newmeta = {}
  for n, v in pairs(meta) do
    newmeta[n] = v
  end
  local table = load(PWD..path) or {}
  newmeta.table = table
  newmeta.filename = PWD..path
  newmeta.__index = newmeta
  setmetatable(table, newmeta)
  return table
end
 
function meta:save()
  local f = io.open(self.filename, "w")
  if not f then return false end
  for k, v in pairs(self.table) do
    f:write(k.."="..v.."\n")
  end
  f:close()
  return true
end
 
setmetatable(pref, meta)
return pref

 

 

 

Использование:

preferences = pref("filepath")

В случае если файл найден открывает его и парсит в переменную preferences, в случае если файл отсутствует создает новую таблицу в preferences.

preferences:save()

Сохраняет таблицу в файл (по пути который был задан в pref("filename"))

 

Пример:

pref = require("pref") // подключаем либу

settings = pref("bob.cfg") -- В рабочей директории нет файла bob.cfg поэтому создается новая таблица
settings.fname = "Bob"  -- Добавляем значения к таблице
settings.lname = "Marley"
settings.year = 90
settings.status = "Narcoman"
settings:save() -- сохраняем таблицу в файл bob.cfg в рабочей директории
 
settings = pref("bob.cfg") -- Открываем файл bob.cfg поскольку он есть в рабочей директории
settings.year = 00  -- Меняем значения в загруженной таблице
settings.status = "Icon"
settings:save() -- Сохраняем таблицу в файл bob.cfg в рабочей директории

PS Переписано за пять минут, толком не тестировалось. Возможны ошибки, хотя крайне маловероятны. Feedback welcome.

 

 

 

Я тоже по началу такой путь выбрал. но потом пока дебажил - вечно путался где у меня префы, а где свои переменные. Сказалось то, что всегда работал с ними через get/set вызовы функций типа set("key", value). Поэтому решил для наглядности использовать табличный вид, они контрастно выделяются на фоне. В принципе большой разницы нет в моем или твоем варианте, это лишь дело вкуса при использовании

 

PS: Поднял твое сообщение, чтобы было видно всем

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×