Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » SciTE - Open Source Text Editor for Windows & Linux

Модерирует : gyra, Maz

Widok (09-10-2007 14:48): лимит страниц. продолжаем здесь  Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

   

mozers



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
-- Расчет выделенного текста как математического выражения
-- или открытие в браузере выделенного URL
-- Автор: HSolo, mozers™
-- http://forum.ru-board.com/topic.cgi?forum=5&topic=3215&start=1120#19
--------------------------------------------
 
local function FormulaDetect(str)
  local PatternNum = "([\-\+\*\/%b()%s]*%d+[\.\,]*%d*[\)]*)"
  local startPos, endPos, Num, Formula
  startPos = 1
  Formula = ''
  while true do
      startPos, endPos, Num = string.find(str, PatternNum, startPos) -- Находим числа, знаки, скобки (т.е. все что можно принять за часть формулы)
      if startPos == nil then break end
      startPos = endPos + 1
--~ print(Num)
      Num = string.gsub (Num, '%s+', '') -- Убираем пробелы
      Num = string.gsub (Num, '^([\(%d]+)', '+%1') -- Там, где перед числом нет знака, ставим "+" (т.е. пробелы и переводы строк заменяются на "+")
      Num = string.gsub (Num, '^([\)]+)([%d]+)', '%1+%2') -- Добавляем знак "+" (при его отсутствии) между числом и скобкой
      Formula = Formula..Num -- Склеиваем вновь преобразованную строку
  end
  Formula = string.gsub (Formula, '^[\+]', '')                    -- В самом начале получился лишний "+" - убиваем его
  Formula = string.gsub(Formula,"[\,]+",'.')                      -- Не будем строги к символу - разделителю десятичных чисел
  Formula = string.gsub(Formula,"([\+\*\/\-])([\+\*\/\-]+)",'%1') -- Удаляем сдвоенные знаки
  Formula = string.gsub(Formula,"+",' + ')                        -- Разделяем суммы пробелами (имхо, нагляднее чем разделять все знаки)
  return Formula
end
 
-- local str = props['CurrentSelection'] -- неверно работает с вертикальными блоками
-- Кстати - явный BUG ядра - может кто исправит?
local str = editor:GetSelText()
if (str == '') then
  str = editor:GetCurLine()
end
 
if (string.len(str) > 2) then
  if string.find(str,'http://(.*)') then
    local browser = ('explorer ' .. str .. ' &')
    os.execute(browser)
  else
    if string.find(str, "(math\.%w+)") then  -- В случае сложных математических выражений форматирование оставляем на пользователя
      str = string.gsub(str,"[=]",'')
    else
      str = FormulaDetect(str)
    end
 
    print('-> Расчет выражения: '..str)
    local res = assert(loadstring('return '..str),str)()
    editor:CharRight()
    editor:LineEnd()
    local sel_start = editor.SelectionStart + 1
    local sel_end = sel_start + string.len(res)
    editor:AddText('\n'..res)
    editor:SetSel(sel_start, sel_end)
    print('>> Результат: '..res)
  end
end
 
-- Тесты типа
--~ 1/2 56/4 - 56 (8-6)*4  4,5*(1+2)    66
--~ 3/6 6.4/2 6  (7-6)*4  45/4.1 66
 
--~ dmfdmk v15*6dmd.ks skm4.37/3d(k)gm/sk+d skdmg(6,7+6)skdmgk
 
--~ Колбаса = 24.5кг. * 120руб./кг  
--~ Бензин(ABC) = (2500км. / (11,5л./100км.)) * 18.4руб./л + Канистра =100руб.  
--~ Штукатурка = 22.4 м2 /80руб./100 м2
 

Всего записей: 2187 | Зарегистр. 03-01-2002 | Отправлено: 21:28 12-12-2006
   

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Программы » SciTE - Open Source Text Editor for Windows & Linux
Widok (09-10-2007 14:48): лимит страниц. продолжаем здесь


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru