diff --git a/uppbox/uppweb/www.cpp b/uppbox/uppweb/www.cpp index 8f096ae92..1aa4db97e 100644 --- a/uppbox/uppweb/www.cpp +++ b/uppbox/uppweb/www.cpp @@ -1,1036 +1,1056 @@ -#include "www.h" -#define IMAGECLASS WWW -#define IMAGEFILE -#include -#include - -#define TFILE -#include - -#define LLOG(x) // LOG(x) - -#ifdef PLATFORM_WIN32 -String rootdir = "u:\\upp.src"; -String uppbox = rootdir + "uppbox"; -String uppsrc = rootdir + "uppsrc"; -String reference = rootdir + "reference"; -String examples = rootdir + "examples"; -String targetdir = "u:\\uppwww"; -String pdfdir = "u:\\pdf"; -#else -String rootdir = "/root/upp.src"; -String uppbox = rootdir + "uppbox"; -String uppsrc = rootdir + "uppsrc"; -String reference = rootdir + "reference"; -String examples = rootdir + "examples"; -String targetdir = "/var/www"; -String diffdir = "/root/wwwupp"; -String pdfdir = "/var/www"; -#endif -String bazaar; -bool outPdf; -bool doSvn; - -String GetRcFile(const char *s) -{ - String f = GetDataFile(s); - if(FileExists(f)) - return f; - return GetHomeDirFile("upp.src/uppbox/uppweb/" + AsString(s)); -} - -bool ContainsAt(const String &source, const String &pattern, int pos) -{ - return pos >= 0 - && pos + pattern.GetLength() <= source.GetLength() - && 0 == memcmp(source.Begin() + pos, pattern.Begin(), pattern.GetLength()); -} - -bool StartsWith(const String &source, const String &pattern) -{ - return ContainsAt(source, pattern, 0); -} - -bool EndsWith(const String &source, const String &pattern) -{ - return ContainsAt(source, pattern, source.GetLength() - pattern.GetLength()); -} - -String ImgName(int q) -{ - return Sprintf("%di.png", q); -} - -typedef Image (*ImageFn)(); - -namespace Upp { -template<> -unsigned GetHashValue(const ::ImageFn& fn) { return (unsigned)(uintptr_t) fn; } -}; - -String GetImageSrc(ImageFn img) -{ - static Index il; - int q = il.Find(img); - if(il.Find(img) < 0) { - q = il.GetCount(); - il.Add(img); - PNGEncoder png; - png.SaveFile(AppendFileName(targetdir, ImgName(q)),(*img)()); - } - return ImgName(q); -} - -Htmls Wimg(ImageFn img) -{ - return HtmlImg(GetImageSrc(img)).Border(0); -} - -Htmls RoundFrame(Htmls data, String border, Color bg) -{ - return HtmlPackedTable().BgColor(bg).Width(-100) - .Attr("style", "border-style: solid; border-width: 1px; border-color: #" + border + ";") - / HtmlLine() / data; -} - -HtmlTag BoxWidth(int width) -{ - return HtmlPackedTable().Width(width) / HtmlLine(); -} - -Htmls BarSection(const char *txt) -{ - Htmls bar; - bar.Br(); - bar << HtmlPackedTable().BgColor(WhiteGray).Width(-100) / - (HtmlRow() / ( - HtmlCell().Width(10) / " " + - HtmlCell() / HtmlArial(8) / HtmlBold() / txt + - HtmlCell().Width(10) / " " - )); - return bar; -} - -Htmls BarCaption(const char *text) -{ - return HtmlLine() - .Width(-100) - .VCenter() - .Style("background-image: url('" + GetImageSrc(WWW::Caption) + "'); " - "border: 0px solid black;" - "padding-left:12px; padding-right:0px; " - "padding-top:1px; padding-bottom:1px;" - "color:#FFFFFF;") - / HtmlBold() / HtmlArial(8) / text; -} - -Htmls BarCaptionLang(const char *text) -{ - return HtmlLine() - .Width(20) - .VCenter() - .Style("background-image: url('" + GetImageSrc(WWW::News2) + "'); " - "border: 0px solid black;" - "padding-left:12px; padding-right:0px; " - "padding-top:1px; padding-bottom:1px;" - "color:#FFFFFF;") - / HtmlBold() / HtmlArial(8) / text; -} - -Htmls BarItem(Htmls content, const char *style) -{ - String bgStyle = "background-image: url('" + GetImageSrc(WWW::Button) + "'); "; - return HtmlLine().Width(-100).VCenter().Style(bgStyle + style) - / content; -} - -Htmls BarLink(const char *link, const char *text, bool nxt = true) -{ - String style = "border: 0px solid black; " - "padding-left:12px; padding-right:0px; " - "padding-top:6px; padding-bottom:6px;"; - if(nxt) - style += " border-top: 1px solid #6E89AE;"; - - return BarItem( HtmlLink(link).Class("l1") / text, style ); -} - -Htmls SearchBar(const char *domain) -{ - Htmls form = - HtmlForm("http://www.google.com/search", false, "GET") - .Style("margin:0px;padding:0px;") / - ( HtmlHidden("ie", "UTF-8") + - HtmlHidden("oe", "UTF-8") + - HtmlEdit("q", 15) + - HtmlHidden("domains", domain) + - HtmlHidden("sitesearch", domain) - ); - - Htmls content; - content << HtmlPackedTable().Width(-100) - / HtmlRow() / ( - HtmlCell() / Wimg(WWW::google) + - HtmlCell() / form - ); - - String style = "border: 0px solid black; " - "padding-left:6px; padding-right:0px; " - "padding-top:4px; padding-bottom:4px;" - "border-top: 1px solid #6E89AE;"; - return BarItem(content, style); -} - -HtmlTag HtmlPadding(int p) -{ - return HtmlPackedTable().Width(-100) / - HtmlLine(); -} - -VectorMap escape; - -String QtfAsHtml(const char *qtf, Index& css, - const VectorMap& links, - const VectorMap& labels, - const String& outdir, const String& fn = Null) -{ - return EncodeHtml(ParseQTF(qtf), css, links, labels, outdir, fn, Zoom(8, 40), escape, 40); -} - -String GetText(const char *s) -{ - return GetTopic(s).text; -} - -String ChangeTopicLanguage(const String &topic, int lang) { - int pos = topic.ReverseFind('$'); - if (pos < 0) - return ""; - String langtxt = ToLower(LNGAsText(lang)); - return topic.Left(pos+1) + langtxt + topic.Mid(pos+1+langtxt.GetCount()); -} - -String GetTopicLanguage(const String &topic) { - int pos = topic.ReverseFind('$'); - if (pos < 0) - return ""; - return topic.Mid(pos+1, 5); -} - -String FormatDateRFC822(const Time& t) { - int tz = int((GetSysTime()-GetUtcTime())/60); - return Format("%s, %d %Mon %d %02d:%02d:%02d %s%04d", - DayName(DayOfWeek(t)).Left(3), - t.day,t.month,t.year, - t.hour,t.minute,t.second, - tz>0?"+":"",tz/60*100+(tz+1440)%60); -} - -void CreateRssFeed() { - String header="\n" - "\n" - "Ultimate++ svn changes\n" - "http://ultimatepp.org/\n" - "This feed offers list of commits to Ultimate++ framework svn repository\n" - ""+ FormatDateRFC822(GetSysTime()) + "\n" - "en-us\n" - "\n\n"; - - String items; - for(int i = 0; i < min(30,svnlog.GetCount()); i++){ - items+="\n" - "Revision " + svnlog[i].revision + "\n" - "http://code.google.com/p/upp-mirror/source/detail?r=" + svnlog[i].revision + "\n" - "http://code.google.com/p/upp-mirror/source/detail?r=" + svnlog[i].revision + "\n" - "" + FormatDateRFC822(svnlog[i].time) + "\n" - "\n" - " Revision:" + svnlog[i].revision + "\n" - " Description:" + svnlog[i].msg + "\n" - " Submitted:" + FormatDateRFC822(svnlog[i].time) + " by " + svnlog[i].author + "\n" - " Affected files: \n" - " \n" - "
\n"; - for(int j = 0; j < svnlog[i].changes.GetCount(); j++) - items+="" + svnlog[i].changes[j].action + " " - "" + svnlog[i].changes[j].path + "
\n"; - items+= - "
\n" - " \n" - " \n" - "]]>
\n" - "
\n\n"; - } - SaveFile(AppendFileName(targetdir, "svnchanges.xml"), header + items + "
\n
\n"); -} - -VectorMap tt; - -String Www(const char *topic, int lang, String topicLocation = "topic://uppweb/www/") -{ - String strLang = ToLower(LNGAsText(lang)); - String www = GatherTopics(tt, String().Cat() << topicLocation << topic << "$" << strLang); - if (www != "index.html") - return www; - return GatherTopics(tt, String().Cat() << topicLocation << topic << "$" << "en-us"); -} - -String FolderLinks(String package, String group, int lang) -{ - String qtf; - FindFile ff(AppendFileName(AppendFileName(AppendFileName(uppsrc, package), group + ".tpp"), "*.tpp")); - while(ff) { - if(ff.IsFile()) { - if (ff.GetName().Find("en-us") >= 0) { - String title; - String tl = "topic://" + package + '/' + group + '/' + GetFileTitle(ff.GetName()); - tl = ChangeTopicLanguage(tl, lang); - GatherTopics(tt, tl, title); - qtf << "________[^" << tl << "^ " << DeQtf(Nvl(title, tl)) << "]&"; - } - } - ff.Next(); - } - return qtf; -} - -void AddFiles(String& qtf, const String& dir, const char* ext, bool& b) -{ - FindFile ff(AppendFileName(dir, "*." + String(ext))); - while(ff) { - qtf << "[A4* " << DeQtf(ff.GetName()) << "]&&" - << CppAsQtf(LoadFile(AppendFileName(dir, ff.GetName()))) - << "&&&"; - ff.Next(); - b = true; - } -} - -struct Isort { - bool operator()(const String& a, const String& b) const - { - return ToUpper(a) < ToUpper(b); - } -}; - -String MakeExamples(const char *dir, const char *www, int language) -{ - String ttxt; - FindFile ff(AppendFileName(dir, "*.*")); - ttxt << "{{1:3 "; - bool next = false; - Vector ls; - while(ff) { - if(ff.IsFolder()) - ls.Add(ff.GetName()); - ff.Next(); - } - Sort(ls, Isort()); - for(int i = 0; i < ls.GetCount(); i++) { - String name = ls[i]; - String link = String().Cat() << www << '$' << name << "$" << ToLower(LNGAsText(language)) << ".html"; - Topic& topic = tt.Add(link); - topic.title = name; - String fn = AppendFileName( - AppendFileName( - AppendFileName(uppbox, "uppweb"), - String(www) + ".tpp" - ), - topic.title + "$" + ToLower(LNGAsText(language)) + ".tpp" - ); - String h = ReadTopic(LoadFile(fn)).text; - Package p; - p.Load(AppendFileName(AppendFileName(dir, name), name + ".upp")); - topic.text << "[R6* " << name << "]&&" << DeQtf(p.description) << "&"; - if(h.GetCount()) - topic.text << h; - topic.text << "[A2 &x, String& qtf, const char *folder, int lang) -{ - if(x.Find(folder) >= 0) - return; - x.Add(folder); - String srcdoc = FolderLinks(folder, "srcdoc", lang); - String src = FolderLinks(folder, "src", lang); - Package p; - p.Load(AppendFileName(uppsrc, AppendFileName(folder, GetFileName(folder) + ".upp"))); - if(srcdoc.GetLength() || src.GetLength()) { - qtf << "&&&[*4@b " << folder << "]&"; - if(!IsNull(p.description)) - qtf << "[2 " << p.description << "]&"; - if(srcdoc.GetCount()) { - qtf << "&[3/* " + Format(t_("Using %s"), folder) << "]&"; - qtf << srcdoc; - } - if(src.GetCount()) { - qtf << "&[3/* " << Format(t_("%s reference"), folder) << "]&"; - qtf << src; - } - } -} - -int CharFilterLbl(int c) -{ - return IsAlNum(c) ? c : '.'; -} - - -void QtfAsPdf(PdfDraw &pdf, const char *qtf) -{ - RichText txt = ParseQTF(qtf); - Size page = Size(3968, 6074); - UPP::Print(pdf, txt, page); -} - -VectorMap links; -VectorMap labels; -Htmls header, lastUpdate; - -Array bar; -Array languages; - -int GetLinkLanguage(const String &link) { - int pos = link.ReverseFind('$'); - if (pos < 0) - return 0; - int lang = LNGFromText(ToUpper(link.Mid(pos+1))); - for (int i = 0; i < languages.GetCount(); ++i) { - if (languages[i] == lang) - return i; - } - return 0; -} - -void ExportPage(int i) -{ - Index css; - String path = links.GetKey(i); - RLOG("Exporting " << path); - - int ilang = GetLinkLanguage(path); - SetLanguage(languages[ilang]); - String text = GetText(path); - int h; - h = ParseQTF(tt[i].text).GetHeight(1000); - - int isvn = svndata.Find(tt.GetKey(i)); - String qtflangs; - String googleFile; - if (isvn > -1) { - String txt = String("[2 ") + t_("Last edit by %s on %s") + ".]"; - qtflangs += Format(txt, svndata[isvn].author, Format(Date(svndata[isvn].time))); - googleFile = svndata[isvn].fullPath; - if (googleFile.GetCount() > rootdir.GetCount()) - googleFile = UnixPath(googleFile.Mid(rootdir.GetCount())); - else - googleFile = ""; - } - String strlang; - String jslang; - Array arrLangs; - for (int il = 0; il < languages.GetCount(); ++il) { - String topic = ChangeTopicLanguage(path, languages[il]); - int itopic; - if ((itopic = tt.Find(topic)) >= 0) { - if (tt[itopic].title.Find(" (translated)") < 0) { - if (il != ilang) { - if (!strlang.IsEmpty()) - strlang << ", "; - arrLangs.Add("[^" + links[itopic] + "^ [2 " + ToLower(GetNativeLangName(languages[il])) + "]]"); - } - jslang+="'"+ links[itopic] +"':'" + GetNativeLangName(languages[il]) + "',"; - } - } - } - if(!jslang.IsEmpty()) - jslang.Trim(jslang.GetCount()-1); - if (arrLangs.GetCount() > 0) { - for (int i = 0; i < arrLangs.GetCount(); ++i) { - if (i == arrLangs.GetCount()-1 && i != 0) - strlang << String(" ") + t_("and") + " "; - else if (i > 0) - strlang << ", "; - strlang << arrLangs[i]; - } - } - if (!strlang.IsEmpty()) - qtflangs += Format(String("[2 ") + t_("This page is also in %s") + ".]", strlang); - if (tt[i].title.Find("How to contribute. Web page") < 0) { - String help = "topic://uppweb/www/contribweb$" + ToLower(LNGAsText(languages[ilang])); - qtflangs += " " + String("[^") + help + "^ [ htmlrep; - int posB = 0; - while (true) { - posB = page.Find("[IHTMLTEXT", posB); - if (posB < 0) - break; - int posBB = posB + (int)strlen("[IHTMLTEXT"); - int pos0 = page.ReverseFind("[", posB-1); - int posE = page.Find(";2", posBB); - String html0 = page.Mid(posBB, posE - posBB); - html0.Replace("`", ""); - htmlrep.Add(html0); - int posEE = page.Find("]&]", posE) + (int)strlen("]&]"); - - page = page.Left(pos0) + "QTFHTMLTEXT" + FormatInt(htmlrep.GetCount()-1) + page.Mid(posEE+1); - } - - page = QtfAsHtml(page, css, links, labels, targetdir, links[i]); - for (int iHtml = 0; iHtml < htmlrep.GetCount(); ++iHtml) - page.Replace(String("QTFHTMLTEXT") + FormatInt(iHtml), htmlrep[iHtml]); - - Color paper = SWhite; - if(path == "topic://uppweb/www/download$en-us") - page << LoadFile(GetRcFile("adsense3.txt")); -/* if(path == "topic://uppweb/www/index$en-us") { - for(int q = 0; q < news.GetCount(); q++) { - String n = GetText("uppweb/www_news/" + news[q]); - String h = news[q]; - int i = h.Find('$'); - if(i >= 0) - h = h.Mid(0, i); - if(h.GetLength() == 8) - h = h.Mid(0, 4) + '-' + h.Mid(4, 2) + '-' + h.Mid(6, 2); - page << "
"; - page << "
  " - << h << "

"; - page << QtfAsHtml(n, css, links, targetdir, FormatIntAlpha(q) + "_n"); - page << "
"; - } - }*/ - Color bg = Color(210, 217, 210); - Htmls footer; - footer << HtmlTable().Border(0).Width(-100) / HtmlLine() + - RoundFrame(HtmlPadding(8) / langs , "6E89AE;padding: 10px;", White); - Htmls html; - html << - HtmlPackedTable().Width(-100) / - HtmlLine().ColSpan(3) / header + - HtmlPackedTable().Width(-100) / ( - HtmlLine().ColSpan(3).BgColor(bg).Height(6) / "" + - HtmlRow() / ( - HtmlTCell().Center() / BoxWidth(160).Center() / ( - bar[GetLinkLanguage(path)] + - "
" + - LoadFile(GetRcFile("facebook.txt")) + - "

" + -// "

" + - LoadFile(GetRcFile("adsense2.txt")) + - "

" + - LoadFile(GetRcFile("adlinks.txt")) + - (h > 25000 ? "

" + LoadFile(GetRcFile("adsense2.txt")) - : "") + - "


" + -// LoadFile(GetRcFile("referral.txt")) + -// LoadFile(GetRcFile("referral2.txt")) + -// LoadFile(GetRcFile("donations.txt")) + -// "

" + -// amazon[i % amazon.GetCount()] + - "


" + - HtmlLink("http://sourceforge.net/projects/upp/") / - HtmlImg("http://sourceforge.net/sflogo.php?group_id=93970&type=2", - "SourceForge.net Logo").Border(0).Width(125).Height(37) + - "

" + - HtmlLink("http://www.sdjournal.org/en/") / - HtmlImg(GetImageSrc(WWW::Sdj)).Border(0) + - "

" + - (links[i] == "index.html" ? lastUpdate : Htmls()) + - HtmlImg("http://www.vol.cz/cgi-bin/wc/upp").Width(1).Height(1) - ) + - HtmlTCell().BgColor(bg) / BoxWidth(6) / "" + - HtmlTCell().Width(-100).BgColor(bg) / ( - RoundFrame(HtmlPadding(8) / page , "6E89AE;padding: 10px;", White) + - footer - ) - ) - ) + Htmls(""); - - String topicTitle = tt.GetKey(i); - String pageTitle = tt[i].title; - if(IsNull(pageTitle)) - pageTitle = "Ultimate++"; - if(StartsWith(topicTitle, "examples$")) - pageTitle = "Demos / " + pageTitle; - else if(StartsWith(topicTitle, "reference$")) - pageTitle = "Examples / " + pageTitle; - - if(pageTitle != "Ultimate++") - pageTitle << " :: Ultimate++"; - - Htmls content = - "\n" + - HtmlHeader(pageTitle, AsCss(css) + - "a.l1 { text-decoration:none; font-size: 8pt; font-family: sans-serif; " - "font-weight: normal; }\n" - "a.l1:link { color:#000000; }\n" - "a.l1:visited { color:#000080; }\n" - "a.l1:hover { color:#9933CC; }\n" - "a.l1:active { color:#000000; }\n" - "a.l2 { text-decoration:none; font-size: 12pt; font-family: sans-serif; " - "font-variant: small-caps; }\n" - "a.l2:link { color:#0066FF; }\n" - "a.l2:visited { color:#FF6600; }\n" - "a.l2:hover { color:#BC0624; }\n" - "a.l2:active { color:#BC0024; }\n", - "" - "\n" - "" -// "" - ) - - - .BgColor(bg) - .Alink(Red).Link(Black).Vlink(Blue) - / html; - SaveFile(AppendFileName(targetdir, links[i]), content); - RLOG("Exported page " << links[i]); -} - -String Downloads() -{ - String r; - FindFile ff(AppendFileName(targetdir, "downloads/*.*")); - Vector

") + - BarItem(HtmlPackedTable().Width(-100) - / HtmlRow() / ( - HtmlCell() / Wimg(WWW::Language) + - HtmlCell() / Htmls("
"+GetNativeLangName(languages[i])+"
") - ),"border: 0px solid black;" - "padding-left:6px; padding-right:0px;" - "padding-top:4px; padding-bottom:4px;" - ) + Htmls("
"); - - - HtmlTag bf = HtmlPackedTable() - .Width(-100) - .BgColor(White) - .Attr("style", "border-style: solid; border-width: 1px; border-color: #6E89AE;" - "padding: 0px"); - String div = HtmlTable().Border(0).Width(-100) / HtmlLine(); - bar[i] = bf / bi + div + - // bf / bex + div + - // bf / bdoc + div + - // bf / bcom + div + - // bf / bcon + div + - bf / bsearch + div + - bf / blang + div; - } - SetLanguage(lang); - - for(int i = 0; i < tt.GetCount(); i++) { - String topic = tt.GetKey(i); - links.Add(topic, topic == "topic://uppweb/www/index$en-us" ? "index.html" : - memcmp(topic, "topic://", 8) ? topic : TopicFileNameHtml(topic)); - } - - String svntableStr = DeQtf("[svntable]"); - for(int i = 0; i < tt.GetCount(); i++) { - if (tt[i].title == "Svn releases") - tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 300, "")); - else if (tt[i].title == "Svn Web releases") - tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 100, "uppweb")); - else if (tt[i].title == "Svn Bazaar releases") - tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 100, "bazaar")); - else if (tt[i].title == "Svn Upp releases") - tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 100, "uppsrc")); - else if (tt[i].title == "Svn major releases") - tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 300, "", true)); - else if (tt[i].title == "Svn Web major releases") - tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 100, "uppweb", true)); - else if (tt[i].title == "Svn Bazaar major releases") - tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 100, "bazaar", true)); - else if (tt[i].title == "Svn Upp major releases") - tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 100, "uppsrc", true)); - else - if(tt[i].title == "Nightly builds") - tt[i].text.Replace(String("<#downloads#>"), downloads); - else if (links[i].Find("index") >= 0) { - String win32 = "upp-win32-RELEASE.exe"; - String win32release = win32; - win32release.Replace(String("RELEASE"), release); - String x11 = "upp-x11-src-RELEASE.tar.gz"; - String x11release = x11; - x11release.Replace(String("RELEASE"), release); - tt[i].text.Replace(DeQtf(x11), DeQtf(x11release)); - tt[i].text.Replace(DeQtf(win32), DeQtf(win32release)); - } - } - - for(int i = 0; i < reflink.GetCount(); i++) { - String l = reflink.GetKey(i); - String lbl = Filter(l, CharFilterLbl); - String f = links.Get(reflink[i], Null) + '#' + lbl; - links.Add(l, f); - static const char *x[] = { "::struct", "::class", "::union" }; - for(int ii = 0; ii < 3; ii++) { - String e = x[ii]; - if(EndsWith(l, e)) { - links.Add(l.Mid(0, l.GetLength() - e.GetLength()), f); - } - } - labels.Add(l, lbl); - } - - Date d = GetSysDate(); - lastUpdate = HtmlItalic() / HtmlArial(8) / HtmlFontColor(Gray()) / - (String().Cat() << "Last update " << GetSysDate()); - -// Vector amazon = Split(LoadFile(GetRcFile("amazon.txt")), '\n');//440 - - Vector bazaarItems = SvnBazaarList(bazaar, svnlog); - - // To fill Bazaar page with real release dates and size - for(int i = 0; i < tt.GetCount(); i++) { - if (tt[i].title == "Bazaar") { - String page = tt[i]; - for (int j = 0; j < bazaarItems.GetCount(); ++j) { - int pos = page.Find("2 " + DeQtf(bazaarItems[j].name) + "]]"); - if (pos < 0) - pos = page.Find("2 " + DeQtf(bazaarItems[j].name) + "\r\n]]"); - if (pos >= 0) { - pos = page.Find("::", pos); - pos = page.Find("::", pos); - pos = page.Find(":: [s0;=2", pos); - if (pos >= 0) - pos += (int)strlen(":: [s0;=2"); - String strDate; - if (pos >= 0) { - Time t = bazaarItems[j].lastChange; - if (IsNull(t)) - strDate = "Not in Svn log"; - else - strDate = Format("%Mon", t.month) + " " + FormatInt(t.year); - page.Insert(pos, " " + strDate); - } - pos = page.Find(":: [s0;=2", pos); - if (pos >= 0) - pos += (int)strlen(":: [s0;=2"); - String strSz; - if (pos >= 0) { - if (bazaarItems[j].size == 0) - strSz = "Not in Svn log"; - else - strSz = BytesToString(bazaarItems[j].size); - - page.Insert(pos, " " + strSz); - } - } - } - tt[i].text = page; - } - } - - LLOG("G: " << MemoryUsedKb()); - -/* - if (outPdf) { - PdfDraw pdf; - for(int i = 0; i < tt.GetCount(); i++) - QtfAsPdf(pdf, tt[i]); - SaveFile(AppendFileName(pdfdir, "Upp.pdf"), pdf.Finish()); - } -*/ - - LLOG("H: " << MemoryUsedKb()); - - for(int i = 0; i < tt.GetCount(); i++) - ExportPage(i); - SetLanguage(lang); - - LLOG("I: " << MemoryUsedKb()); - -// SaveFile(AppendFileName(targetdir, "favicon.ico"), LoadFile(AppendFileName(uppsrc, "ide/ide.ico"))); - SaveFile(AppendFileName(targetdir, "stats.html"), - HtmlImg("http://www.vol.cz/cgi-bin/wc/upp") + "
" + - HtmlLink("http://www.mygooglepagerank.com", "_blank") / - "" + - "" + - HtmlLink("http://www.mygooglepagerank.com", "_blank") / - "" + - "" - ); - Cout() << "Finished OK\n"; -} +#include "www.h" +#define IMAGECLASS WWW +#define IMAGEFILE +#include +#include + +#define TFILE +#include + +#define LLOG(x) // LOG(x) + +#ifdef PLATFORM_WIN32 +String rootdir = "u:\\upp.src"; +String uppbox = rootdir + "uppbox"; +String uppsrc = rootdir + "uppsrc"; +String reference = rootdir + "reference"; +String examples = rootdir + "examples"; +String targetdir = "u:\\uppwww"; +String diffdir = "u:\\wwwupp"; +String pdfdir = "u:\\pdf"; +#else +String rootdir = "/root/upp.src"; +String uppbox = rootdir + "uppbox"; +String uppsrc = rootdir + "uppsrc"; +String reference = rootdir + "reference"; +String examples = rootdir + "examples"; +String targetdir = "/var/www"; +String diffdir = "/root/wwwupp"; +String pdfdir = "/root/pdf"; +#endif +String bazaar; +bool outPdf; +bool doSvn; + +String GetRcFile(const char *s) +{ + String f = GetDataFile(s); + if(FileExists(f)) + return f; + return GetHomeDirFile("upp.src/uppbox/uppweb/" + AsString(s)); +} + +bool ContainsAt(const String &source, const String &pattern, int pos) +{ + return pos >= 0 + && pos + pattern.GetLength() <= source.GetLength() + && 0 == memcmp(source.Begin() + pos, pattern.Begin(), pattern.GetLength()); +} + +bool StartsWith(const String &source, const String &pattern) +{ + return ContainsAt(source, pattern, 0); +} + +bool EndsWith(const String &source, const String &pattern) +{ + return ContainsAt(source, pattern, source.GetLength() - pattern.GetLength()); +} + +String ImgName(int q) +{ + return Sprintf("%di.png", q); +} + +typedef Image (*ImageFn)(); + +namespace Upp { +template<> +unsigned GetHashValue(const ::ImageFn& fn) { return (unsigned)(uintptr_t) fn; } +}; + +String GetImageSrc(ImageFn img) +{ + static Index il; + int q = il.Find(img); + if(il.Find(img) < 0) { + q = il.GetCount(); + il.Add(img); + PNGEncoder png; + png.SaveFile(AppendFileName(targetdir, ImgName(q)),(*img)()); + } + return ImgName(q); +} + +Htmls Wimg(ImageFn img) +{ + return HtmlImg(GetImageSrc(img)).Border(0); +} + +Htmls RoundFrame(Htmls data, String border, Color bg) +{ + return HtmlPackedTable().BgColor(bg).Width(-100) + .Attr("style", "border-style: solid; border-width: 1px; border-color: #" + border + ";") + / HtmlLine() / data; +} + +HtmlTag BoxWidth(int width) +{ + return HtmlPackedTable().Width(width) / HtmlLine(); +} + +Htmls BarSection(const char *txt) +{ + Htmls bar; + bar.Br(); + bar << HtmlPackedTable().BgColor(WhiteGray).Width(-100) / + (HtmlRow() / ( + HtmlCell().Width(10) / " " + + HtmlCell() / HtmlArial(8) / HtmlBold() / txt + + HtmlCell().Width(10) / " " + )); + return bar; +} + +Htmls BarCaption(const char *text) +{ + return HtmlLine() + .Width(-100) + .VCenter() + .Style("background-image: url('" + GetImageSrc(WWW::Caption) + "'); " + "border: 0px solid black;" + "padding-left:12px; padding-right:0px; " + "padding-top:1px; padding-bottom:1px;" + "color:#FFFFFF;") + / HtmlBold() / HtmlArial(8) / text; +} + +Htmls BarCaptionLang(const char *text) +{ + return HtmlLine() + .Width(20) + .VCenter() + .Style("background-image: url('" + GetImageSrc(WWW::News2) + "'); " + "border: 0px solid black;" + "padding-left:12px; padding-right:0px; " + "padding-top:1px; padding-bottom:1px;" + "color:#FFFFFF;") + / HtmlBold() / HtmlArial(8) / text; +} + +Htmls BarItem(Htmls content, const char *style) +{ + String bgStyle = "background-image: url('" + GetImageSrc(WWW::Button) + "'); "; + return HtmlLine().Width(-100).VCenter().Style(bgStyle + style) + / content; +} + +Htmls BarLink(const char *link, const char *text, bool nxt = true) +{ + String style = "border: 0px solid black; " + "padding-left:12px; padding-right:0px; " + "padding-top:6px; padding-bottom:6px;"; + if(nxt) + style += " border-top: 1px solid #6E89AE;"; + + return BarItem( HtmlLink(link).Class("l1") / text, style ); +} + +Htmls SearchBar(const char *domain) +{ + Htmls form = + HtmlForm("http://www.google.com/search", false, "GET") + .Style("margin:0px;padding:0px;") / + ( HtmlHidden("ie", "UTF-8") + + HtmlHidden("oe", "UTF-8") + + HtmlEdit("q", 15) + + HtmlHidden("domains", domain) + + HtmlHidden("sitesearch", domain) + ); + + Htmls content; + content << HtmlPackedTable().Width(-100) + / HtmlRow() / ( + HtmlCell() / Wimg(WWW::google) + + HtmlCell() / form + ); + + String style = "border: 0px solid black; " + "padding-left:6px; padding-right:0px; " + "padding-top:4px; padding-bottom:4px;"; + "border-top: 1px solid #6E89AE;"; + return BarItem(content, style); +} + +HtmlTag HtmlPadding(int p) +{ + return HtmlPackedTable().Width(-100) / + HtmlLine(); +} + +VectorMap escape; + +String QtfAsHtml(const char *qtf, Index& css, + const VectorMap& links, + const VectorMap& labels, + const String& outdir, const String& fn = Null) +{ + return EncodeHtml(ParseQTF(qtf), css, links, labels, outdir, fn, Zoom(8, 40), escape, 40); +} + +String GetText(const char *s) +{ + return GetTopic(s).text; +} + +String ChangeTopicLanguage(const String &topic, int lang) { + int pos = topic.ReverseFind('$'); + if (pos < 0) + return ""; + String langtxt = ToLower(LNGAsText(lang)); + return topic.Left(pos+1) + langtxt + topic.Mid(pos+1+langtxt.GetCount()); +} + +String GetTopicLanguage(const String &topic) { + int pos = topic.ReverseFind('$'); + if (pos < 0) + return ""; + return topic.Mid(pos+1, 5); +} + +String FormatDateRFC822(const Time& t) { + int tz = int((GetSysTime()-GetUtcTime())/60); + return Format("%s, %d %Mon %d %02d:%02d:%02d %s%04d", + DayName(DayOfWeek(t)).Left(3), + t.day,t.month,t.year, + t.hour,t.minute,t.second, + tz>0?"+":"",tz/60*100+(tz+1440)%60); +} + +void CreateRssFeed() { + String header="\n" + "\n" + "Ultimate++ svn changes\n" + "http://ultimatepp.org/\n" + "This feed offers list of commits to Ultimate++ framework svn repository\n" + ""+ FormatDateRFC822(GetSysTime()) + "\n" + "en-us\n" + "\n\n"; + + String items; + for(int i = 0; i < min(30,svnlog.GetCount()); i++){ + items+="\n" + "Revision " + svnlog[i].revision + "\n" + "http://code.google.com/p/upp-mirror/source/detail?r=" + svnlog[i].revision + "\n" + "http://code.google.com/p/upp-mirror/source/detail?r=" + svnlog[i].revision + "\n" + "" + FormatDateRFC822(svnlog[i].time) + "\n" + "\n" + " Revision:" + svnlog[i].revision + "\n" + " Description:" + svnlog[i].msg + "\n" + " Submitted:" + FormatDateRFC822(svnlog[i].time) + " by " + svnlog[i].author + "\n" + " Affected files: \n" + " \n" + "
\n"; + for(int j = 0; j < svnlog[i].changes.GetCount(); j++) + items+="" + svnlog[i].changes[j].action + " " + "" + svnlog[i].changes[j].path + "
\n"; + items+= + "
\n" + " \n" + " \n" + "]]>
\n" + "
\n\n"; + } + SaveFile(AppendFileName(targetdir, "svnchanges.xml"), header + items + "
\n
\n"); +} + +VectorMap tt; + +String Www(const char *topic, int lang, String topicLocation = "topic://uppweb/www/") +{ + String strLang = ToLower(LNGAsText(lang)); + String www = GatherTopics(tt, String().Cat() << topicLocation << topic << "$" << strLang); + if (www != "index.html") + return www; + return GatherTopics(tt, String().Cat() << topicLocation << topic << "$" << "en-us"); +} + +String FolderLinks(String package, String group, int lang) +{ + String qtf; + FindFile ff(AppendFileName(AppendFileName(AppendFileName(uppsrc, package), group + ".tpp"), "*.tpp")); + while(ff) { + if(ff.IsFile()) { + if (ff.GetName().Find("en-us") >= 0) { + String title; + String tl = "topic://" + package + '/' + group + '/' + GetFileTitle(ff.GetName()); + tl = ChangeTopicLanguage(tl, lang); + GatherTopics(tt, tl, title); + qtf << "________[^" << tl << "^ " << DeQtf(Nvl(title, tl)) << "]&"; + } + } + ff.Next(); + } + return qtf; +} + +void AddFiles(String& qtf, const String& dir, const char* ext, bool& b) +{ + FindFile ff(AppendFileName(dir, "*." + String(ext))); + while(ff) { + qtf << "[A4* " << DeQtf(ff.GetName()) << "]&&" + << CppAsQtf(LoadFile(AppendFileName(dir, ff.GetName()))) + << "&&&"; + ff.Next(); + b = true; + } +} + +struct Isort { + bool operator()(const String& a, const String& b) const + { + return ToUpper(a) < ToUpper(b); + } +}; + +String MakeExamples(const char *dir, const char *www, int language) +{ + String ttxt; + FindFile ff(AppendFileName(dir, "*.*")); + ttxt << "{{1:3 "; + bool next = false; + Vector ls; + while(ff) { + if(ff.IsFolder()) + ls.Add(ff.GetName()); + ff.Next(); + } + Sort(ls, Isort()); + for(int i = 0; i < ls.GetCount(); i++) { + String name = ls[i]; + String link = String().Cat() << www << '$' << name << "$" << ToLower(LNGAsText(language)) << ".html"; + Topic& topic = tt.Add(link); + topic.title = name; + String fn = AppendFileName( + AppendFileName( + AppendFileName(uppbox, "uppweb"), + String(www) + ".tpp" + ), + topic.title + "$" + ToLower(LNGAsText(language)) + ".tpp" + ); + String h = ReadTopic(LoadFile(fn)).text; + Package p; + p.Load(AppendFileName(AppendFileName(dir, name), name + ".upp")); + topic.text << "[R6* " << name << "]&&" << DeQtf(p.description) << "&"; + if(h.GetCount()) + topic.text << h; + topic.text << "[A2 &x, String& qtf, const char *folder, int lang) +{ + if(x.Find(folder) >= 0) + return; + x.Add(folder); + String srcdoc = FolderLinks(folder, "srcdoc", lang); + String src = FolderLinks(folder, "src", lang); + Package p; + p.Load(AppendFileName(uppsrc, AppendFileName(folder, GetFileName(folder) + ".upp"))); + if(srcdoc.GetLength() || src.GetLength()) { + qtf << "&&&[*4@b " << folder << "]&"; + if(!IsNull(p.description)) + qtf << "[2 " << p.description << "]&"; + if(srcdoc.GetCount()) { + qtf << "&[3/* " + Format(t_("Using %s"), folder) << "]&"; + qtf << srcdoc; + } + if(src.GetCount()) { + qtf << "&[3/* " << Format(t_("%s reference"), folder) << "]&"; + qtf << src; + } + } +} + +int CharFilterLbl(int c) +{ + return IsAlNum(c) ? c : '.'; +} + + +void QtfAsPdf(PdfDraw &pdf, const char *qtf) +{ + RichText txt = ParseQTF(qtf); + Size page = Size(3968, 6074); + UPP::Print(pdf, txt, page); +} + +VectorMap links; +VectorMap labels; +Htmls header, lastUpdate; + +Array bar; +Array languages; + +int GetLinkLanguage(const String &link) { + int pos = link.ReverseFind('$'); + if (pos < 0) + return 0; + int lang = LNGFromText(ToUpper(link.Mid(pos+1))); + for (int i = 0; i < languages.GetCount(); ++i) { + if (languages[i] == lang) + return i; + } + return 0; +} + +void ExportPage(int i) +{ + Index css; + String path = links.GetKey(i); + RLOG("Exporting " << path); + + int ilang = GetLinkLanguage(path); + SetLanguage(languages[ilang]); + String text = GetText(path); + int h; + h = ParseQTF(tt[i].text).GetHeight(1000); + + int isvn = svndata.Find(tt.GetKey(i)); + String qtflangs; + String googleFile; + if (isvn > -1) { + String txt = String("[2 ") + t_("Last edit by %s on %s") + ".]"; + qtflangs += Format(txt, svndata[isvn].author, Format(Date(svndata[isvn].time))); + googleFile = svndata[isvn].fullPath; + if (googleFile.GetCount() > rootdir.GetCount()) + googleFile = UnixPath(googleFile.Mid(rootdir.GetCount())); + else + googleFile = ""; + } + String strlang; + String jslang; + Array arrLangs; + for (int il = 0; il < languages.GetCount(); ++il) { + String topic = ChangeTopicLanguage(path, languages[il]); + int itopic; + if ((itopic = tt.Find(topic)) >= 0) { + if (tt[itopic].title.Find(" (translated)") < 0) { + if (il != ilang) { + if (!strlang.IsEmpty()) + strlang << ", "; + arrLangs.Add("[^" + links[itopic] + "^ [2 " + ToLower(GetNativeLangName(languages[il])) + "]]"); + } + jslang+="'"+ links[itopic] +"':'" + GetNativeLangName(languages[il]) + "',"; + } + } + } + if(!jslang.IsEmpty()) + jslang.Trim(jslang.GetCount()-1); + if (arrLangs.GetCount() > 0) { + for (int i = 0; i < arrLangs.GetCount(); ++i) { + if (i == arrLangs.GetCount()-1 && i != 0) + strlang << String(" ") + t_("and") + " "; + else if (i > 0) + strlang << ", "; + strlang << arrLangs[i]; + } + } + if (!strlang.IsEmpty()) + qtflangs += Format(String("[2 ") + t_("This page is also in %s") + ".]", strlang); + if (tt[i].title.Find("How to contribute. Web page") < 0) { + String help = "topic://uppweb/www/contribweb$" + ToLower(LNGAsText(languages[ilang])); + qtflangs += " " + String("[^") + help + "^ [ htmlrep; + int posB = 0; + while (true) { + posB = page.Find("[IHTMLTEXT", posB); + if (posB < 0) + break; + int posBB = posB + (int)strlen("[IHTMLTEXT"); + int pos0 = page.ReverseFind("[", posB-1); + int posE = page.Find(";2", posBB); + String html0 = page.Mid(posBB, posE - posBB); + html0.Replace("`", ""); + htmlrep.Add(html0); + int posEE = page.Find("]&]", posE) + (int)strlen("]&]"); + + page = page.Left(pos0) + "QTFHTMLTEXT" + FormatInt(htmlrep.GetCount()-1) + page.Mid(posEE+1); + } + + page = QtfAsHtml(page, css, links, labels, targetdir, links[i]); + for (int iHtml = 0; iHtml < htmlrep.GetCount(); ++iHtml) + page.Replace(String("QTFHTMLTEXT") + FormatInt(iHtml), htmlrep[iHtml]); + + Color paper = SWhite; + if(path == "topic://uppweb/www/download$en-us") + page << LoadFile(GetRcFile("adsense3.txt")); +/* if(path == "topic://uppweb/www/index$en-us") { + for(int q = 0; q < news.GetCount(); q++) { + String n = GetText("uppweb/www_news/" + news[q]); + String h = news[q]; + int i = h.Find('$'); + if(i >= 0) + h = h.Mid(0, i); + if(h.GetLength() == 8) + h = h.Mid(0, 4) + '-' + h.Mid(4, 2) + '-' + h.Mid(6, 2); + page << "
"; + page << "
  " + << h << "

"; + page << QtfAsHtml(n, css, links, targetdir, FormatIntAlpha(q) + "_n"); + page << "
"; + } + }*/ + Color bg = Color(210, 217, 210); + Htmls footer; + footer << HtmlTable().Border(0).Width(-100) / HtmlLine() + + RoundFrame(HtmlPadding(8) / langs , "6E89AE;padding: 10px;", White); + Htmls html; + html << + HtmlPackedTable().Width(-100) / + HtmlLine().ColSpan(3) / header + + HtmlPackedTable().Width(-100) / ( + HtmlLine().ColSpan(3).BgColor(bg).Height(6) / "" + + HtmlRow() / ( + HtmlTCell().Center() / BoxWidth(160).Center() / ( + bar[GetLinkLanguage(path)] + + "
" + + LoadFile(GetRcFile("facebook.txt")) + + "

" + +// "

" + + LoadFile(GetRcFile("adsense2.txt")) + + "

" + + LoadFile(GetRcFile("adlinks.txt")) + + (h > 25000 ? "

" + LoadFile(GetRcFile("adsense2.txt")) + : "") + + "


" + +// LoadFile(GetRcFile("referral.txt")) + +// LoadFile(GetRcFile("referral2.txt")) + +// LoadFile(GetRcFile("donations.txt")) + +// "

" + +// amazon[i % amazon.GetCount()] + + "


" + + HtmlLink("http://sourceforge.net/projects/upp/") / + HtmlImg("http://sourceforge.net/sflogo.php?group_id=93970&type=2", + "SourceForge.net Logo").Border(0).Width(125).Height(37) + + "

" + + HtmlLink("http://www.sdjournal.org/en/") / + HtmlImg(GetImageSrc(WWW::Sdj)).Border(0) + + "

" + + (links[i] == "index.html" ? lastUpdate : Htmls()) + + HtmlImg("http://www.vol.cz/cgi-bin/wc/upp").Width(1).Height(1) + ) + + HtmlTCell().BgColor(bg) / BoxWidth(6) / "" + + HtmlTCell().Width(-100).BgColor(bg) / ( + RoundFrame(HtmlPadding(8) / page , "6E89AE;padding: 10px;", White) + + footer + ) + ) + ) + Htmls(""); + + String topicTitle = tt.GetKey(i); + String pageTitle = tt[i].title; + if(IsNull(pageTitle)) + pageTitle = "Ultimate++"; + if(StartsWith(topicTitle, "examples$")) + pageTitle = "Demos / " + pageTitle; + else if(StartsWith(topicTitle, "reference$")) + pageTitle = "Examples / " + pageTitle; + + if(pageTitle != "Ultimate++") + pageTitle << " :: Ultimate++"; + + Htmls content = + "\n" + + HtmlHeader(pageTitle, AsCss(css) + + "a.l1 { text-decoration:none; font-size: 8pt; font-family: sans-serif; " + "font-weight: normal; }\n" + "a.l1:link { color:#000000; }\n" + "a.l1:visited { color:#000080; }\n" + "a.l1:hover { color:#9933CC; }\n" + "a.l1:active { color:#000000; }\n" + "a.l2 { text-decoration:none; font-size: 12pt; font-family: sans-serif; " + "font-variant: small-caps; }\n" + "a.l2:link { color:#0066FF; }\n" + "a.l2:visited { color:#FF6600; }\n" + "a.l2:hover { color:#BC0624; }\n" + "a.l2:active { color:#BC0024; }\n", + "" + "\n" + "" +// "" + ) + + + .BgColor(bg) + .Alink(Red).Link(Black).Vlink(Blue) + / html; + SaveFile(AppendFileName(targetdir, links[i]), content); + RLOG("Exported page " << links[i]); +} + + +struct ProgramData { + String rootdir; + String targetdir; + String diffdir; + String pdfdir; + bool ftpUpload; + bool outPdf; + bool doSvn; + void Xmlize(XmlIO xml) { + xml + ("rootdir", rootdir) + ("targetdir", targetdir) + ("diffdir", diffdir) + ("pdfdir", pdfdir) + ("ftpUpload", ftpUpload) + ("outPdf", outPdf) + ("doSvn", doSvn) + ; + } +}; + +CONSOLE_APP_MAIN +{ + StdLogSetup(LOG_COUT|LOG_FILE); +#ifdef PLATFORM_POSIX + rootdir = GetHomeDirFile("upp.src"); + targetdir = GetHomeDirFile("uppwww"); + diffdir = GetHomeDirFile("wwwupp"); + pdfdir = GetHomeDirFile("pdf"); +#endif + outPdf = true; + doSvn = true; + + RLOG("--- uppweb started at " << GetSysTime()); + + ProgramData data; + + String configFile = GetHomeDirFile("uppweb.xml"); + bool cfgloaded = false; + if (FileExists(configFile)) { + if (LoadFromXMLFile(data, configFile)) { + rootdir = data.rootdir; + targetdir = data.targetdir; + diffdir = data.diffdir; + pdfdir = data.pdfdir; +// ftpupload = data.ftpUpload; + outPdf = data.outPdf; + doSvn = data.doSvn; + cfgloaded = true; + } + } + if (!cfgloaded) { + data.rootdir = rootdir; + data.targetdir = targetdir; + data.diffdir = diffdir; + data.pdfdir = pdfdir; +// data.ftpUpload = ftpupload; + data.outPdf = outPdf; + data.doSvn = doSvn; + StoreAsXMLFile(data, NULL, configFile); + } + Cout() << "RootDir: " << rootdir << "\n"; + Cout() << "TargetDir: " << targetdir << "\n"; + + if (!DirectoryExists(rootdir)) { + Cout() << ("Directory " + DeQtf(rootdir) + " does not exist\n"); + return; + } + + uppbox = AppendFileName(rootdir, "uppbox"); + uppsrc = AppendFileName(rootdir, "uppsrc"); + reference = AppendFileName(rootdir, "reference"); + examples = AppendFileName(rootdir, "examples"); + bazaar = AppendFileName(rootdir, "bazaar"); + + Cout() << "Loading www.tpp\n"; + InitWwwTpp(); + + languages.Add(LNG_('E','N','U','S')); // en-us has to be the first one + languages.Add(LNG_('C','A','E','S')); + languages.Add(LNG_('C','S','C','Z')); + languages.Add(LNG_('D','E','D','E')); + languages.Add(LNG_('E','S','E','S')); + languages.Add(LNG_('E','U','E','S')); + languages.Add(LNG_('F','R','F','R')); + languages.Add(LNG_('R','O','R','O')); + languages.Add(LNG_('R','U','R','U')); + languages.Add(LNG_('Z','H','C','N')); + languages.Add(LNG_('Z','H','T','W')); + + RealizeDirectory(targetdir); + + if (outPdf) { + RealizeDirectory(pdfdir); + } + Cout() << "Gather ref links " << uppsrc << "\n"; + GatherRefLinks(uppsrc); + Cout() << "Gather ref links " << AppendFileName(rootdir, "bazaar") << "\n"; + GatherRefLinks(AppendFileName(rootdir, "bazaar")); + + SaveFile(AppendFileName(targetdir, "sdj.gif"), LoadFile(GetRcFile("sdj.gif"))); + + String release = "4193"; + escape.Add("RELEASE", release); + escape.Add("RELEASET", release); + escape.Add("UPDATETIME", Format("%`", GetUtcTime())); + + if (doSvn) { + Cout() << "Processing svn\n"; + GetSvnList(svndata, rootdir); + GetSvnLog(svnlog); + CreateRssFeed(); + if (svnlog.GetCount() > 0) { + escape.Add("LATESTSVN", svnlog[0].revision); + //Index css; + //escape.Add("SVNTABLE", QtfAsHtml(SvnChanges(svnlog, "", 100), css, links, labels, targetdir)); + //escape.Add("ANCHOR", ""); + } + } + + escape.Add("PAYPAL", LoadFile(GetRcFile("donations.txt"))); + + header = HtmlPackedTable() + .Width(-100) + .BgColor(White) + .Attr("style", "border: 1px solid #6E89AE;" + "padding-left: 10px;padding-right: 0px;padding-top: 0px;padding-bottom: 0px;") + / + HtmlRow() / ( + HtmlCell() / HtmlLink("index.html") / Wimg(WWW::Logo6) + + HtmlCell().Right().Bottom() + .Style("padding-bottom: 5px; " + "background-image: url('" + GetImageSrc(WWW::HB) + "')") + / HtmlArial(14) / (LoadFile(GetRcFile("adsense.txt")) + "  "/* + "
..harnessing the real power of C++  "*/) + ); + + bar.SetCount(languages.GetCount()); + + int lang = GetCurrentLanguage(); + for (int i = 0; i < languages.GetCount(); ++i) { + Cout() << "Language " << LNGAsText(languages[i]); + Htmls bi, bex, bdoc, bcom, bcon, bsearch, blang; + + SetLanguage(languages[i]); + + Www("index", languages[i]); + Www("contribweb", languages[i]); + // bi << BarLink("index.html", "Home", false); + bi << BarLink(Www("overview", languages[i]), t_("Overview"), false); + bi << BarLink(Www("examples", languages[i]), t_("Examples")); + { + int di = tt.Find("topic://uppweb/www/examples$" + ToLower(LNGAsText(languages[i]))); + tt[di].text << MakeExamples(examples, "examples", languages[i]); + tt[di].text << GetTopic("topic://uppweb/www/reference$" + ToLower(LNGAsText(languages[i]))).text; + tt[di].text << MakeExamples(reference, "reference", languages[i]); + } + + bi << BarLink(Www("ss", languages[i]), t_("Screenshots")); + bi << BarLink(Www("comparison", languages[i]), t_("Comparisons")); + bi << BarLink(Www("apps", languages[i]), t_("Applications")); + bi << BarLink(Www("download", languages[i]), t_("Download")); + + bi << BarLink(Www("documentation", languages[i]), t_("Manual")); + { + int di = tt.Find("topic://uppweb/www/documentation$" + ToLower(LNGAsText(languages[i]))); + if (di >= 0) { + Index x; + x.Clear(); + String qtf; + SrcDocs(x, qtf, "Core", languages[i]); + SrcDocs(x, qtf, "Draw", languages[i]); + SrcDocs(x, qtf, "CtrlCore", languages[i]); + SrcDocs(x, qtf, "CtrlLib", languages[i]); + SrcDocs(x, qtf, "RichText", languages[i]); + SrcDocs(x, qtf, "RichEdit", languages[i]); + FindFile ff(AppendFileName(uppsrc, "*.*")); + Array folders; + folders.Clear(); + while(ff) { + if(ff.IsFolder()) + folders.Add(ff.GetName()); + ff.Next(); + } + Sort(folders); + for (int ifold = 0; ifold < folders.GetCount(); ++ifold) + SrcDocs(x, qtf, folders[ifold], languages[i]); + tt[di].text << qtf; + } + } + bi << BarLink(Www("bazaar", languages[i]), t_("Bazaar")); + bi << BarLink(Www("Roadmap", languages[i]), t_("Status & Roadmap")); + bi << BarLink(Www("FAQ", languages[i]), t_("FAQ")); + bi << BarLink(Www("About", languages[i], "topic://ide/app/"), t_("Authors & License")); + + bi << BarLink("http://www.ultimatepp.org/forum", t_("Forums")); + // bcom << BarLink(Www("mailing"), "Mailing lists"); + // bi << BarLink("http://www.ultimatepp.org/wiki/index.php", "Wiki"); + bi << BarLink(Www("Funding", languages[i]), t_("Funding Ultimate++")); + // bcom << BarLink(Www("helpus"), "Getting involved"); + // bcom << BarLink("mailto: upp@ntllib.org", "Contact developers"); + + bsearch << BarCaption(t_("Search on this site")); + bsearch << SearchBar("www.ultimatepp.org"); + + blang << BarCaption(t_("Language")); + blang << Htmls("

") + + BarItem(HtmlPackedTable().Width(-100) + / HtmlRow() / ( + HtmlCell() / Wimg(WWW::Language) + + HtmlCell() / Htmls("
" + ToLower(GetNativeLangName(languages[i])) + "
") + ),"border: 0px solid black;" + "padding-left:6px; padding-right:0px;" + "padding-top:4px; padding-bottom:4px;" + ) + Htmls("
"); + + + HtmlTag bf = HtmlPackedTable() + .Width(-100) + .BgColor(White) + .Attr("style", "border-style: solid; border-width: 1px; border-color: #6E89AE;" + "padding: 0px"); + String div = HtmlTable().Border(0).Width(-100) / HtmlLine(); + bar[i] = bf / bi + div + + // bf / bex + div + + // bf / bdoc + div + + // bf / bcom + div + + // bf / bcon + div + + bf / bsearch + div + + bf / blang + div; + } + SetLanguage(lang); + + for(int i = 0; i < tt.GetCount(); i++) { + String topic = tt.GetKey(i); + links.Add(topic, topic == "topic://uppweb/www/index$en-us" ? "index.html" : + memcmp(topic, "topic://", 8) ? topic : TopicFileNameHtml(topic)); + } + + String svntableStr = DeQtf("[svntable]"); + for(int i = 0; i < tt.GetCount(); i++) { + if (tt[i].title == "Svn releases") + tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 300, "")); + else if (tt[i].title == "Svn Web releases") + tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 100, "uppweb")); + else if (tt[i].title == "Svn Bazaar releases") + tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 100, "bazaar")); + else if (tt[i].title == "Svn Upp releases") + tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 100, "uppsrc")); + else if (tt[i].title == "Svn major releases") + tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 300, "", true)); + else if (tt[i].title == "Svn Web major releases") + tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 100, "uppweb", true)); + else if (tt[i].title == "Svn Bazaar major releases") + tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 100, "bazaar", true)); + else if (tt[i].title == "Svn Upp major releases") + tt[i].text.Replace(svntableStr, SvnChanges(svnlog, 100, "uppsrc", true)); + else if (links[i].Find("index") >= 0) { + String win32 = "upp-win32-RELEASE.exe"; + String win32release = win32; + win32release.Replace(String("RELEASE"), release); + String x11 = "upp-x11-src-RELEASE.tar.gz"; + String x11release = x11; + x11release.Replace(String("RELEASE"), release); + tt[i].text.Replace(DeQtf(x11), DeQtf(x11release)); + tt[i].text.Replace(DeQtf(win32), DeQtf(win32release)); + } + } + + for(int i = 0; i < reflink.GetCount(); i++) { + String l = reflink.GetKey(i); + String lbl = Filter(l, CharFilterLbl); + String f = links.Get(reflink[i], Null) + '#' + lbl; + links.Add(l, f); + static const char *x[] = { "::struct", "::class", "::union" }; + for(int ii = 0; ii < 3; ii++) { + String e = x[ii]; + if(EndsWith(l, e)) { + links.Add(l.Mid(0, l.GetLength() - e.GetLength()), f); + } + } + labels.Add(l, lbl); + } + + Date d = GetSysDate(); + lastUpdate = HtmlItalic() / HtmlArial(8) / HtmlFontColor(Gray()) / + (String().Cat() << "Last update " << GetSysDate()); + +// Vector amazon = Split(LoadFile(GetRcFile("amazon.txt")), '\n');//440 + + Vector bazaarItems = SvnBazaarList(bazaar, svnlog); + + // To fill Bazaar page with real release dates and size + for(int i = 0; i < tt.GetCount(); i++) { + if (tt[i].title == "Bazaar") { + String page = tt[i]; + for (int j = 0; j < bazaarItems.GetCount(); ++j) { + int pos = page.Find("2 " + DeQtf(bazaarItems[j].name) + "]]"); + if (pos < 0) + pos = page.Find("2 " + DeQtf(bazaarItems[j].name) + "\r\n]]"); + if (pos >= 0) { + pos = page.Find("::", pos); + pos = page.Find("::", pos); + pos = page.Find(":: [s0;=2", pos); + if (pos >= 0) + pos += (int)strlen(":: [s0;=2"); + String strDate; + if (pos >= 0) { + Time t = bazaarItems[j].lastChange; + if (IsNull(t)) + strDate = "Not in Svn log"; + else + strDate = Format("%Mon", t.month) + " " + FormatInt(t.year); + page.Insert(pos, " " + strDate); + } + pos = page.Find(":: [s0;=2", pos); + if (pos >= 0) + pos += (int)strlen(":: [s0;=2"); + String strSz; + if (pos >= 0) { + if (bazaarItems[j].size == 0) + strSz = "Not in Svn log"; + else + strSz = BytesToString(bazaarItems[j].size); + + page.Insert(pos, " " + strSz); + } + } + } + tt[i].text = page; + } + } + + LLOG("G: " << MemoryUsedKb()); + +/* + if (outPdf) { + PdfDraw pdf; + for(int i = 0; i < tt.GetCount(); i++) + QtfAsPdf(pdf, tt[i]); + SaveFile(AppendFileName(pdfdir, "Upp.pdf"), pdf.Finish()); + } +*/ + + LLOG("H: " << MemoryUsedKb()); + + for(int i = 0; i < tt.GetCount(); i++) + ExportPage(i); + SetLanguage(lang); + + LLOG("I: " << MemoryUsedKb()); + +// SaveFile(AppendFileName(targetdir, "favicon.ico"), LoadFile(AppendFileName(uppsrc, "ide/ide.ico"))); + SaveFile(AppendFileName(targetdir, "stats.html"), + HtmlImg("http://www.vol.cz/cgi-bin/wc/upp") + "
" + + HtmlLink("http://www.mygooglepagerank.com", "_blank") / + "" + + "" + + HtmlLink("http://www.mygooglepagerank.com", "_blank") / + "" + + "" + ); + Cout() << "Finished OK\n"; + +#if 0 // we are now doing this on server, directly copying to www directory + + if (!ftpupload) + return; + + RLOG("uppweb Finished, now about to upload the content"); + + Vector upload; + { + FindFile ff(AppendFileName(targetdir, "*.*")); + while(ff) { + if(ff.IsFile()) { + String s = LoadFile(AppendFileName(targetdir, ff.GetName())); + String f = AppendFileName(diffdir, ff.GetName()); + if(LoadFile(f) != s) { + upload.Add(ff.GetName()); + RLOG("upload: " << ff.GetName()); + } + } + ff.Next(); + } + } + RealizeDirectory(diffdir); + + if(upload.GetCount()) { + FtpClient ftp; + RLOG("Connecting ftp..."); + if(!ftp.Connect(getenv("UPPFTP"), getenv("UPPFTPUSR"), getenv("UPPFTPPWD"), true)) { + RLOG("Unable to connect!" + ftp.GetError()); + SetExitCode(1); + return; + } + if(!ftp.Cd("www")) { + RLOG("Unable to 'cd www'"); + SetExitCode(1); + return; + } + for(int i = 0; i < upload.GetCount(); i++) { + RLOG("Uploading " << upload[i]); + String s = LoadFile(AppendFileName(targetdir, upload[i])); + if(!ftp.Save(upload[i], s)) { + RLOG("FTP error (file upload): " + ftp.GetError()); + SetExitCode(1); + return; + } + SaveFile(AppendFileName(diffdir, upload[i]), s); + } + } + BeepInformation(); +#endif +} diff --git a/uppbox/uppweb/www.tpp/documentation$ru-ru.tpp b/uppbox/uppweb/www.tpp/documentation$ru-ru.tpp index ebcc52ba6..f8010fb7f 100644 --- a/uppbox/uppweb/www.tpp/documentation$ru-ru.tpp +++ b/uppbox/uppweb/www.tpp/documentation$ru-ru.tpp @@ -4,45 +4,45 @@ topic "Documentation"; [b83;*2 $$2,0#07864147445237544204411237157677:title] [{_}%RU-RU [s1; Документация&] -[s0; Документация Ultimate`+`+ до сих пор не +[s0; [2 Документация Ultimate`+`+ до сих пор не полная, но она постоянно находится -в работе.&] -[s0; &] -[s0; Сообщество Ultimate`+`+ всегда готово +в работе.]&] +[s0;2 &] +[s0; [2 Сообщество Ultimate`+`+ всегда готово обеспечить превосходую поддержку -в [^http`:`/`/www`.ultimatepp`.org`/forum`/^ форуме].&] -[s0; &] -[s0;* &] -[s0; [*^topic`:`/`/ide`/app`/install`$en`-us^ Установка на +в ][^http`:`/`/www`.ultimatepp`.org`/forum`/^2 форуме][2 .]&] +[s0;2 &] +[s0;*2 &] +[s0; [*^topic`:`/`/ide`/app`/install`$ru`-ru^ Установка на платформе Win32]&] [s0; [*^topic`:`/`/ide`/SrcUpdater`/app`/LinuxInstallGuide`$en`-us^ Установка на платформе POSIX (Linux, BSD, ...)]&] [s0;*^topic`:`/`/uppweb`/www`/linuxinstall`$en`-us^ &] [s2; [4 Документация по среде TheIDE]&] [s0;*R^topic`:`/`/ide`/app`/HelpPage`$en`-us^4 &] -[s0; [^topic`:`/`/ide`/app`/GettingStarted`$en`-us^ Начало работы +[s0; [^topic`:`/`/ide`/app`/GettingStarted`$ru`-ru^2 Начало работы с TheIDE]&] -[s0; [^topic`:`/`/ide`/app`/PackagesAssembliesAndNests`$en`-us^ Пакеты, -группы и наборы]&] -[s0; [^topic`:`/`/ide`/app`/ConfiguringPackagesAssemblies`$en`-us^ Настройка +[s0; [^topic`:`/`/ide`/app`/PackagesAssembliesAndNests`$en`-us^2 Пакеты, +сборки (Assemblies) и гнезда (Nests)]&] +[s0; [^topic`:`/`/ide`/app`/ConfiguringPackagesAssemblies`$ru`-ru^2 Настройка пакетов и групп]&] -[s0; [^topic`:`/`/ide`/app`/Files`$en`-us^ Типы файлов]&] -[s0; [^topic`:`/`/ide`/app`/Keys`$en`-us^ Использование +[s0; [^topic`:`/`/ide`/app`/Files`$ru`-ru^2 Типы файлов]&] +[s0; [^topic`:`/`/ide`/app`/Keys`$en`-us^2 Использование клавиатуры]&] -[s0; [^topic`:`/`/ide`/app`/Flags`$en`-us^ Флаги компоновки]&] -[s0; [^topic`:`/`/ide`/app`/Topic`$en`-us^ Topic`+`+]&] -[s0; [^topic`:`/`/ide`/app`/Assist`$en`-us^ Assist`+`+]&] -[s0; [^topic`:`/`/ide`/app`/macros`$en`-us^ Макросы]&] -[s0; [^topic`:`/`/ide`/app`/PackageTemplates`$en`-us^ Шаблоны +[s0; [^topic`:`/`/ide`/app`/Flags`$en`-us^2 Флаги компоновки]&] +[s0; [^topic`:`/`/ide`/app`/Topic`$en`-us^2 Topic`+`+]&] +[s0; [^topic`:`/`/ide`/app`/Assist`$en`-us^2 Assist`+`+]&] +[s0; [^topic`:`/`/ide`/app`/macros`$en`-us^2 Макросы]&] +[s0; [^topic`:`/`/ide`/app`/PackageTemplates`$en`-us^2 Шаблоны проектов в Ultimate`+`+]&] -[s0; [^topic`:`/`/ide`/app`/cmdline`$en`-us^ Использование +[s0; [^topic`:`/`/ide`/app`/cmdline`$en`-us^2 Использование командная строки TheIDE]&] -[s0; [^topic`:`/`/ide`/app`/IconDes`$en`-us^ Iml дизайнер]&] -[s0; &] -[s0; [^topic`:`/`/ide`/app`/umk`$en`-us^ Утилита командной +[s0; [^topic`:`/`/ide`/app`/IconDes`$en`-us^2 Iml дизайнер]&] +[s0;2 &] +[s0; [^topic`:`/`/ide`/app`/umk`$en`-us^2 Утилита командной строки для компоновки `- umk]&] -[s0; &] -[s0; [^topic`:`/`/ide`/app`/CrossComp`$en`-gb^ Использование +[s0;2 &] +[s0; [^topic`:`/`/ide`/app`/CrossComp`$en`-gb^2 Использование TheIDE в качестве инструмента кросс`-платформен ной разработки]&] [s0; &] @@ -53,30 +53,30 @@ TheIDE в качестве инструмента кросс`-платформе [s0; [*+117 Начало работы с Ultimate`+`+]&] [s0;* &] [s0;l256; [*^topic`:`/`/uppweb`/www`/overview`$en`-us^+92 Описание]&] -[s0;l256;~~~1024; [^topic`:`/`/Core`/srcdoc`/CoreTutorial`$en`-us^ Руководств +[s0;l256;~~~1024; [^topic`:`/`/Core`/srcdoc`/CoreTutorial`$en`-us^2 Руководств о по типам заначений пакета Core]&] -[s0;l256;~~~1024; [^topic`:`/`/Core`/srcdoc`/Tutorial`$en`-us^ Руководство +[s0;l256;~~~1024; [^topic`:`/`/Core`/srcdoc`/Tutorial`$en`-us^2 Руководство по контейнерам]&] -[s0;l256;~~~1024; [^topic`:`/`/CtrlLib`/srcdoc`/Tutorial`$en`-us^ Руководство - по работе с GUI]&] -[s0;l256;~~~1024; [^topic`:`/`/Draw`/srcdoc`/DrawTutorial`$en`-us^ Руководств +[s0;l256;~~~1024; [^topic`:`/`/CtrlLib`/srcdoc`/Tutorial`$en`-us^2 Руководств +о по работе с GUI]&] +[s0;l256;~~~1024; [^topic`:`/`/Draw`/srcdoc`/DrawTutorial`$en`-us^2 Руководств о по работе с Draw]&] -[s0;l256; [^topic`:`/`/Draw`/srcdoc`/ImgTutorial`$en`-us^ Руководство +[s0;l256; [^topic`:`/`/Draw`/srcdoc`/ImgTutorial`$en`-us^2 Руководство по работе с Image]&] -[s0;l256; [^topic`:`/`/Sql`/srcdoc`/tutorial`$en`-us^ Руководство +[s0;l256; [^topic`:`/`/Sql`/srcdoc`/tutorial`$en`-us^2 Руководство по работе с Sql]&] -[s0;l256;^topic`:`/`/Sql`/srcdoc`/tutorial`$en`-us^ &] -[s0;l256;~~~1024; [^topic`:`/`/Core`/srcdoc`/Packages`$en`-us^ Стандартные +[s0;l256;^topic`:`/`/Sql`/srcdoc`/tutorial`$en`-us^2 &] +[s0;l256;~~~1024; [^topic`:`/`/Core`/srcdoc`/Packages`$en`-us^2 Стандартные пакеты Ultimate`+`+]&] -[s0;l256; [^topic`:`/`/CtrlLib`/src`/index`$en`-us^ Список всех +[s0;l256; [^topic`:`/`/CtrlLib`/src`/index`$en`-us^2 Список всех виджетов]&] [s0;l256;^topic`:`/`/CtrlLib`/src`/index`$en`-us^ &] [s0; [*+117 Содействие Ultimate`+`+]&] [s0;*+117 &] -[s0;i256; [^topic`:`/`/uppweb`/www`/contribweb`$en`-us^ Как помочь]&] -[s0;i256; [^topic`:`/`/uppweb`/www`/svnInstall`$en`-us^ Доступ +[s0;i256; [^topic`:`/`/uppweb`/www`/contribweb`$en`-us^2 Как помочь]&] +[s0;i256; [^topic`:`/`/uppweb`/www`/svnInstall`$en`-us^2 Доступ к SVN]&] -[s0;i256; [^topic`:`/`/uppweb`/www`/codestyle`$en`-us^ Стиль написания -кода]&] +[s0;i256; [^topic`:`/`/uppweb`/www`/codestyle`$en`-us^2 Стиль +написания кода]&] [s0;i256; &] [s0; [*+117 Пакеты]] \ No newline at end of file diff --git a/uppbox/uppweb/www.tpp/documentation$ru-ru.tppi b/uppbox/uppweb/www.tpp/documentation$ru-ru.tppi new file mode 100644 index 000000000..6449559bb --- /dev/null +++ b/uppbox/uppweb/www.tpp/documentation$ru-ru.tppi @@ -0,0 +1,9 @@ +TITLE("Documentation") +COMPRESSED +120,156,165,87,91,79,227,70,20,254,43,35,149,86,92,147,216,185,177,240,212,66,75,163,174,182,136,144,182,82,100,106,39,49,89,107,157,56,235,11,217,85,85,180,64,183,168,2,149,151,62,84,85,111,116,251,208,199,112,73,215,27,72,248,11,227,127,212,115,102,156,196,14,9,9,133,60,96,143,125,190,239,155,115,155,227,60,153,154,138,205,199,222,139,141,249,91,90,85,183,21,71,183,165,188,178,24,95,158,221,72,129,157,0,118,113,33,46,196,132,148,152,72,39,196,88,60,38,38,4,49,41,44,46,38,132,116,114,49,254,40,149,90,42,42,53,91,51,170,82,190,128,118,34,152,137,72,151,94,76,37,4,48,74,36,197,120,58,153,0,227,68,66,16,224,90,72,166,83,233,244,146,173,217,186,42,229,191,249,250,219,247,55,114,11,27,57,146,183,132,101,66,127,162,29,218,242,14,232,53,109,210,182,183,79,27,222,247,212,245,78,62,144,242,86,108,153,228,197,145,111,144,156,110,107,21,197,86,229,57,121,142,208,75,218,33,222,30,60,120,77,232,13,237,120,175, +8,109,211,38,187,166,87,112,217,240,78,230,113,169,67,96,1,110,249,91,123,128,215,241,78,96,129,61,193,215,94,195,243,75,192,217,135,135,39,132,158,19,239,21,109,208,51,120,109,159,54,35,18,23,38,146,128,192,83,176,232,208,51,239,7,218,100,128,231,0,21,22,119,14,202,154,244,2,112,129,247,130,65,117,216,107,104,135,86,32,166,233,29,50,214,99,80,6,148,77,124,14,112,76,142,119,224,253,200,183,114,9,191,38,60,254,23,93,130,234,164,252,214,83,219,174,201,75,114,84,142,214,235,117,57,226,248,212,181,154,28,49,204,178,28,221,54,76,167,34,71,183,68,226,125,135,158,225,190,148,64,250,224,118,102,251,251,154,221,178,141,154,86,228,184,90,73,149,163,10,0,70,181,170,101,43,186,46,79,153,142,188,96,58,91,132,190,97,123,110,160,3,65,114,11,119,232,187,247,10,188,185,207,41,145,144,124,169,85,227,162,52,154,32,107,22,115,181,18,40,55,125,178,199,90,213,121,145,225,140,107,14,190,51,165,86,229,5,199,186,23,237,250,231,217,204, +87,100,154,129,205,147,143,178,171,243,36,18,137,204,248,66,66,50,156,90,173,174,22,184,31,163,58,26,244,246,219,37,70,43,17,228,39,70,39,38,6,10,114,145,5,17,162,69,54,159,170,153,213,143,187,124,27,195,29,251,169,170,215,214,149,114,127,139,137,94,40,134,27,172,169,182,173,85,203,89,91,49,109,181,212,11,8,228,227,111,160,228,16,92,115,133,50,122,201,235,29,129,166,176,150,81,208,235,74,241,25,72,177,62,180,44,181,82,208,53,184,170,150,158,168,150,109,245,212,1,205,31,128,220,130,100,4,228,121,44,189,51,230,241,22,117,201,116,223,112,134,192,61,164,60,212,34,125,203,242,127,154,1,205,140,145,176,98,84,183,181,178,99,194,14,111,171,25,220,44,100,2,48,119,232,59,158,7,55,93,97,152,26,156,159,37,253,13,189,25,195,250,137,166,135,209,255,162,46,84,227,17,22,78,3,224,175,16,113,12,198,103,234,203,144,155,126,102,213,13,77,200,59,6,15,96,178,98,210,186,216,155,90,152,171,176,224,178,140,61,0,145,71,227,4,234, +74,57,132,254,55,131,184,192,77,182,0,252,154,81,117,107,194,29,131,182,201,22,251,104,252,30,58,214,24,59,136,132,102,217,1,67,127,97,188,101,69,41,154,70,104,3,191,98,176,48,122,16,197,113,187,247,51,97,83,173,212,116,104,19,33,156,127,88,158,99,128,218,16,47,214,66,59,144,115,173,110,22,156,135,90,242,24,162,98,165,4,213,175,78,28,70,116,60,222,94,242,131,134,244,50,18,171,97,162,146,203,20,141,234,106,104,71,153,138,142,167,154,11,108,152,122,109,108,251,183,78,159,225,96,78,229,89,80,250,27,240,129,11,174,113,177,71,13,202,133,170,9,203,133,213,43,108,98,67,210,137,200,11,4,176,39,84,177,2,145,182,86,140,74,141,107,41,23,238,118,35,119,19,6,10,171,24,26,88,247,48,5,15,187,16,84,166,49,216,109,73,47,111,246,228,133,219,125,159,159,233,184,59,108,129,111,3,167,120,160,48,134,254,203,207,142,107,238,0,228,178,108,115,249,88,128,237,134,228,130,137,213,131,154,19,132,244,221,45,121,72,94,206,250,246,186, +152,76,13,30,149,161,51,202,216,81,205,29,77,173,247,194,61,247,8,156,252,59,136,116,193,209,190,107,165,0,216,238,238,174,0,51,221,64,208,86,12,19,162,102,153,197,146,81,228,119,155,142,109,152,154,162,7,243,232,79,112,71,139,15,46,48,146,116,39,29,126,218,97,134,97,223,189,38,44,95,219,60,130,140,255,93,176,35,55,8,162,223,87,209,61,213,176,245,54,11,140,95,56,168,108,2,82,219,212,31,107,133,255,205,27,156,20,49,178,107,185,204,120,210,85,83,169,247,25,241,238,129,172,8,33,133,242,103,52,93,166,82,126,32,91,166,2,29,121,52,93,246,185,222,103,179,31,70,5,88,65,162,251,208,220,51,223,186,35,71,80,232,169,63,110,194,12,3,125,104,31,143,25,254,125,209,155,130,134,85,242,16,151,4,179,12,7,234,146,250,34,196,227,23,47,180,31,255,195,1,63,105,112,72,184,132,169,223,159,106,70,249,225,46,236,193,158,116,202,62,39,160,68,124,175,99,19,30,214,139,216,219,252,90,187,189,155,80,59,130,67,204,54,181,2,46, +4,118,244,11,186,136,127,190,92,67,52,15,189,99,105,50,56,107,167,154,25,152,191,249,247,32,59,12,96,160,131,74,39,217,47,158,76,8,87,52,74,48,122,190,212,213,193,176,186,120,28,177,239,135,96,227,236,30,130,16,240,16,193,128,27,3,99,176,36,253,7,14,248,71,16, + diff --git a/uppbox/uppweb/www.tpp/download$ru-ru.tpp b/uppbox/uppweb/www.tpp/download$ru-ru.tpp new file mode 100644 index 000000000..7c8141ea6 --- /dev/null +++ b/uppbox/uppweb/www.tpp/download$ru-ru.tpp @@ -0,0 +1,141 @@ +topic "Ultimate++ download"; +[ $$0,0#00000000000000000000000000000000:Default] +[b117;*+117 $$1,0#27457433418004101424360058862402:Caption] +[{_}%RU-RU +[s0;= [*R6 Загрузка U`+`+]&] +[s1;#b0; Краткое описание&] +[s1;#b0; &] +[ {{2222:1111:3333:3334<50;>50;f0;g0;h1;l8/25r8/25t8/15b8/15@(229)R(128) [s0; [*+92 Операционная система]] +:: [s0;= [+92 Исходный код]] +:: [s0;= [+92 Ночные сборки]] +:: [s0;= [+92 Стабильные выпуски]] +::@2 [s0; [*2 Любая]] +:: [s0;= [^http`:`/`/code`.google`.com`/p`/upp`-mirror`/source`/checkout^2 SVN]&] +[s0;= [^https`:`/`/gitorious`.org`/upp^2 GIT][2 `*]] +:: [s0;= [^topic`:`/`/uppweb`/www`/nightly`$ru`-ru^2 tarball]] +:: [s0;= [^http`:`/`/sourceforge`.net`/projects`/upp`/files`/upp`/^2 tarball]] +:: [s0; [*2 MS Windows]] +:: [s0;=2 ] +:: [s0;= [^topic`:`/`/uppweb`/www`/nightly`$ru`-ru^2 win32 installer]] +:: [s0;= [^http`:`/`/sourceforge`.net`/projects`/upp`/files`/upp`/^2 win32 +installer]] +:: [s0; [*2 Ubuntu]] +:: [s0;=2 ] +:: [s0;= [^https`:`/`/launchpad`.net`/`~dolik`-rce`/`+archive`/upp`-nightly^2 PPA][2 , +][^https`:`/`/launchpad`.net`/`~dolik`-rce`/`+archive`/upp`-nightly`/`+packages^2 d +eb, dsc]] +:: [s0;= [^https`:`/`/launchpad`.net`/`~dolik`-rce`/`+archive`/upp^2 PPA][2 , +][^https`:`/`/launchpad`.net`/`~dolik`-rce`/`+archive`/upp`/`+packages^2 deb, +dsc]] +:: [s0; [*2 Fedora, Mandriva, OpenSUSE]] +:: [s0;=2 ] +:: [s0;=2 ] +:: [s0;= [^http`:`/`/sourceforge`.net`/projects`/upp`/files`/upp`/^2 rpms]] +:: [s0; [*2 Gentoo]] +::-2 [s0;= [^http`:`/`/www`.ultimatepp`.org`/forum`/index`.php`?t`=msg`&goto`=21343^2 ebuild +]] +::l0/25r0/25t0/15b0/15R0-1 [s0;%- ] +:: [s0;%- ] +::l8/25r8/25t8/15b8/15R(128) [s0; [*2 Arch Linux]] +::-2 [s0;= [^http`:`/`/aur`.archlinux`.org`/packages`.php`?K`=u`%2B`%2B^2 PKGBUILDs]] +::l0/25r0/25t0/15b0/15R0-1 [s0;%- ] +:: [s0;%- ]}}&] +[s0;~~~64; -|[2 `* неофициальное зеркало]&] +[s0; &] +[s1;#b0; Исходный код&] +[s0;2 &] +[s0; [2 Публичное SVN`-зеркало размещено на +площадке Google Code по ссылке: ][^http`:`/`/code`.google`.com`/p`/upp`-mirror`/source`/checkout^2 h +ttp://code.google.com/p/upp`-mirror/source/checkout][2 . Это +зеркало приблизительно на 1 час отстает +от SVN репозитория разработчиков. Если +у вас есть желание ускорить разработку +U`+`+ пользуйтесь этим зеркалом и сообщайте +об ошибках на нашем ][^http`:`/`/www`.ultimatepp`.org`/forum^2 фо +руме][2 !]&] +[s0;2 &] +[s0; [2 Для пользователей Gentoo идет разработка +ebuild, использующего SVN. Если вас это +заинтересовало следите за соответствующей +][^http`:`/`/www`.ultimatepp`.org`/forum`/index`.php`?t`=msg`&goto`=21343^2 ветк +ой форума][2 .]&] +[s0;2 &] +[s0; [2 Пользователи Arch Linux могут загрузить +пакеты с исходным кодом с ][^http`:`/`/aur`.archlinux`.org`/packages`.php`?K`=u`%2B`%2B^2 A +UR][2 и собрать их инструментом makepkg. +В качестве альтернативы можно использовать +утилиту ][/2 yaourt][2 (или любой другой, внешний +интерфейс к менеджеру пакетов ][/2 pacman][2 , +который совместим с ][/2 AUR][2 ), позволяющую +загрузить, собрать и установить пакеты +автоматически.]&] +[s0; &] +[s0; &] +[s1;#b0; Ночные сборки&] +[s0;2 &] +[s0; [2 Каждую ночь автоматически публикуется +новый выпуск. Здесь ][^topic`:`/`/uppweb`/www`/nightly`$en`-us^2 to +pic://uppweb/www/nightly`$ru`-ru][2 , вы можетere найти +инсталлятор для windows (upp`-win32`-NNNN.exe) +и архив с исходным кодом (upp`-x11`-src`-NNNN.tar.gz). +]&] +[s0;2 &] +[s0; [2 Для тех, кто использует Ubuntu или другой +дистрибутив GNU/Linux основанный на Debian, +на Launchpad PPA ][^https`:`/`/launchpad`.net`/`~dolik`-rce`/`+archive`/upp`-nightly^2 h +ttps://launchpad.net/`~dolik`-rce/`+archive/upp`-nightly ][2 имеются +deb`-пакеты ночных сборок (а так же dsc`-пакеты +с исходным кодом). Рекомендуется добавить +архив к источникам PPA (вы можете следовать +данному ][^https`:`/`/launchpad`.net`/`+help`/soyuz`/ppa`-sources`-list`.html^2 р +уководству `"шаг`-за`-шагом`"][2 , используя +][/2 dolik`-rce/upp`-nightly][2 в качестве имени PPA) +и установить пакет `"upp`" при помощи +вашего любимого менеджера пакетов +(например: Synaptic). При этом, также, будут +установленны исходники Ultimate`+`+, TheIDE +и все необходимые зависимости. Пожалуйста, +обратите внимание, что работа над +пакетами Ubuntu еще идет и они до сих +пор имеют несколько шерховатостей.]&] +[s1;#b0; &] +[s0; [2 Заметьте, что последние сборки, как +правило, считаются самими стабильными. +Это значит, что ночные сборки обычно +более стабильны чем стабильные выпуски, +так как исправления, сделанные после +выпуска стабильного релиза, в него +уже не вносятся.]&] +[s0;2 &] +[s0;2 &] +[s1;#b0; Стабильные релизы&] +[s0;2 &] +[s0;# [2 Стабильные релизы публикуются на +Sourceforge.net. Вы можете загрузить их по +ссылке: ][^http`:`/`/sourceforge`.net`/projects`/upp`/files`/^2 http://sourcefo +rge.net/projects/upp/files][2 . В дополнение к инсталлятору + для Windows и архиву с исходным кодом, +вы обнаружите там rpm`-пакеты для Fedora, +Mandriva и OpenSUSE.]&] +[s0;#2 &] +[s0;# [2 Для пользователей Ubuntu и Debian, которые +не хотят делать обновления ежедневно +с ночного PPA, существует PPA стабильных +релизов: ][^https`:`/`/launchpad`.net`/`~dolik`-rce`/`+archive`/upp^2 https:// +launchpad.net/`~dolik`-rce/`+archive/upp][2 . Для установки +Ultimate`+`+ из этого архива, используйте +процедуру, описанную для ночных сборок, +убрав суффикс `"`-nightly`" из имени.]&] +[s0;2 &] +[s0;2 &] +[s1;#b0; Цена&] +[s0;2 &] +[s0; [2 Вы не должны ничего платить за Ultimate +`+ `+, даже если вы собираетесь использовать +его для разработки коммерческих приложений. + Тем не менее, если вам нравится эта +платформа, пожалуйста, рассмотрите +возможность ][^topic`:`/`/uppweb`/www`/Funding`$ru`-ru^2 пожертво +вания][2 , даже небольшие взносы помогут +финансировать его дальнейшее развитие.]&] +[s0;2 ] \ No newline at end of file diff --git a/uppbox/uppweb/www.tpp/download$ru-ru.tppi b/uppbox/uppweb/www.tpp/download$ru-ru.tppi new file mode 100644 index 000000000..39a709a59 --- /dev/null +++ b/uppbox/uppweb/www.tpp/download$ru-ru.tppi @@ -0,0 +1,14 @@ +TITLE("Ultimate++ download") +COMPRESSED +120,156,173,89,109,83,27,215,21,254,43,183,126,201,128,209,235,34,108,34,234,54,78,156,48,158,56,110,6,66,251,129,81,186,66,90,11,21,33,105,164,85,176,227,218,195,75,136,233,144,152,25,79,59,233,164,211,186,237,135,126,235,140,144,17,44,32,201,127,97,245,143,250,156,115,238,174,86,66,2,106,91,30,203,146,246,158,123,222,159,243,220,235,69,117,237,90,44,20,187,26,187,224,149,188,107,61,76,215,10,118,106,113,41,30,191,53,115,99,2,239,16,141,67,212,184,149,152,186,149,152,156,76,196,167,99,177,68,60,22,79,24,137,201,155,177,216,212,244,244,77,35,17,51,146,159,164,203,118,190,84,76,45,62,249,253,211,235,115,11,225,185,5,181,88,141,205,220,86,139,55,230,110,42,247,39,183,238,190,238,174,119,183,220,35,247,196,173,171,5,115,194,156,72,125,144,90,172,198,103,174,46,197,102,148,251,115,119,221,173,119,55,241,180,227,54,21,222,222,184,78,119,3,98,109,215,113,155,129,149,248,168,158,60,49,240,74,198,241,74,78,226,69,111,137,95, +78,197,102,126,133,191,15,99,51,185,216,204,114,124,166,48,29,53,166,42,244,102,79,71,227,83,75,244,246,209,152,97,124,56,62,55,22,55,166,199,217,66,24,56,241,161,161,220,127,64,97,147,109,248,30,10,59,80,219,198,231,61,5,27,96,7,12,107,186,45,183,158,74,37,147,158,99,44,246,87,60,219,198,242,3,183,221,221,117,143,21,219,127,112,102,217,223,221,78,247,57,47,105,210,142,251,248,186,142,165,206,153,133,255,130,166,58,158,59,238,105,247,7,45,224,54,240,207,155,238,22,4,181,200,71,134,103,59,68,254,214,125,1,1,216,26,220,236,235,101,219,46,155,73,51,106,70,51,165,172,101,70,114,165,82,174,128,127,51,165,85,51,90,54,163,181,114,217,12,175,230,43,149,82,197,140,86,75,181,74,198,194,210,101,43,179,82,170,217,95,27,106,254,183,15,56,63,189,221,170,178,93,46,111,151,42,249,82,173,106,70,74,149,28,111,132,229,179,247,190,74,45,26,202,188,209,103,132,93,42,231,51,34,134,101,107,214,146,25,93,91,91,51,163,197,124, +110,217,46,60,54,175,85,106,102,184,82,131,188,157,174,44,165,11,133,17,46,136,125,15,161,15,30,20,45,27,30,84,74,127,176,50,118,85,28,137,62,204,23,44,239,243,144,221,56,80,95,204,171,223,229,139,217,210,90,181,167,197,80,111,103,238,90,190,56,105,168,124,177,106,67,141,85,121,79,102,143,218,149,205,95,88,170,21,237,218,40,211,3,9,42,164,107,197,204,114,57,157,213,58,205,103,217,82,33,191,2,203,41,197,230,68,186,146,89,206,127,99,233,18,208,190,65,251,151,95,222,161,20,134,84,234,221,183,163,7,229,116,102,37,157,179,170,216,58,107,45,133,84,182,154,57,19,167,183,208,241,158,44,189,192,64,14,249,103,86,182,84,73,135,212,23,233,98,182,146,255,6,159,126,83,182,138,243,11,243,159,14,77,195,217,140,188,93,25,84,202,171,213,126,67,102,173,162,93,42,209,111,97,99,136,2,42,210,8,128,59,191,154,182,45,108,34,141,9,133,53,244,58,74,222,122,100,70,202,203,101,243,215,182,121,123,181,154,51,63,200,149,236,146,121,219, +136,79,38,38,161,207,90,170,229,11,89,218,189,16,35,196,164,55,59,70,136,73,111,115,177,112,156,117,94,15,251,254,201,199,97,248,218,143,172,134,186,131,152,171,251,249,98,237,209,72,235,211,181,138,25,161,220,20,104,153,54,222,203,141,54,252,115,243,118,205,188,110,124,76,127,169,0,62,159,253,120,225,222,253,187,213,255,215,232,167,79,5,211,158,61,123,118,51,49,163,194,127,100,204,82,192,250,38,32,249,59,64,61,161,127,93,192,87,38,209,17,143,133,19,250,209,237,104,72,84,193,201,53,124,4,200,66,67,105,1,232,113,95,97,252,237,99,23,135,70,1,111,14,144,53,195,253,26,20,205,32,252,212,194,143,127,130,85,88,72,230,213,21,230,19,30,227,183,58,52,157,64,120,150,17,93,125,2,120,167,135,144,220,192,159,93,172,194,211,164,215,27,239,50,3,72,62,25,101,97,45,75,162,209,114,80,80,203,249,98,212,152,17,229,254,23,115,172,51,16,60,88,137,47,142,196,0,143,28,158,170,58,212,226,100,92,33,54,245,238,6,8,64,119,147,199, +110,29,59,108,242,87,138,22,69,167,73,206,106,113,26,163,14,77,105,14,26,191,239,179,232,115,104,160,60,52,96,203,95,48,56,161,81,117,183,48,74,101,247,38,237,221,253,65,185,135,100,129,199,50,148,158,177,178,43,61,31,220,215,61,193,38,76,94,56,228,108,252,17,210,122,76,174,96,79,72,252,136,143,142,219,26,240,157,126,112,104,244,119,240,103,159,179,200,50,196,116,246,201,189,29,14,12,86,119,183,117,190,137,127,236,16,237,232,79,229,57,205,142,148,161,134,59,204,179,80,63,148,138,95,164,134,20,226,159,97,247,94,192,1,138,19,147,47,138,69,19,37,44,120,3,139,81,106,20,254,179,97,128,129,2,27,33,197,60,45,16,140,238,11,46,220,215,200,41,50,22,136,191,14,62,71,136,107,163,14,5,109,142,220,58,69,79,204,144,38,216,96,75,14,164,70,120,173,14,30,190,55,200,38,46,142,134,175,237,248,210,65,186,12,34,138,10,46,160,227,96,72,235,92,221,195,66,250,106,104,44,157,0,254,41,200,119,64,130,183,168,156,143,2,124,88, +42,13,17,172,83,227,226,203,174,162,18,117,250,96,165,165,97,133,43,9,143,83,239,136,160,119,22,230,200,23,191,40,247,133,126,147,33,14,85,32,37,134,90,68,151,18,167,137,84,175,166,87,172,242,74,14,89,125,169,184,90,159,75,47,81,196,148,0,167,78,104,155,163,224,16,121,21,215,15,165,205,251,170,197,139,22,53,206,22,47,63,229,120,108,193,193,168,161,30,167,1,46,12,41,106,76,158,41,200,17,221,165,196,184,7,108,222,107,250,18,162,156,1,197,209,49,212,202,199,170,87,90,200,31,234,131,66,122,162,196,23,174,172,67,126,182,21,8,60,25,35,122,17,187,213,116,81,56,6,227,1,35,13,163,187,46,211,150,118,219,241,210,17,245,99,58,30,82,26,161,26,236,230,30,149,40,21,234,144,180,135,206,70,159,65,136,129,175,205,154,134,148,7,62,54,36,31,18,99,73,2,29,14,34,193,1,53,48,167,70,157,65,134,84,243,207,208,112,136,240,178,209,109,146,35,19,70,106,37,96,215,163,141,0,82,183,231,158,18,15,100,40,6,206,48,17, +58,15,30,104,188,76,93,130,118,91,69,51,92,35,154,198,43,49,145,100,25,173,26,228,230,58,103,129,162,131,49,86,197,98,56,101,200,117,252,226,102,172,161,252,112,118,81,78,12,139,107,114,70,80,99,60,228,152,146,155,225,7,120,69,172,71,214,56,37,8,238,175,163,53,81,218,23,53,170,236,241,40,30,55,195,213,74,70,111,131,195,73,36,247,237,120,68,141,134,102,46,220,109,170,61,129,202,1,132,101,76,150,243,128,242,218,34,208,11,138,113,147,187,151,134,138,110,172,134,154,125,176,16,213,80,212,193,134,109,141,183,109,143,183,208,212,185,107,45,229,211,197,144,124,185,239,17,106,98,220,239,227,88,160,57,69,21,41,244,229,73,188,79,186,39,220,39,171,40,181,212,111,240,254,133,46,48,208,118,240,167,190,214,104,123,85,14,20,243,171,188,131,214,31,163,17,66,57,63,225,169,79,108,127,64,246,252,100,34,97,238,63,129,28,39,220,1,132,34,7,193,82,167,53,251,212,34,94,195,246,138,132,52,202,29,2,155,198,204,164,142,189,41,168,99,3, +165,42,189,41,179,175,135,141,248,194,121,34,213,140,141,231,102,98,98,217,42,148,137,208,61,174,125,139,57,80,78,163,250,152,164,85,205,112,33,95,181,205,200,178,189,90,32,178,64,37,195,44,137,156,244,38,170,50,175,0,69,1,84,76,77,235,102,88,190,145,110,243,138,238,175,193,145,191,39,8,24,72,98,48,117,50,105,26,67,6,134,163,67,233,80,48,198,47,129,126,48,142,118,190,162,185,164,32,109,139,121,177,38,24,59,154,123,232,65,225,200,216,165,31,6,176,95,56,117,16,251,199,24,36,132,164,82,153,173,39,213,252,227,34,221,108,101,40,251,175,88,163,208,23,183,21,210,213,68,155,33,34,104,51,6,204,205,65,15,78,89,107,155,178,28,40,46,46,2,71,45,104,138,66,140,50,164,190,90,182,238,221,253,148,33,166,129,0,55,245,185,4,123,139,20,172,146,11,161,35,93,104,27,226,158,76,162,136,176,144,67,158,194,68,73,217,138,144,234,205,23,143,77,53,88,127,203,163,189,240,228,57,227,76,128,224,9,255,116,15,130,33,66,205,146,201, +26,119,248,120,210,163,136,100,116,135,51,73,149,43,215,102,219,156,30,130,86,191,109,217,37,33,217,92,60,39,180,118,135,71,241,182,79,157,58,250,194,237,56,146,234,191,248,243,80,242,39,182,133,122,143,217,134,239,0,171,243,218,71,83,250,192,164,227,97,206,0,240,134,93,109,48,120,118,104,8,211,129,129,92,244,161,133,239,30,91,108,56,81,164,51,215,114,45,14,184,127,204,105,115,101,99,139,158,45,237,17,243,86,18,178,43,135,64,197,92,134,12,110,14,209,66,167,161,38,51,140,11,175,5,67,62,184,105,23,185,69,181,155,82,131,56,40,49,223,56,240,207,60,122,35,63,106,253,123,214,207,232,213,157,196,135,48,57,195,81,125,53,164,78,249,201,22,99,43,125,151,50,163,84,238,73,72,7,121,179,209,199,78,134,93,124,246,244,116,119,251,101,175,114,25,92,36,51,192,75,252,220,242,112,155,239,221,202,16,110,18,163,29,68,226,97,52,221,171,234,243,78,219,151,189,240,233,29,177,171,253,198,248,235,105,185,172,214,231,234,151,50,105,24,123,57, +234,82,229,156,240,97,172,134,8,174,240,26,125,247,217,79,96,240,248,252,169,231,113,41,26,110,109,150,163,12,11,142,8,36,208,117,213,224,16,22,141,131,215,103,164,218,187,64,243,138,225,106,127,70,47,60,153,250,172,167,199,84,130,252,92,151,30,57,3,75,246,8,111,116,181,75,246,196,141,78,176,37,128,100,124,11,112,192,225,228,154,229,152,232,246,213,37,143,241,196,48,177,69,168,231,77,74,6,62,154,226,103,251,147,216,71,175,75,160,48,249,14,252,233,45,104,147,46,23,77,39,251,39,210,224,224,161,210,57,242,230,26,79,74,191,62,184,191,7,217,167,190,184,32,112,233,116,191,167,208,65,1,10,35,212,255,223,54,109,57,62,72,45,140,228,101,33,194,140,125,193,41,9,240,119,116,15,135,126,221,192,172,239,93,40,95,17,43,123,140,225,124,56,249,15,47,170,15,97,216,47,133,37,54,165,145,78,233,88,42,191,240,129,70,252,127,35,21,227,245,60,221,62,120,1,83,136,23,205,106,166,100,140,117,77,255,122,131,57,36,215,152,195,14,53,253, +91,161,145,167,94,79,163,68,105,200,61,139,163,52,227,100,66,210,59,115,49,12,49,83,57,21,196,146,115,47,114,254,111,30,25,226,162,71,121,136,161,244,236,228,182,133,219,235,62,95,229,137,247,163,204,125,237,188,92,123,16,75,208,231,217,51,196,130,73,5,80,144,41,200,166,220,153,9,238,119,248,2,83,31,249,245,85,219,57,7,189,207,106,197,108,190,152,11,252,255,138,86,72,30,111,242,126,114,80,65,187,106,2,234,71,159,188,219,151,192,242,29,26,235,63,210,122,119,125,126,168,47,94,184,180,136,216,180,153,160,172,15,205,132,119,253,75,183,6,59,50,153,229,78,150,99,69,58,122,181,151,250,31,34,202,131,115, + diff --git a/uppbox/uppweb/www.tpp/nightly$ru-ru.tpp b/uppbox/uppweb/www.tpp/nightly$ru-ru.tpp new file mode 100644 index 000000000..f37182165 --- /dev/null +++ b/uppbox/uppweb/www.tpp/nightly$ru-ru.tpp @@ -0,0 +1,16 @@ +topic "Nightly builds"; +[2 $$0,0#00000000000000000000000000000000:Default] +[i448;a25;kKO9;2 $$1,0#37138531426314131252341829483380:class] +[l288;2 $$2,2#27521748481378242620020725143825:desc] +[0 $$3,0#96390100711032703541132217272105:end] +[H6;0 $$4,0#05600065144404261032431302351956:begin] +[i448;a25;kKO9;2 $$5,0#37138531426314131252341829483370:item] +[l288;a4;*@5;1 $$6,6#70004532496200323422659154056402:requirement] +[l288;i1121;b17;O9;~~~.1408;2 $$7,0#10431211400427159095818037425705:param] +[i448;b42;O9;2 $$8,8#61672508125594000341940100500538:tparam] +[b42;2 $$9,9#13035079074754324216151401829390:normal] +[{_}%RU-RU +[s0; [*R+150 Ночные сборки]&] +[s0; &] +[s0; <#downloads#>&] +[s0;%% ] \ No newline at end of file diff --git a/uppbox/uppweb/www.tpp/nightly$ru-ru.tppi b/uppbox/uppweb/www.tpp/nightly$ru-ru.tppi new file mode 100644 index 000000000..913b58337 --- /dev/null +++ b/uppbox/uppweb/www.tpp/nightly$ru-ru.tppi @@ -0,0 +1,5 @@ +TITLE("Nightly builds") +COMPRESSED +120,156,133,145,203,138,212,64,20,134,95,37,144,105,23,99,148,115,173,75,74,196,133,11,193,133,208,48,171,16,134,244,116,148,96,186,91,59,61,184,16,27,93,185,240,25,124,8,23,3,34,232,51,164,223,104,78,102,178,20,38,132,20,85,212,119,206,255,157,84,148,157,157,65,1,57,60,240,148,47,219,183,205,117,127,168,171,78,36,164,134,52,189,127,253,38,166,137,71,227,217,35,7,101,20,114,246,65,70,82,98,193,64,81,2,115,128,242,170,111,134,161,174,122,10,225,14,162,130,114,242,74,232,37,72,64,246,129,140,37,0,2,79,138,194,129,180,92,183,195,85,93,129,93,103,235,17,29,71,64,0,143,8,76,30,88,5,145,201,74,144,39,4,45,219,237,186,174,94,185,52,1,50,73,169,179,232,206,170,137,128,85,159,48,97,100,32,86,140,234,202,85,251,174,219,254,79,73,31,84,242,80,118,135,118,51,27,53,146,206,95,104,66,67,93,225,114,111,109,69,173,89,156,140,216,48,34,167,17,85,44,146,0,149,251,246,227,117,183,111,55,237,246,48,87,232, +16,9,211,10,125,178,8,199,227,241,41,10,220,79,202,91,22,4,203,77,104,103,230,225,81,35,68,13,24,128,189,144,122,83,255,208,236,155,205,108,178,18,74,179,71,40,66,238,208,217,68,33,88,126,141,86,0,76,194,86,27,164,218,203,161,60,204,240,196,77,80,44,98,110,67,98,5,31,193,139,87,49,19,66,135,54,72,152,252,237,55,148,219,221,126,211,244,117,245,249,242,203,98,121,241,100,121,145,85,3,164,172,58,95,62,70,133,108,252,57,254,59,125,31,255,158,126,140,55,217,233,219,248,203,182,95,199,63,227,239,250,81,125,119,113,94,158,229,235,221,167,109,191,107,214,67,254,252,254,108,177,200,234,91,107,17,168,145, +