PageRenderTime 145ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/src/kx/data/TreeUtils.hx

http://github.com/cambiata/cx
Haxe | 1008 lines | 673 code | 217 blank | 118 comment | 55 complexity | c5eb1458618b9b1920194d964744ec03 MD5 | raw file
  1. package kx.data;
  2. import cx.ArrayTools;
  3. import cx.CryptTools;
  4. import cx.EncodeTools;
  5. import cx.FileTools;
  6. import cx.OdtTools;
  7. import cx.PathTools;
  8. import cx.StrTools;
  9. import harfang.SessionManager;
  10. import harfang.UserBase.User;
  11. import haxe.ds.StringMap.StringMap;
  12. import haxe.Utf8;
  13. import hxdom.Attr;
  14. import hxdom.Elements.EAnchor;
  15. import hxdom.Elements.EBody;
  16. import hxdom.Elements.EForm;
  17. import hxdom.Elements.EHead;
  18. import hxdom.Elements.EDiv;
  19. import hxdom.Elements.EHeader1;
  20. import hxdom.Elements.EHtml;
  21. import hxdom.Elements.EImage;
  22. import hxdom.Elements.EInput;
  23. import hxdom.Elements.ELink;
  24. import hxdom.Elements.EListItem;
  25. import hxdom.Elements.EMeta;
  26. import hxdom.Elements.EScript;
  27. import hxdom.Elements.ESmall;
  28. import hxdom.Elements.ESpan;
  29. import hxdom.Elements.ETitle;
  30. import hxdom.Elements.EUnorderedList;
  31. import hxdom.Elements.Text;
  32. import hxdom.Elements.InputType;
  33. import hxdom.HtmlSerializer;
  34. import kx.data.TreeUtils.BigMenuLi;
  35. import kx.data.TreeUtils.BigMenuUl;
  36. import kx.data.TreeUtils.Breadcrumbs;
  37. import kx.data.TreeUtils.MainContent;
  38. import kx.data.TreeUtils.Navbar;
  39. import kx.data.TreeUtils.PageContent;
  40. import kx.data.TreeUtils.PageElements;
  41. import kx.data.TreeUtils.PageHeader;
  42. import kx.data.TreeUtils.Sidebar;
  43. import kx.data.TreeUtils.Sidemenu;
  44. import kx.data.TreeUtils.Submenu;
  45. import neko.Web;
  46. import nx.enums.EHeadType;
  47. import server.Config;
  48. import sys.FileSystem;
  49. import sys.io.File;
  50. import thx.xml.XmlFormat;
  51. /**
  52. * ...
  53. * @author Jonas Nyström
  54. */
  55. using Lambda;
  56. using StringTools;
  57. using hxdom.DomTools;
  58. typedef DocInfo = {
  59. safepath: String,
  60. filepath: String,
  61. docname: String,
  62. sort: String,
  63. isDir: Bool,
  64. ext: String,
  65. }
  66. class TreeUtils
  67. {
  68. public function new()
  69. {
  70. }
  71. static public function getTree(dir:String, filefilter:Array<String>=null): StringMap<DocInfo>
  72. {
  73. var map = new StringMap<DocInfo>();
  74. dir = FileTools.correctPath(dir);
  75. var dirPath = dir; // StrTools.untilLast(dir, '/', true);
  76. //map.set(StrTools.afterLast(dir, '/') + '.dir', '');
  77. var files = FileTools.getDirectories(dir, true, null);
  78. var files = files.map(function(f) { return StringTools.replace(f, dirPath, ''); } ) ;
  79. files = files.filter(function(val) { return (!val.startsWith('/x-')); } );
  80. for (filepath in files)
  81. {
  82. var cont = false;
  83. for (filter in filefilter)
  84. {
  85. if (filepath.toLowerCase().endsWith(filter))
  86. {
  87. cont = true;
  88. break;
  89. }
  90. }
  91. if (cont) continue;
  92. var safepath = /*'doc' +*/ cleanPathFromSortnumbers(filepath);
  93. safepath = EncodeTools.pathsafe(safepath);
  94. safepath = FileTools.excludeExtension(safepath);
  95. var docname = FileTools.getFilename(filepath, true);
  96. var sortStr = docname.substr(0, 3);
  97. var sortvalue = Std.parseInt(sortStr);
  98. if (sortvalue != null)
  99. {
  100. docname = docname.substring(4);
  101. }
  102. else
  103. {
  104. sortStr = docname;
  105. }
  106. var docinfo = {
  107. filepath: dir + filepath,
  108. safepath: safepath,
  109. docname: docname,
  110. sort: sortStr,
  111. isDir: FileSystem.isDirectory(dir + filepath),
  112. ext: FileTools.getExtension(filepath),
  113. }
  114. map.set(safepath, docinfo);
  115. }
  116. //trace(map);
  117. return map;
  118. }
  119. static public function cleanPathFromSortnumbers(path:String):String
  120. {
  121. var pathCleaned = '';
  122. var segments:Array<String> = [];
  123. for (s in path.split('/'))
  124. {
  125. var sortVal = s.substr(0, 4);
  126. var segment = s;
  127. if (Std.parseInt(sortVal) != null)
  128. {
  129. segment = s.substring(4);
  130. }
  131. segments.push(segment);
  132. }
  133. return segments.join('/');
  134. }
  135. static public function getSortedKeys(tree:StringMap<DocInfo>): Array<DocInfo>
  136. {
  137. var a = Lambda.array(tree);
  138. a.sort(function(a, b) { return Reflect.compare(a.filepath, b.filepath); } );
  139. return a;
  140. }
  141. static public function getLevels(trees:StringMap<String>): StringMap<Int>
  142. {
  143. var map = new StringMap<Int>();
  144. for (key in trees.keys())
  145. {
  146. var level = key.length - key.replace('/', '').length;
  147. map.set(key, level);
  148. }
  149. return map;
  150. }
  151. static public function getSubtree(tree:StringMap<DocInfo>, levelKey:String, depth:Int=1): StringMap<DocInfo>
  152. {
  153. var map = new StringMap<DocInfo>();
  154. var level = StrTools.countSub(levelKey, '/');
  155. for (key in tree.keys())
  156. {
  157. if (key.startsWith(levelKey))
  158. {
  159. var subLevel = StrTools.countSub(key, '/');
  160. //trace([subLevel, level]);
  161. if (subLevel <= level + depth)
  162. {
  163. map.set(key, tree.get(key));
  164. }
  165. }
  166. }
  167. return map;
  168. }
  169. static public function getSublevels(tree:StringMap<DocInfo>, depth:Int=1): StringMap<DocInfo>
  170. {
  171. var map = new StringMap<DocInfo>();
  172. for (key in tree.keys())
  173. {
  174. var subLevel = StrTools.countSub(key, '/');
  175. if (subLevel <= depth)
  176. {
  177. trace([subLevel]);
  178. map.set(key, tree.get(key));
  179. }
  180. }
  181. return map;
  182. }
  183. static public function createIndex(pageElements:PageElements): EHtml
  184. {
  185. var html = new EHtml();
  186. var head = getHead('Körakademin', [
  187. "/assets/css/bootstrap.min.css",
  188. "/assets/css/font-awesome.min.css",
  189. "/assets/css/ace.min.css",
  190. "/assets/css/kak.css",
  191. ]);
  192. var body = getBody(pageElements);
  193. html.appendChild(head);
  194. html.appendChild(body);
  195. return html;
  196. }
  197. static public function getBody(pageElements:PageElements)
  198. {
  199. var body = new EBody();
  200. var navbar = new NavbarUser(); // EDiv().attr(Attr.ClassName, "navbar navbar-default").attr(Attr.Id, "navbar");
  201. body.appendChild(navbar);
  202. var mainContainer = new EDiv().attr(Attr.ClassName, "main-container").attr(Attr.Id, "main-container");
  203. //var script = new EScript().attr(Attr.Type, "text/javascript");
  204. //script.addText("try{ace.settings.check('main-container' , 'fixed')}catch(e){}");
  205. //mainContainer.add(script);
  206. body.appendChild(mainContainer);
  207. var mainContainerInner = new EDiv().attr(Attr.ClassName, "main-container-inner");
  208. mainContainer.appendChild(mainContainerInner);
  209. var aMenuToggler = new EAnchor().attr(Attr.ClassName, "menu-toggler").attr(Attr.Id, "menu-toggler").attr(Attr.Href, "#");
  210. mainContainerInner.appendChild(aMenuToggler);
  211. /*
  212. var bigmenuItems:Array<BigmenuItem> = [
  213. {title: 'Rösten', url: 'rosten.html', clss: 'bigmenu-rosten' },
  214. {title: 'Noterna', url: 'noterna.html', clss: 'bigmenu-empty' },
  215. {title: 'Repertoar', url: 'repertoar.html', clss: 'bigmenu-empty'},
  216. ];
  217. var test2sub = new Submenu();
  218. test2sub.appendChild(new NavlistLi('test2subA', 'linksub1.html'));
  219. test2sub.appendChild(new NavlistLi('test2subB', 'linksub2.html'));
  220. var sidemenuItems:Array<SidemenuItem> =
  221. [
  222. {title: 'test', url:'/test' },
  223. {title: 'test2', url:'/test2', submenu: test2sub },
  224. {title: 'test3', url:'/test3' },
  225. ];
  226. */
  227. var sidebar = new Sidebar(pageElements.bigmenuItems, pageElements.sidemenuItems); // new EDiv().attr(Attr.ClassName, "sidebar").attr(Attr.Id, "sidebar");
  228. mainContainerInner.appendChild(sidebar);
  229. var url = Web.getURI();
  230. url = url.substr(1, url.length - 1);
  231. var segments = url.split('/');
  232. var crumbs:Array<String> = [];
  233. var path = '/';
  234. try
  235. {
  236. var fileSegments = pageElements.filename.substr(Config.DOCPATH.length).split('/');
  237. var i = 0;
  238. for (segment in segments)
  239. {
  240. path = path + segment + '/';
  241. var fileSegment = fileSegments[i];
  242. fileSegment = FileTools.excludeExtension(fileSegment);
  243. var orderval = Std.parseInt(fileSegment.substring(0, 3));
  244. if (orderval != null) fileSegment = fileSegment.substr(4);
  245. crumbs.push(segment + '|' + path + '|' + fileSegment);
  246. i++;
  247. }
  248. //trace(crumbs);
  249. }
  250. catch (e:Dynamic)
  251. {
  252. }
  253. var breadcrumbs = new Breadcrumbs(crumbs);
  254. var content:PageContent = null;
  255. if (pageElements.pageContent != null)
  256. {
  257. content = pageElements.pageContent;
  258. }
  259. else
  260. {
  261. content = new PageContent();
  262. }
  263. var mainContent = new MainContent(breadcrumbs, content); // new EDiv().attr(Attr.ClassName, "main-content").attr(Attr.Id, "main-content");
  264. mainContainerInner.appendChild(mainContent);
  265. body.appendChild(new EScript().attr(Attr.Type, "text/javascript").attr(Attr.Src, "http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"));
  266. body.appendChild(new EScript().attr(Attr.Type, "text/javascript").attr(Attr.Src, "/assets/js/bootstrap.min.js"));
  267. body.appendChild(new EScript().attr(Attr.Type, "text/javascript").attr(Attr.Src, "/assets/js/ace.min.js"));
  268. body.appendChild(new EScript().attr(Attr.Type, "text/javascript").attr(Attr.Src, "/assets/video/swfobject.js"));
  269. body.appendChild(new EScript().attr(Attr.Type, "text/javascript").attr(Attr.Src, "/assets/video/flowplayer.min.js"));
  270. return body;
  271. }
  272. static public function getHead(title:String, styles: Array<String> = null)
  273. {
  274. var head = new EHead();
  275. head.appendChild(new EMeta().attr(Attr.Charset, 'utf-8'));
  276. head.appendChild(new ETitle().addText(title));
  277. for (style in styles) head.appendChild(new ELink().attr(Attr.Href, style).attr(Attr.Rel, "stylesheet"));
  278. /*
  279. head.appendChild(new ELink().attr(Attr.Href, "/assets/css/font-awesome.min.css").attr(Attr.Rel, "stylesheet"));
  280. head.appendChild(new ELink().attr(Attr.Href, "/assets/css/ace.min.css").attr(Attr.Rel, "stylesheet"));
  281. head.appendChild(new ELink().attr(Attr.Href, "/assets/css/kak.css").attr(Attr.Rel, "stylesheet"));
  282. */
  283. return head;
  284. }
  285. static public function buildIndex()
  286. {
  287. var html = new EHtml();
  288. var head = new EHead();
  289. head.appendChild(new EMeta().attr(Attr.Charset, 'utf-8'));
  290. head.appendChild(new ETitle().addText('Körakademin'));
  291. head.appendChild(new ELink().attr(Attr.Href, "/assets/css/bootstrap.min.css").attr(Attr.Rel, "stylesheet"));
  292. head.appendChild(new ELink().attr(Attr.Href, "/assets/css/font-awesome.min.css").attr(Attr.Rel, "stylesheet"));
  293. head.appendChild(new ELink().attr(Attr.Href, "/assets/css/ace.min.css").attr(Attr.Rel, "stylesheet"));
  294. head.appendChild(new ELink().attr(Attr.Href, "/assets/css/kak.css").attr(Attr.Rel, "stylesheet"));
  295. var body = new EBody();
  296. var navbar = new NavbarUser(); // EDiv().attr(Attr.ClassName, "navbar navbar-default").attr(Attr.Id, "navbar");
  297. body.appendChild(navbar);
  298. var mainContainer = new EDiv().attr(Attr.ClassName, "main-container").attr(Attr.Id, "main-container");
  299. var script = new EScript().attr(Attr.Type, "text/javascript");
  300. script.addText("try{ace.settings.check('main-container' , 'fixed')}catch(e){}");
  301. mainContainer.add(script);
  302. body.appendChild(mainContainer);
  303. var mainContainerInner = new EDiv().attr(Attr.ClassName, "main-container-inner");
  304. mainContainer.appendChild(mainContainerInner);
  305. var aMenuToggler = new EAnchor().attr(Attr.ClassName, "menu-toggler").attr(Attr.Id, "menu-toggler").attr(Attr.Href, "#");
  306. mainContainerInner.appendChild(aMenuToggler);
  307. var bigmenuItems:Array<BigmenuItem> = [
  308. {title: 'Rösten', url: 'rosten.html', clss: 'bigmenu-rosten' },
  309. {title: 'Noterna', url: 'noterna.html', clss: 'bigmenu-empty' },
  310. {title: 'Repertoar', url: 'repertoar.html', clss: 'bigmenu-empty'},
  311. ];
  312. var test2sub = new Submenu();
  313. test2sub.appendChild(new NavlistLi('test2subA', 'linksub1.html'));
  314. test2sub.appendChild(new NavlistLi('test2subB', 'linksub2.html'));
  315. var sidemenuItems:Array<SidemenuItem> =
  316. [
  317. {title: 'test', url:'/test' },
  318. {title: 'test2', url:'/test2', submenu: test2sub },
  319. {title: 'test3', url:'/test3' },
  320. ];
  321. var sidebar = new Sidebar(bigmenuItems, sidemenuItems); // new EDiv().attr(Attr.ClassName, "sidebar").attr(Attr.Id, "sidebar");
  322. mainContainerInner.appendChild(sidebar);
  323. var breadcrumbs = new Breadcrumbs(['test|/test', 'test2|/test2']);
  324. var content = new PageContent();
  325. var mainContent = new MainContent(breadcrumbs, content);
  326. mainContainerInner.appendChild(mainContent);
  327. body.appendChild(new EScript().attr(Attr.Type, "text/javascript").attr(Attr.Src, "http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"));
  328. body.appendChild(new EScript().attr(Attr.Type, "text/javascript").attr(Attr.Src, "assets/js/bootstrap.min.js"));
  329. body.appendChild(new EScript().attr(Attr.Type, "text/javascript").attr(Attr.Src, "assets/js/ace.min.js"));
  330. body.appendChild(new EScript().attr(Attr.Type, "text/javascript").attr(Attr.Src, "assets/video/jwplayer.js"));
  331. html.appendChild(head);
  332. html.appendChild(body);
  333. //return toHtml(html);
  334. return html;
  335. }
  336. static public function testHxdom()
  337. {
  338. /*
  339. var ul = new BigMenuUl();
  340. ul.appendChild(new BigMenuLi('Rösten', 'rosten.html', 'bigmenu-rosten'));
  341. ul.appendChild(new BigMenuLi('Noterna', 'noterna.html', 'bigmenu-empty'));
  342. ul.appendChild(new BigMenuLi('Repertoar', 'repertoar.html', 'bigmenu-empty'));
  343. var html = new EHtml();
  344. html.appendChild(ul);
  345. var out = Xml.parse(HtmlSerializer.run(html)).firstElement().firstElement().toString();
  346. */
  347. var sub = new NavlistUl(true);
  348. sub.appendChild(new NavlistLi('test', 'linksub1.html'));
  349. sub.appendChild(new NavlistLi('test2', 'linksub2.html'));
  350. var ul = new NavlistUl();
  351. ul.appendChild(new NavlistLi('test', 'link.html'));
  352. ul.appendChild(new NavlistLi('testsub', 'sub.html', sub));
  353. var html = new EHtml();
  354. html.appendChild(ul);
  355. var xml:Xml = Xml.parse(HtmlSerializer.run(html)).firstElement().firstElement();
  356. var format = new XmlFormat('\t');
  357. return format.format(xml).toString();
  358. }
  359. }
  360. typedef PageElements = {
  361. bigmenuItems:Array<BigmenuItem>,
  362. sidemenuItems:Array<SidemenuItem>,
  363. pageContent: PageContent,
  364. filename: String,
  365. }
  366. class BigMenuUl extends EUnorderedList {
  367. public function new() {
  368. super();
  369. this.classes('bigmenu');
  370. }
  371. }
  372. class BigMenuLi extends EListItem {
  373. public function new(title:String, link:String, clss:String = 'btn-success', icon:String=null, iconRight:String=null, imgClss:String=null)
  374. {
  375. super();
  376. /*this.attr(Attr.ClassName);*/
  377. var a = new EAnchor();
  378. a.attr(Attr.Href, link).attr(Attr.ClassName, 'btn $clss $imgClss');
  379. /*
  380. */
  381. if (icon != null)
  382. {
  383. var span = new ESpan().attr(Attr.ClassName, icon);
  384. a.appendChild(span);
  385. }
  386. a.addText(title);
  387. if (iconRight != null)
  388. {
  389. var span = new ESpan().attr(Attr.ClassName, '$iconRight' );
  390. a.appendChild(span);
  391. }
  392. if (imgClss != null)
  393. {
  394. var span = new ESpan();
  395. span.attr(Attr.ClassName, 'span-right $imgClss');
  396. a.appendChild(span);
  397. }
  398. this.appendChild(a);
  399. /*
  400. var div = new EDiv();
  401. div.classes(imgClass);
  402. div.addText(title);
  403. a.appendChild(div);
  404. */
  405. //this.classes('btn $imgClass');
  406. }
  407. }
  408. class NavlistUl extends EUnorderedList {
  409. public function new(isSubmenu:Bool=false) {
  410. super();
  411. var classes = (!isSubmenu) ? 'nav nav-list': 'submenu';
  412. this.classes(classes);
  413. }
  414. }
  415. class NavlistLi extends EListItem {
  416. public function new(title:String, link:String, sub:EUnorderedList=null)
  417. {
  418. super();
  419. var a = new EAnchor();
  420. a.attr(Attr.Href, link);
  421. this.appendChild(a);
  422. var i = new ESpan();
  423. a.appendChild(i);
  424. var span = new ESpan();
  425. span.classes('menu-text');
  426. span.addText(title);
  427. a.appendChild(span);
  428. if (sub != null)
  429. {
  430. a.classes('dropdown-toggle');
  431. this.appendChild(sub);
  432. var b = new ESpan();
  433. b.classes('arrow icon-angle-down');
  434. a.appendChild(b);
  435. i.classes('icon-folder-close');
  436. } else {
  437. //i.classes('icon-edit');
  438. }
  439. }
  440. }
  441. class NavbarUser extends Navbar
  442. {
  443. /*
  444. public function new()
  445. {
  446. trace('ykkas');
  447. super();
  448. }
  449. */
  450. override public function createChildren()
  451. {
  452. super.createChildren();
  453. var divUser = new EDiv().attr(Attr.ClassName, "navbar-user pull-right");
  454. var user:User = SessionManager.getUser();
  455. var form:EForm = null;
  456. if (user != null)
  457. {
  458. divUser.addText('Välkommen, ${user.firstname} ${user.lastname}!');
  459. form = new EForm().classes('navbar-form form-inline pull-right').attr(Attr.Action, '/logout').attr(Attr.Method, 'post');
  460. var submit = new EInput(InputType.Submit).classes('btn btn-primary btn-sm').attr(Attr.Value, 'Logga ut');
  461. form.appendChild(submit);
  462. this.appendChild(form);
  463. }
  464. else
  465. {
  466. /*
  467. divUser.addText('Gäst');
  468. form = new EForm().classes('navbar-form form-inline pull-right').attr(Attr.Action, '/loginform').attr(Attr.Method, 'post');
  469. var login = new EInput(InputType.IText).classes('span2').attr(Attr.Placeholder, 'Användarnamn').attr(Attr.Id, 'login').attr(Attr.Name, 'login');
  470. var pass = new EInput(InputType.Password).classes('input-small').attr(Attr.Placeholder, 'Lösenord').attr(Attr.Id, 'pass').attr(Attr.Name, 'pass');
  471. var submit = new EInput(InputType.Submit).classes('btn btn-success btn-sm').attr(Attr.Value, 'Logga in');
  472. form.appendChild(login);
  473. form.appendChild(pass);
  474. form.appendChild(submit);
  475. this.appendChild(form);
  476. */
  477. }
  478. this.appendChild(divUser);
  479. }
  480. }
  481. class Navbar extends EDiv {
  482. public function new()
  483. {
  484. super();
  485. this.attr(Attr.ClassName, "navbar navbar-default");
  486. this.attr(Attr.Id, "navbar");
  487. this.createChildren();
  488. }
  489. public function createChildren()
  490. {
  491. var divContainer = new EDiv().attr(Attr.ClassName, "navbar-container").attr(Attr.Id, "navbar-container");
  492. this.appendChild(divContainer);
  493. var divHeader = new EDiv().attr(Attr.ClassName, "navbar-header pull-left");
  494. var aLogo = new EAnchor().attr(Attr.Href, '#').attr(Attr.ClassName, 'navbar-brand');
  495. var aImg = new EImage().attr(Attr.Src, "/assets/css/images/logo.png");
  496. aLogo.appendChild(aImg);
  497. divHeader.appendChild(aLogo);
  498. divContainer.appendChild(divHeader);
  499. }
  500. }
  501. class Breadcrumbs extends EDiv {
  502. public function new(crumbs:Array<String>)
  503. {
  504. super();
  505. this.attr(Attr.ClassName, "breadcrumbs");
  506. this.attr(Attr.Id, "breadcrumbs");
  507. /*
  508. var script = new EScript().attr(Attr.Type, "text/javascript");
  509. script.addText("try{ace.settings.check('breadcrumbs' , 'fixed')}catch(e){}");
  510. this.appendChild(script);
  511. */
  512. var breadcrumb = new EUnorderedList().attr(Attr.ClassName, "breadcrumb");
  513. this.appendChild(breadcrumb);
  514. var crumb = new EListItem();
  515. var i = new ESpan().classes("icon-home home-icon");
  516. crumb.appendChild(i);
  517. var a = new EAnchor().attr(Attr.Href, '/');
  518. a.addText('Hem');
  519. crumb.appendChild(a);
  520. breadcrumb.appendChild(crumb);
  521. for (crumb in crumbs)
  522. {
  523. //trace(crumb);
  524. var a = crumb.split('|');
  525. //var title = a[0];
  526. var title = EncodeTools.utf8(a[2]);
  527. var url = PathTools.removeSlash(a[1]);
  528. var cr = new EListItem();
  529. if (ArrayTools.isLast(crumbs, crumb))
  530. {
  531. cr.attr(Attr.ClassName, "active");
  532. cr.addText(title);
  533. }
  534. else
  535. {
  536. var a = new EAnchor().attr(Attr.Href, url);
  537. a.addText(title);
  538. cr.appendChild(a);
  539. }
  540. breadcrumb.appendChild(cr);
  541. }
  542. }
  543. }
  544. class PageContent extends EDiv {
  545. public function new()
  546. {
  547. super();
  548. this.attr(Attr.ClassName, "page-content");
  549. //this.appendChild(new PageHeader('Sidrubrik', 'Körakademin'));
  550. }
  551. }
  552. class PageStringContent extends PageContent {
  553. public function new(text:String)
  554. {
  555. super();
  556. this.attr(Attr.ClassName, "page-content");
  557. //this.appendChild(new PageHeader('Sidrubrik', 'Körakademin'));
  558. this.addHtml(text);
  559. }
  560. }
  561. class PageFlvContent extends PageContent {
  562. var filename:String;
  563. public function new (filename:String)
  564. {
  565. super();
  566. this.filename = filename;
  567. //trace(cryptFilename);
  568. this.addContent();
  569. }
  570. public function addContent()
  571. {
  572. var cryptFilename = CryptTools.crypt(filename);
  573. //trace(cryptFilename);
  574. var html = ''
  575. +'<link rel="stylesheet" type="text/css" href="/assets/video/skin/functional.css"></link>'
  576. +'<style type="text/css"> '
  577. +' .flowplayer { width: 640px; height: 480px;}'
  578. +'</style>'
  579. +'<div class="flowplayer" data-swf="/assets/video/flowplayer.swf" data-ratio="0.4167">'
  580. +' <video>'
  581. +' <source type="video/flv" src="/video/$cryptFilename"></source>'
  582. +' </video>'
  583. +'</div>'
  584. ;
  585. //this.addText(html);
  586. this.addHtml(html);
  587. var filenamePng = FileTools.getDirectory(filename) + FileTools.getFilename(filename, false) + '.png';
  588. //trace(filenamePng);
  589. if (FileTools.exists(filenamePng))
  590. {
  591. var cryptFilename = CryptTools.crypt(filenamePng);
  592. var img = new EImage().attr(Attr.Src, '/file/$cryptFilename').attr(Attr.ClassName, 'videoimage');
  593. this.appendChild(img);
  594. }
  595. }
  596. }
  597. class PageOdtContent extends PageContent {
  598. var filename:String;
  599. public function new(filename:String, title:String=null, subtitle:String=null) {
  600. super();
  601. this.filename = filename;
  602. var copyfile = this.filename + '.copy.txt';
  603. if (FileTools.exists(copyfile)) {
  604. addCopyright(FileTools.getContent(copyfile));
  605. }
  606. this.attr(Attr.ClassName, "page-content content-max");
  607. if (title != null || subtitle != null) this.appendChild(new PageHeader(EncodeTools.utf8(title), EncodeTools.utf8(subtitle)));
  608. this.addContent();
  609. }
  610. public function addContent()
  611. {
  612. var div:EDiv = new EDiv();
  613. this.appendChild(div);
  614. try {
  615. var html = new OdtTools().getHtmlFromOdt2(this.filename, false, 40, 2);
  616. if (html.toLowerCase().indexOf('href="player:') != -1)
  617. {
  618. //trace('replace player');
  619. html = this.replacePlayerTags(html);
  620. }
  621. //var html = OdtTools.getHtmlFromOdt(this.filename);
  622. div.addHtml(html);
  623. } catch (e:Dynamic)
  624. {
  625. div.addText(Std.string(e));
  626. }
  627. }
  628. public function addCopyright(html:String)
  629. {
  630. var div:EDiv = new EDiv();
  631. div.attr(Attr.ClassName, 'alert alert-warning');
  632. div.addHtml(EncodeTools.utf8(html));
  633. this.appendChild(div);
  634. }
  635. public function replacePlayerTags(html:String):String
  636. {
  637. var r = ~/<object[ .:a-zA-Z0-9="-_\/><\r\t\n]+object>/im;
  638. var compare = html;
  639. var rebuiltHtml = html;
  640. //trace(r.match(compare));
  641. while (r.match(compare))
  642. {
  643. r.match(compare);
  644. var match = r.matched(0);
  645. var pos = r.matchedPos();
  646. var beforeMatch = compare.substr(0, pos.pos);
  647. var afterMatch = compare.substr(pos.len + pos.pos);
  648. var r2 = ~/"player:([.a-zA-Z0-9\/_-]*)"/;
  649. r2.match(match);
  650. var fileAddress = r2.matched(1);
  651. var newTag = '<newtag src="$fileAddress" >testNewTag</newtag>';
  652. var newTag = playerTag(fileAddress);
  653. rebuiltHtml = StringTools.replace(rebuiltHtml, match, newTag);
  654. compare = compare.substr(pos.len + pos.pos);
  655. }
  656. return rebuiltHtml;
  657. }
  658. private function playerTag(file:String)
  659. {
  660. //trace(this.filename);
  661. var path = FileTools.getDirectory(this.filename);
  662. var filename = '$path$file';
  663. var cryptAdr = CryptTools.crypt(filename);
  664. var url = '/audio/$cryptAdr';
  665. return '
  666. <object id="wp-as-40_1-flash" type="application/x-shockwave-flash" data="/assets/audio/player.swf" width="290" height="24">
  667. <param name="movie" value="http://s0.wp.com/wp-content/plugins/audio-player/player.swf?m=1365086195g" />
  668. <param name="FlashVars" value="bg=0xF8F8F8&amp;leftbg=0xEEEEEE&amp;lefticon=0x666666&amp;rightbg=0xCCCCCC&amp;rightbghover=0x999999&amp;righticon=0x666666&amp;righticonhover=0xFFFFFF&amp;text=0x666666&amp;slider=0x666666&amp;track=0xFFFFFF&amp;border=0x666666&amp;loader=0x9FFFB8&amp;soundFile=$url" />
  669. <param name="quality" value="high" />
  670. <param name="menu" value="false" />
  671. <param name="bgcolor" value="#FFFFFF" />
  672. <param name="wmode" value="opaque" />
  673. </object>
  674. ';
  675. }
  676. }
  677. class PageHeader extends EDiv {
  678. public function new(title:String, subtitle:String=null)
  679. {
  680. super();
  681. this.attr(Attr.ClassName, "page-header");
  682. var h1 = new EHeader1().addText(title);
  683. this.appendChild(h1);
  684. if (subtitle != null) {
  685. var small = new ESmall();
  686. var i = new ESpan().attr(Attr.ClassName, "icon-double-angle-right");
  687. small.appendChild(i);
  688. small.addText(subtitle);
  689. h1.appendChild(small);
  690. }
  691. }
  692. }
  693. class Sidebar extends EDiv {
  694. public function new(bigmenuItems:Array<BigmenuItem>=null, sidemenuItems:Array<SidemenuItem>=null)
  695. {
  696. super();
  697. this.attr(Attr.ClassName, "sidebar");
  698. this.attr(Attr.Id, "sidebar");
  699. if (bigmenuItems != null)
  700. {
  701. var bigMenu = new Bigmenu(bigmenuItems);
  702. this.appendChild(bigMenu);
  703. }
  704. /*
  705. var test2sub = new Submenu();
  706. test2sub.appendChild(new NavlistLi('test2subA', 'linksub1.html'));
  707. test2sub.appendChild(new NavlistLi('test2subB', 'linksub2.html'));
  708. var sidemenu:Array<SidemenuItem> =
  709. [
  710. {title: 'test', url:'/test' },
  711. {title: 'test2', url:'/test2', submenu: test2sub },
  712. {title: 'test3', url:'/test3' },
  713. ];
  714. */
  715. if (sidemenuItems != null)
  716. {
  717. var sideMenu = new Sidemenu(sidemenuItems);
  718. this.appendChild(sideMenu);
  719. }
  720. }
  721. }
  722. typedef BigmenuItem = {
  723. title: String,
  724. url: String,
  725. clss: String,
  726. ?icon: String,
  727. ?iconRight:String,
  728. ?imgClss:String,
  729. }
  730. class Bigmenu extends EUnorderedList {
  731. public function new(items: Array<BigmenuItem>)
  732. {
  733. super();
  734. this.classes('bigmenu');
  735. for (item in items)
  736. this.appendChild(new BigMenuLi(item.title, item.url, item.clss, item.icon, item.iconRight, item.imgClss));
  737. /*
  738. this.appendChild(new BigMenuLi('Rösten', 'rosten.html', 'bigmenu-rosten'));
  739. this.appendChild(new BigMenuLi('Noterna', 'noterna.html', 'bigmenu-empty'));
  740. this.appendChild(new BigMenuLi('Repertoar', 'repertoar.html', 'bigmenu-empty'));
  741. */
  742. }
  743. }
  744. typedef SidemenuItem = {
  745. title: String,
  746. url: String,
  747. ?submenu: Submenu,
  748. }
  749. class Sidemenu extends EUnorderedList {
  750. public function new(items: Array<SidemenuItem>) {
  751. super();
  752. this.classes('nav nav-list');
  753. for (item in items) this.appendChild(new NavlistLi(item.title, item.url, item.submenu));
  754. /*
  755. var subMenu = new Submenu();
  756. subMenu.appendChild(new NavlistLi('test', 'linksub1.html'));
  757. subMenu.appendChild(new NavlistLi('test2', 'linksub2.html'));
  758. */
  759. /*
  760. this.appendChild(new NavlistLi('test', 'link.html'));
  761. this.appendChild(new NavlistLi('testsub', 'sub.html'));
  762. */
  763. }
  764. }
  765. class Submenu extends EUnorderedList {
  766. public function new(isSubmenu:Bool=false) {
  767. super();
  768. this.classes('submenu');
  769. }
  770. }
  771. class MainContent extends EDiv {
  772. public function new(breadcrumbs:Breadcrumbs, content:PageContent)
  773. {
  774. super();
  775. this.attr(Attr.ClassName, "main-content");
  776. this.attr(Attr.Id, "main-content");
  777. /*
  778. var breadcrumbs = new Breadcrumbs(['test|/test', 'test2|/test2']);
  779. */
  780. if (breadcrumbs != null) this.appendChild(breadcrumbs);
  781. if (content != null) this.appendChild(content);
  782. }
  783. }