AMSUtils = {}; --=============================== -- COUNTS ELEMENTS IN A STRING -- RETURN: NUMBER OF FOUND ELEMENTS function AMSUtils.String_CountElements(string, element) counttab = {}; next_ = 0; fuck = true; retfind = 0; while (fuck) do next_ = next_ + 1; counttab[next_] = String.Find(string, element, retfind + 1, false); retfind = counttab[next_]; if (next_ > 1) and (counttab[next_] <= counttab[next_-1]) then break; end end numcounttab = Table.Count(counttab); Table.Remove(counttab, numcounttab); numcounttab = Table.Count(counttab); return numcounttab; end --=============================== ----------------------------- -- èùåò ýëåìåíò â òàáëèöå -- âîçâðàùàåò êîëè÷åñòâî íàéäåííûõ ýëåìåòîâ (0 åñëè íå íàéäåíî) function AMSUtils.Table_CountElements(tab, el) nFound = 0; --n = 0; for x, y in tab do if (y == el) then --n = n + 1; nFound = nFound + 1; end end return nFound; end ----------------- ----------------------------- -- èùåò ýëåìåíò â ìàññèâå -- âîçâðàùàåò ìàññèâ ñ èíäåêñàìè íàéäåííûõ ýë-òîâ; åñëè íè÷åãî íå íàéäåíî, 1-ûé ýëåìåíò âîçâð. ìàññèâà = -1 function AMSUtils.Table_GetIndices(tab, el) tFound = {}; tFound[1] = -1; nFound = 0; for x, y in tab do if (y == el) then --n = n + 1; nFound = nFound + 1; tFound[nFound] = x; end end return tFound; end ----------------- -- ñîðòèðóåò ÷èñëåííóþ òàáëèöó (âåêòîð) â ñëó÷àéíîì ïîðÿäêå -- âîçâðàùàåò îòñîðòèðîâàííóþ òàáëèöó function AMSUtils.Table_Randomize(tab_) local tab = {}; AMSUtils.Table_Copytab(tab_, tab); nCnt1 = Table.Count(tab); tNew = {}; for a, b in tab do tNew[a] = 0; end -- created template table sized 1:1 with all zeros nCnt2 = Table.Count(tNew); for i=nCnt1, 1, -1 do nRand1 = Math.Random(1, i); -- random index in source tab repeat nRand2 = Math.Random(1, nCnt2); -- random index in target tab until tNew[nRand2] == 0 -- must point to zero value (vacant) tNew[nRand2] = tab[nRand1]; -- copy from source to target Table.Remove(tab, nRand1); -- remove copied element from source tab end return tNew; end --------------------------------------------------------------------- ------------ function AMSUtils.StringToTable(DelimitedString, Delimiter) tbReturn = {} local strWorking local nPos = nil local strData local nTableIndex = 1 local nDelimiterLength = String.Length(Delimiter) if(nDelimiterLength < 1)then tbReturn[nTableIndex] = DelimitedString return tbReturn end strWorking = DelimitedString nPos = String.Find(strWorking, Delimiter) while(nPos ~= -1)do strData = String.Left(strWorking, nPos -1) tbReturn[nTableIndex] = strData nTableIndex = nTableIndex + 1 local nLength = String.Length(strWorking) strWorking = String.Right(strWorking, nLength - (nPos + (nDelimiterLength -1))) nPos = String.Find(strWorking, Delimiter) end if(strWorking ~= "")then tbReturn[nTableIndex] = strWorking end return tbReturn end ------------- ----------------------------------------------------------------------------- ---------------------- Ó Ä À Ë Å Í È Å Ï Î Â Ò Î Ð Î Â -------------------- -- Óäàëÿåò ïîâòîðÿþùèåñÿ ýëåìåíòû (äóáëèêàòû) èç ìàññèâà è âîçâðàùàåò åãî -- 1 ÀÐÃÓÌÅÍÒ: ÌÀÑÑÈ {} -- ÂÎÇÂÐÀÙÀÅÒ: ÌÀÑÑÈ {} function AMSUtils.Table_RemDup(tIn) local tOut = {}; i = 1; tOut[1] = tIn[1]; for x = 1, Table.Count(tIn) do if AMSUtils.Table_CountElements(tOut, tIn[x]) == 0 then i = i+1; tOut[i] = tIn[x]; end end return tOut; end --------------------------------------------------------------------- --===========================================-- function AMSUtils.FileFromLink (link) nFound = String.ReverseFind(link, "/", false); sOut = String.Mid(link, nFound+1, -1); return sOut; end --===========================================-- --===========================================-- function AMSUtils.Zeroed(numb, nchars) snum = ""..numb; nDiff = nchars - String.Length(snum); if nDiff > 0 then sOut = String.Repeat("0", nDiff)..snum; else sOut = snum; end return sOut; end --===========================================-- --===========================================-- function AMSUtils.Cheq(what) Dialog.Message("CHECK", ""..what, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); end --===========================================-- --========================================-- function AMSUtils.String_FormatTime (s, delimiter) hrs = 0; min = 0; sec = 0; sh = "00"; sm = "00"; ss = "00"; hrs = Math.Floor(s/3600); if hrs < 0 then min = Math.Floor(s/60); else min = Math.Floor((s - hrs*3600)/60); end sec = s - hrs*3600 - min*60; if hrs < 10 then sh = "0"..hrs; else sh = hrs; end if min < 10 then sm = "0"..min; else sm = min; end if sec < 10 then ss = "0"..sec; else ss = sec; end str = sh..delimiter..sm..delimiter..ss; return str; end --========================================-- --------------------------------------------------------------------- -- ÊÎÏÈÐÎÂÀÍÈÅ ÌÀÑÑÈÂÀ 1  ÌÀÑÑÈ 2 -- -- 2 ÀÐÃÓÌÅÍÒÀ: ÌÀÑÑÈÂ-ÈÑÒÎ×ÍÈÊ {}, ÌÀÑÑÈÂ-ÖÅËÜ {} -- ÂÎÇÂÐÀÙÀÅÒ: ÍÈ×ÅÃÎ function AMSUtils.Table_Copytab(t_source, t_target) for index, value in t_source do t_target[index] = value; end end ----------------------------------------------------------------------------- ------------------------------------------------ function AMSUtils.Table_ChkTab(Tab, Notice, div) el = ""; xxx = Table.Concat(Tab, div, 1, TABLE_ALL); amount = Table.Count(Tab); if ((amount == 1) or (Math.Mod(amount - 1, 10) == 0 )) and (amount ~= 11) then els = " ýëåìåíò"; elseif (( amount == 2 ) or ( Math.Mod(amount - 2, 10) == 0 )) and (amount ~= 12) then els = " ýëåìåíòà"; elseif (( amount == 3 ) or ( Math.Mod(amount - 3, 10) == 0 )) and (amount ~= 13) then els = " ýëåìåíòà"; elseif (( amount == 4 ) or ( Math.Mod(amount - 4, 10) == 0 )) and (amount ~= 14) then els = " ýëåìåíòà"; else els = " ýëåìåíòîâ"; end Dialog.Message(Notice.." - âñåãî "..amount..els, xxx, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); end --------------------------------------------------------------------- --====================================-- function AMSUtils.String_AbbrevLink (link, numchars) local sOut = ""; -- http://inkunabeln.ub.uni-koeln.de/inkunabeln/max/enne138/enne138_druck1%3d0001.jpg sFile = FileFromLink(link); -- must never be abbrev'ed local nFindSlashes = String.Find(link, "//", 1, false); sIntro = String.Left(link, nFindSlashes + 1); if String.Length(sIntro..".../"..sFile) >= numchars then sOut = sIntro..".../"..sFile; else local n = 0; while ( String.Length(sIntro..String.Mid(link, nFindSlashes+2, n)..".../"..sFile) < numchars ) do sOut = sIntro..String.Mid(link, nFindSlashes+2, n)..".../"..sFile; n = n + 1; end end return sOut; end --====================================-- --==================================================================-- -- returns TRUE if the string can be converted into a number ("-1", "2.34", "0") and -- FALSE if not function AMSUtils.String_IsNumber(st) bRetrurn = false; local num = String.ToNumber(st); if num ~= 0 then bRetrurn = true; else if st == String.Repeat("0", String.Length(st)) then bRetrurn = true; else bRetrurn = false; end end return bRetrurn; end --===================================================================-- --========================== -- returns TRUE if the string contains only numeric characters ---------- FALSE if not (compare to IsNumber: "-2" or "2.34" would return false) function AMSUtils.String_IsNumber2_ (st) local lth = String.Length(st); local bReturn = true; for i = 1, lth do local sPiece = String.Mid(st, i, 1); local nInd = 0; for x = 0, 9 do if sPiece == ""..x then nInd = 1; break; end end if nInd == 0 then bReturn = false; break; end end return bReturn; end --========================-- -- Sorts numerically indexed DOUBLE-DIMENSIONAL array by internal index -- e.g. mytab = { {"a", "b", "c"}, {"b", "a", "c"} } SORT BY SECOND COLUMN ASCENDING = { {"b", *"a", "c"}, {"a", *"b", "c"} } -- SORT BY SECOND COLUMN DESCENDING = { {"a", *"b", "c"}, {"b", *"a", "c"} } -- SORT BY FIRST COLUMN ASCENDING = { {*"a", "b", "c"}, {*"b", "a", "c"} } -- RETURNS NEW TABLE - SORTED function AMSUtils.Table_SortByElement (t_Original, n_Element, b_Descend) -- First copy out birthday strings to new table, appending original indices as "(_(n)_)" to the end of each string local tNew = {}; for x, y in t_Original do tNew[x] = y[n_Element].."(_("..x..")_)"; end -- Define sorter function function sorter(v1, v2) if b_Descend then -- if TRUE : descending if (v1 > v2)then return true; else return false; end else -- if FALSE : ascending if (v1 < v2)then return true; else return false; end end end -- Sort the new table Table.Sort(tNew, sorter); -- Create new (final output) table t_Out = {}; -- Extract original indices from strings in tNew and copy items from orig. table to t_Out for x, y in tNew do local find1_ = String.Find(y, "(_(", 1, false); local find2_ = String.Find(y, ")_)", find1_, false); local extr_num = String.Mid(y, find1_ + 3, find2_ - find1_ - 3); local index = String.ToNumber(extr_num); t_Out[x] = {}; for n, m in t_Original[index] do t_Out[x][n] = m; end end return t_Out; end --==================================================================--