Thread: [pygccxml-commit] SF.net SVN: pygccxml:[1447] ui/web
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2008-10-26 13:01:03
|
Revision: 1447 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1447&view=rev Author: roman_yakovenko Date: 2008-10-26 13:00:57 +0000 (Sun, 26 Oct 2008) Log Message: ----------- adding textcha Modified Paths: -------------- ui/web/forms.py ui/web/templates/generated.html ui/web/templates/generator.html Added Paths: ----------- ui/web/static/generator.css ui/web/textcha.py Modified: ui/web/forms.py =================================================================== --- ui/web/forms.py 2008-10-23 05:40:53 UTC (rev 1446) +++ ui/web/forms.py 2008-10-26 13:00:57 UTC (rev 1447) @@ -1,96 +1,91 @@ -import config -import web - -class Label(web.form.Input): - tmpl = """<label name="%(name)s" %(atts)s>%(value)s</label>%(note)s""" - def render(self): - value = '' - if self.value is not None: - value = web.net.websafe(self.value) - return self.tmpl % dict( name=web.net.websafe(self.name) - , value=value - , atts=self.addatts() - , note=self.rendernote(self.note) ) - -class RawHTML(web.form.Input): - def __init__(self, html, *validators, **attrs): - web.form.Input.__init__( self, '', *validators, **attrs ) - self.__html = html - def render(self): - return self.__html - -class SimpleForm( web.form.Form ): - tmpl = """<form %(attrs)s>\n%(inputs)s\n</form>\n""" - def __init__(self, *inputs, **kw): - web.form.Form.__init__( self, *inputs, **kw ) - self.__kw = kw - self.__kw.pop( 'validators', None ) - - def render_addattrs( self ): - attrs = [] - for (n, v) in self.__kw.iteritems(): - attrs.append( ' %s="%s"' % (n, web.net.websafe(v)) ) - return ''.join( attrs ) - - def render( self ): - controls = [] - controls.append( self.rendernote(self.note) ) - for i in self.inputs: - if i.pre: - controls.append( i.pre ) - controls.append( i.render() ) - if i.post: - controls.append( i.post ) - return self.tmpl % dict( attrs=self.render_addattrs(), inputs='\n'.join( controls ) ) - - -""" - <form action="/generated.html" method="post" id="SourceCodeForm" style="width:80%; float:left;"> - <label>Source code:</label> - <br/> - <textarea name="source_code" rows="20" style="width:100%;"></textarea> - <br/> - <input type="submit" name="show_decls" value="Show declarations" /> - <a></a> - <input type="submit" name="generate_bp" value="Generate Boost.Python code" /> - <a></a> - <input type="submit" name="generate_pypp" value="Generate Py++ code" /> - </form> -""" - - -class generator_t( SimpleForm ): - def __init__( self, action, code_generator=None, method='post' ): - self.__code_generator = code_generator - self.__show_decls = web.form.Button( 'Show declarations', type="submit" ) - self.__generate_bpl_code = web.form.Button( 'Generate Boost.Python code', type="submit" ) - self.__generate_pypp_code = web.form.Button( 'Generate Py++ code', id="generate_pypp_code", type="submit" ) - self.__source_code = web.form.Textarea( "source_code", rows="20", style="width:100%;") - SimpleForm.__init__( self - , Label( 'source_code', value="Source code:" ) - , RawHTML( '<br/>' ) - , self.__source_code - , RawHTML( '<br/>' ) - , self.__show_decls - , RawHTML( '<a></a>' ) - , self.__generate_bpl_code - , RawHTML( '<a></a>' ) - , self.__generate_pypp_code - , action=action - , method=method - , style="width:80%; float:left;" ) - - def process( self, request_data ): - warnings = '' - generated = '' - source_code = request_data[ self.__source_code.name] - if self.__show_decls.name in request_data: - generated = self.__code_generator.show_declarations( source_code ) - elif self.__generate_pypp_code.name in request_data: - generated = self.__code_generator.generate_pypp_code( source_code ) - elif self.__generate_bpl_code.name in request_data: - generated, warnings = self.__code_generator.generate_bpl_code( source_code ) - else: - generated = 'error - unknown submit action' - return generated, warnings - +import config +import web +import textcha + +class Label(web.form.Input): + tmpl = """<label name="%(name)s" %(atts)s>%(value)s</label>%(note)s""" + def render(self): + value = '' + if self.value is not None: + value = web.net.websafe(self.value) + return self.tmpl % dict( name=web.net.websafe(self.name) + , value=value + , atts=self.addatts() + , note=self.rendernote(self.note) ) + +class RawHTML(web.form.Input): + def __init__(self, html, *validators, **attrs): + web.form.Input.__init__( self, '', *validators, **attrs ) + self.__html = html + def render(self): + return self.__html + +class SimpleForm( web.form.Form ): + tmpl = """<form %(attrs)s>\n%(inputs)s\n</form>\n""" + def __init__(self, *inputs, **kw): + web.form.Form.__init__( self, *inputs, **kw ) + self.__kw = kw + self.__kw.pop( 'validators', None ) + + def render_addattrs( self ): + attrs = [] + for (n, v) in self.__kw.iteritems(): + attrs.append( ' %s="%s"' % (n, web.net.websafe(v)) ) + return ''.join( attrs ) + + def render( self ): + controls = [] + controls.append( self.rendernote(self.note) ) + for i in self.inputs: + if i.pre: + controls.append( i.pre ) + controls.append( i.render() ) + if i.post: + controls.append( i.post ) + return self.tmpl % dict( attrs=self.render_addattrs(), inputs='\n'.join( controls ) ) + + +class generator_t( SimpleForm ): + def __init__( self, action, code_generator=None, method='post' ): + self.__code_generator = code_generator + self.__show_decls = web.form.Button( 'Show declarations', type="submit" ) + self.__generate_bpl_code = web.form.Button( 'Generate Boost.Python code', type="submit" ) + self.__generate_pypp_code = web.form.Button( 'Generate Py++ code', id="generate_pypp_code", type="submit" ) + self.__source_code = web.form.Textarea( "source_code", rows="20", style="width:100%") + self.__textcha_question = web.form.Hidden( "textcha_question", value=textcha.random_question(), style="width:60%;", id='textcha-question') + self.__textcha_answer = web.form.Textbox( "textcha_answer", value="", style="width:40%;", maxlength="120", id='textcha-answer') + SimpleForm.__init__( self + , Label( 'source_code', value="Source code:" ) + , RawHTML( '<br/>' ) + , self.__source_code + , RawHTML( '<br/>' ) + , self.__textcha_question + , Label( 'textcha_question', value=self.__textcha_question.value ) + , self.__textcha_answer + , RawHTML( '<br/><br/>' ) + , self.__show_decls + , RawHTML( '<a></a>' ) + , self.__generate_bpl_code + , RawHTML( '<a></a>' ) + , self.__generate_pypp_code + , action=action + , method=method + , style="width:80%; float:left;" ) + + def process( self, request_data ): + warnings = '' + generated = '' + if not textcha.is_human( request_data[ self.__textcha_question.name], request_data[ self.__textcha_answer.name] ): + generated = warnings = "Please answer the question!" + return generated, warnings + source_code = request_data[ self.__source_code.name] + if self.__show_decls.name in request_data: + generated = self.__code_generator.show_declarations( source_code ) + elif self.__generate_pypp_code.name in request_data: + generated = self.__code_generator.generate_pypp_code( source_code ) + elif self.__generate_bpl_code.name in request_data: + generated, warnings = self.__code_generator.generate_bpl_code( source_code ) + else: + generated = 'error - unknown submit action' + return generated, warnings + Added: ui/web/static/generator.css =================================================================== --- ui/web/static/generator.css (rev 0) +++ ui/web/static/generator.css 2008-10-26 13:00:57 UTC (rev 1447) @@ -0,0 +1,13 @@ +#textcha { + font-size: 100%; + margin-top: 0.5em; + border: 2px solid #FF8888; + color: black; + vertical-align: middle; + padding: 3px 2px; +} + +#textcha-answer { + border: 2px solid #000000; + padding: 3px 2px; +} Modified: ui/web/templates/generated.html =================================================================== --- ui/web/templates/generated.html 2008-10-23 05:40:53 UTC (rev 1446) +++ ui/web/templates/generated.html 2008-10-26 13:00:57 UTC (rev 1447) @@ -1,35 +1,36 @@ -$def with (code, warnings) -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <link rel="shortcut icon" href="/static/favicon.ico" /> - <link rel="icon" href="/static/favicon.ico" /> - <title>pygccxml & py++ demo - generated code</title> -</head> -<body> - <h2>pygccxml & py++ demo - generated code</h2> - <span style="width:80%; float:left;"> - <label>Generated code:</label> - <br/> - <textarea name="generated_code" rows="20" readonly="true" style="width:100%;">$:code</textarea> - </span> - <a> </a> - <span style="float : left; padding-left : 10px; width : 18%;"> - <br/> - <label style="width:100%;">What is ... ?</label> - <dt> - <dd><a href="http://www.language-binding.net">py++</a></dd> - <dd><a href="http://www.language-binding.net">pygccxml</a></dd> - </dt> - <label style="width:100%;">Adsense placeholder</label> - <textarea name="adsense" rows="15" style="width:100;">jjjjjjjjjjjjjjjjjjjjjjjjjj</textarea> - </span> - <span style="width:100%;"> - <br/> - <label>Warnings:</label> - <br/> - <textarea name="warnings" rows="15" readonly="true" style="width:100%;">$:warnings</textarea> - </span> -</body> -</html> +$def with (code, warnings) +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <link rel="shortcut icon" href="/static/favicon.ico" /> + <link rel="icon" href="/static/favicon.ico" /> + <!--link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="/static/generator.css"--> + <title>pygccxml & py++ demo - generated code</title> +</head> +<body> + <h2>pygccxml & py++ demo - generated code</h2> + <span style="width:80%; float:left;"> + <label>Generated code:</label> + <br/> + <textarea name="generated_code" rows="20" readonly="true" style="width:100%;">$:code</textarea> + </span> + <a> </a> + <span style="float : left; padding-left : 10px; width : 18%;"> + <br/> + <label style="width:100%;">What is ... ?</label> + <dt> + <dd><a href="http://www.language-binding.net">py++</a></dd> + <dd><a href="http://www.language-binding.net">pygccxml</a></dd> + </dt> + <label style="width:100%;">Adsense placeholder</label> + <textarea name="adsense" rows="15" style="width:100;">jjjjjjjjjjjjjjjjjjjjjjjjjj</textarea> + </span> + <span style="width:100%;"> + <br/> + <label>Warnings:</label> + <br/> + <textarea name="warnings" rows="15" readonly="true" style="width:100%;">$:warnings</textarea> + </span> +</body> +</html> Modified: ui/web/templates/generator.html =================================================================== --- ui/web/templates/generator.html 2008-10-23 05:40:53 UTC (rev 1446) +++ ui/web/templates/generator.html 2008-10-26 13:00:57 UTC (rev 1447) @@ -1,25 +1,26 @@ -$def with (generator_form) -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <link rel="shortcut icon" href="/static/favicon.ico" /> - <link rel="icon" href="/static/favicon.ico" /> - <title>pygccxml & py++ demo</title> -</head> -<body> - <h2>pygccxml & py++ demo</h2> - $:generator_form.render() - <a> </a> - <span style="float : left; padding-left : 10px; width : 18%;"> - <br/> - <label style="width:100;">What is ... ?</label> - <dt> - <dd><a href="http://www.language-binding.net">py++</a></dd> - <dd><a href="http://www.language-binding.net">pygccxml</a></dd> - </dt> - <label style="width:100;">Adsense placeholder</label> - <textarea name="adsense" rows="15" style="width:100;">jjjjjjjjjjjjjjjjjjjjjjjjjj</textarea> - </span> -</body> -</html> +$def with (generator_form) +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <link rel="shortcut icon" href="/static/favicon.ico" /> + <link rel="icon" href="/static/favicon.ico" /> + <!--link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="/static/generator.css"--> + <title>pygccxml & py++ demo</title> +</head> +<body> + <h2>pygccxml & py++ demo</h2> + $:generator_form.render() + <a> </a> + <span style="float : left; padding-left : 10px; width : 18%;"> + <br/> + <label style="width:100;">What is ... ?</label> + <dt> + <dd><a href="http://www.language-binding.net">py++</a></dd> + <dd><a href="http://www.language-binding.net">pygccxml</a></dd> + </dt> + <label style="width:100;">Adsense placeholder</label> + <textarea name="adsense" rows="15" style="width:100;">jjjjjjjjjjjjjjjjjjjjjjjjjj</textarea> + </span> +</body> +</html> Added: ui/web/textcha.py =================================================================== --- ui/web/textcha.py (rev 0) +++ ui/web/textcha.py 2008-10-26 13:00:57 UTC (rev 1447) @@ -0,0 +1,20 @@ +import re +import random +import config + +questions = { + 'Which programming language does the pygccxml project mainly use?' : re.compile( '\s*python\s*' ) +} + +question_keys = questions.keys() +question_keys_len = len(question_keys) + +def random_question(): + return question_keys[ random.randrange( question_keys_len ) ] + +def is_human( question, answer ): + if question not in questions: + return False + return questions[question].match( answer.lower() ) + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-12 15:46:52
|
Revision: 1559 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1559&view=rev Author: roman_yakovenko Date: 2009-01-12 15:46:44 +0000 (Mon, 12 Jan 2009) Log Message: ----------- updating web interface Modified Paths: -------------- ui/web/static/generator.css ui/web/templates/generator_tmpl.html ui/web/web.zip Added Paths: ----------- ui/web/static/tabber.css ui/web/static/tabber.js Removed Paths: ------------- ui/web/templates/generated.html ui/web/templates/generator.html Modified: ui/web/static/generator.css =================================================================== --- ui/web/static/generator.css 2009-01-11 21:17:40 UTC (rev 1558) +++ ui/web/static/generator.css 2009-01-12 15:46:44 UTC (rev 1559) @@ -11,3 +11,21 @@ border: 2px solid #000000; padding: 3px 2px; } + +form{ + max-width: 19cm; +} + +textarea{ + margin-top: 3px; + margin-right: 5px; + margin-left: 5px; + margin-bottom: 3px; +} + +input{ + margin-top: 5px; + margin-right: 5px; + margin-left: 5px; + margin-bottom: 5px; +} Added: ui/web/static/tabber.css =================================================================== --- ui/web/static/tabber.css (rev 0) +++ ui/web/static/tabber.css 2009-01-12 15:46:44 UTC (rev 1559) @@ -0,0 +1,99 @@ +/* $Id: example.css,v 1.5 2006/03/27 02:44:36 pat Exp $ */ + +/*-------------------------------------------------- + REQUIRED to hide the non-active tab content. + But do not hide them in the print stylesheet! + --------------------------------------------------*/ +.tabberlive .tabbertabhide { + display:none; +} + +/*-------------------------------------------------- + .tabber = before the tabber interface is set up + .tabberlive = after the tabber interface is set up + --------------------------------------------------*/ +.tabber { +} +.tabberlive { + margin-top:1em; +} + +/*-------------------------------------------------- + ul.tabbernav = the tab navigation list + li.tabberactive = the active tab + --------------------------------------------------*/ +ul.tabbernav +{ + margin:0; + padding: 3px 0; + border-bottom: 1px solid #778; + font: bold 12px Verdana, sans-serif; +} + +ul.tabbernav li +{ + list-style: none; + margin: 0; + display: inline; +} + +ul.tabbernav li a +{ + padding: 3px 0.5em; + margin-right: 3px; + border: 1px solid #778; + border-bottom: none; + background: #DDE; + text-decoration: none; +} + +ul.tabbernav li a:link { color: #448; } +ul.tabbernav li a:visited { color: #667; } + +ul.tabbernav li a:hover +{ + color: #000; + background: #AAE; + border-color: #227; +} + +ul.tabbernav li.tabberactive a +{ + background-color: #fff; + border-bottom: 1px solid #fff; +} + +ul.tabbernav li.tabberactive a:hover +{ + color: #000; + background: white; + border-bottom: 1px solid white; +} + +/*-------------------------------------------------- + .tabbertab = the tab content + Add style only after the tabber interface is set up (.tabberlive) + --------------------------------------------------*/ +.tabberlive .tabbertab { + padding:5px; + border:1px solid #aaa; + border-top:0; + + /* If you don't want the tab size changing whenever a tab is changed + you can set a fixed height */ + + /* height:200px; */ + + /* If you set a fix height set overflow to auto and you will get a + scrollbar when necessary */ + + /* overflow:auto; */ +} + +/* If desired, hide the heading since a heading is provided by the tab */ +.tabberlive .tabbertab h2 { + display:none; +} +.tabberlive .tabbertab h3 { + display:none; +} Added: ui/web/static/tabber.js =================================================================== --- ui/web/static/tabber.js (rev 0) +++ ui/web/static/tabber.js 2009-01-12 15:46:44 UTC (rev 1559) @@ -0,0 +1,523 @@ +/*================================================== + $Id: tabber.js,v 1.9 2006/04/27 20:51:51 pat Exp $ + tabber.js by Patrick Fitzgerald pa...@ba... + + Documentation can be found at the following URL: + http://www.barelyfitz.com/projects/tabber/ + + License (http://www.opensource.org/licenses/mit-license.php) + + Copyright (c) 2006 Patrick Fitzgerald + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + ==================================================*/ + +function tabberObj(argsObj) +{ + var arg; /* name of an argument to override */ + + /* Element for the main tabber div. If you supply this in argsObj, + then the init() method will be called. + */ + this.div = null; + + /* Class of the main tabber div */ + this.classMain = "tabber"; + + /* Rename classMain to classMainLive after tabifying + (so a different style can be applied) + */ + this.classMainLive = "tabberlive"; + + /* Class of each DIV that contains a tab */ + this.classTab = "tabbertab"; + + /* Class to indicate which tab should be active on startup */ + this.classTabDefault = "tabbertabdefault"; + + /* Class for the navigation UL */ + this.classNav = "tabbernav"; + + /* When a tab is to be hidden, instead of setting display='none', we + set the class of the div to classTabHide. In your screen + stylesheet you should set classTabHide to display:none. In your + print stylesheet you should set display:block to ensure that all + the information is printed. + */ + this.classTabHide = "tabbertabhide"; + + /* Class to set the navigation LI when the tab is active, so you can + use a different style on the active tab. + */ + this.classNavActive = "tabberactive"; + + /* Elements that might contain the title for the tab, only used if a + title is not specified in the TITLE attribute of DIV classTab. + */ + this.titleElements = ['h2','h3','h4','h5','h6']; + + /* Should we strip out the HTML from the innerHTML of the title elements? + This should usually be true. + */ + this.titleElementsStripHTML = true; + + /* If the user specified the tab names using a TITLE attribute on + the DIV, then the browser will display a tooltip whenever the + mouse is over the DIV. To prevent this tooltip, we can remove the + TITLE attribute after getting the tab name. + */ + this.removeTitle = true; + + /* If you want to add an id to each link set this to true */ + this.addLinkId = false; + + /* If addIds==true, then you can set a format for the ids. + <tabberid> will be replaced with the id of the main tabber div. + <tabnumberzero> will be replaced with the tab number + (tab numbers starting at zero) + <tabnumberone> will be replaced with the tab number + (tab numbers starting at one) + <tabtitle> will be replaced by the tab title + (with all non-alphanumeric characters removed) + */ + this.linkIdFormat = '<tabberid>nav<tabnumberone>'; + + /* You can override the defaults listed above by passing in an object: + var mytab = new tabber({property:value,property:value}); + */ + for (arg in argsObj) { this[arg] = argsObj[arg]; } + + /* Create regular expressions for the class names; Note: if you + change the class names after a new object is created you must + also change these regular expressions. + */ + this.REclassMain = new RegExp('\\b' + this.classMain + '\\b', 'gi'); + this.REclassMainLive = new RegExp('\\b' + this.classMainLive + '\\b', 'gi'); + this.REclassTab = new RegExp('\\b' + this.classTab + '\\b', 'gi'); + this.REclassTabDefault = new RegExp('\\b' + this.classTabDefault + '\\b', 'gi'); + this.REclassTabHide = new RegExp('\\b' + this.classTabHide + '\\b', 'gi'); + + /* Array of objects holding info about each tab */ + this.tabs = new Array(); + + /* If the main tabber div was specified, call init() now */ + if (this.div) { + + this.init(this.div); + + /* We don't need the main div anymore, and to prevent a memory leak + in IE, we must remove the circular reference between the div + and the tabber object. */ + this.div = null; + } +} + + +/*-------------------------------------------------- + Methods for tabberObj + --------------------------------------------------*/ + + +tabberObj.prototype.init = function(e) +{ + /* Set up the tabber interface. + + e = element (the main containing div) + + Example: + init(document.getElementById('mytabberdiv')) + */ + + var + childNodes, /* child nodes of the tabber div */ + i, i2, /* loop indices */ + t, /* object to store info about a single tab */ + defaultTab=0, /* which tab to select by default */ + DOM_ul, /* tabbernav list */ + DOM_li, /* tabbernav list item */ + DOM_a, /* tabbernav link */ + aId, /* A unique id for DOM_a */ + headingElement; /* searching for text to use in the tab */ + + /* Verify that the browser supports DOM scripting */ + if (!document.getElementsByTagName) { return false; } + + /* If the main DIV has an ID then save it. */ + if (e.id) { + this.id = e.id; + } + + /* Clear the tabs array (but it should normally be empty) */ + this.tabs.length = 0; + + /* Loop through an array of all the child nodes within our tabber element. */ + childNodes = e.childNodes; + for(i=0; i < childNodes.length; i++) { + + /* Find the nodes where class="tabbertab" */ + if(childNodes[i].className && + childNodes[i].className.match(this.REclassTab)) { + + /* Create a new object to save info about this tab */ + t = new Object(); + + /* Save a pointer to the div for this tab */ + t.div = childNodes[i]; + + /* Add the new object to the array of tabs */ + this.tabs[this.tabs.length] = t; + + /* If the class name contains classTabDefault, + then select this tab by default. + */ + if (childNodes[i].className.match(this.REclassTabDefault)) { + defaultTab = this.tabs.length-1; + } + } + } + + /* Create a new UL list to hold the tab headings */ + DOM_ul = document.createElement("ul"); + DOM_ul.className = this.classNav; + + /* Loop through each tab we found */ + for (i=0; i < this.tabs.length; i++) { + + t = this.tabs[i]; + + /* Get the label to use for this tab: + From the title attribute on the DIV, + Or from one of the this.titleElements[] elements, + Or use an automatically generated number. + */ + t.headingText = t.div.title; + + /* Remove the title attribute to prevent a tooltip from appearing */ + if (this.removeTitle) { t.div.title = ''; } + + if (!t.headingText) { + + /* Title was not defined in the title of the DIV, + So try to get the title from an element within the DIV. + Go through the list of elements in this.titleElements + (typically heading elements ['h2','h3','h4']) + */ + for (i2=0; i2<this.titleElements.length; i2++) { + headingElement = t.div.getElementsByTagName(this.titleElements[i2])[0]; + if (headingElement) { + t.headingText = headingElement.innerHTML; + if (this.titleElementsStripHTML) { + t.headingText.replace(/<br>/gi," "); + t.headingText = t.headingText.replace(/<[^>]+>/g,""); + } + break; + } + } + } + + if (!t.headingText) { + /* Title was not found (or is blank) so automatically generate a + number for the tab. + */ + t.headingText = i + 1; + } + + /* Create a list element for the tab */ + DOM_li = document.createElement("li"); + + /* Save a reference to this list item so we can later change it to + the "active" class */ + t.li = DOM_li; + + /* Create a link to activate the tab */ + DOM_a = document.createElement("a"); + DOM_a.appendChild(document.createTextNode(t.headingText)); + DOM_a.href = "javascript:void(null);"; + DOM_a.title = t.headingText; + DOM_a.onclick = this.navClick; + + /* Add some properties to the link so we can identify which tab + was clicked. Later the navClick method will need this. + */ + DOM_a.tabber = this; + DOM_a.tabberIndex = i; + + /* Do we need to add an id to DOM_a? */ + if (this.addLinkId && this.linkIdFormat) { + + /* Determine the id name */ + aId = this.linkIdFormat; + aId = aId.replace(/<tabberid>/gi, this.id); + aId = aId.replace(/<tabnumberzero>/gi, i); + aId = aId.replace(/<tabnumberone>/gi, i+1); + aId = aId.replace(/<tabtitle>/gi, t.headingText.replace(/[^a-zA-Z0-9\-]/gi, '')); + + DOM_a.id = aId; + } + + /* Add the link to the list element */ + DOM_li.appendChild(DOM_a); + + /* Add the list element to the list */ + DOM_ul.appendChild(DOM_li); + } + + /* Add the UL list to the beginning of the tabber div */ + e.insertBefore(DOM_ul, e.firstChild); + + /* Make the tabber div "live" so different CSS can be applied */ + e.className = e.className.replace(this.REclassMain, this.classMainLive); + + /* Activate the default tab, and do not call the onclick handler */ + this.tabShow(defaultTab); + + /* If the user specified an onLoad function, call it now. */ + if (typeof this.onLoad == 'function') { + this.onLoad({tabber:this}); + } + + return this; +}; + + +tabberObj.prototype.navClick = function(event) +{ + /* This method should only be called by the onClick event of an <A> + element, in which case we will determine which tab was clicked by + examining a property that we previously attached to the <A> + element. + + Since this was triggered from an onClick event, the variable + "this" refers to the <A> element that triggered the onClick + event (and not to the tabberObj). + + When tabberObj was initialized, we added some extra properties + to the <A> element, for the purpose of retrieving them now. Get + the tabberObj object, plus the tab number that was clicked. + */ + + var + rVal, /* Return value from the user onclick function */ + a, /* element that triggered the onclick event */ + self, /* the tabber object */ + tabberIndex, /* index of the tab that triggered the event */ + onClickArgs; /* args to send the onclick function */ + + a = this; + if (!a.tabber) { return false; } + + self = a.tabber; + tabberIndex = a.tabberIndex; + + /* Remove focus from the link because it looks ugly. + I don't know if this is a good idea... + */ + a.blur(); + + /* If the user specified an onClick function, call it now. + If the function returns false then do not continue. + */ + if (typeof self.onClick == 'function') { + + onClickArgs = {'tabber':self, 'index':tabberIndex, 'event':event}; + + /* IE uses a different way to access the event object */ + if (!event) { onClickArgs.event = window.event; } + + rVal = self.onClick(onClickArgs); + if (rVal === false) { return false; } + } + + self.tabShow(tabberIndex); + + return false; +}; + + +tabberObj.prototype.tabHideAll = function() +{ + var i; /* counter */ + + /* Hide all tabs and make all navigation links inactive */ + for (i = 0; i < this.tabs.length; i++) { + this.tabHide(i); + } +}; + + +tabberObj.prototype.tabHide = function(tabberIndex) +{ + var div; + + if (!this.tabs[tabberIndex]) { return false; } + + /* Hide a single tab and make its navigation link inactive */ + div = this.tabs[tabberIndex].div; + + /* Hide the tab contents by adding classTabHide to the div */ + if (!div.className.match(this.REclassTabHide)) { + div.className += ' ' + this.classTabHide; + } + this.navClearActive(tabberIndex); + + return this; +}; + + +tabberObj.prototype.tabShow = function(tabberIndex) +{ + /* Show the tabberIndex tab and hide all the other tabs */ + + var div; + + if (!this.tabs[tabberIndex]) { return false; } + + /* Hide all the tabs first */ + this.tabHideAll(); + + /* Get the div that holds this tab */ + div = this.tabs[tabberIndex].div; + + /* Remove classTabHide from the div */ + div.className = div.className.replace(this.REclassTabHide, ''); + + /* Mark this tab navigation link as "active" */ + this.navSetActive(tabberIndex); + + /* If the user specified an onTabDisplay function, call it now. */ + if (typeof this.onTabDisplay == 'function') { + this.onTabDisplay({'tabber':this, 'index':tabberIndex}); + } + + return this; +}; + +tabberObj.prototype.navSetActive = function(tabberIndex) +{ + /* Note: this method does *not* enforce the rule + that only one nav item can be active at a time. + */ + + /* Set classNavActive for the navigation list item */ + this.tabs[tabberIndex].li.className = this.classNavActive; + + return this; +}; + + +tabberObj.prototype.navClearActive = function(tabberIndex) +{ + /* Note: this method does *not* enforce the rule + that one nav should always be active. + */ + + /* Remove classNavActive from the navigation list item */ + this.tabs[tabberIndex].li.className = ''; + + return this; +}; + + +/*==================================================*/ + + +function tabberAutomatic(tabberArgs) +{ + /* This function finds all DIV elements in the document where + class=tabber.classMain, then converts them to use the tabber + interface. + + tabberArgs = an object to send to "new tabber()" + */ + var + tempObj, /* Temporary tabber object */ + divs, /* Array of all divs on the page */ + i; /* Loop index */ + + if (!tabberArgs) { tabberArgs = {}; } + + /* Create a tabber object so we can get the value of classMain */ + tempObj = new tabberObj(tabberArgs); + + /* Find all DIV elements in the document that have class=tabber */ + + /* First get an array of all DIV elements and loop through them */ + divs = document.getElementsByTagName("div"); + for (i=0; i < divs.length; i++) { + + /* Is this DIV the correct class? */ + if (divs[i].className && + divs[i].className.match(tempObj.REclassMain)) { + + /* Now tabify the DIV */ + tabberArgs.div = divs[i]; + divs[i].tabber = new tabberObj(tabberArgs); + } + } + + return this; +} + + +/*==================================================*/ + + +function tabberAutomaticOnLoad(tabberArgs) +{ + /* This function adds tabberAutomatic to the window.onload event, + so it will run after the document has finished loading. + */ + var oldOnLoad; + + if (!tabberArgs) { tabberArgs = {}; } + + /* Taken from: http://simon.incutio.com/archive/2004/05/26/addLoadEvent */ + + oldOnLoad = window.onload; + if (typeof window.onload != 'function') { + window.onload = function() { + tabberAutomatic(tabberArgs); + }; + } else { + window.onload = function() { + oldOnLoad(); + tabberAutomatic(tabberArgs); + }; + } +} + + +/*==================================================*/ + + +/* Run tabberAutomaticOnload() unless the "manualStartup" option was specified */ + +if (typeof tabberOptions == 'undefined') { + + tabberAutomaticOnLoad(); + +} else { + + if (!tabberOptions['manualStartup']) { + tabberAutomaticOnLoad(tabberOptions); + } + +} Deleted: ui/web/templates/generated.html =================================================================== --- ui/web/templates/generated.html 2009-01-11 21:17:40 UTC (rev 1558) +++ ui/web/templates/generated.html 2009-01-12 15:46:44 UTC (rev 1559) @@ -1,36 +0,0 @@ -$def with (code, warnings) -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <link rel="shortcut icon" href="/static/favicon.ico" /> - <link rel="icon" href="/static/favicon.ico" /> - <!--link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="/static/generator.css"--> - <title>pygccxml & py++ demo - generated code</title> -</head> -<body> - <h2>pygccxml & py++ demo - generated code</h2> - <span style="width:80%; float:left;"> - <label>Generated code:</label> - <br/> - <textarea name="generated_code" rows="20" readonly="true" style="width:100%;">$:code</textarea> - </span> - <a> </a> - <span style="float : left; padding-left : 10px; width : 18%;"> - <br/> - <label style="width:100%;">What is ... ?</label> - <dt> - <dd><a href="http://www.language-binding.net">py++</a></dd> - <dd><a href="http://www.language-binding.net">pygccxml</a></dd> - </dt> - <label style="width:100%;">Adsense placeholder</label> - <textarea name="adsense" rows="15" style="width:100;">jjjjjjjjjjjjjjjjjjjjjjjjjj</textarea> - </span> - <span style="width:100%;"> - <br/> - <label>Warnings:</label> - <br/> - <textarea name="warnings" rows="15" readonly="true" style="width:100%;">$:warnings</textarea> - </span> -</body> -</html> Deleted: ui/web/templates/generator.html =================================================================== --- ui/web/templates/generator.html 2009-01-11 21:17:40 UTC (rev 1558) +++ ui/web/templates/generator.html 2009-01-12 15:46:44 UTC (rev 1559) @@ -1,26 +0,0 @@ -$def with (generator_form) -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <link rel="shortcut icon" href="/static/favicon.ico" /> - <link rel="icon" href="/static/favicon.ico" /> - <!--link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="/static/generator.css"--> - <title>pygccxml & py++ demo</title> -</head> -<body> - <h2>pygccxml & py++ demo</h2> - $:generator_form.render() - <a> </a> - <span style="float : left; padding-left : 10px; width : 18%;"> - <br/> - <label style="width:100;">What is ... ?</label> - <dt> - <dd><a href="http://www.language-binding.net">py++</a></dd> - <dd><a href="http://www.language-binding.net">pygccxml</a></dd> - </dt> - <label style="width:100;">Adsense placeholder</label> - <textarea name="adsense" rows="15" style="width:100;">jjjjjjjjjjjjjjjjjjjjjjjjjj</textarea> - </span> -</body> -</html> Modified: ui/web/templates/generator_tmpl.html =================================================================== --- ui/web/templates/generator_tmpl.html 2009-01-11 21:17:40 UTC (rev 1558) +++ ui/web/templates/generator_tmpl.html 2009-01-12 15:46:44 UTC (rev 1559) @@ -1,34 +1,79 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <link rel="shortcut icon" href="/static/favicon.ico" /> - <link rel="icon" href="/static/favicon.ico" /> - <title>pygccxml & py++ demo</title> -</head> -<body> - <h2>pygccxml & py++ demo</h2> - <form action="/generated.html" method="post" id="SourceCodeForm" style="width:80%; float:left;"> - <label>Source code:</label> - <br/> - <textarea name="source_code" rows="20" style="width:100%;"></textarea> - <br/> - <input type="submit" name="show_decls" value="Show declarations" /> - <a></a> - <input type="submit" name="generate_bp" value="Generate Boost.Python code" /> - <a></a> - <input type="submit" name="generate_pypp" value="Generate Py++ code" /> - </form> - <a> </a> - <span style="float : left; padding-left : 10px; width : 18%;"> - <br/> - <label style="width:100;">What is ... ?</label> - <dt> - <dd><a href="http://www.language-binding.net">py++</a></dd> - <dd><a href="http://www.language-binding.net">pygccxml</a></dd> - </dt> - <label style="width:100;">Adsense placeholder</label> - <textarea name="adsense" rows="15" style="width:100;">jjjjjjjjjjjjjjjjjjjjjjjjjj</textarea> - </span> -</body> -</html> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <link rel="shortcut icon" href="/static/favicon.ico" /> + <link rel="icon" href="/static/favicon.ico" /> + <link rel="stylesheet" href="/static/tabber.css" type="text/css" media="screen"/> + <link rel="stylesheet" href="/static/generator.css" type="text/css" media="screen"/> + <script type="text/javascript" src="tabber.js"></script> + <title>pygccxml & py++ demo</title> +</head> +<body> + <h2>pygccxml & py++ demo</h2> + <form action="/generated.html" method="post" id="SourceCodeForm"> + <p>In the following tabs you can configurate GCC-XML compiler. It is not a must</p> + <div class="tabber"> + <div class="tabbertab"> + <h2>Include directories</h2> + <p>List include directories( each directory on the new line ):</p> + <textarea name="COMPILER_INCLUDE_DIRECTORIES" rows="5" cols="80" style="margin-left: 5mm" ></textarea> + </div> + <div class="tabbertab"> + <h2>Preprocessor definitions</h2> + <p>Configure preprocessor ( define -D"HAS_XYZ=1" or undefine -U"_DEBUG" ):</p> + <textarea name="COMPILER_PREPROCESSOR_DEFINITIONS" rows="5" cols="80" style="margin-left: 5mm" ></textarea> + </div> + <div class="tabbertab"> + <h2>Advance</h2> + <p>Define GCC-XML command line arguments:</p> + <textarea name="COMPILER_CMD_ARGS" rows="5" cols="80" style="margin-left: 5mm"></textarea> + </div> + </div> + <p>Add some text that describes purpose of the "Text" and "File"</p> + <div class="tabber"> + <div class="tabbertab"> + <h2>pygccxml demonstration</h2> + <p></p> + <input type="radio" name="GCCXML_TAKE_CODE_FROM" value="file" checked="checked" />Header file:<br/> + <input type="file" name="GCCXML_FILE_NAME" size="90" style="margin-left: 5mm" /><br/> + <input type="radio" name="GCCXML_TAKE_CODE_FROM" value="text"/>Code:<br/> + <textarea name="GCCXML_SOURCE_CODE" rows="15" cols="80" style="margin-left: 5mm"></textarea> + <br/> + <hr /> + <input type="submit" name="VIEW_XML" value="View XML" /> + <a></a> + <input type="submit" name="VIEW_DECLS" value="View declarations tree" /> + </div> + <div class="tabbertab"> + <h2>Boost.Python code generator</h2> + <p></p> + <input type="radio" name="BP_TAKE_CODE_FROM" value="file" checked="checked" />Header file:<br/> + <input type="file" name="BP_FILE_NAME" size="90" style="margin-left: 5mm" /><br/> + <input type="radio" name="BP_TAKE_CODE_FROM" value="text"/>Code:<br/> + <textarea name="BP_SOURCE_CODE" rows="15" cols="80" style="margin-left: 5mm"></textarea> + <br/> + <hr /> + <input type="submit" name="GENERATE_BP_CODE" value="Generate code" /> + <a></a> + <input type="submit" name="GENERATE_BP_PYPP_CODE" value="Generate Py++ code" /> + </div> + <div class="tabbertab"> + <h2>ctypes code generator</h2> + <p></p> + <a>Dynamic/shared library path:</a> + <input type="file" name="CTYPES_SHLIB_FILE_NAME" size="90" style="margin-left: 5mm" /><br/> + <input type="radio" name="CTYPES_TAKE_CODE_FROM" value="file" checked="checked" />Header file:<br/> + <input type="file" name="CTYPES_FILE_NAME" size="90" style="margin-left: 5mm" /><br/> + <input type="radio" name="CTYPES_TAKE_CODE_FROM" value="text"/>Code:<br/> + <textarea name="CTYPES_SOURCE_CODE" rows="15" cols="80" style="margin-left: 5mm"></textarea> + <br/> + <hr /> + <input type="submit" name="GENERATE_CTYPES_CODE" value="Generate code" /> + <a></a> + <input type="submit" name="GENERATE_CTYPES_PYPP_CODE" value="Generate Py++ code" /> + </div> + </div> + </form> +</body> +</html> Modified: ui/web/web.zip =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-12 15:57:27
|
Revision: 1560 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1560&view=rev Author: roman_yakovenko Date: 2009-01-12 15:57:21 +0000 (Mon, 12 Jan 2009) Log Message: ----------- updating web interface Modified Paths: -------------- ui/web/main.py ui/web/templates/generator_tmpl.html Modified: ui/web/main.py =================================================================== --- ui/web/main.py 2009-01-12 15:46:44 UTC (rev 1559) +++ ui/web/main.py 2009-01-12 15:57:21 UTC (rev 1560) @@ -13,9 +13,12 @@ class generator: def GET(self, name=None): - form = forms.generator_t(action='/generated.html') - return render.generator(form) + generator = web.template.frender('templates/generator_tmpl.html') + return generator() + #~ form = forms.generator_t(action='/generated.html') + #~ return render.generator(form) + class generated: def POST(self, r_url=None ): form = forms.generator_t( action='', code_generator=code_generator.manager_t() ) Modified: ui/web/templates/generator_tmpl.html =================================================================== --- ui/web/templates/generator_tmpl.html 2009-01-12 15:46:44 UTC (rev 1559) +++ ui/web/templates/generator_tmpl.html 2009-01-12 15:57:21 UTC (rev 1560) @@ -2,11 +2,11 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <link rel="shortcut icon" href="/static/favicon.ico" /> - <link rel="icon" href="/static/favicon.ico" /> - <link rel="stylesheet" href="/static/tabber.css" type="text/css" media="screen"/> - <link rel="stylesheet" href="/static/generator.css" type="text/css" media="screen"/> - <script type="text/javascript" src="tabber.js"></script> + <link rel="shortcut icon" href="static/favicon.ico" /> + <link rel="icon" href="static/favicon.ico" /> + <link rel="stylesheet" href="static/tabber.css" type="text/css" media="screen"/> + <link rel="stylesheet" href="static/generator.css" type="text/css" media="screen"/> + <script type="text/javascript" src="static/tabber.js"></script> <title>pygccxml & py++ demo</title> </head> <body> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-13 15:36:50
|
Revision: 1566 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1566&view=rev Author: roman_yakovenko Date: 2009-01-13 15:36:40 +0000 (Tue, 13 Jan 2009) Log Message: ----------- more changes to WEB UI Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/decl_printer.py pyplusplus_dev/unittests/ctypes_pof_tester.py ui/web/code_generator.py ui/web/config.py ui/web/forms.py ui/web/main.py ui/web/templates/generated_tmpl.html Added Paths: ----------- ui/web/wizard.py Modified: pygccxml_dev/pygccxml/declarations/decl_printer.py =================================================================== --- pygccxml_dev/pygccxml/declarations/decl_printer.py 2009-01-12 22:33:13 UTC (rev 1565) +++ pygccxml_dev/pygccxml/declarations/decl_printer.py 2009-01-13 15:36:40 UTC (rev 1566) @@ -259,7 +259,8 @@ def visit_variable(self ): self.print_decl_header() curr_level = self.level + 1 - self.writer( ' ' * curr_level * self.INDENT_SIZE + 'type: %s value: %s'%(self.__inst.type.decl_string, self.__inst.value) + os.linesep) + self.writer( ' ' * curr_level * self.INDENT_SIZE + 'type: %s' % self.__inst.type.decl_string + os.linesep) + self.writer( ' ' * curr_level * self.INDENT_SIZE + 'value: %s' % self.__inst.value + os.linesep) if self.__print_details: byte_size = 'size: %d'%(self.__inst.type.byte_size) self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_size.ljust( self.JUSTIFY ) + os.linesep) Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-12 22:33:13 UTC (rev 1565) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-13 15:36:40 UTC (rev 1566) @@ -141,15 +141,15 @@ udt = self.module_ref.create() self.failUnless( 1977 == self.module_ref.read_user_data(udt) ) self.module_ref.destroy( udt ) - - + + def create_suite(): suite = unittest.TestSuite() if 'win' in sys.platform: suite.addTest( unittest.makeSuite(pof_tester_t)) suite.addTest( unittest.makeSuite(issues_tester_t)) - #suite.addTest( unittest.makeSuite(enums_tester_t)) + suite.addTest( unittest.makeSuite(enums_tester_t)) suite.addTest( unittest.makeSuite(opaque_tester_t)) return suite Modified: ui/web/code_generator.py =================================================================== --- ui/web/code_generator.py 2009-01-12 22:33:13 UTC (rev 1565) +++ ui/web/code_generator.py 2009-01-13 15:36:40 UTC (rev 1566) @@ -6,34 +6,33 @@ from pyplusplus import module_builder class manager_t: - def __init__( self ): - pass - def show_declarations( self, source_code ): + def show_declarations( self, file_configuration ): try: - reader = parser.source_reader_t( config=config.gccxml ) - decls = reader.read_string( source_code ) + reader = parser.project_reader_t( config=config.gccxml ) + decls = reader.read_files( [file_configuration] ) global_ns = declarations.get_global_namespace( decls ) tmp = [] - declarations.print_declarations( decls, verbose=False, writer=lambda x: tmp.append( x ) ) - return '\n'.join( tmp ) + declarations.print_declarations( decls, verbose=False, writer=lambda x: tmp.append( x.rstrip() ) ) + print os.linesep.join( tmp ) + return os.linesep.join( tmp ), '' except Exception, error: user_msg = [ 'Error occured during code generation process!' ] user_msg.append( 'Error:' ) user_msg.append( str( error ) ) - return '\n'.join( user_msg ) + return '', '\n'.join( user_msg ) def generate_pypp_code( self, source_code ): return "import pyplusplus" - def generate_bpl_code( self, source_code ): + def generate_bpl_code( self, file_configuration ): try: _logging_.loggers.make_inmemory() - - f = parser.create_text_fc( source_code ) - mb = module_builder.module_builder_t( [ f ] - , gccxml_path=config.gccxml.gccxml_path ) + + mb = module_builder.module_builder_t( [ file_configuration ] + , gccxml_path=config.gccxml.gccxml_path + , compiler=config.gccxml.compiler) mb.decls( header_dir=config.temp_dir ).include() mb.build_code_creator( "pyplusplus" ) code = mb.code_creator.create() @@ -41,12 +40,12 @@ code = code.replace( '\r\n', '\n' ) warnings = _logging_.loggers.stream.getvalue() _logging_.loggers.stream.close() - return code, warnings + return code, warnings except Exception, error: user_msg = [ 'Error occured during code generation process!' ] user_msg.append( 'Error:' ) user_msg.append( str( error ) ) - return '\n'.join( user_msg ) + return '', '\n'.join( user_msg ) if __name__ == '__main__': m = manager_t() Modified: ui/web/config.py =================================================================== --- ui/web/config.py 2009-01-12 22:33:13 UTC (rev 1565) +++ ui/web/config.py 2009-01-13 15:36:40 UTC (rev 1566) @@ -10,16 +10,16 @@ if os.path.exists( os.path.join( projects_root_dir, 'pygccxml_dev' ) ): sys.path.append( os.path.join( projects_root_dir, 'pygccxml_dev' ) ) -if os.path.exists( os.path.join( projects_root_dir, 'pyplusplus_dev' ) ): +if os.path.exists( os.path.join( projects_root_dir, 'pyplusplus_dev' ) ): sys.path.append( os.path.join( projects_root_dir, 'pyplusplus_dev' ) ) -#else use installed modules +#else use installed modules from pygccxml import parser from pyplusplus import module_builder gccxml_path = os.path.join( projects_root_dir, 'gccxml_bin', 'v09', sys.platform, 'bin' ) if os.path.exists( gccxml_path ): - gccxml = parser.config_t( gccxml_path=gccxml_path ) + gccxml = parser.config_t( gccxml_path=gccxml_path, compiler='msvc71' ) else: #use gccxml from PATH gccxml = parser.config_t() Modified: ui/web/forms.py =================================================================== --- ui/web/forms.py 2009-01-12 22:33:13 UTC (rev 1565) +++ ui/web/forms.py 2009-01-13 15:36:40 UTC (rev 1566) @@ -1,12 +1,13 @@ import config import web -import textcha +from pygccxml import parser +import wizard class Label(web.form.Input): tmpl = """<label name="%(name)s" %(atts)s>%(value)s</label>%(note)s""" def render(self): value = '' - if self.value is not None: + if self.value is not None: value = web.net.websafe(self.value) return self.tmpl % dict( name=web.net.websafe(self.name) , value=value @@ -43,49 +44,79 @@ if i.post: controls.append( i.post ) return self.tmpl % dict( attrs=self.render_addattrs(), inputs='\n'.join( controls ) ) - - -class generator_t( SimpleForm ): - def __init__( self, action, code_generator=None, method='post' ): + + +class generator_t: + def __init__( self, code_generator, input ): + self.__input = input self.__code_generator = code_generator - self.__show_decls = web.form.Button( 'Show declarations', type="submit" ) - self.__generate_bpl_code = web.form.Button( 'Generate Boost.Python code', type="submit" ) - self.__generate_pypp_code = web.form.Button( 'Generate Py++ code', id="generate_pypp_code", type="submit" ) - self.__source_code = web.form.Textarea( "source_code", rows="20", style="width:100%") - self.__textcha_question = web.form.Hidden( "textcha_question", value=textcha.random_question(), style="width:60%;", id='textcha-question') - self.__textcha_answer = web.form.Textbox( "textcha_answer", value="", style="width:40%;", maxlength="120", id='textcha-answer') - SimpleForm.__init__( self - , Label( 'source_code', value="Source code:" ) - , RawHTML( '<br/>' ) - , self.__source_code - , RawHTML( '<br/>' ) - , self.__textcha_question - , Label( 'textcha_question', value=self.__textcha_question.value ) - , self.__textcha_answer - , RawHTML( '<br/><br/>' ) - , self.__show_decls - , RawHTML( '<a></a>' ) - , self.__generate_bpl_code - , RawHTML( '<a></a>' ) - , self.__generate_pypp_code - , action=action - , method=method - , style="width:80%; float:left;" ) - - def process( self, request_data ): - warnings = '' - generated = '' - if not textcha.is_human( request_data[ self.__textcha_question.name], request_data[ self.__textcha_answer.name] ): - generated = warnings = "Please answer the question!" - return generated, warnings - source_code = request_data[ self.__source_code.name] - if self.__show_decls.name in request_data: - generated = self.__code_generator.show_declarations( source_code ) - elif self.__generate_pypp_code.name in request_data: - generated = self.__code_generator.generate_pypp_code( source_code ) - elif self.__generate_bpl_code.name in request_data: - generated, warnings = self.__code_generator.generate_bpl_code( source_code ) + self.__handlers = { + "VIEW_XML" : self.on_view_xml + , "VIEW_DECLS" : self.on_view_decls + , "GENERATE_BP_CODE" : self.on_generate_bp_code + , "GENERATE_BP_PYPP_CODE" : self.on_generate_bp_pypp_code + , "GENERATE_CTYPES_CODE" : self.on_generate_ctypes_code + , "GENERATE_CTYPES_PYPP_CODE" : self.on_generate_ctypes_pypp_code + } + + def __create_fc( self, prefix ): + fto_key = prefix + '_TAKE_CODE_FROM' + code_key = prefix + '_SOURCE_CODE' + file_key = prefix + '_FILE_NAME' + if self.__input[fto_key] == 'text': + return parser.create_text_fc( self.__input[ code_key ] ) else: - generated = 'error - unknown submit action' - return generated, warnings - + return parser.create_source_fc( self.__input[ file_key ] ) + + def on_view_xml( self ): + fc = self.__create_fc( 'GCCXML' ) + decls_tree, warnings = self.__code_generator.show_declarations( fc ) + return decls_tree, warnings + + def on_view_decls( self ): + fc = self.__create_fc( 'GCCXML' ) + decls_tree, warnings = self.__code_generator.show_declarations( fc ) + return decls_tree, warnings + + def on_generate_bp_code( self ): + fc = self.__create_fc( 'BP' ) + code, warnings = self.__code_generator.generate_bpl_code( fc ) + return code, warnings + + def on_generate_bp_pypp_code( self ): + w = wizard.wizard_t() + code = w.create_bpl_code( config.gccxml, self.__create_fc( 'BP' ) ) + return code, '' + + def on_generate_ctypes_code( self ): + pass + + def on_generate_ctypes_pypp_code( self ): + pass + + def not_found_handler( self ): + raise RuntimeError( 'Error - unknown submit action' ) + + def __select_handler( self ): + for key, handler in self.__handlers.iteritems(): + if key in self.__input: + return handler + else: + return self.not_found_handler + + def process( self ): + handler = self.__select_handler() + return handler() + + + #~ source_code = request_data[ self.__source_code.name] + #~ if self.__show_decls.name in request_data: + #~ generated = self.__code_generator.show_declarations( source_code ) + #~ elif self.__generate_pypp_code.name in request_data: + #~ generated = self.__code_generator.generate_pypp_code( source_code ) + #~ elif self.__generate_bpl_code.name in request_data: + #~ generated, warnings = self.__code_generator.generate_bpl_code( source_code ) + #~ else: + #~ generated = 'error - unknown submit action' + #~ return generated, warnings + Modified: ui/web/main.py =================================================================== --- ui/web/main.py 2009-01-12 22:33:13 UTC (rev 1565) +++ ui/web/main.py 2009-01-13 15:36:40 UTC (rev 1566) @@ -21,9 +21,10 @@ class generated: def POST(self, r_url=None ): - form = forms.generator_t( action='', code_generator=code_generator.manager_t() ) - generated, warnings = form.process( web.input() ) - return render.generated(generated, warnings) + form = forms.generator_t( code_generator.manager_t(), web.input() ) + generated_frender = web.template.frender('templates/generated_tmpl.html') + generated, warnings = form.process() + return generated_frender(generated, warnings) if __name__ == '__main__': app = web.application(urls, globals(), autoreload=True) Modified: ui/web/templates/generated_tmpl.html =================================================================== --- ui/web/templates/generated_tmpl.html 2009-01-12 22:33:13 UTC (rev 1565) +++ ui/web/templates/generated_tmpl.html 2009-01-13 15:36:40 UTC (rev 1566) @@ -1,28 +1,21 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <link rel="shortcut icon" href="/static/favicon.ico" /> - <link rel="icon" href="/static/favicon.ico" /> - <title>pygccxml & py++ demo - generated code</title> -</head> -<body> - <h2>pygccxml & py++ demo - generated code</h2> - <span style="width:80%; float:left;"> - <label>Generated code</label> - <br/> - <textarea name="generated_code" rows="20" readonly="true" style="width:100%;">hihi</textarea> - </span> - <a> </a> - <span style="float : left; padding-left : 10px; width : 18%;"> - <br/> - <label style="width:100;">What is ... ?</label> - <dt> - <dd><a href="http://www.language-binding.net">py++</a></dd> - <dd><a href="http://www.language-binding.net">pygccxml</a></dd> - </dt> - <label style="width:100;">Adsense placeholder</label> - <textarea name="adsense" rows="15" style="width:100;">jjjjjjjjjjjjjjjjjjjjjjjjjj</textarea> - </span> -</body> -</html> +$def with ( generated_code, warnings ) +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <link rel="shortcut icon" href="/static/favicon.ico" /> + <link rel="icon" href="/static/favicon.ico" /> + <title>pygccxml & py++ demo - generated code</title> +</head> +<body> + <h2>pygccxml & py++ demo - generated code</h2> + <label>Generated code</label> + <br/> + <textarea name="generated_code" rows="20" cols="180" readonly="true">$generated_code</textarea> + <br/> + <label>Warnings and Errors</label> + <br/> + <textarea name="generated_code" rows="20" cols="180" readonly="true">$warnings</textarea> + +</body> +</html> Added: ui/web/wizard.py =================================================================== --- ui/web/wizard.py (rev 0) +++ ui/web/wizard.py 2009-01-13 15:36:40 UTC (rev 1566) @@ -0,0 +1,81 @@ +"""generates Py++ code from the user data""" +import os +from pygccxml import parser + +BP_FILE_CODE_TEMPLATE = \ +""" +import os +from pyplusplus import module_builder + +#Creating an instance of class that will help you to expose your declarations +mb = module_builder.module_builder_t( [r"%(file_name)s"] + , gccxml_path=r"%(gccxml_path)s" + , include_paths=%(include_paths)s + , define_symbols=%(define_symbols)s ) + +#print all parsed declarations and some information about them +mb.print_declarations() + +#Py++ has smart algorithm, which automaticly selects what declarations should be +#exported, but of course you can change that. + +#building code creator. After this step you should not modify declarations. +mb.build_code_creator( module_name='pyplusplus' ) + +#writing code to file. +mb.write_module( './bindings.cpp' ) +""" + +BP_TEXT_CODE_TEMPLATE = \ +r''' +import os +import tempfile +from pygccxml import parser +from pyplusplus import module_builder + +code = \ +""" +%(text)s +""" + + +#Creating an instance of class that will help you to expose your declarations +mb = module_builder.module_builder_t( [parser.create_text_fc(code)] + , gccxml_path=r"%(gccxml_path)s" + , include_paths=%(include_paths)s + , define_symbols=%(define_symbols)s ) + +#print all parsed declarations and some information about them +mb.print_declarations() + +#select all declarations from the code fragment and export them +mb.decls( header_dir=tempfile.tempdir ).include() + +mb.add_declaration_code( code, tail=False ) + +#building code creator. After this step you should not modify declarations. +mb.build_code_creator( module_name='pyplusplus' ) + +#writing code to file. +mb.write_module( './bindings.cpp' ) +''' + +class wizard_t( object ): + """code generator that creates Py++ code""" + def __init__( self ): + object.__init__( self ) + + def create_bpl_code( self, gccxml_cfg, file_configuration ): + tmpl = None + substitute_dict = dict( gccxml_path=gccxml_cfg.gccxml_path + , include_paths=`gccxml_cfg.include_paths` + , define_symbols=`gccxml_cfg.define_symbols` ) + if file_configuration.content_type == file_configuration.CONTENT_TYPE.TEXT: + global BP_TEXT_CODE_TEMPLATE + tmpl = BP_TEXT_CODE_TEMPLATE + substitute_dict['text'] = '\n'.join( [ line.rstrip() for line in file_configuration.data.split('\n') ] ) + else: + global BP_FILE_CODE_TEMPLATE + tmpl = BP_FILE_CODE_TEMPLATE + substitute_dict['file_name'] = file_configuration.data + return tmpl % substitute_dict This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-14 09:53:49
|
Revision: 1570 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1570&view=rev Author: roman_yakovenko Date: 2009-01-14 09:53:39 +0000 (Wed, 14 Jan 2009) Log Message: ----------- adding ability to display generated XML Modified Paths: -------------- ui/web/code_generator.py ui/web/main.py ui/web/templates/generator_tmpl.html Added Paths: ----------- ui/web/form_processor.py Removed Paths: ------------- ui/web/forms.py Modified: ui/web/code_generator.py =================================================================== --- ui/web/code_generator.py 2009-01-14 09:50:52 UTC (rev 1569) +++ ui/web/code_generator.py 2009-01-14 09:53:39 UTC (rev 1570) @@ -4,9 +4,24 @@ from pyplusplus import _logging_ from pygccxml import declarations from pyplusplus import module_builder +import xml.sax.saxutils class manager_t: + def __init__( self ): + pass + def show_xml( self, file_configuration ): + try: + reader = parser.project_reader_t( config=config.gccxml ) + content = reader.read_xml( file_configuration ) + return content, '' + #return xml.sax.saxutils.escape( content ), '' + except Exception, error: + user_msg = [ 'Error occured during code generation process!' ] + user_msg.append( 'Error:' ) + user_msg.append( str( error ) ) + return '', '\n'.join( user_msg ) + def show_declarations( self, file_configuration ): try: reader = parser.project_reader_t( config=config.gccxml ) @@ -14,7 +29,6 @@ global_ns = declarations.get_global_namespace( decls ) tmp = [] declarations.print_declarations( decls, verbose=False, writer=lambda x: tmp.append( x.rstrip() ) ) - print os.linesep.join( tmp ) return os.linesep.join( tmp ), '' except Exception, error: user_msg = [ 'Error occured during code generation process!' ] Copied: ui/web/form_processor.py (from rev 1567, ui/web/forms.py) =================================================================== --- ui/web/form_processor.py (rev 0) +++ ui/web/form_processor.py 2009-01-14 09:53:39 UTC (rev 1570) @@ -0,0 +1,79 @@ +import config +import web +from pygccxml import parser +import wizard + +class generator_t: + def __init__( self, code_generator, input ): + self.__input = input + self.__code_generator = code_generator + self.__handlers = { + "VIEW_XML" : self.on_view_xml + , "VIEW_DECLS" : self.on_view_decls + , "GENERATE_BP_CODE" : self.on_generate_bp_code + , "GENERATE_BP_PYPP_CODE" : self.on_generate_bp_pypp_code + , "GENERATE_CTYPES_CODE" : self.on_generate_ctypes_code + , "GENERATE_CTYPES_PYPP_CODE" : self.on_generate_ctypes_pypp_code + } + + def __create_fc( self, prefix ): + fto_key = prefix + '_TAKE_CODE_FROM' + code_key = prefix + '_SOURCE_CODE' + file_key = prefix + '_FILE_NAME' + if self.__input[fto_key] == 'text': + return parser.create_text_fc( self.__input[ code_key ] ) + else: + return parser.create_source_fc( self.__input[ file_key ] ) + + def on_view_xml( self ): + fc = self.__create_fc( 'GCCXML' ) + decls_tree, warnings = self.__code_generator.show_xml( fc ) + return decls_tree, warnings + + def on_view_decls( self ): + fc = self.__create_fc( 'GCCXML' ) + decls_tree, warnings = self.__code_generator.show_declarations( fc ) + return decls_tree, warnings + + def on_generate_bp_code( self ): + fc = self.__create_fc( 'BP' ) + code, warnings = self.__code_generator.generate_bpl_code( fc ) + return code, warnings + + def on_generate_bp_pypp_code( self ): + w = wizard.wizard_t() + code = w.create_bpl_code( config.gccxml, self.__create_fc( 'BP' ) ) + return code, '' + + def on_generate_ctypes_code( self ): + pass + + def on_generate_ctypes_pypp_code( self ): + pass + + def not_found_handler( self ): + raise RuntimeError( 'Error - unknown submit action' ) + + def __select_handler( self ): + for key, handler in self.__handlers.iteritems(): + if key in self.__input: + return handler + else: + return self.not_found_handler + + def process( self ): + handler = self.__select_handler() + return handler() + + + #~ source_code = request_data[ self.__source_code.name] + #~ if self.__show_decls.name in request_data: + #~ generated = self.__code_generator.show_declarations( source_code ) + #~ elif self.__generate_pypp_code.name in request_data: + #~ generated = self.__code_generator.generate_pypp_code( source_code ) + #~ elif self.__generate_bpl_code.name in request_data: + #~ generated, warnings = self.__code_generator.generate_bpl_code( source_code ) + #~ else: + #~ generated = 'error - unknown submit action' + #~ return generated, warnings + Deleted: ui/web/forms.py =================================================================== --- ui/web/forms.py 2009-01-14 09:50:52 UTC (rev 1569) +++ ui/web/forms.py 2009-01-14 09:53:39 UTC (rev 1570) @@ -1,122 +0,0 @@ -import config -import web -from pygccxml import parser -import wizard - -class Label(web.form.Input): - tmpl = """<label name="%(name)s" %(atts)s>%(value)s</label>%(note)s""" - def render(self): - value = '' - if self.value is not None: - value = web.net.websafe(self.value) - return self.tmpl % dict( name=web.net.websafe(self.name) - , value=value - , atts=self.addatts() - , note=self.rendernote(self.note) ) - -class RawHTML(web.form.Input): - def __init__(self, html, *validators, **attrs): - web.form.Input.__init__( self, '', *validators, **attrs ) - self.__html = html - def render(self): - return self.__html - -class SimpleForm( web.form.Form ): - tmpl = """<form %(attrs)s>\n%(inputs)s\n</form>\n""" - def __init__(self, *inputs, **kw): - web.form.Form.__init__( self, *inputs, **kw ) - self.__kw = kw - self.__kw.pop( 'validators', None ) - - def render_addattrs( self ): - attrs = [] - for (n, v) in self.__kw.iteritems(): - attrs.append( ' %s="%s"' % (n, web.net.websafe(v)) ) - return ''.join( attrs ) - - def render( self ): - controls = [] - controls.append( self.rendernote(self.note) ) - for i in self.inputs: - if i.pre: - controls.append( i.pre ) - controls.append( i.render() ) - if i.post: - controls.append( i.post ) - return self.tmpl % dict( attrs=self.render_addattrs(), inputs='\n'.join( controls ) ) - - -class generator_t: - def __init__( self, code_generator, input ): - self.__input = input - self.__code_generator = code_generator - self.__handlers = { - "VIEW_XML" : self.on_view_xml - , "VIEW_DECLS" : self.on_view_decls - , "GENERATE_BP_CODE" : self.on_generate_bp_code - , "GENERATE_BP_PYPP_CODE" : self.on_generate_bp_pypp_code - , "GENERATE_CTYPES_CODE" : self.on_generate_ctypes_code - , "GENERATE_CTYPES_PYPP_CODE" : self.on_generate_ctypes_pypp_code - } - - def __create_fc( self, prefix ): - fto_key = prefix + '_TAKE_CODE_FROM' - code_key = prefix + '_SOURCE_CODE' - file_key = prefix + '_FILE_NAME' - if self.__input[fto_key] == 'text': - return parser.create_text_fc( self.__input[ code_key ] ) - else: - return parser.create_source_fc( self.__input[ file_key ] ) - - def on_view_xml( self ): - fc = self.__create_fc( 'GCCXML' ) - decls_tree, warnings = self.__code_generator.show_declarations( fc ) - return decls_tree, warnings - - def on_view_decls( self ): - fc = self.__create_fc( 'GCCXML' ) - decls_tree, warnings = self.__code_generator.show_declarations( fc ) - return decls_tree, warnings - - def on_generate_bp_code( self ): - fc = self.__create_fc( 'BP' ) - code, warnings = self.__code_generator.generate_bpl_code( fc ) - return code, warnings - - def on_generate_bp_pypp_code( self ): - w = wizard.wizard_t() - code = w.create_bpl_code( config.gccxml, self.__create_fc( 'BP' ) ) - return code, '' - - def on_generate_ctypes_code( self ): - pass - - def on_generate_ctypes_pypp_code( self ): - pass - - def not_found_handler( self ): - raise RuntimeError( 'Error - unknown submit action' ) - - def __select_handler( self ): - for key, handler in self.__handlers.iteritems(): - if key in self.__input: - return handler - else: - return self.not_found_handler - - def process( self ): - handler = self.__select_handler() - return handler() - - - #~ source_code = request_data[ self.__source_code.name] - #~ if self.__show_decls.name in request_data: - #~ generated = self.__code_generator.show_declarations( source_code ) - #~ elif self.__generate_pypp_code.name in request_data: - #~ generated = self.__code_generator.generate_pypp_code( source_code ) - #~ elif self.__generate_bpl_code.name in request_data: - #~ generated, warnings = self.__code_generator.generate_bpl_code( source_code ) - #~ else: - #~ generated = 'error - unknown submit action' - #~ return generated, warnings - Modified: ui/web/main.py =================================================================== --- ui/web/main.py 2009-01-14 09:50:52 UTC (rev 1569) +++ ui/web/main.py 2009-01-14 09:53:39 UTC (rev 1570) @@ -2,7 +2,7 @@ import sys import web -import forms +import form_processor import code_generator urls = ( "/", "generator" @@ -21,7 +21,7 @@ class generated: def POST(self, r_url=None ): - form = forms.generator_t( code_generator.manager_t(), web.input() ) + form = form_processor.generator_t( code_generator.manager_t(), web.input() ) generated_frender = web.template.frender('templates/generated_tmpl.html') generated, warnings = form.process() return generated_frender(generated, warnings) Modified: ui/web/templates/generator_tmpl.html =================================================================== --- ui/web/templates/generator_tmpl.html 2009-01-14 09:50:52 UTC (rev 1569) +++ ui/web/templates/generator_tmpl.html 2009-01-14 09:53:39 UTC (rev 1570) @@ -11,7 +11,7 @@ </head> <body> <h2>pygccxml & py++ demo</h2> - <form action="/generated.html" method="post" id="SourceCodeForm"> + <form action="/generated.html" method="post" name="CODE_GENERATOR_FORM"> <p>In the following tabs you can configurate GCC-XML compiler. It is not a must</p> <div class="tabber"> <div class="tabbertab"> @@ -36,7 +36,7 @@ <h2>pygccxml demonstration</h2> <p></p> <input type="radio" name="GCCXML_TAKE_CODE_FROM" value="file" checked="checked" />Header file:<br/> - <input type="file" name="GCCXML_FILE_NAME" size="90" style="margin-left: 5mm" /><br/> + <input type="text" name="GCCXML_FILE_NAME" size="80" style="margin-left: 5mm" /><br /> <input type="radio" name="GCCXML_TAKE_CODE_FROM" value="text"/>Code:<br/> <textarea name="GCCXML_SOURCE_CODE" rows="15" cols="80" style="margin-left: 5mm"></textarea> <br/> @@ -49,7 +49,7 @@ <h2>Boost.Python code generator</h2> <p></p> <input type="radio" name="BP_TAKE_CODE_FROM" value="file" checked="checked" />Header file:<br/> - <input type="file" name="BP_FILE_NAME" size="90" style="margin-left: 5mm" /><br/> + <input type="text" name="BP_FILE_NAME" size="80" style="margin-left: 5mm" <input type="radio" name="BP_TAKE_CODE_FROM" value="text"/>Code:<br/> <textarea name="BP_SOURCE_CODE" rows="15" cols="80" style="margin-left: 5mm"></textarea> <br/> @@ -62,9 +62,9 @@ <h2>ctypes code generator</h2> <p></p> <a>Dynamic/shared library path:</a> - <input type="file" name="CTYPES_SHLIB_FILE_NAME" size="90" style="margin-left: 5mm" /><br/> + <input type="text" name="CTYPES_SHLIB_FILE_NAME" size="80" style="margin-left: 5mm" /><br/> <input type="radio" name="CTYPES_TAKE_CODE_FROM" value="file" checked="checked" />Header file:<br/> - <input type="file" name="CTYPES_FILE_NAME" size="90" style="margin-left: 5mm" /><br/> + <input type="text" name="CTYPES_FILE_NAME" size="80" style="margin-left: 5mm" /><br/> <input type="radio" name="CTYPES_TAKE_CODE_FROM" value="text"/>Code:<br/> <textarea name="CTYPES_SOURCE_CODE" rows="15" cols="80" style="margin-left: 5mm"></textarea> <br/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-14 13:20:21
|
Revision: 1571 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1571&view=rev Author: roman_yakovenko Date: 2009-01-14 13:20:11 +0000 (Wed, 14 Jan 2009) Log Message: ----------- web ui - main success scenarios work! Modified Paths: -------------- ui/web/code_generator.py ui/web/form_processor.py ui/web/static/generator.css ui/web/templates/generator_tmpl.html Modified: ui/web/code_generator.py =================================================================== --- ui/web/code_generator.py 2009-01-14 09:53:39 UTC (rev 1570) +++ ui/web/code_generator.py 2009-01-14 13:20:11 UTC (rev 1571) @@ -4,6 +4,7 @@ from pyplusplus import _logging_ from pygccxml import declarations from pyplusplus import module_builder +from pyplusplus.module_builder import ctypes_module_builder_t import xml.sax.saxutils class manager_t: @@ -36,10 +37,6 @@ user_msg.append( str( error ) ) return '', '\n'.join( user_msg ) - - def generate_pypp_code( self, source_code ): - return "import pyplusplus" - def generate_bpl_code( self, file_configuration ): try: _logging_.loggers.make_inmemory() @@ -61,6 +58,26 @@ user_msg.append( str( error ) ) return '', '\n'.join( user_msg ) + def generate_ctypes_code( self, file_configuration, symbols_file ): + try: + _logging_.loggers.make_inmemory() + mb = ctypes_module_builder_t( [ file_configuration ], symbols_file, config.gccxml ) + mb.build_code_creator( symbols_file ) + code = mb.code_creator.create() + code = code.replace( '\n\r', '\n' ) + code = code.replace( '\r\n', '\n' ) + warnings = _logging_.loggers.stream.getvalue() + _logging_.loggers.stream.close() + return code, warnings + except Exception, error: + user_msg = [ 'Error occured during code generation process!' ] + user_msg.append( 'Error:' ) + user_msg.append( str( error ) ) + return '', '\n'.join( user_msg ) + + + + if __name__ == '__main__': m = manager_t() m.generate_bpl_code( 'int do_smth( int &);int do_smth( int, int);' ) Modified: ui/web/form_processor.py =================================================================== --- ui/web/form_processor.py 2009-01-14 09:53:39 UTC (rev 1570) +++ ui/web/form_processor.py 2009-01-14 13:20:11 UTC (rev 1571) @@ -10,8 +10,8 @@ self.__handlers = { "VIEW_XML" : self.on_view_xml , "VIEW_DECLS" : self.on_view_decls - , "GENERATE_BP_CODE" : self.on_generate_bp_code - , "GENERATE_BP_PYPP_CODE" : self.on_generate_bp_pypp_code + , "GENERATE_BP_CODE" : self.on_generate_bpl_code + , "GENERATE_BP_PYPP_CODE" : self.on_generate_bpl_pypp_code , "GENERATE_CTYPES_CODE" : self.on_generate_ctypes_code , "GENERATE_CTYPES_PYPP_CODE" : self.on_generate_ctypes_pypp_code } @@ -35,18 +35,21 @@ decls_tree, warnings = self.__code_generator.show_declarations( fc ) return decls_tree, warnings - def on_generate_bp_code( self ): - fc = self.__create_fc( 'BP' ) + def on_generate_bpl_code( self ): + fc = self.__create_fc( 'BPL' ) code, warnings = self.__code_generator.generate_bpl_code( fc ) return code, warnings - def on_generate_bp_pypp_code( self ): + def on_generate_bpl_pypp_code( self ): w = wizard.wizard_t() - code = w.create_bpl_code( config.gccxml, self.__create_fc( 'BP' ) ) + code = w.create_bpl_code( config.gccxml, self.__create_fc( 'BPL' ) ) return code, '' def on_generate_ctypes_code( self ): - pass + fc = parser.create_source_fc( self.__input[ "CTYPES_FILE_NAME" ] ) + symbols_file = self.__input[ "CTYPES_SHLIB_FILE_NAME" ] + code, warnings = self.__code_generator.generate_ctypes_code( fc, symbols_file ) + return code, warnings def on_generate_ctypes_pypp_code( self ): pass Modified: ui/web/static/generator.css =================================================================== --- ui/web/static/generator.css 2009-01-14 09:53:39 UTC (rev 1570) +++ ui/web/static/generator.css 2009-01-14 13:20:11 UTC (rev 1571) @@ -17,15 +17,16 @@ } textarea{ - margin-top: 3px; - margin-right: 5px; - margin-left: 5px; - margin-bottom: 3px; + margin-top: 2mm; + margin-right: 2mm; + margin-left: 2mm; + margin-bottom: 2mm; } input{ - margin-top: 5px; - margin-right: 5px; - margin-left: 5px; - margin-bottom: 5px; + margin-top: 2mm; + margin-right: 2mm; + margin-left: 2mm; + margin-bottom: 2mm; } + Modified: ui/web/templates/generator_tmpl.html =================================================================== --- ui/web/templates/generator_tmpl.html 2009-01-14 09:53:39 UTC (rev 1570) +++ ui/web/templates/generator_tmpl.html 2009-01-14 13:20:11 UTC (rev 1571) @@ -11,23 +11,23 @@ </head> <body> <h2>pygccxml & py++ demo</h2> - <form action="/generated.html" method="post" name="CODE_GENERATOR_FORM"> + <form action="/generated.html" method="post"> <p>In the following tabs you can configurate GCC-XML compiler. It is not a must</p> <div class="tabber"> <div class="tabbertab"> <h2>Include directories</h2> <p>List include directories( each directory on the new line ):</p> - <textarea name="COMPILER_INCLUDE_DIRECTORIES" rows="5" cols="80" style="margin-left: 5mm" ></textarea> + <textarea name="COMPILER_INCLUDE_DIRECTORIES" rows="5" cols="80"></textarea> </div> <div class="tabbertab"> <h2>Preprocessor definitions</h2> <p>Configure preprocessor ( define -D"HAS_XYZ=1" or undefine -U"_DEBUG" ):</p> - <textarea name="COMPILER_PREPROCESSOR_DEFINITIONS" rows="5" cols="80" style="margin-left: 5mm" ></textarea> + <textarea name="COMPILER_PREPROCESSOR_DEFINITIONS" rows="5" cols="80"></textarea> </div> <div class="tabbertab"> <h2>Advance</h2> <p>Define GCC-XML command line arguments:</p> - <textarea name="COMPILER_CMD_ARGS" rows="5" cols="80" style="margin-left: 5mm"></textarea> + <textarea name="COMPILER_CMD_ARGS" rows="5" cols="80" ></textarea> </div> </div> <p>Add some text that describes purpose of the "Text" and "File"</p> @@ -36,9 +36,9 @@ <h2>pygccxml demonstration</h2> <p></p> <input type="radio" name="GCCXML_TAKE_CODE_FROM" value="file" checked="checked" />Header file:<br/> - <input type="text" name="GCCXML_FILE_NAME" size="80" style="margin-left: 5mm" /><br /> + <input type="text" name="GCCXML_FILE_NAME" style="min-width:93%;" /><br /> <input type="radio" name="GCCXML_TAKE_CODE_FROM" value="text"/>Code:<br/> - <textarea name="GCCXML_SOURCE_CODE" rows="15" cols="80" style="margin-left: 5mm"></textarea> + <textarea name="GCCXML_SOURCE_CODE" rows="15" cols="80" ></textarea> <br/> <hr /> <input type="submit" name="VIEW_XML" value="View XML" /> @@ -48,10 +48,10 @@ <div class="tabbertab"> <h2>Boost.Python code generator</h2> <p></p> - <input type="radio" name="BP_TAKE_CODE_FROM" value="file" checked="checked" />Header file:<br/> - <input type="text" name="BP_FILE_NAME" size="80" style="margin-left: 5mm" - <input type="radio" name="BP_TAKE_CODE_FROM" value="text"/>Code:<br/> - <textarea name="BP_SOURCE_CODE" rows="15" cols="80" style="margin-left: 5mm"></textarea> + <input type="radio" name="BPL_TAKE_CODE_FROM" value="file" checked="checked" />Header file:<br/> + <input type="text" name="BPL_FILE_NAME" style="min-width:93%;"/><br/> + <input type="radio" name="BPL_TAKE_CODE_FROM" value="text"/>Code:<br/> + <textarea name="BPL_SOURCE_CODE" rows="15" cols="80" ></textarea> <br/> <hr /> <input type="submit" name="GENERATE_BP_CODE" value="Generate code" /> @@ -62,13 +62,14 @@ <h2>ctypes code generator</h2> <p></p> <a>Dynamic/shared library path:</a> - <input type="text" name="CTYPES_SHLIB_FILE_NAME" size="80" style="margin-left: 5mm" /><br/> - <input type="radio" name="CTYPES_TAKE_CODE_FROM" value="file" checked="checked" />Header file:<br/> - <input type="text" name="CTYPES_FILE_NAME" size="80" style="margin-left: 5mm" /><br/> - <input type="radio" name="CTYPES_TAKE_CODE_FROM" value="text"/>Code:<br/> - <textarea name="CTYPES_SOURCE_CODE" rows="15" cols="80" style="margin-left: 5mm"></textarea> - <br/> - <hr /> + <input type="text" name="CTYPES_SHLIB_FILE_NAME" style="min-width:93%;" /><br/> + <!--input type="radio" name="CTYPES_TAKE_CODE_FROM" value="file" checked="checked" />Header file:<br/--> + <a>Header file:</a> + <input type="text" name="CTYPES_FILE_NAME" style="min-width:93%;" /><br/> + <!--input type="radio" name="CTYPES_TAKE_CODE_FROM" value="text"/>Code:<br/--> + <!--textarea name="CTYPES_SOURCE_CODE" rows="15" cols="80" ></textarea--> + <!--br/--> + <hr/> <input type="submit" name="GENERATE_CTYPES_CODE" value="Generate code" /> <a></a> <input type="submit" name="GENERATE_CTYPES_PYPP_CODE" value="Generate Py++ code" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |