# HG changeset patch # User Alex Gilkes # Date 1256740788 0 # Node ID be27ed110b50fb12348ad055d037632be8dcdf2d # Parent 044383f395250e703863527ebf8a67fdd315f149 Bringing in Helium, imaker and cmaker diff -r 044383f39525 -r be27ed110b50 buildframework/helium/build-jar.ant.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/build-jar.ant.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,77 @@ + + + + + Called by hlm-jar.bat to build helium java code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+ + +
+ +
\ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/build.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/build.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,40 @@ + + + + + Helium targets to build helium itself. + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/antlint_config.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/antlint_config.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,34 @@ + + + + + ([a-z0-9[\\d\\_\\.\\@\\{\\}\\$]]*) + ([a-z0-9[\\d\\-]]*) + + ([a-z0-9][a-zA-Z0-9]*) + ([a-z0-9[\\d\\.\\_\\-]]*) + + ^build.xml$|ant.xml$|antlib.xml$ + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/capabilities_config.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/capabilities_config.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,286 @@ + + + + 3.1.0.5 + + + e32strt.exe + efile.exe + ekern.exe + installserver.exe + IntegrityCheck.exe + nandloader.exe + nandloader_unistore2.exe + sisregistryserver.exe + sospmmhandler.exe + usbmsapp.exe + + + AccServer.exe + akncapserver.exe + aknnfysrv.exe + appmngr.exe + CentRepToolServer.exe + cuimsg.exe + cuistartup.exe + cpfilehandler.exe + DcfRepSrv.exe + e32strt.exe + EasApplication.exe + efile.exe + einfoserver_00.exe + ekern.exe + ewsrv.exe + FileManager.exe + idle.exe + ImageEditor.exe + installserver.exe + IntegrityCheck.exe + integrityserver.exe + javadrmrlserver.exe + javahelperserver.exe + javasecurebackup.exe + mceserver.exe + MemScanServ.exe + Menu2.exe + mmcapp.exe + nandloader.exe + nandloader_unistore2.exe + ncpkickstart.exe + nsmldmhostserver1.exe + RfsServer.exe + SatServer.exe + sbengine.exe + sbenginenojava.exe + sisregistryserver.exe + Starter.exe + startup.exe + sysstart.exe + SWInstSvrUI.exe + SystemAMSCore.exe + TerminalControl.exe + usbmsapp.exe + + + ContentListingServer.exe + cuimusicplayer.exe + DRMPlayServer.exe + DRMRightsManager.exe + ekern.exe + hmidp92.exe + hmidp92_minimal.exe + ImageEditor.exe + LWPlayer.exe + MCServer.exe + MediaGallery2.exe + MediaPlayer.exe + MGLUtilityServer.exe + musicplayer.exe + MusicShopApp.exe + MusicStore.exe + nandloader.exe + nandloader_unistore2.exe + ncpkickstart.exe + Phone.exe + pwmdrmserv.exe + RightsServer.exe + WMDRMKeyServer.exe + + + + AHDemoApp.exe + AknFSIDemo.exe + AknSoundTest.exe + AlignApp.exe + AnimApp.exe + ATSInterface.exe + Bappea.exe + BappeaProf.exe + bbcapslimited.exe + bbcapsmod.exe + bmpanapp.exe + btaudiotester.exe + BURTestServer.exe + cascade.exe + CbaApp.exe + ced.exe + ceddump.exe + centrepperftest.exe + closelogger.exe + Codetest.exe + ColorCard.exe + ColorTest.exe + ConnTest.exe + ConsoleUI.exe + crashread.exe + creator.exe + dlgapp.exe + disksuck.exe + dptester.exe + DRMEncryptor.exe + DRMUtilApp.exe + dtest.exe + EditConf.exe + epos_comasuplpostestermodulecfg.exe + eshell.exe + filebrowse.exe + filebrowser.exe + FileBrowserFileOpServer.exe + FtdGwcTest.exe + ftdbserver.exe + ftp.exe + Goofy.exe + gwstestexecute.exe + httpexampleclient.exe + htifilehlp.exe + htiipcommserver.exe + htiwatchdog.exe + htiframework.exe + layouttest.exe + Launcher.exe + MemFailAppStart.exe + memsuck.exe + MIDP2smstestrunner.exe + MIDP2Test.exe + mmctest.exe + OtaTestServer.exe + pipeconsumer.exe + pipeconsumer2.exe + pipeconsumer3.exe + pipeproducer.exe + pipeproducer2.exe + pipeproducer3.exe + PSYCRTester.exe + psytester.exe + ResFileDump.exe + resettest.exe + rfileloggerserver.exe + _rohid_ced.exe + _rohid_ceddump.exe + runtests.exe + rtautils.exe + rtaserver.exe + scheduletest.exe + Sender.exe + setcap.exe + spdhelper.exe + spdcommserver_bluetooth.exe + ShutDownTest.exe + ScreenGrabber.exe + spdcommserver.exe + statapi.exe + statlite.exe + stifstarter.exe + stiftestframework.exe + suspender.exe + SVGPerfTest.exe + systemswtest.exe + tefutilityserver.exe + tefcleanup.exe + testcontrol.exe + testexecute.exe + testexecutelogengine.exe + testexecutelogengineext.exe + testinvalidipcargs.exe + TestServerStarter.exe + trkapp.exe + TrkConsole.exe + TrkTcbServer.exe + XnThemeManagerTestApp.exe + xtatestapp.exe + taskmgr.exe + THelper.exe + t_acc.exe + t_cenrep.exe + t_cenreptrans.exe + t_cenrep_back_rest.exe + t_cenrep_back_rest_defect.exe + t_cenrep_back_rest_delete.exe + t_cenrep_cache.exe + t_cenrep_defects.exe + t_cenrep_meta.exe + t_cenrep_platsec.exe + t_cenrep_preq752.exe + t_cenrep_rfs.exe + t_cenrep_transactions.exe + t_certstore.exe + t_crypto.exe + t_deletedirallfiles.exe + t_deletefileallfiles.exe + t_disp.exe + t_display.exe + t_fsysbm.exe + t_keystore.exe + t_keypad.exe + t_killprocess.exe + t_mmc.exe + t_mmcpw.exe + t_oeexport.exe + t_oeexport1.exe + t_oomcenrepsrv.exe + t_security.exe + t_se_api.exe + t_ssi.exe + t_usb.exe + t_wlandriver.exe + ucccontrolte.exe + xkon.exe + xtatestapp.exe + + + crashread2.exe + d_exc.exe + d_exc_mc.norm.exe + d_exc_mc.sdram.exe + mobilecrashstarter.exe + selftestserver.exe + _aalto_e32strt.exe + _aalto_e32strt_minios.exe + _h2_e32strt.exe + _h2_ekern.exe + _h2_paging_ekern.exe + _h2_usbboot.exe + _h4hrp_bootldr.exe + _h4hrp_bootldr_me.exe + _h4hrp_e32strt.exe + _h4hrp_e32strt_me.exe + _h4hrp_ekern.exe + _h4hrp_paging_ekern.exe + _h4hrp_restartota.exe + _h4hrp_usbboot.exe + _h4hrp_usbmsapp.exe + _integrator_cm1136_e32strt.exe + _integrator_cm1136_ekern.exe + _lubbock_e32strt.exe + _lubbock_ekern.exe + _lubbock_paging_ekern.exe + _rapido_e32strt.exe + _rapido_e32strt_minios.exe + _rapido_ekern.exe + _reka2_ekern.exe + _teflon_e32strt.exe + _teflon_e32strt_minios.exe + _teflon_ekern.exe + _template_ekern.exe + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/diamonds_config.xml.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/diamonds_config.xml.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <#if (ant?keys?seq_contains('metadata.enable'))> + + <#else> + + + + + + + + + + + + <#if (ant?keys?seq_contains('validate.policy.log'))> + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/epydoc.conf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/epydoc.conf Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,15 @@ +[epydoc] + +output: html + +target: doc/api/python/ + +docformat: restructuredtext + +verbosity: 2 + +parse: yes +introspect: no + +imports: no + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/helium_data_model.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/helium_data_model.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,2694 @@ + + + + + + archive.max.number.of.threads + allowed + integer + Set the maximum number of threads running for archiving (for a parallel job). + + + ats.ctc.host + recommended + string + CTC host, provided by CATS used to create coverage measurement reports. MON.sym files are copied to this location, for example "10.0.0.1". If not given, code coverage reports are not created + + + ats.testrun.name + recommended + string + Modify the test-run name if you have understanding of test.xml file or leave it as it is. Deafault value is a string consist of build id, product name, major and minor versions + + + ats.plan.name + recommended + string + Modify the plan name if you have understanding of test.xml file or leave it as it is. Deafault value is "plan" + + + ats.trace.enabled + recommended + string + Should be "True" if tracing is needed during the tests running on ATS3. Deafault value is "False", the values are case-sensitive. + + + ats.ctc.enabled + recommended + string + Should be "True" if coverage measurement and dynamic analysis (CTC) tool support is to be used by ATS. Deafault value is "False", the values are case-sensitive. + + + ats.email.list + recommended + string + The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon(s) ";" separated email addresses. + + + ats.aste.email.list + recommended + string + The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon(s) ";" separated email addresses. + + + ats.flashfiles.minlimit + recommended + string + Limit of minimum number of flash files to execute ats-test target, otherwise ATSDrop.zip will not be generated. Default value is "2" files. + + + ats.sisfiles.minlimit + recommended + string + Limit of minimum number of sis files to execute matti-test target, otherwise MATTI-drop.zip will not be generated. Default value is "1" files. + + + ats.target.platform + recommended + string + Sets target platform for compiling test components. Default value is "armv5 urel". + + + ats.test.timeout + recommended + string + To set test commands execution time limit on ATS3 server, in seconds. Default value is "60". + + + ats.product.hwid + recommended + string + Product HardWare ID (HWID) attached to ATS. By default the value of HWID is not set. + + + ats.obey.pkgfiles.rule + recommended + string + If the property is set to "True", then the only test components which will have PKG files, will be included into the test.xml as a test-set. Which means, even if there's a test component (executable) but there's no PKG file, it should not be considered as a test component and hence not included into the test.xml as a separate test. By default the property value is False. + + + tsrc.data.dir + allowed + string + The default value is "data" and refers to the 'data' directory under 'tsrc' directory. + + + tsrc.path.list + allowed + string + Contains list of the tsrc directories. Gets the list from system definition layer files. Assuming that the test components are defined already in te layers.sysdef.xml files to get compiled. + Not recommended, but the property value can be set if there are no system definition file(s), and tsrc directories paths to set manually. + + + ats.flash.images + allowed + string + List of flash images (.fpsx files) to install on the phone. It is not recommended to set the value manually however, it is possible. + + + ats.report.location + allowed + string + Sets ATS reports store location. Default location is "${publish.dir}/${publish.subdir}" + + + ats.drop.file + discouraged + string + Path for creation of the drop file during the build. Default is ATS3Drop.zip + + + ats.aste.drop.file + discouraged + string + Path for creation of the drop file during the build. Default is ATS3AsteDrop.zip + + + ats.product.name + must + string + Name of the product to be tested. For example: "PRODUCT" + + + ats.script.type + recommended + string + There are two types of ats script files to send drop to ATS server, "runx" and "import"; + only difference is that with "import" ATS doesn't have to have access rights to testdrop.zip file, + as it is sent to the system over http and import doesn't need network shares. + If that is not needed "import" should not be used. Default value is "runx" as "import" involves heavy processing on ATS server + + + ats.drop.location + must + string + Server location (UNC path) to save the ATS3Drop file, before sending to the ATS. For example: \\trwsem00\some_folder\. In case, ``ats.script.type`` is set to "import", ATS doesn't need to have access to ats.drop.location, its value can be any local folder on build machine, for example c:\temp (no network share needed). + + + ats.aste.testrun.name + recommended + string + Modify the test-run name if you have understanding of test.xml file or leave it as it is. Deafault value is a string consist of build id, product name, major and minor versions + + + ats.aste.plan.name + recommended + string + Modify the plan name if you have understanding of test.xml file or leave it as it is. Deafault value is "plan" + + + disable.analysis.tool + allowed + string + Set this property to disable Analysis Tool. By default Analysis Tool will run with every build and send api metrics to diamonds but Analysis Tools takes time. + + + drop.file.counter + never + integer + Drop package file counter. Updates its value automatically when a new drop file is created for ATS. + + + ido.build.filter + never + string + Property is used to define ido build filters in the configuration file. + + + ats.server + must + string + For example: "4fio00105" or "catstresrv001.cats.noklab.net:80". Default server port is "8080", but it is not allowed between intra and Noklab. Because of this we need to define server port as 80. The host can be different depending on site and/or product. + + + ats.password + must + string + Password for ATS. This password might be different from NOE or HTTP/UNIX password. + + + ats.username + must + string + Username for ATS server. This is NOT the NOE or HTTP/UNIX username. + + + eunit.test.package + recommended + string + The EUnit package name to be unzipped on the environment, for executing EUnit tests." + + + eunitexerunner.flags + must + string + Flags for EUnit exerunner can be set by setting the value of this variable. The default flags are set to "/E S60AppEnv /R Off". + + + cache.dir + never + string + Root directory where Helium can store files on a temporary basis for a user. + + + log4j.cache.dir + allowed + string + Log directory for log4j. + + + build.cache.dir + never + string + Directory where Helium can store files on a temporary basis for a user per build. + + + build.cache.log.dir + never + string + Directory where Helium can store log files on a temporary basis for a user per build. + + + build.duplicates.log + discouraged + string + Default name of the build duplicates log file. + + + build.version + discouraged + string + Version of the build. + + + build.drive + recommended + string + Substed drive where the build is performed. if not defined then helium should search next available build drive letter and subst autometically + + + unsubst.after.build + allowed + string + Unsubsted drive after build finished. If not defined then helium should left the drive as subst. Set the value as "yes" if you want to unsubst after build finished. + + + build.id + discouraged + string + A unique ID for the build. + + + zip.wa.file + discouraged + string + A unique name for the WA Sources ZIP file. + + + binary.root + never + string + Defines location of binaries created in build. Used in check-capability target while generating capability scan report. + + + build.log + never + string + Defines name of the log file. + + + build.log.dir + discouraged + string + This is where the build logs are stored. + + + build.signal.status.dir + discouraged + string + This is where the signal related files are stored. + + + build.status.email.template + allowed + string + This is the email template path where it updates the build status based on metadata database contents. The default file could (email_status.html.ftl under tools\common\template\log)be used as the base and any additional info could be added + + + build.logging.key.stages + discouraged + string + Defines which stages are considered as key stages and logged. + + + build.logging.start.stage + discouraged + string + Defines at which point logging is started. + + + build.name + must + string + A general label for this type of build. Currently if not defined, product.name will be used to set this property, but this will likely be removed in future. + + + build.output.dir + never + string + This is the directory where build output is placed. + + + build.property.cache.file + never + string + A file where persistent properties for a build should be stored. + + + build.sisfiles.dir + never + string + This is the directory where sisfiles are placed. + + + build.summary.file + discouraged + string + This is the file where build summary is stored. + + + build.system + allowed + string + This specifies which build system is used. Default for this is ebs You can use ec for Electric Cloud.. + + + build.system.ebs + never + string + Defined if build.system is set to "ebs", which is the default. + + + build.system.sbs + never + string + Defined if ${build.system} is set to "sbs". + + + build.temp.dir + never + string + A directory for storing temporary build files. + + + build.type + recommended + string + The general type of the build. This is used for checking the tools environment. Potential values include core, ido, product. + + + build.errors.limit + allowed + number + Maximum allowable errors in a build. + + + canonical.sysdef.file + never + string + The path of the generated canonical System Definition file that contains all the input System Definition file content. + + + ccm.base.dir + allowed + string + Directory where CCM operations will be performed. + + + ccm.home.dir + must + string + Home directory of CCM operations. + + + ccm.database + must + string + Name of the CCM database to use. No default value. + + + ccm.cache.xml + allowed + string + Location of the cache.xml file which enables global synergy sessions. + + + ccm.database.path + discouraged + string + Path of the CCM database. No default value + + + ccm.enabled + allowed + string + Defines that property if you want the ccm-get-input step to be run during the build area preparation. + + + ccm.engine.host + must + string + Engine host of CCM database. No default value. + + + ccm.user.login + never + string + Contains the user name for CCM by reading the information from .netrc file. + + + ccm.user.password + never + string + Contains the password for CCM user name by reading the information from .netrc file. + + + ccmgetinput + allowed + string + To check which ccmgetinput helium will be use + + + ccmtask.python.script.file + never + string + The path for the Python script to handle the ccm task bridge to the ccm.py module. + + + + cmaker.component.dir + never + string + Location of the cmaker component to install it. + + + cmaker.config.dir + discouraged + string + Directory where to execute cMaker. + + + cmaker.log.label + allowed + string + Custom label added to the cmaker logs. + + + cmaker.pp.version + recommended + string + Version of PP(NCP) configuration to be exported + + + cmaker.s60.version + recommended + string + Version of S60(require cmaker.pp.version to be set) configuration to be exported + + + common.overlay.dir + must + string + Location of the common overlay. + + + current.env.config + never + string + Internal property used for environment setting in the beginning of the build. + + + ctool.region.china + never + string + . + + + ctool.dir + allowed + string + Location of the configuration tool. + + + ctool.western.conf + allowed + string + configuration for the western variant. + + + ctool.china.conf + allowed + string + configuration for the chinese variant. + + + ctool.japan.conf + allowed + string + configuration for the japanese variant. + + + customer.makefile.target + never + string + Default makefile target for running customer iMaker ROM building. + + + data.model.file + never + string + The data model XML file for the Ant configuration. + + + data.model.parsed + never + string + The data model XML file for the Ant configuration parsed. + + + delta.ant.file + never + string + Temp file + + + delta.zip.delete.file + never + string + Special Instructions file for SymDEC + + + delta.zip.file + never + string + The zip file + + + delta.zip.location + never + string + Output location + + + delta.zip.temp.location + never + string + Temp location + + + delta.zip.file.size + must + string + Define the file size of the zipped up released file, this is then used by delta + zipping code to determine if a delta zip is required or a full zip should be created. + The delta zip will only be published if it is less than 1/2 the size of this property + + + + diamonds.compile.summary + never + string + Compilation summary file for diamonds. + + + diamonds.listener.configuration.file + never + string + Diamonds Configuration file with full path used for diamonds listener. + + + antlib.import.module.path + never + string + Path where ant XML files dynamically downloaded from jar file. + + + diamonds.build.id + never + string + The ID assigned to the build by the Diamonds server. + + + diamonds.build.url + never + string + The full URL to the build entry on the Diamonds server. + + + diamonds.host + discouraged + string + Diamonds server's host address. + + + diamonds.path + discouraged + string + Diamonds server build location. + + + diamonds.port + discouraged + string + Diamonds server port number. + + + diamonds.mail + discouraged + string + Email address of diamonds server. + + + diamonds.schema + discouraged + string + Diamonds rest api schema. + + + documentation.host + never + string + The host server where the Helium documentation is stored. + + + documentation.path.root + never + string + The root of the path on the host server where the Helium documentation is stored. + + + documentation.path + never + string + The full path on the host server where the Helium documentation is stored. + + + diamonds.target.list.to.log + discouraged + string + List of targets that should be logged in to Diamonds. + + + + documentation.url.root + allowed + string + Root location of the Helium release documentation. + + + + log.target + allowed + string + Enables logging of the start and end of individual targets. + + + log4j.configuration + never + string + Defines the path to log4j configuration. + + + + call.cleanup + allowed + string + Ensures the cleanup-all target is called when the build finishes. + + + sbs.config + allowed + string + Configurations for which the components to be built(armv5,winscw) + + + skip.sbs.layer.generation + allowed + string + skip sbs layer filtering (true) for new schema and false for schema 1.4.0 + + + ec.allow.duplicates + discouraged + string + Setting this to "1" will force xml2mak to generate only warnings (instead of errors) for duplicate components in the component list + + + ec.emake + discouraged + string + Location of emake tool. + + + ec.history.dir + discouraged + string + This specifies the directory where Electric Cloud history files are stored. + Currently defined in helium.ant.xml and mapped related to publish.root.dir + + + ec.historyfile + discouraged + string + Temporary location of the EC history file used by the current build. + + + ec.makefile.file + discouraged + string + Location of the Makefile generated to run the EC build. + + + ec.maxagents + allowed + string + Maximum number of agent to be used + + + ec.history.option + never + string + Should be create for single node build and merge for multi node build. + + + ec.mode + allowed + string + mode is either serial / parallel - default is parallel + + + week.number + allowed + string + this is used to identify the history files based on releases + + + branch.name + allowed + string + this along with week.number used to find proper history file based on releases. + + + ec.scripts.dir + discouraged + string + ec scripts location + + + ec.sysdef2make + never + string + Location of sysdef2make.pl file, which is used to translate system definition files to make files. Internal property that normally does not require changes. + + + ec.tools.dir + discouraged + string + Location of EC-tools. Passed to environment variable EC_TOOLS_DIR, when calling ecbuild_electric.cmd to execute Electric Cloud build. + + + email.ldap.server + allowed + string + Network address of the LDAP server. + + + ldap.organization.unit.rootdn + allowed + string + Organization root DN for LDAP server. + + + ldap.people.rootdn + allowed + string + People root DN for LDAP server. + + + email.ldap.rootdn + allowed + string + Root distinguished name of the LDAP server. + + + email.smtp.server + allowed + string + Network address of the SMTP server. + + + skip.ats.sending + allowed + boolean + Skips sending drop package file to ATS/ASTE after its creation. + + + skip.build.duplicates + allowed + boolean + This allow you to skip the build duplciates log generation. + + + skip.codescanner + allowed + boolean + Skip the codescanner target if true (true/yes/on). + + + skip.policy-validation + allowed + boolean + Skip the policy validation target if true (true/yes/on). + + + codescanner.config + allowed + string + Defines the location of a custom configuration for codescanner. + + + codescanner.format + allowed + string + Defines the format of Codescanner output (html|xml|std). + + + codescanner.log.unique + allowed + string + Defines if the folder for Codescanner output is unique (on|off). + + + file-comparison.bcomp_path + allowed + string + Defines the location of BComp.exe. + + + file-comparison.bcomp_conf + allowed + string + Defines the location of Beyond Compare configuration file. + + + file-comparison.left_side + must + string + The fileset id used on the left side of comparison. + + + file-comparison.right_side + must + string + The fileset id used on the right side of comparison. + + + file-comparison.output + allowed + string + Defines the location where comparison output should be put. + + + file-comparison.left_name + allowed + string + Defines the name of the folder for the left side of comparison. + + + file-comparison.right_name + allowed + string + Defines the name of the folder for the right side of comparison. + + + file-comparison.regexp.from + allowed + string + Defines the regexp pattern (in ANT-pattern style) which to mach from given filesets. + + + file-comparison.regexp.to + allowed + string + Defines the regexp pattern (in ANT-pattern style) what to use in (possible) replacement. + + + skip.compile-ec-patch + allowed + string + If defined it skips the buildtools emake patching. + + + ee_roms.log.file + never + string + ee log file location + + + ee.makefile.target + allowed + string + Defines make target that is run when creating engineer english images. + + + epocroot + discouraged + string + epocroot path + + + ext.java.lib.dir + never + string + External ant library path + + + genxml.output.file + never + string + Path for the output XML file generated by genxml used as input to EBS or EC. + + + genxml.output.file.suffix + never + string + Suffix used in genxml related output files. This value is added into file names to show that they are genxml related. Used in log files, genxml output files and component list for EE images. Normally does not need to be set. + + + helium.build.dir + never + string + The path where Helium-specific outputs are written to. + + + helium.doc.dir + never + string + Location of helium doc src. + + + helium.ccm.workarea.dir + allowed + string + The path to a Synergy work area used for updating Helium releases. + + + helium.svn.url + allowed + string + SVN URL where to find Helium. + + + helium.java.lib.dir + never + string + helium java library location + + + helium.svn.workarea.dir + allowed + string + The path to a Subversion work area used for updating Helium releases. + + + helium.dir + never + string + Defines the logical path to the helium directory used to start a build. + + + helium.version + never + string + Contains Helium version information + + + + ido.codescanner.config + allowed + string + Defines the location of a custom configuration for codescanner. + + + ido.codescanner.output.dir + recommended + string + Defines the location of Codescanner output. + + + ido.codescanner.output.type + allowed + string + Defines the format of Codescanner output (html|xml|std). + + + ido.keep.old + allowed + string + Once define this property will enable the backup of old ado before doing the copy. + + + ido.template.robot.ready + discouraged + string + Location of the ready.txt FMPP template (override that property if you want to customize the content). + + + robot.email.to + discouraged + string + Comma seperated list of email address. + + + imaker.command + never + string + The path to the iMaker executable file. + + + imaker.engine + never + string + Defines which accelerator to use for running iMaker. (default value from build.system property) + + + imaker.fmpp.ant + never + string + Location of the Ant iMaker execution template. + + + imaker.fmpp.makefile + never + string + Location of the EC iMaker execution template. + + + tools.ivy.config.file + allowed + string + The tools dependencies Ivy settings configuration file. + + + loc.output.dir + never + string + The directory that will contain the zipped .loc files zip package. + + + loc.output.filename + never + string + The filename of the zip-loc-files target output zip file. + + + loc.temp.dir + never + string + The location of temporary directory used during zip-loc-files. + + + localisation.files.china + recommended + string + Localisation files for the China region. + + + localisation.files.japan + recommended + string + Localisation files for the Japan region. + + + localisation.files.western + recommended + string + Localisation files for the western region. + + + localisation.makefile.target + allowed + string + Makefile target that is executed when creating localised rom images (target localisation-roms). + + + localisation.s60locfiles.dir + never + string + Location of Series 60 localisation input files. Internal property that does not normally needs to be set. + + + localisation.tool + never + string + This key defines which tool should be used to localise the build area (localisation-mcss-localiser or localisation-s60-localiser). + + + localisation.buildfile + never + string + begining of the localisation buildfile name + + + isis_mktarget.list + never + string + Comma separated list of file names(main, what, check file names) + + + log.build.build_id + never + string + Diamonds logging information. + + + log.build.category + never + string + Diamonds logging information. + + + log.build.computer + never + string + Diamonds logging information. + + + log.build.user + never + string + Diamonds logging information. + + + md5.signature.file + never + string + Output location of md5 file + + + md5.split + never + string + Number of partial md5 files to use during creation + + + old.md5.file.present + allowed + string + Is a previous builds md5 being passed manually + + + metadata.db.file + never + string + The path to the SQLite metadata database file. + + + exclude.test.layers + allowed + string + Comma seperated excluded test layers. The test components (mentioned in the excluded test layers) will not be included in the ATS test drops + + + delta.exclude.commasep + allowed + string + Comma seperated excluded directories from the zip + + + old.md5.file + allowed + string + A previous builds md5 + + + number.of.threads + allowed + string + how many parallel threads can run + + + overlays.log.file + never + string + The path to the overlays output log file. + + + parse_abld_what.tool + allowed + string + Location of the parse_what_log.pl tool. + + + prep.root.dir + recommended + string + The directory where new build area directories are created and substed to the build drive. + + + qmake.enabled + allowed + string + If defined the qmake stage will be enabled during compilation. + + + qt.dir + recommended + string + The location of the Qt framework to build. + + + qt.qmake.ant.template + allowed + string + The location of the ant template to run qmake commands. + + + qt.qmake.makefile.template + allowed + string + The location of the makefile template to run qmake commands. + + + qt.configure.args + allowed + string + The command lines argument passed to the configure tool. + + + qt.qmake.default.args + allowed + string + Setting default arguments to qMake command line, if the qmakeArgs is defined from the system definition file + then those arguments are discarded. + + + qt.configure.log.name + never + string + The name of the Qt configure output log. + + + absolute.prep.root.dir + never + string + This will convert absolute path for prep.root.dir if anybody use relative path. + + + prep.build.dir + never + string + This is the directory where the build area is prepared. Once created it is substed to the build.drive. + + + prep.delivery.modificationset + allowed + string + Location where the XML modificationset file should be generated. If not defined the file is not generated. (Usefull for CI systems) + + + publish.dir + must + string + Directory where the build is published (includes build.id) + + + publish.ccm.folder + allowed + string + Synergy folder where you want your task to be published. + + + publish.base.dir + never + string + Directory where all builds are published. Same as publish.dir but without build.id at the end + + + publish.fileset.ids + allowed + string + The fileset id which will be upload + + + publish.release.subdir + never + string + Subdir part of the publish release dir, relative to publish.root.dir + + + publish.release.dir + never + string + The directory where the release of this build is published to on the local network. + + + release.images.dir + never + string + The directory where flash images of build can be found + + + releasenotes.output + never + string + Location of output rtf file + + + releasenotes.output.dir + never + string + Defines the directory that will contain the output of release notes creation. + + + releasenotes.props + never + string + Property file with customer values + + + releasenotes.scan2log + never + string + Location of scan2log HTML file + + + releasenotes.temp.errors + never + string + Temp file + + + releasenotes.temp.output + never + string + Temp file + + + releasenotes.temp.props + never + string + Temp file + + + releasenotes.temp.props2 + never + string + Temp file + + + releasenotes.template + never + string + Defines the name of the release note template used. + + + rombuild.using.var + allowed + boolean + Define this property if you build is using Symbian Binary Variation. + + + rombuild.buildinfo.template + never + string + FMPP template to generate a buildinfo makefile. + + + rombuild.buildinfo.output + never + string + Location of the output file. + + + rombuild.makefile.name + allowed + string + The filename of the output makefile generated by Helium for iMaker. + + + roms.spec.name + never + string + Used to select spec-section in rom image configuration for building. Used only for makefpsx. + + + s60.delta.config.prefix + allowed + string + Define the prefix part of the configuration name that builds delta variant. + + + s60.getenv.trigger.location + allowed + string + Define the location of the trigger file that should be used by CI. + + + getenv.tool.location + never + string + Defines the location of the getenv.pl script. + + + src.dir + never + string + java source directory location for helium library + + + subcon.log.file + never + string + The path to the subcon ROMs log. + + + subcon.makefile.target + never + string + The name of the makefile target for making subcon ROMs. + + + subcon.zips.dir + never + string + The directory where subcon zips are stored. + + + team + recommended + string + Used to specify which team configuration is being used. These configuration files are under /mc/mc_build/teams. + + + temp.build.dir + never + string + Directory to store temporary files generated during the process. + + + trace.log.file + never + string + The path to the trace ROMs log. + + + trace.makefile.target + never + string + The name of the makefile target for making trace ROMs. + + + uda.makefile.target + never + string + The name of the makefile target for making UDA images. + + + zip.ee.log.file + never + string + Defines log file where to record archiving of engineering english area. + + + zip.subcon.log.file + never + string + Defines log file where to record archiving of subcon environment. + + + zip.subcon_roms.log.file + never + string + The log file name for zipping subcon_roms. + + + zip.trace_roms.log.file + never + string + The log file name for zipping trace_roms. + + + zip.uda_roms.log.file + never + string + The log file name for zipping uda_roms. + + + zips.build.dir + never + string + This is the directory where build area is archived after the build has finished. + + + zips.flashfiles.dir + never + string + This is the directory where flash files are archived. + + + zips.loc.dir + never + string + This is the directory where build area is archived after the localisation. + + + zip.localised.log.file + never + string + The path to the localization zipping log file. + + + remote.builds.config.file + never + string + The path to the configuration file for remote builds. + + + local.free.space + recommended + string + The amount of free space needed on the build machine in Mbs. + + + localisation.language.file + never + string + Defined where to find languages.xml. + + + network.free.space + allowed + string + Amount of free space in MBs needed on the network drive where the build is published. The ``network.drive`` drive property must also be defined. + + + network.drive + recommended + string + The drive letter of a substed drive that maps to the network location where the build is published. + + + ec.build.class + never + string + Build class for Electric Cloud. No default value. + + + sbs.tools.config + allowed + string + tools configuration to be built + + + sbs.implicit.tools.build + allowed + boolean + uses tools config to be built before building the actual configuration. + + + sysdef.clean.configurations.list + allowed + string + Comma-separated list of System Definition configuration names to be built in the ido-prep-clean stage. If not defined the sysdef.configurations.list will be used to generate that configuration list. + + + sysdef.configurations.list + must + string + Comma-separated list of System Definition configuration names to be built in the compile-main stage. + + + compile.symbianos + never + string + Property must be set if the Symbian System Definition file is included in a build, in order to do full build from source. + + + publish.subdir + allowed + string + Subdir part of the publish dir, relative to publish.root.dir + + + error.email.to.list + never + string + List of email addresses where email is sent in case of build failure. No default value + + + release.dir.root + never + string + This is the directory which points to release-directory root. + + + enabled.ats + must + string + Value must be set to execute ats-test target. for example, 'value="1"' + + + enabled.aste + must + string + Value must be set to execute ats-aste target. for example, 'value="1"' + + + eunit.prepare.zip + must + string + Name of eunit zip file. Need to unzip into build area to start eunit test + + + core.build.version + allowed + string + This Defaults to the ${major.version}.${minor.version} combo and is available so that 1 number can be used (dot can be removed) + + + major.version + allowed + string + Part of a version information that is used to differentiate a build. Major version is the part that changes less frequently. Ie. year. + + + minor.version + allowed + string + Part of a version information that is used to differentiate a build. Minor version is the part that changes more frequntly. Ie week or a running number. + + + notes.database + recommended + string + The Notes database to do DCT5 upload to. + + + notes.release.dir + never + string + The DCT5 Release Notes SW Release Folder (where your build is Published to, so it can be obtained from there.) + + + notes.server + recommended + string + Lotus notes server name + + + prep.config.file + must + string + Defines configuration file used in prep-copy target. The file defines how files are copied and extracted into build area. + + + prep.delivery.file + must + string + Defines configuration file used in synergy operations (ccm-get-input for example). This file contains definition of projects that are checkouted or snapshotted. + + + product.family + must + string + In product builds defines the product family that the build product belong to. + + + product.list + must + string + In product builds defines the list of products that are build in the configuration. Property is used in rom image creation, localisation release notes creation and data packaging. + + + product.printname + must + string + A printable name for a product used in release notes. + + + product.type + must + string + Project ID in release notes. + + + publish + recommended + string + Defines whether the build content will be published to the network. + + + is.published + never + string + The value is either true or false depending on whether the publish property is set or not. + + + publish.root.dir + recommended + string + Defines the root directory of publish feature. Should point into the root of the folder that will contain published nightly builds/releases. + + + releasenotes.logo + never + string + Defines the logo image file which will be used in release notes. + + + relnotes.config.dir + must + string + Defines the directory that contains release notes creation configuration files. + + + sis.config.file + recommended + string + Configuration file for SIS-file generation. + + + sms.number + never + string + sms numbers to report error or build information. + + + src + never + string + Source location for junit test class + + + src.classes + never + string + Java source files location for helium library + + + subcon.build.drive + never + string + Build drive for subcon build + + + subcon.prep.config.file + must + string + Subcon prep configuration file location + + + subcon.rombuild.config.file + never + string + A ROM configuration file for verifying subcon ROMS. + + + rombuild.config.file + must + string + This key defines where this parsed file will be located. + + + rombuild.config.file.parsed + never + string + Locates the parsed configuration for ROM builds. + + + ee.rom.output.dir + must + string + /output/development_flash_images/engineering_english/logs + + + core.rom.output.dir + must + string + /output/release_flash_images/rnd/core + + + selge.ini.network.dir + must + string + \\\\vcfiler02\\pub\\flash_user\\Crashbin/working\\selge_ini_prep + + + unix.username + never + string + Unix username. + + + unix.username.available + never + string + Equal 0 if the unix username if available + + + unix.password + never + string + Unix password + + + image_creation.copyto + never + string + Path for copying the image files default is output/images + + + image_creation.drive + never + string + Drive (environment) to use for creating images + + + variant.image.targetpath + never + string + Path for copying the variant image files default is under output/variant_images + + + zips.ee.spec.name + allowed + string + the value should be "ee" + + + zip.config.file + recommended + string + Path to the the zip specification file + + + zip.config.file.parsed + never + string + Path to the parsed file of zip specification file + + + unix.password.available + never + string + Equal 0 if the unix password if available + + + failonerror + never + boolean + failonerror attribute for exec + + + flash.config.enabled + recommended + flag + Define that property to enable config file generation. + + + compile.signal.input + never + string + Name of the signal input to be able to override the compile-main target. + + + compile.sysdef.dtd.stub + never + string + compile.sysdef.dtd.stub + + + ec.mem.limit + never + string + memory limit for EC execution. See user guide for more details + + + archive.using.ec + recommended + boolean + Set to true to enable EC zipping + + + build.drive.notdefined + never + flag + used to track if build.drive has predefined or not + + + ado.mapping.file + never + string + Path to a INI file that contains the mapping between the ADO from Synergy WA and it's location on the BA. + + + ado.quality.mapping.file + never + string + Path to a INI file that contains the mapping between the ADO from Synergy WA and it's location on the BA for quality targets. + + + ido.romtree + never + string + Path to the build romtree; the location contains iby files. Default value is "${build.drive}${env.EPOCROOT}/epoc32/rom/include" + + + ido.cenrep.root + never + string + Path to the cenrep root. Default value is "${build.drive}${env.EPOCROOT}/epoc32/tools/cenrep/ido/src" + + + ido.cenrep.target + never + string + Path to the cenrep target directory. Default value is "${build.drive}${env.EPOCROOT}/epoc32/data/z/private/10202be9" + + + s60.build.robot.date + must + string + This property represent the releasing interval. The syntax is as follow: + day1,time1,day2,time2,projectname;day1,time1,day2,time2,projectname2 + + With day and time matching the following properties: + day [1, 14] + time [00, 23]:[00, 59] + + Example: + 2,10:00,3,20:00,ABS_domain + + + + s60.build.robot.path + must + string + Location where to publish the build robot delivery. + + + validate.properties.at.startup + never + string + display warnings at build startup if required properties are not defined. + + + tracing.csv.file + never + string + Path location for the memory tracing data captured by the TracingLogger. + + + imagetool.cfg.xml.parsed + never + string + Locates the parsed configuration for ImageTool in the build directory. + + + imagetool.destination + allowed + string + Location where to copy ImageTool and definitions. + + + imagetool.images + allowed + string + Defines comma separated list of image names. + + + imagetool.log + never + string + Defines name of the ImageTool log file. + + + imagetool.output.dir + never + string + Defines the location of ImageTool output files. + + + imagetool.tooldir + never + string + Defines the location of ImageTool. + + + read.build.int + allowed + string + This must be set to enable reading the build.number from a text database file located on the network. It allows automated build number incrementing. + + + build.int.db.dir + discouraged + string + The directory where the build integer database text files are stored. + + + create.bom.workarea.root + allowed + string + Your synergy work area directory (Set as the parent of the helium dir by default) + + + validate.policy.csv + recommended + string + Location of the CSV file that defines policy IDs. + + + validate.policy.ignoreroot + allowed + boolean + Skip the validation of the given root folders. + + + validate.policy.log + discouraged + string + Location validate policy xml log. + + + validate.policy.log.xml + discouraged + string + Location of the LogXML output file. + + + validate.policy.pattern + allowed + string + Comma separated list of pattern for policy validation. Defualt value is, distribution.policy.s60,distribution.policy + + + + internal.api.config + allowed + string + Location of the config to parse the build content. + + + internal.api.output.prebuild + allowed + string + Location of the prebuild ado header content. + + + internal.api.output.postbuild + allowed + string + Location of the postbuild ado header content. + + + required.ant.version + never + string + The version of Apache Ant required by Helium. + + + sbs.hlm.scanlog + allowed + boolean + Enable helium scanlog for raptor. (experimental temporary solution) + + + ivy.file + never + string + Location of ivy jar. + + + ivy.filename + never + string + Name of ivy jar. + + + logging.output.file + never + string + Location of generated logging config. + + + last.major.helium.version + never + string + Last major helium version + + + database.file + never + string + Location of helium database + + + teamlevel.ci.system + allowed + boolean + Change release tag from team level to product level + + + teamlevel.folder.number + allowed + string + Folder name which contains those tasks to change the release tag + + + programlevel.release.tag + allowed + string + Program level release tag name + + + sms.server + allowed + string + Server that sends SMSs + + + data.model.xsl + allowed + string + Data Model extra content + + + ci.min.ba.maintain + allowed + string + Minimal number of build area to keep. + + + ci.session.file + allowed + string + Location of the session file which will be created by Helium. + + + ci.project.config + allowed + string + Location of the configuration that will be generated for the Cruise Control HLMSynergy modificationset. + + + signals.buildexception.signalname + allowed + string + Name of the signal configuration that is used when a signal is fired after catching a BuildException failure. + + + hlm.enable.asserts + recommended + string + Enable helium asserts. Build will fail if this is enabled and asserts fail. + + + python.modules.path + allowed + string + Python modules path. + + + metadata.dbfile + never + string + Location of build metadata database. + + + Environment + + tools.ivy.config.file + + + Policy validation + Properties which drive the policy validation. + validate.policy.csv + validate.policy.log + validate.policy.ignoreroot + validate.policy.pattern + + + preparation + Preparing the build area. + prep.config.file + prep.delivery.file + + + localFreeSpace + Checking for disk space on local machine. + build.drive + local.free.space + + + remoteFreeSpace + Checking for disk space on network disk. + network.drive + network.free.space + + + compilation + Main compilation. + sysdef.configurations.list + + build.system + build.system.ebs + ido.build.filter + + + sisFiles + Creating SIS files. + sis.config.file + + + rombuild + Creating ROM images. + rombuild.config.file + rombuild.config.file.parsed + roms.spec.name + rombuild.using.var + + + + subcon + Creating a subcon build area and testing the creation of subcon images. + subcon.build.drive + subcon.prep.config.file + subcon.rombuild.config.file + + + archive + Zipping the build area. + zips.ee.spec.name + zip.config.file + zip.config.file.parsed + zips.build.dir + zip.wa.file + + + publish + Publishing the build to the network. + publish + is.published + publish.root.dir + publish.dir + publish.subdir + publish.base.dir + publish.fileset.ids + publish.release.subdir + publish.release.dir + + + mobilecrash + Mobilecrash configuration. + ee.rom.output.dir + core.rom.output.dir + selge.ini.network.dir + + + ReleaseNotes + Release notes generation. + relnotes.config.dir + releasenotes.logo + releasenotes.output + releasenotes.output.dir + releasenotes.props + releasenotes.scan2log + releasenotes.temp.errors + releasenotes.temp.output + releasenotes.temp.props + releasenotes.temp.props2 + releasenotes.template + + + DeltaZip + + md5.signature.file + md5.split + old.md5.file.present + delta.exclude.commasep + old.md5.file + delta.ant.file + delta.zip.delete.file + delta.zip.file + delta.zip.location + delta.zip.temp.location + + + CCM + + ccm.base.dir + ccm.home.dir + ccm.database + ccm.enabled + ccmgetinput + ccm.database.path + ccm.engine.host + ccm.user.login + ccm.user.password + ccm.cache.xml + + + EC + + ec.allow.duplicates + ec.emake + ec.history.dir + ec.historyfile + ec.makefile.file + ec.maxagents + ec.history.option + ec.scripts.dir + ec.sysdef2make + ec.tools.dir + ec.build.class + sbs.implicit.tools.build + sbs.tools.config + ec.mem.limit + skip.compile-ec-patch + archive.using.ec + + + cMaker + + cmaker.component.dir + cmaker.config.dir + cmaker.pp.version + cmaker.s60.version + cmaker.log.label + + + IDO - Codescanner + Codescanner related Ant properties. + ido.codescanner.config + ido.codescanner.output.dir + ido.codescanner.output.type + skip.codescanner + + + iMaker - integration + New iMaker integration support. + rombuild.buildinfo.template + rombuild.buildinfo.output + imaker.engine + + + ImageTool + ImageTool configuration. + imagetool.destination + imagetool.images + imagetool.cfg.xml.parsed + imagetool.log + imagetool.output.dir + imagetool.tooldir + + + Diamonds + + diamonds.host + diamonds.path + diamonds.port + diamonds.mail + log.target + call.cleanup + diamonds.listener.configuration.file + diamonds.compile.summary + diamonds.schema + diamonds.build.id + diamonds.build.url + diamonds.target.list.to.log + + + Localisation + + loc.output.dir + loc.output.filename + loc.temp.dir + localisation.files.china + localisation.files.japan + localisation.files.western + localisation.makefile.target + localisation.s60locfiles.dir + localisation.tool + localisation.buildfile + isis_mktarget.list + localisation.language.file + + + ATS + + ats.ctc.host + ats.testrun.name + ats.plan.name + ats.aste.testrun.name + ats.aste.plan.name + ats.trace.enabled + ats.ctc.enabled + ats.obey.pkgfiles.rule + ats.flashfiles.minlimit + ats.sisfiles.minlimit + ats.email.list + ats.target.platform + ats.flash.images + ats.test.timeout + ats.product.hwid + ats.drop.file + ats.aste.drop.file + ats.aste.email.list + ats.product.name + ats.script.type + ats.drop.location + ats.server + ats.password + ats.username + ats.report.location + enabled.ats + enabled.aste + skip.ats.sending + eunit.test.package + eunitexerunner.flags + drop.file.counter + exclude.test.layers + + + Company + + email.ldap.server + email.ldap.rootdn + email.smtp.server + sms.server + ldap.organization.unit.rootdn + ldap.people.rootdn + + + Release + + s60.build.robot.date + s60.build.robot.path + + + Qt + + qt.dir + qt.configure.log.name + qt.qmake.ant.template + qt.qmake.makefile.template + qt.configure.args + qt.qmake.default.args + qmake.enabled + + + Misc + + absolute.prep.root.dir + ado.mapping.file + ado.quality.mapping.file + antlib.import.module.path + binary.root + branch.name + build.cache.dir + build.cache.log.dir + build.drive.notdefined + build.duplicates.log + build.errors.limit + build.id + build.log.dir + build.signal.status.dir + build.status.email.template + build.log + build.logging.key.stages + build.logging.start.stage + build.name + build.output.dir + build.property.cache.file + build.sisfiles.dir + build.summary.file + build.system.sbs + build.temp.dir + build.type + build.version + cache.dir + log4j.cache.dir + canonical.sysdef.file + ccmtask.python.script.file + codescanner.config + codescanner.format + codescanner.log.unique + common.overlay.dir + compile.signal.input + compile.symbianos + compile.sysdef.dtd.stub + core.build.version + create.bom.workarea.root + ctool.china.conf + ctool.dir + ctool.japan.conf + ctool.region.china + ctool.western.conf + current.env.config + customer.makefile.target + data.model.file + data.model.parsed + database.file + delta.zip.file.size + disable.analysis.tool + documentation.host + documentation.path.root + documentation.path + documentation.url.root + ec.mode + ee.makefile.target + ee_roms.log.file + epocroot + error.email.to.list + eunit.prepare.zip + ext.java.lib.dir + failonerror + file-comparison.bcomp_conf + file-comparison.bcomp_path + file-comparison.left_name + file-comparison.left_side + file-comparison.output + file-comparison.regexp.from + file-comparison.regexp.to + file-comparison.right_name + file-comparison.right_side + genxml.output.file.suffix + genxml.output.file + getenv.tool.location + helium.build.dir + helium.doc.dir + helium.ccm.workarea.dir + helium.svn.url + helium.dir + helium.java.lib.dir + helium.svn.workarea.dir + helium.version + ido.cenrep.root + ido.cenrep.target + ido.keep.old + ido.romtree + ido.template.robot.ready + image_creation.copyto + image_creation.drive + imaker.command + imaker.fmpp.ant + imaker.fmpp.makefile + internal.api.config + internal.api.output.postbuild + internal.api.output.prebuild + ivy.file + ivy.filename + last.major.helium.version + log.build.build_id + log.build.category + log.build.computer + log.build.user + log4j.configuration + logging.output.file + major.version + metadata.db.file + minor.version + notes.database + notes.release.dir + notes.server + number.of.threads + overlays.log.file + parse_abld_what.tool + prep.build.dir + prep.delivery.modificationset + prep.root.dir + product.family + product.list + product.printname + product.type + programlevel.release.tag + publish.ccm.folder + read.build.int + build.int.db.dir + release.dir.root + remote.builds.config.file + required.ant.version + robot.email.to + rombuild.makefile.name + s60.delta.config.prefix + s60.getenv.trigger.location + sbs.config + skip.sbs.layer.generation + sbs.hlm.scanlog + skip.build.duplicates + skip.policy-validation + sms.number + src.classes + src.dir + src + subcon.log.file + subcon.makefile.target + subcon.zips.dir + sysdef.clean.configurations.list + team + teamlevel.ci.system + teamlevel.folder.number + temp.build.dir + trace.log.file + trace.makefile.target + tracing.csv.file + tsrc.data.dir + tsrc.path.list + uda.makefile.target + unix.password.available + unix.password + unix.username.available + unix.username + unsubst.after.build + validate.policy.log.xml + validate.properties.at.startup + variant.image.targetpath + week.number + zip.ee.log.file + zip.localised.log.file + zip.subcon.log.file + zip.subcon_roms.log.file + zip.trace_roms.log.file + zip.uda_roms.log.file + zips.flashfiles.dir + zips.loc.dir + flash.config.enabled + release.images.dir + data.model.xsl + ci.min.ba.maintain + ci.session.file + ci.project.config + archive.max.number.of.threads + signals.buildexception.signalname + hlm.enable.asserts + python.modules.path + metadata.dbfile + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/helium_data_model.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/helium_data_model.xsl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,41 @@ + + + + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/helium_distribution_test.cfg.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/helium_distribution_test.cfg.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/helium_eclipse_java_profile.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/helium_eclipse_java_profile.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/install/build-cruisecontrol-bin.ant.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/install/build-cruisecontrol-bin.ant.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,84 @@ + + + + Cruise Control installation script. + + + + + unzipping artifact: + organisation=${artifact.organisation} + module=${artifact.module} + revision=${artifact.revision} + artifact=${artifact.artifact} + type=${artifact.type} + ext=${artifact.ext} + origin=${artifact.origin} + local=${artifact.local} + size=${artifact.size} + file=${artifact.file} + helium.dir=${helium.dir} + + + + + + + + + + + + + + + + + + unzipping artifact: + organisation=${artifact.organisation} + module=${artifact.module} + revision=${artifact.revision} + artifact=${artifact.artifact} + type=${artifact.type} + ext=${artifact.ext} + origin=${artifact.origin} + local=${artifact.local} + size=${artifact.size} + file=${artifact.file} + helium.dir=${helium.dir} + + + + + + + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/install/build-hccc.ant.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/install/build-hccc.ant.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,46 @@ + + + + Helium Cruise Control Customization installation script. + + + unzipping artifact: + organisation=${artifact.organisation} + module=${artifact.module} + revision=${artifact.revision} + artifact=${artifact.artifact} + type=${artifact.type} + ext=${artifact.ext} + origin=${artifact.origin} + local=${artifact.local} + size=${artifact.size} + file=${artifact.file} + helium.dir=${helium.dir} + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/install/build-jep.ant.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/install/build-jep.ant.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,47 @@ + + + + Jep library installation script. + + + unzipping artifact: + organisation=${artifact.organisation} + module=${artifact.module} + revision=${artifact.revision} + artifact=${artifact.artifact} + type=${artifact.type} + ext=${artifact.ext} + origin=${artifact.origin} + local=${artifact.local} + size=${artifact.size} + file=${artifact.file} + helium.dir=${helium.dir} + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/install/build-logilab-common.ant.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/install/build-logilab-common.ant.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,49 @@ + + + + Logilab library installation script. + + + unzipping artifact: + organisation=${artifact.organisation} + module=${artifact.module} + revision=${artifact.revision} + artifact=${artifact.artifact} + type=${artifact.type} + ext=${artifact.ext} + origin=${artifact.origin} + local=${artifact.local} + size=${artifact.size} + file=${artifact.file} + helium.dir=${helium.dir} + + + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/install/build-xincluder.ant.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/install/build-xincluder.ant.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,53 @@ + + + + xincluder installation script. + + + + unzipping artifact: + organisation=${artifact.organisation} + module=${artifact.module} + revision=${artifact.revision} + artifact=${artifact.artifact} + type=${artifact.type} + ext=${artifact.ext} + origin=${artifact.origin} + local=${artifact.local} + size=${artifact.size} + file=${artifact.file} + helium.dir=${helium.dir} + + + + + + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/7zip-4.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/7zip-4.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/ant-1.7.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/ant-1.7.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + Apache Ant. Used for the core build process. + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/ccm-6.5.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/ccm-6.5.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,31 @@ + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/codescanner-2.0.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/codescanner-2.0.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/codescanner-2.1.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/codescanner-2.1.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/cruisecontrol-2.7.1.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/cruisecontrol-2.7.1.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/cruisecontrol-2.7.2-hc1.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/cruisecontrol-2.7.2-hc1.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,34 @@ + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/cruisecontrol-2.7.2.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/cruisecontrol-2.7.2.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/cruisecontrol-2.7.3.rc1.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/cruisecontrol-2.7.3.rc1.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/cruisecontrol-2.8.1.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/cruisecontrol-2.8.1.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/cruisecontrol-2.8.2.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/cruisecontrol-2.8.2.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/eggs-1.0.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/eggs-1.0.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/eggs_subcon-1.0.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/eggs_subcon-1.0.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,33 @@ + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/hccc-1-2.7.2.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/hccc-1-2.7.2.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/jars-1.0.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/jars-1.0.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,36 @@ + + + + + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/jars_subcon-1.0.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/jars_subcon-1.0.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/java-1.6.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/java-1.6.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,29 @@ + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/java13-1.3.1.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/java13-1.3.1.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,29 @@ + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/jep-2.3-java6.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/jep-2.3-java6.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/perl-5.6.1.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/perl-5.6.1.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/python-2.5.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/python-2.5.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/sbs-2.4.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/sbs-2.4.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/symsee-7.2.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/symsee-7.2.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/unzip-5.40.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/unzip-5.40.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/modules/xincluder-1.0d11.ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/modules/xincluder-1.0d11.ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/ivy/tools_ivy_settings.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/ivy/tools_ivy_settings.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/java_checkstyle_config.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/java_checkstyle_config.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/logging.conf.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/logging.conf.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,58 @@ +<#-- +============================================================================ +Name : logging.conf.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +[formatters] +keys: simple,detailed + +[handlers] +keys: console,syslog + +[loggers] +keys: root,dp + +[formatter_simple] +format: %(levelname)s:%(name)s:%(message)s + +[formatter_detailed] +format: %(levelname)s:%(name)s: %(module)s:%(lineno)d: %(message)s + +[handler_console] +class: StreamHandler +args: [] +formatter: simple + +[handler_syslog] +class: handlers.SysLogHandler +args: [('myhost.mycorp.net', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER] +formatter: detailed + +[logger_root] +level: INFO +handlers: syslog + +[logger_dp] +<#if ant?keys?seq_contains("dp.debug") || ant?keys?seq_contains("debug")> +level: DEBUG +<#else> +level: INFO + +handlers: console +qualname: dp \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/metadata_filter_config_default.ant.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/metadata_filter_config_default.ant.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/metadata_regex.csv --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/metadata_regex.csv Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,47 @@ +priority,regex,description +FATAL,.*mingw_make\.exe.*, +ERROR,.*\): Missing file:.*, +ERROR,^(?:(?:\s*\d+\)\s*)|(?:\s*\*\*\*\s*))ERROR:.*, +ERROR,.*Error:\s+.*, +ERROR,.*is not recognized as an internal or external command.*, +ERROR,^MISSING:.*, +ERROR,.*FLEXlm error:.*, +ERROR,.*(ABLD|BLDMAKE) ERROR:.*, +ERROR,.*FATAL ERROR\(S\):.*, +ERROR,.*fatal error C1001: INTERNAL COMPILER ERROR.*, +ERROR,.*fatal error U1077.*, +ERROR,.*warning U4010, +ERROR,^make(?:\[\d+\])?\: \*\*\*.*, +ERROR,^make(?:\[\d+\])?:\s+.*\s+not\s+remade.*, +ERROR,error: ((Internal fault):)$, +ERROR,Exception: [A-Z0-9_]+.*, +ERROR,.*target .* given more than once in the same rule.*, +ERROR,^ERROR:.*, +ERROR,^ERROR EC\d+:.*, +ERROR,Errors caused tool to abort..*, +ERROR,.*no rule to make.*, +ERROR,^ERROR\t.*, +ERROR,.*Traceback \(most recent call last\).*, +CRITICAL,[Ww]arning:?\s+(#111-D|#1166-D|#117-D|#128-D|#1293-D|#1441-D|#170-D|#174-D|#175-D|#185-D|#186-D|#223-D|#231-D|#257-D|#284-D|#368-D|#414-D|#430-D|#47-D|#514-D|#546-D|#68-D|#69-D|#830-D|#940-D|#836-D|A1495E|L6318W|C2874W|C4127|C4355|C4530|C4702|C4786|LNK4049), +WARNING,^(\d+\))?\s.*WARNING:.*, +WARNING,^MAKEDEF WARNING:.*, +WARNING,.*\\\\(?)\(\d+\)\s:\sWarning:\s\(\d+\), +WARNING,^(BLDMAKE |MAKEDEF )?WARNING:.*, +WARNING,.*\(\d+\) : warning C.*, +WARNING,.*\d+: warning:.*, +WARNING,.*Usage Warning:.*, +WARNING,.*mwld.exe:.*, +WARNING,^Command line warning.*, +WARNING,.*ERROR: bad relocation:.*, +WARNING,^(\d+) warning.*, +WARNING,.*EventType:\s+Error\s+Source:\s+SweepNT.*, +WARNING,^WARN\t.*, +WARNING,.*LINK : warning.*, +REMARK,.*Command line warning D4025 : .*, +REMARK,^REMARK: .*, +REMARK,^EventType:\s+Error\s+Source:\s+GNU\s+Make.*, +REMARK,".*:\d+: warning: cannot find matching deallocation function""r""((:\d+)*: note: ).*", +INFO,^INFO:.*, +ERROR,"\""(.*)\"" , line (\d+): (Error: +(.\d+.*?):.*)$", +WARNING,"line \d+: Warning:', r':\s+warning\s+\w+:.*", +WARNING,"\""(.*)\""\, line (\d+): (Warning: +(?!A1495E)(.\d+.*?):.*)$", \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/pylintrc.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/pylintrc.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,288 @@ + +[MASTER] + +# Add to the black list. It should be a base name, not a +# path. You may set this option multiple times. +ignore=CVS + +# Pickle collected data for later comparisons. +persistent=yes + +# Set the cache size for astng objects. +cache-size=500 + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + + +[MESSAGES CONTROL] + +# Enable only checker(s) with the given id(s). This option conflicts with the +# disable-checker option +#enable-checker= + +# Enable all checker(s) except those with the given id(s). This option +# conflicts with the enable-checker option +#disable-checker= + +# Enable all messages in the listed categories. +#enable-msg-cat= + +# Disable all messages in the listed categories. +#disable-msg-cat= + +# Enable the message(s) with the given id(s). +#enable-msg= + +# Disable the message(s) with the given id(s). +disable-msg=C0301,W0401,W0611,W0614,R0801,W0402,R0914 + + +[REPORTS] + +# set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html +output-format=text + +# Include message's id in output +include-ids=yes + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +files-output=no + +# Tells wether to display a full report or only the messages +reports=yes + +# Python expression which should return a note less than 10 (10 is the highest +# note).You have access to the variables errors warning, statement which +# respectivly contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (R0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Add a comment according to your evaluation note. This is used by the global +# evaluation report (R0004). +comment=no + +# Enable the report(s) with the given id(s). +#enable-report= + +# Disable the report(s) with the given id(s). +#disable-report= + + +# checks for : +# * doc strings +# * modules / classes / functions / methods / arguments / variables name +# * number of arguments, local variables, branchs, returns and statements in +# functions, methods +# * required module attributes +# * dangerous default values as arguments +# * redefinition of function / method / class +# * uses of the global statement +# +[BASIC] + +# Required attributes for module, separated by a comma +required-attributes= + +# Regular expression which should only match functions or classes name which do +# not require a docstring +no-docstring-rgx=__.*__ + +# Regular expression which should only match correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression which should only match correct module level names +const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__)|(_[a-zA-Z0-9_]{2,40}))$ + +# Regular expression which should only match correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression which should only match correct function names +function-rgx=[a-z_][a-zA-Z0-9_]{2,40}$ + +# Regular expression which should only match correct method names +method-rgx=[a-z_][a-zA-Z0-9_]{2,40}$ + +# Regular expression which should only match correct instance attribute names +attr-rgx=[a-z_][a-zA-Z0-9_]{2,40}$ + +# Regular expression which should only match correct argument names +argument-rgx=[a-z_][a-zA-Z0-9_]{2,30}$ + +# Regular expression which should only match correct variable names +variable-rgx=[a-z_][a-zA-Z0-9_]{2,30}$ + +# Regular expression which should only match correct list comprehension / +# generator expression variable names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,ex,Run,_ + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# List of builtins function names that should not be used, separated by a comma +bad-functions=map,filter,apply,input + + +# try to find bugs in the code using type inference +# +[TYPECHECK] + +# Tells wether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# When zope mode is activated, consider the acquired-members option to ignore +# access to some undefined attributes. +zope=no + +# List of members which are usually get through zope's acquisition mecanism and +# so shouldn't trigger E0201 when accessed (need zope=yes to be considered). +acquired-members=REQUEST,acl_users,aq_parent + + +# checks for +# * unused variables / imports +# * undefined variables +# * redefinition of variable from builtins or from an outer scope +# * use of variable before assigment +# +[VARIABLES] + +# Tells wether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching names used for dummy variables (i.e. not used). +dummy-variables-rgx=_|dummy + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + + +# checks for : +# * methods without self as first argument +# * overridden methods signature +# * access only to existant members via self +# * attributes not defined in the __init__ method +# * supported interfaces implementation +# * unreachable code +# +[CLASSES] + +# List of interface methods to ignore, separated by a comma. This is used for +# instance to not check methods defines in Zope's Interface base class. +ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + + +# checks for sign of poor/misdesign: +# * number of methods, attributes, local variables... +# * size, complexity of functions, methods +# +[DESIGN] + +# Maximum number of arguments for function / method +max-args=5 + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of branch for function / method body +max-branchs=12 + +# Maximum number of statements in function / method body +max-statements=50 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + + +# checks for +# * external modules dependencies +# * relative / wildcard imports +# * cyclic imports +# * uses of deprecated modules +# +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,string,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report R0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report R0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report R0402 must +# not be disabled) +int-import-graph= + + +# checks for : +# * unauthorized constructions +# * strict indentation +# * line length +# * use of <> instead of != +# +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=80 + +# Maximum number of lines in a module +max-module-lines=1000 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + + +# checks for: +# * warning notes in the code like FIXME, XXX +# * PEP 263: source code with non ascii character but no encoding declaration +# +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +# checks for similarities and duplicated code. This computation may be +# memory / CPU intensive, so you should disable it if you experiments some +# problems. +# +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/signaling_config_default.ant.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/signaling_config_default.ant.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,377 @@ + + + + + Definitions of helium signals. + + + + + + + + + + + + + + + + + + + + + + defaultSignalAlwaysNotifier: Signal: ${signal.name} + defaultSignalAlwaysNotifier: Status: ${signal.status} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/config/version.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/config/version.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,4 @@ +#Helium version - DO NOT EDIT +#Tue Sep 22 14:15:51 IST 2009 +last.major.helium.version=5.0 +helium.version=6.0.1 diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/images/bom.png Binary file buildframework/helium/doc/images/bom.png has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/images/dp.png Binary file buildframework/helium/doc/images/dp.png has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/index.html Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,22 @@ + + + + + +Helium Documentation Index + + + +
+

Helium Documentation

+ + Helium Documentation +

+ If this link does not work, please run hlm docs from the /helium directory and try again. +

+ The main Helium documentation is HTML generated from the RST text documents. +

+ + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/.templates/sidebar.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/.templates/sidebar.html Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,7 @@ + +

API Search

+ \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/antdoclet/html/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/antdoclet/html/index.html Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,21 @@ + + + + + + Ant Tasks Documentation + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/antdoclet/html/libindex.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/antdoclet/html/libindex.vm Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,38 @@ + + +## +## This is an Velocity template for generating an HTML index +## of the Ant "categories" (antlibs) +## +## Objects expected in context: +## +## $title - Project title (of type String) +## $antroot - (of type AntRoot) +## + + + $title Ant Libraries + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/antdoclet/html/main.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/antdoclet/html/main.vm Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,37 @@ +## +## This template is the entry point for calling other templates. +## The output of this template goes to stdout. +## +## Objects available in context: +## +## $velocity - Helper object for processing other templates (of type VelocityFacade) +## $antroot - Contains all the Ant tasks/types (of type AntRoot) +## $title - Project title (of type String) +## + +AntDoclet - Running project $title + +- Generating Task and Types documentation... +## +#foreach( $taskDoc in $antroot.getAll() ) ## + #if ( ! $taskDoc.isIgnored() ) + +- Processing $taskDoc.antName ## + $velocity.eval( "task.vm", "${taskDoc.getFullClassName()}.html" ) ## + #else ## +- Ignoring $taskDoc.fullClassName()## + #end ## +#end ## + + +- Generating Navigation indexes... +## Now, generate an "index" file for the categories, and one for each category +$velocity.eval( "libindex.vm", "libindex.html" ) +$velocity.eval( "overview.vm", "overview.html" ) +#foreach( $category in $antroot.getCategories() ) + $velocity.eval( "taskindex.vm", "index.${category}.html" ) +#end +#set($category = "all") +$velocity.eval( "taskindex.vm", "index.${category}.html" ) + +- Done diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/antdoclet/html/overview.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/antdoclet/html/overview.vm Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,19 @@ + + + + + $title + + + + + +

$title - Ant Tasks Documentation

+ +

This document is the Ant Tasks specification for the Helium build toolkit.

+ + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/antdoclet/html/style.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/antdoclet/html/style.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,87 @@ + + +body { + font-family: verdana, arial,helvetica,sanserif; + font-size: 90%; +} + +h2 { + font-size: 110%; + text-align: left; +} + +div#navigation h2 { + text-align: left; + background-color: #CCCCFF; + font-variant: small-caps; + margin-bottom: 0; + padding-left: 5%; +} + +h3 { + font-size: 100%; + text-align: left; + background-color: #CCCCFF; + margin-bottom: 0; +} + +h4 { + font-size: 90%; + margin-top: 5%; +} + +div#navigation { + float: left; +} + +#navigation div.description { + margin-left: 5%; + font-size: small; +} + +div.description { + margin: 5%; + font-size: medium; +} + +pre { + border: solid 1px black; + background-color: #FFFFCC; + font-size: smaller; + font-family: monospace; +} + +code { + font-size: smaller; + font-family: monospace; +} + +table { + font-family: arial,helvetica,sanserif; + font-size: 80%; + margin: 5%; + padding: 0px; + +// border: solid 1px black; + border-spacing: 0px; + border-collapse: collapse; +} + +tr:first-child { + background-color: #DDDDFF; +} + +td { + margin: 0px; + padding: 2px; + border: solid 1px black; + border-spacing: 0px; + border-collapse: collapse; +} + + +.copyright { + color: #999999; + font-size: 60%; + text-align: center; +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/antdoclet/html/task.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/antdoclet/html/task.vm Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,144 @@ + + +## +## This is a Velocity template for generating an HTML +## document describing an Ant Task/Type +## +## Objects expected in context: +## +## $taskDoc - Describes an Ant Task/Type (of type AntDoc) +## +## + + + <$taskDoc.getAntName()> + + + + + +

<$!taskDoc.getAntCategory() : $taskDoc.getAntName()>

+ +

Description

+
+ $taskDoc.getComment() +
+ +

Parameters

+ + + + + + + + + +#foreach ($attr in $taskDoc.attributes ) + + + + + + + + + + +#end +
AttributeDescriptionTypeRequired?
$attr + $taskDoc.getAttributeComment($attr) + + $taskDoc.getAttributeType($attr) + + + #if( $taskDoc.getAttributeRequired($attr) ) + Yes $taskDoc.getAttributeRequired($attr) + #elseif ( $taskDoc.getAttributeNotRequired($attr) ) + No $taskDoc.getAttributeNotRequired($attr) + #else ? + #end +
+ +

Parameters accepted as nested elements

+ +
+#if ($taskDoc.isTaskContainer()) +

This Task is a Container (it accepts nested Tasks).

+#end + +#if ($taskDoc.supportsCharacters()) +

This Task accepts text in its element body.

+#end + +#foreach ($element in $taskDoc.getNestedElements()) + + #set($elementDoc = $taskDoc.getElementDoc($element)) + +

+ #### + #### Put a link for those types that are in this javadoc run + #### and have nested elements (since nested-nested elements + #### is the only info we are not showing for each nested element) + #### + #if( $elementDoc.sourceIncluded() && ($elementDoc.getNestedElements().hasMoreElements() || $elementDoc.isTagged())) + + <$element> ... + + #else + <$element> + + #if ( ! $elementDoc.sourceIncluded() ) + (Of type ${elementDoc.getAntName()} ) + #end + #end +

+ + #if($elementDoc.getComment()) + $elementDoc.getComment() + #end + + + + + + + + + + #foreach ($elementAttr in $elementDoc.getAttributes()) + + + + + + + + + + #end +
AttributeDescriptionTypeRequired
$elementAttr +### #if($elementDoc.getAttributeComment($elementAttr)) + $!elementDoc.getAttributeComment($elementAttr) +### #end + + $elementDoc.getAttributeType($elementAttr) + + + #if($elementDoc.getAttributeRequired($elementAttr)) + Yes $elementDoc.getAttributeRequired($elementAttr) + #elseif ( $elementDoc.getAttributeNotRequired($elementAttr) ) + No $elementDoc.getAttributeNotRequired($elementAttr) + #else ? + #end + +
+#end +
+
+
+ + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/antdoclet/html/taskindex.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/antdoclet/html/taskindex.vm Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,65 @@ + + +## +## This is an Velocity template for generating an HTML index +## of the Ant Task/Types +## +## Objects expected in context: +## +## $title - Project title (of type String) +## $antroot - (of type AntRoot) +## + + + $title Ant Tasks + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/allmacros-frame.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/allmacros-frame.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,52 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "api.ftllib"/> + + + + + +<@helium_api_head_section title="All macros (Helium)"/> + + + + + All macros + +
+ + + + + +
+ <#assign macrolist=doc.antDatabase.project.macro.name?sort> + <#list macrolist as macrovar> + + ${macrovar} + +
+ +
+ +<@helium_api_html_footer/> diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/allproperties-frame.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/allproperties-frame.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,51 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "api.ftllib"/> + + + + + +<@helium_api_head_section title="All properties (Helium)"/> + + + + All properties + +
+ + + + + +
+ <#assign propertylist=data.heliumDataModel.property.name?sort> + <#list propertylist as propertyvar> + + ${propertyvar} + +
+ +
+ +<@helium_api_html_footer/> diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/alltargets-frame.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/alltargets-frame.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,52 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "api.ftllib"/> + + + + + +<@helium_api_head_section title="All targets (Helium)"/> + + + + All targets + +
+ + + + + +
+ <#assign targetlist=doc.antDatabase.project.target.name?sort> + <#list targetlist as targetvar> + + ${targetvar} + +
+ +
+ + +<@helium_api_html_footer/> diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/api.ftllib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/api.ftllib Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,169 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> + +<#if ant?keys?seq_contains("tracurl")> + <#assign helium_browser_trunk=ant.tracurl> +<#else> + <#assign helium_browser_trunk=""> + + +<#macro helium_api_navbar> + + + + + + + + + + + + + +
+Helium API + +
+ + + + + + +<#macro helium_api_head_section title> + + + + + + + + + + + + ${title} + + + + + +<#macro helium_api_header title> + + + + +<@helium_api_head_section title="${title}"/> + + + <@helium_api_navbar/> +
+ + + +<#macro helium_api_html_footer> +
+ <@helium_api_navbar/> + Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html + + + + + + + +<#macro helium_api_location_path location> + <#assign target_line=""/> + <#assign res = location?matches(":(\\d+):$") /> + <#list res as m> + <#assign target_line="#L${m?groups[1]}"/> + + <#assign location_path=location/> + <#if location?index_of("helium\\") > 0> + <#assign location_path=location?substring(location?last_index_of('helium\\'))/> + + <#assign target_url=location_path?replace("\\", "/")?replace(":(\\d+):", "", 'ri') /> + ${location_path} + + +<#macro helium_project_path location> + <#assign location_path=location/> + <#if location?index_of("helium\\") > 0> + <#assign location_path=location?substring(location?last_index_of('helium\\'))/> + + <#assign target_url=location_path?replace("\\", "/")?replace(":(\\d+):", "", 'ri') /> + ${target_url} + + +<#-- Macros for recursively handling random HTML elements inside documentation elements. --> +<#macro tt> <#recurse> + +<#macro p>

<#recurse>

+ +<#macro ul>
    <#recurse>
+ +<#macro li>
  • <#recurse>
  • + +<#macro b><#recurse> + +<#macro pre>
    ${.node?html}
    + +<#macro @text>${.node?trim} + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/apisearchindex.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/apisearchindex.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,6 @@ +.. index:: + module: Helium API Search + +================= +Helium API Search +================= diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/deprecated-list.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/deprecated-list.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,83 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "api.ftllib"/> + +<@helium_api_header title="Deprecated targets (Helium)"/> + + + + Deprecated targets + +
    + + + + + +
    + <#assign targetlist=doc.antDatabase.project.target.name?sort> + <#list targetlist as targetvar> + + <#list doc.antDatabase.project.target as targetref> + <#if targetvar == targetref.name> + <#if targetref.deprecated?size > 0> + + ${targetvar} +
    ${targetref.deprecated} +
    +
    + + + + + +
    + +
    + + Deprecated properties + +
    + + + + + +
    + <#assign propertylist=data.heliumDataModel.property.name?sort> + <#list propertylist as propertyvar> + <#list data.heliumDataModel.property as propertyref> + <#if propertyvar == propertyref.name> + <#if propertyref.deprecated?size > 0> + + ${propertyvar} +
    ${propertyref.deprecated} +
    +
    + + + + +
    + + +<@helium_api_html_footer/> diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/help.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/help.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,78 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "api.ftllib"/> + +<@helium_api_header title="Helium API Help"/> + +
    +

    + How This API Document Is Organized +

    + +
    + + This API document describes the Helium user API (Application Programming Interface) in terms of its Ant targets, properties and other configuration. It has pages corresponding to the items in the navigation bar, described as follows: + +

    Project

    + + A project corresponds to an Apache Ant XML file. Each project contains a number of targets. + +

    Target

    + + Each target has its own page listing the following sections: +
      +
    • Location
    • +
    • Description
    • +
    • Property dependencies. A list of Ant properties that this target uses and their edit status requirements.
    • +
    • Target dependencies. A list of other targets that will be called before or during this target execution.
    • +
    + + Target dependencies legend: +
      +
    • Blue arrows point to direct dependencies.
    • +
    • Green arrows point to antcall and runtarget dependencies.
    • +
    + +

    + + + <#include "target-example.dot.cmap"/> + +

    + +

    Property Group

    + A list of Property groups that group together related configuration elements, their usage requirements within that group and their edit status requirements.. + +

    Property

    + Each property has its own page listing the following sections: +
      +
    • Description
    • +
    • Usage
    • +
    • Type
    • +
    • Edit Status : The values could be must, recommended, allowed, discouraged or never.
    • +
    +

    +

    + + +<@helium_api_html_footer/> \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/index-1.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/index-1.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,55 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "api.ftllib"/> + +<@helium_api_header title="Index (Helium API)"/> + + + +

    Index

    +
    + <#assign indexlist = {}> + <#list data.heliumDataModel.property.name as propertyName> + <#assign indexlist = indexlist + {propertyName: "property"}> + + <#list doc.antDatabase.project.target.name as targetName> + <#assign indexlist = indexlist + {targetName: "target"}> + + + <#assign alphabetlist = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']> + <#list alphabetlist as letter> + ${letter?upper_case} + + + <#list alphabetlist as letter> +

    ${letter?upper_case}

    + <#list indexlist?keys?sort as element> + <#if element?starts_with(letter)> +
    ${element}
    + + +

    + +

    + + +<@helium_api_html_footer/> diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/index.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/index.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,50 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> + + + +<#include "api.ftllib"/> + + + +<@helium_api_head_section title="Helium API"/> + + + + + + + + + + +<body> +<h2>frame alert</h2> +<p/> +this document is designed to be viewed using the frames feature. if you see this message, you are using a non-frame-capable web client. +<br/> +link to<a href="overview-summary.html">non-frame version.</a> +</body> + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/macro.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/macro.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,51 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "api.ftllib"/> +<#list doc.antDatabase.project.macro as macro> +<@pp.changeOutputFile name="macro-${macro.name}.html" /> + +<@helium_api_header title="Macro ${macro.name}"/> + + + +

    Macro ${macro.name}

    + +

    Location

    +

    <@helium_api_location_path location="${macro.location}"/>

    + +
    + +

    Description

    +

    +<#recurse macro.documentation> +

    +

    + +

    Example:

    ${macro.usage}

    + +
    + +<@helium_api_html_footer/> + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/overview-frame.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/overview-frame.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,78 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> + + + + + +<#include "api.ftllib"/> + +<@helium_api_head_section title="Overview (Helium API)"/> + + + + + + + +
    +
    + + + + + +
    + + All targets +
    + All properties +
    + All macros +
    +

    + + Projects +
    + <#assign projectlist=doc.antDatabase.project.name?sort> + <#list projectlist as project> + ${project} +
    + + +

    + Property groups +
    + <#assign grouplist=data.heliumDataModel.group.name?sort> + <#list grouplist as group> + ${group} +
    + + + +

    + +

    +   + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/overview-summary.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/overview-summary.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,79 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "api.ftllib"/> + +<@helium_api_header title="Helium API"/> + + +

    +

    Helium API

    +
    + +

    + This is the API specification for the Helium build toolkit. +

    + + + +

    Projects

    +

    + Helium is configured into a set of Ant project files that group related functionality. +

    + + + + + + <#assign projectInfo = {}> + <#list doc.antDatabase.project as project> + <#assign projectInfo = projectInfo + {project.name: project.documentation}> + + <#list projectInfo?keys?sort as name> + + + + + +
    Project nameDescription
    ${name}<#recurse projectInfo[name]>
    +
    + +

    Property groups

    +

    + Property groups define a set of properties that relate to a specific feature or functionality in Helium. +

    + + + + + + <#list data.heliumDataModel.group as group> + + + + + +
    Property group nameDescription
    ${group.name}${group.description}
    + +<@helium_api_html_footer/> \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/project-frame.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/project-frame.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,54 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#list doc.antDatabase.project as project> +<@pp.changeOutputFile name="project-frame-${project.name}.html" /> + + + + +<#include "api.ftllib"/> + +<@helium_api_head_section title="Project (Helium API)"/> + + + + + + +
    + Targets  + +
    + + <#assign targetlist=project.target.name?sort> + <#list targetlist as target> + ${target} +
    + +
    +
    + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/project.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/project.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,102 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "api.ftllib"/> + +<#list doc.antDatabase.project as project> +<@pp.changeOutputFile name="project-${project.name}.html" /> + +<@helium_api_header title="Project ${project.name}"/> + + + +

    Project ${project.name}

    + +

    Location

    +<#if (project[".//target"]?size > 0)> +

    <@helium_project_path location="${project.target[0].location}"/>

    + +

    Description

    +

    +<#recurse project.documentation> +

    +

    +


    + + +

    Targets

    + + + + + <#assign targetInfo = {}> + <#list project.target as target> + <#assign targetInfo = targetInfo + {target.name: target.documentation}> + + <#list targetInfo?keys?sort as name> + + + + +
    Target nameDescription
    ${name}<#recurse targetInfo[name]>
    + +

    Properties

    + +<#assign propertymodel=data.heliumDataModel.property> +<#assign propertylist=project.property> +<#list propertymodel as propertyInModel> +<#list propertylist as propertyvar> + <#if propertyvar.name == propertyInModel.name> + + ${propertyvar.name} + +
    + + + + +

    File Includes

    +<#assign filelist=project.fileDependency> +<#list filelist as filelistvar> + +${filelistvar} + +
    + + +

    Python Modules

    +<#assign pymodulelist=project.pythonDependency> +<#list pymodulelist.module as pymodulevar> + <#if pymodulevar?size > 0> + + ${pymodulevar} + + +
    + + + + +<@helium_api_html_footer/> + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/properties-table.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/properties-table.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,56 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "api.ftllib"/> + +<@helium_api_header title="Properties (Helium API)"/> + + + +
    +

    + Properties table(Sortable) +

    + + + + + + + + <#assign propertySort=data.heliumDataModel.property.name?sort> + <#assign propertyTable=data.heliumDataModel.property> + <#list propertySort as propertyName> + <#list propertyTable as property> + <#if propertyName == property.name> + + + + + + + + + +
    PropertyDescriptionEdit StatusType
    ${property.name}${property.description}${property.editStatus}${property.type}
    + + +<@helium_api_html_footer/> \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/api/properties-table.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/api/properties-table.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,492 @@ +/* + SortTable + version 2 + 7th April 2007 + Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/ + + Instructions: + Download this file + Add to your HTML + Add class="sortable" to any table you'd like to make sortable + Click on the headers to sort + + Thanks to many, many people for contributions and suggestions. + Licenced as X11: http://www.kryogenix.org/code/browser/licence.html + This basically means: do what you want with it. +*/ + + +var stIsIE = /*@cc_on!@*/false; + +sorttable = { + init: function() { + // quit if this function has already been called + if (arguments.callee.done) return; + // flag this function so we don't do the same thing twice + arguments.callee.done = true; + // kill the timer + if (_timer) clearInterval(_timer); + + if (!document.createElement || !document.getElementsByTagName) return; + + sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/; + + forEach(document.getElementsByTagName('table'), function(table) { + if (table.className.search(/\bsortable\b/) != -1) { + sorttable.makeSortable(table); + } + }); + + }, + + makeSortable: function(table) { + if (table.getElementsByTagName('thead').length == 0) { + // table doesn't have a tHead. Since it should have, create one and + // put the first table row in it. + the = document.createElement('thead'); + the.appendChild(table.rows[0]); + table.insertBefore(the,table.firstChild); + } + // Safari doesn't support table.tHead, sigh + if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0]; + + if (table.tHead.rows.length != 1) return; // can't cope with two header rows + + // Sorttable v1 put rows with a class of "sortbottom" at the bottom (as + // "total" rows, for example). This is B&R, since what you're supposed + // to do is put them in a tfoot. So, if there are sortbottom rows, + // for backwards compatibility, move them to tfoot (creating it if needed). + sortbottomrows = []; + for (var i=0; i5' : ' ▴'; + this.appendChild(sortrevind); + return; + } + if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) { + // if we're already sorted by this column in reverse, just + // re-reverse the table, which is quicker + sorttable.reverse(this.sorttable_tbody); + this.className = this.className.replace('sorttable_sorted_reverse', + 'sorttable_sorted'); + this.removeChild(document.getElementById('sorttable_sortrevind')); + sortfwdind = document.createElement('span'); + sortfwdind.id = "sorttable_sortfwdind"; + sortfwdind.innerHTML = stIsIE ? ' 6' : ' ▾'; + this.appendChild(sortfwdind); + return; + } + + // remove sorttable_sorted classes + theadrow = this.parentNode; + forEach(theadrow.childNodes, function(cell) { + if (cell.nodeType == 1) { // an element + cell.className = cell.className.replace('sorttable_sorted_reverse',''); + cell.className = cell.className.replace('sorttable_sorted',''); + } + }); + sortfwdind = document.getElementById('sorttable_sortfwdind'); + if (sortfwdind) { sortfwdind.parentNode.removeChild(sortfwdind); } + sortrevind = document.getElementById('sorttable_sortrevind'); + if (sortrevind) { sortrevind.parentNode.removeChild(sortrevind); } + + this.className += ' sorttable_sorted'; + sortfwdind = document.createElement('span'); + sortfwdind.id = "sorttable_sortfwdind"; + sortfwdind.innerHTML = stIsIE ? ' 6' : ' ▾'; + this.appendChild(sortfwdind); + + // build an array to sort. This is a Schwartzian transform thing, + // i.e., we "decorate" each row with the actual sort key, + // sort based on the sort keys, and then put the rows back in order + // which is a lot faster because you only do getInnerText once per row + row_array = []; + col = this.sorttable_columnindex; + rows = this.sorttable_tbody.rows; + for (var j=0; j 12) { + // definitely dd/mm + return sorttable.sort_ddmm; + } else if (second > 12) { + return sorttable.sort_mmdd; + } else { + // looks like a date, but we can't tell which, so assume + // that it's dd/mm (English imperialism!) and keep looking + sortfn = sorttable.sort_ddmm; + } + } + } + } + return sortfn; + }, + + getInnerText: function(node) { + // gets the text we want to use for sorting for a cell. + // strips leading and trailing whitespace. + // this is *not* a generic getInnerText function; it's special to sorttable. + // for example, you can override the cell text with a customkey attribute. + // it also gets .value for fields. + + hasInputs = (typeof node.getElementsByTagName == 'function') && + node.getElementsByTagName('input').length; + + if (node.getAttribute("sorttable_customkey") != null) { + return node.getAttribute("sorttable_customkey"); + } + else if (typeof node.textContent != 'undefined' && !hasInputs) { + return node.textContent.replace(/^\s+|\s+$/g, ''); + } + else if (typeof node.innerText != 'undefined' && !hasInputs) { + return node.innerText.replace(/^\s+|\s+$/g, ''); + } + else if (typeof node.text != 'undefined' && !hasInputs) { + return node.text.replace(/^\s+|\s+$/g, ''); + } + else { + switch (node.nodeType) { + case 3: + if (node.nodeName.toLowerCase() == 'input') { + return node.value.replace(/^\s+|\s+$/g, ''); + } + case 4: + return node.nodeValue.replace(/^\s+|\s+$/g, ''); + break; + case 1: + case 11: + var innerText = ''; + for (var i = 0; i < node.childNodes.length; i++) { + innerText += sorttable.getInnerText(node.childNodes[i]); + } + return innerText.replace(/^\s+|\s+$/g, ''); + break; + default: + return ''; + } + } + }, + + reverse: function(tbody) { + // reverse the rows in a tbody + newrows = []; + for (var i=0; i=0; i--) { + tbody.appendChild(newrows[i]); + } + delete newrows; + }, + + /* sort functions + each sort function takes two parameters, a and b + you are comparing a[0] and b[0] */ + sort_numeric: function(a,b) { + aa = parseFloat(a[0].replace(/[^0-9.-]/g,'')); + if (isNaN(aa)) aa = 0; + bb = parseFloat(b[0].replace(/[^0-9.-]/g,'')); + if (isNaN(bb)) bb = 0; + return aa-bb; + }, + sort_alpha: function(a,b) { + if (a[0]==b[0]) return 0; + if (a[0] 0 ) { + var q = list[i]; list[i] = list[i+1]; list[i+1] = q; + swap = true; + } + } // for + t--; + + if (!swap) break; + + for(var i = t; i > b; --i) { + if ( comp_func(list[i], list[i-1]) < 0 ) { + var q = list[i]; list[i] = list[i-1]; list[i-1] = q; + swap = true; + } + } // for + b++; + + } // while(swap) + } +} + +/* ****************************************************************** + Supporting functions: bundled here to avoid depending on a library + ****************************************************************** */ + +// Dean Edwards/Matthias Miller/John Resig + +/* for Mozilla/Opera9 */ +if (document.addEventListener) { + document.addEventListener("DOMContentLoaded", sorttable.init, false); +} + +/* for Internet Explorer */ +/*@cc_on @*/ +/*@if (@_win32) + document.write(" + +Use a script when prototyping or a more specialized operation is needed in only one place. Embedded scripts should generally be kept as short as possible. + +.. index:: + single: Java conventions + +Java conventions +================ + +.. index:: + single: Ant Task Documentions + +Ant task documentation +---------------------- + +* Javadoc comment of a Ant task class should include the Ant-specific tag ``@ant.task``. It accepts three "attributes": ``name``, ``category`` and ``ignored``. When ``ignored=true``, the class will not be included in the documentation. For example:: + + /** + * Code Sample for Ant Task class Comments + * @ant.task name="copy" category="filesystem" + * @ant.task ignored="true" + */ + public class Copy + +* The task properties documentation is extracted from the property getter/setter methods. The tags are ``@ant.required`` and ``@ant.not-required`` which indicate if the property is required or not required. For example:: + + /** + * Code Sample for Ant Task property Comments + * @ant.required + * Default is false. + */ + public void setOverwrite(boolean overwrite){ + this.forceOverwrite = overwrite; + } + +All custom tasks should be commented in this way. + +.. index:: + single: File Execution + +File execution +============== + +File execution should not depend on the extension of the file. The appropriate executable should be used to run the script, e.g:: + + python foo.py + +not:: + + foo.py + + +.. index:: + single: Documentation conventions + +Documentation conventions +========================= + +Standalone documents are written in reStructuredText_ format. + +.. _reStructuredText : http://docutils.sourceforge.net/rst.html + + +.. index:: + single: Python conventions + +Python conventions +========================= + +Specific conventions +-------------------- + +Python Code Indentation +``````````````````````` + +* Indents are 4 spaces. Tabs should not be used. + + +Documentation +````````````` + +* Docstrings are written in reStructuredText_ format, according to `PEP 257 - Docstring Conventions`_. Documentation is extracted using Epydoc_, so the reStructuredText tags that Epydoc recognises are used. + +.. _`PEP 257 - Docstring Conventions` : http://www.python.org/dev/peps/pep-0257/ +.. _Epydoc : http://epydoc.sourceforge.net/ + + +Unit testing +```````````` + +* Unit tests are written for each Python module. +* They should follow the Nose_ testing framework conventions. +* The test suite is run by calling ``hlm py-unittest``. + +.. _Nose : http://somethingaboutorange.com/mrl/projects/nose/ + + +Lint +```` + +* Always check your code with pylint_ before checking it in. +* Aim for pylint_ score >= 8. + +.. _pylint: http://www.logilab.org/857 + + +Reference coding standards +-------------------------- + +These reference standards are used for all conventions not covered above. + +* `PEP 8 - Style Guide for Python Code`_. +* `Twisted Coding Standard`_ (but with a grain of salt): + +.. _`PEP 8 - Style Guide for Python Code` : http://www.python.org/dev/peps/pep-0008/ +.. _`Twisted Coding Standard` : http://twistedmatrix.com/trac/browser/trunk/doc/development/policy/coding-standard.xhtml?format=raw + + +.. index:: + single: Quality Checklist + +Quality checklist +================= + +'''Python''' + +* All modules have a single description line in the module comment. + +.. index:: + single: Bad Word Scanner configuration + +Bad Word Scanner configuration +============================== + +This section will probably only ever be used by a helium contributor: + +Bad word scanner scans the helium code for the words that should not be in the helium source code. You need to include the bad words +in a .cvs file and scan the directory of the source code. Bad words include Nokia product names, competitors product names etc. + +Run the following command :: + + hlm check-bad-words \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/conf.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/conf.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,181 @@ +# -*- coding: utf-8 -*- +#============================================================================ +#Name : ant.py +#Part of : Helium + +#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +#All rights reserved. +#This component and the accompanying materials are made available +#under the terms of the License "Eclipse Public License v1.0" +#which accompanies this distribution, and is available +#at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +#Initial Contributors: +#Nokia Corporation - initial contribution. +# +#Contributors: +# +#Description: +#=============================================================================== +# +# Helium Documentation documentation build configuration file, created by +# sphinx-quickstart on Fri May 09 09:49:44 2008. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# The contents of this file are pickled, so don't put values in the namespace +# that aren't pickleable (module imports are okay, they're removed automatically). +# +# All configuration values have a default value; values that are commented out +# serve to show the default value. + +import sys, os + +# If your extensions are in another directory, add it here. If the directory +# is relative to the documentation root, use os.path.abspath to make it +# absolute, like shown here. +#sys.path.append(os.path.abspath('some/directory')) + +# General configuration +# --------------------- + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +#extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['.templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General substitutions. +project = 'Helium' +copyright = '2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html' + +# The default replacements for |version| and |release|, also used in various +# other places throughout the built documents. +# +# The short X.Y version. +version = '0.23' +# The full version, including alpha/beta/rc tags. +release = '0.23' + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +today_fmt = '%B %d, %Y' + +# List of documents that shouldn't be included in the build. +#unused_docs = [] + +# List of directories, relative to source directories, that shouldn't be searched +# for source files. +#exclude_dirs = [] + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + + +# Options for HTML output +# ----------------------- + +# The style sheet to use for HTML and HTML Help pages. A file of that name +# must exist either in Sphinx' static/ path, or in one of the custom paths +# given in html_static_path. +html_style = 'default.css' + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# The name of an image file (within the static path) to place at the top of +# the sidebar. +html_logo = 'helium_pallot_small.jpg' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['.static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +html_sidebars = { + 'index': 'sidebar.html' +} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +html_use_modindex = False + +# If true, the reST sources are included in the HTML build as _sources/. +#html_copy_source = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = '' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Helium doc' + + +# Options for LaTeX output +# ------------------------ + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, document class [howto/manual]). +latex_documents = [ + ('index', 'Helium.tex', 'Helium Documentation', 'The Helium Team', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_use_modindex = True diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/default.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/default.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,842 @@ +/** + * Sphinx Doc Design + */ + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +/* :::: LAYOUT :::: */ + +div.document { + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: white; + padding: 0 20px 30px 20px; +} + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; +} + +div.clearer { + clear: both; +} + +div.footer { + color: #fff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #fff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + color: #fff; + width: 100%; + height: 30px; + line-height: 30px; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +div.related a { + color: white; +} + +/* ::: TOC :::: */ +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: white; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: white; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: white; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + list-style: none; + color: white; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +/* :::: MODULE CLOUD :::: */ +div.modulecloud { + margin: -5px 10px 5px 10px; + padding: 10px; + line-height: 160%; + border: 1px solid #cbe7e5; + background-color: #f2fbfd; +} + +div.modulecloud a { + padding: 0 5px 0 5px; +} + +/* :::: SEARCH :::: */ +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* :::: COMMON FORM STYLES :::: */ + +div.actions { + padding: 5px 10px 5px 10px; + border-top: 1px solid #cbe7e5; + border-bottom: 1px solid #cbe7e5; + background-color: #e0f6f4; +} + +form dl { + color: #333; +} + +form dt { + clear: both; + float: left; + min-width: 110px; + margin-right: 10px; + padding-top: 2px; +} + +input#homepage { + display: none; +} + +div.error { + margin: 5px 20px 0 0; + padding: 5px; + border: 1px solid #d00; + font-weight: bold; +} + +/* :::: INLINE COMMENTS :::: */ + +div.inlinecomments { + position: absolute; + right: 20px; +} + +div.inlinecomments a.bubble { + display: block; + float: right; + background-image: url(style/comment.png); + background-repeat: no-repeat; + width: 25px; + height: 25px; + text-align: center; + padding-top: 3px; + font-size: 0.9em; + line-height: 14px; + font-weight: bold; + color: black; +} + +div.inlinecomments a.bubble span { + display: none; +} + +div.inlinecomments a.emptybubble { + background-image: url(style/nocomment.png); +} + +div.inlinecomments a.bubble:hover { + background-image: url(style/hovercomment.png); + text-decoration: none; + color: #3ca0a4; +} + +div.inlinecomments div.comments { + float: right; + margin: 25px 5px 0 0; + max-width: 50em; + min-width: 30em; + border: 1px solid #2eabb0; + background-color: #f2fbfd; + z-index: 150; +} + +div#comments { + border: 1px solid #2eabb0; + margin-top: 20px; +} + +div#comments div.nocomments { + padding: 10px; + font-weight: bold; +} + +div.inlinecomments div.comments h3, +div#comments h3 { + margin: 0; + padding: 0; + background-color: #2eabb0; + color: white; + border: none; + padding: 3px; +} + +div.inlinecomments div.comments div.actions { + padding: 4px; + margin: 0; + border-top: none; +} + +div#comments div.comment { + margin: 10px; + border: 1px solid #2eabb0; +} + +div.inlinecomments div.comment h4, +div.commentwindow div.comment h4, +div#comments div.comment h4 { + margin: 10px 0 0 0; + background-color: #2eabb0; + color: white; + border: none; + padding: 1px 4px 1px 4px; +} + +div#comments div.comment h4 { + margin: 0; +} + +div#comments div.comment h4 a { + color: #d5f4f4; +} + +div.inlinecomments div.comment div.text, +div.commentwindow div.comment div.text, +div#comments div.comment div.text { + margin: -5px 0 -5px 0; + padding: 0 10px 0 10px; +} + +div.inlinecomments div.comment div.meta, +div.commentwindow div.comment div.meta, +div#comments div.comment div.meta { + text-align: right; + padding: 2px 10px 2px 0; + font-size: 95%; + color: #538893; + border-top: 1px solid #cbe7e5; + background-color: #e0f6f4; +} + +div.commentwindow { + position: absolute; + width: 500px; + border: 1px solid #cbe7e5; + background-color: #f2fbfd; + display: none; + z-index: 130; +} + +div.commentwindow h3 { + margin: 0; + background-color: #2eabb0; + color: white; + border: none; + padding: 5px; + font-size: 1.5em; + cursor: pointer; +} + +div.commentwindow div.actions { + margin: 10px -10px 0 -10px; + padding: 4px 10px 4px 10px; + color: #538893; +} + +div.commentwindow div.actions input { + border: 1px solid #2eabb0; + background-color: white; + color: #135355; + cursor: pointer; +} + +div.commentwindow div.form { + padding: 0 10px 0 10px; +} + +div.commentwindow div.form input, +div.commentwindow div.form textarea { + border: 1px solid #3c9ea2; + background-color: white; + color: black; +} + +div.commentwindow div.error { + margin: 10px 5px 10px 5px; + background-color: #fbe5dc; + display: none; +} + +div.commentwindow div.form textarea { + width: 99%; +} + +div.commentwindow div.preview { + margin: 10px 0 10px 0; + background-color: #70d0d4; + padding: 0 1px 1px 25px; +} + +div.commentwindow div.preview h4 { + margin: 0 0 -5px -20px; + padding: 4px 0 0 4px; + color: white; + font-size: 1.3em; +} + +div.commentwindow div.preview div.comment { + background-color: #f2fbfd; +} + +div.commentwindow div.preview div.comment h4 { + margin: 10px 0 0 0!important; + padding: 1px 4px 1px 4px!important; + font-size: 1.2em; +} + +/* :::: SUGGEST CHANGES :::: */ +div#suggest-changes-box input, div#suggest-changes-box textarea { + border: 1px solid #ccc; + background-color: white; + color: black; +} + +div#suggest-changes-box textarea { + width: 99%; + height: 400px; +} + + +/* :::: PREVIEW :::: */ +div.preview { + background-image: url(style/preview.png); + padding: 0 20px 20px 20px; + margin-bottom: 30px; +} + + +/* :::: INDEX PAGE :::: */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* :::: INDEX STYLES :::: */ + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +form.pfform { + margin: 10px 0 20px 0; +} + +/* :::: GLOBAL STYLES :::: */ + +.docwarning { + background-color: #ffe4e4; + padding: 10px; + margin: 0 -20px 0 -20px; + border-bottom: 1px solid #f66; +} + +p.subhead { + font-weight: bold; + margin-top: 20px; +} + +/*BMT added 16/10/08 */ +a:link { + color: blue; + text-decoration: none; +} + +a:visited { + color: navy; + text-decoration: none; +} + +a:hover { + color: purple; + text-decoration: underline; +} +/* BMT end added 16/10/08 */ + + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 250%; color:black;} +div.body h2 { font-size: 190%; color:#36237f;} +div.body h3 { font-size: 150%; color:#4933af;} +div.body h4 { font-size: 120%; color:#6223df;} +div.body h5 { font-size: 100%; color:#6f23ef;} +div.body h6 { font-size: 80%; color:#5a62ff;} + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + text-align: left; + line-height: 130%; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +ul.fakelist { + list-style: none; + margin: 10px 0 10px 20px; + padding: 0; +} + +.field-list ul { + padding-left: 1em; +} + +.first { + margin-top: 0 !important; +} + +/* "Footnotes" heading */ +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +/* "Topics" */ + +div.topic { + background-color: #eee; + border: 1px solid #ccc; + padding: 0 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* Admonitions */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +div.admonition p { + display: inline; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +table.docutils { + border: 0; +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 0; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +dl { + margin-bottom: 15px; + clear: both; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.refcount { + color: #060; +} + +dt:target, +.highlight { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +th { + text-align: left; + padding-right: 5px; +} + +pre { + padding: 5px; + background-color: #efc; + color: #333; + border: 1px solid #ac9; + border-left: none; + border-right: none; + overflow: auto; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +tt { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +tt.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +tt.descclassname { + background-color: transparent; +} + +tt.xref, a tt { + background-color: transparent; + font-weight: bold; +} + +.footnote:target { background-color: #ffa } + +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.versionmodified { + font-style: italic; +} + +form.comment { + margin: 0; + padding: 10px 30px 10px 30px; + background-color: #eee; +} + +form.comment h3 { + background-color: #326591; + color: white; + margin: -10px -30px 10px -30px; + padding: 5px; + font-size: 1.4em; +} + +form.comment input, +form.comment textarea { + border: 1px solid #ccc; + padding: 2px; + font-family: sans-serif; + font-size: 100%; +} + +form.comment input[type="text"] { + width: 240px; +} + +form.comment textarea { + width: 100%; + height: 200px; + margin-bottom: 10px; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +/* :::: PRINT :::: */ +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0; + width : 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + div#comments div.new-comment-box, + #top-link { + display: none; + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/developer_guide.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/developer_guide.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,191 @@ +.. index:: + module: Developer Guide + +################################### +Developer Guide +################################### + +.. contents:: + +Introduction +============ + +This describes various practices, procedures and conventions used within Helium. It should be read by all contributors to Helium along with the Coding Conventions. + +.. index:: + single: Documentation + +Documentation +============= + +Standalone documents like this design document and the user guide are documented in reStructuredText__ format. + +__ http://docutils.sourceforge.net/rst.html + +HTML documentation is generated in ``/helium/build/doc`` using the ``hlm doc`` command. + + +.. index:: + single: Index References-creating + +Creating Index References +------------------------- + +In order to get things in the index you have to manually add the following code to the .rst files: :: + + .. index:: + module: file heading (the text in the 1st heading at the top of the page) gets added to index as module + +put this text at the top of the file:: + + .. index:: + single: heading text + +put this just above a heading. This gets added to the index as a normal indexed link. + +If you replace 'single' with 'pair' it puts 2 enteries in the index::: + + .. index:: + pair: iname1; ename2 + +In the index it becomes iname1 with ename2 below it and indented (in the 'i' section) and also ename2 with iname1 +below it and indented (in the 'e' section) + +The index directive needs blank lines either side of it. + + +.. index:: + single: Directory Structure + +Directory structure +=================== + +The ``/helium`` directory structure consists of: + +``/build`` + This is not under source control. It is created on demand to store generated documentation, testing and coverage output and so on. + +``/config`` + Configuration files for parts of Helium. Some of these may only need to be defined in Helium, whereas others may be default configuration that may be overridden by a user. + +``/doc`` + All documentation related to Helium. Files are in .rst format (HTML versions can be generated under ``/build/doc`` using the ``hlm doc`` command). + +``/external`` + Applications and libraries that are maintained outside of the Helium team. + +``/testconfig`` + Test build configurations. + +``/tests`` + Test data for unit tests. All unit tests are co-located with the code under test. + +``/tools`` + A number of subdirectories for each stage of the build. Each directory may contain Ant scripts and other tools and scripts related to that stage. + +``/tools/common`` + Common libraries for Java, Perl and Python and XML schemas. + + +Ant script structure +-------------------- + +The ``helium.ant.xml`` file in the project root should be imported by each build configuration. This in turn imports the root files for each of the key build stages defined in the ``/tools`` directory. ``helium.ant.xml`` also defines a number of common Ant default properties. + + +.. index:: + single: Custom Ant library + +Custom Ant library +================== + +All custom Ant tasks and loggers should be added under ``/tools/common/java/src``. The command:: + + hlm-jar.bat + +can be run from the ``/helium`` directory. This will update the ``nokia_ant.jar`` file in ``/tools/common/java/lib``. + +Each custom task must be defined inside the ``antlib.xml`` file inside ``/tools/common/java/src/nokia/ant``. + + +.. index:: + single: XML Schemas + +XML schemas +=========== + +A ``validate-xml`` command can be run to check the various Helium XML files against their schema (this is run in the automated unit tests). + +There are schema files for these XML file types: + +* Helium data model. + + +.. index:: + single: Helium Data Model + +Helium data model +================= + +The Helium data model defines the configuration elements needed to configure Helium. It is defined in the file ``/config/helium_data_model.xml`` and contains: + +* A list of configuration elements with metadata: + + * Name. Defines the name of the configuration element. Required. + * Type. Defines the type of the configuration element, i.e. if the configuration element is a string, integer, boolean or flag. Required. + * Usage. Defines the typical usage of the property. Must one of "must", "recommended", "allowed", "discouraged", "never". Required. + * Description. This should be in .rst format. Required. + * Deprecated. This is a optional element that defines the property is deprecated. + +* A list of groups that group together related configuration elements and their usage requirements within that group, i.e. if that feature is to be used, what configuration is required and what is optional. All required configuration elements in a group must be defined. + +Any Ant configuration can be checked against the model by running ``hlm check``. + + +.. index:: + single: Assertions + +Assertions +========== + +There are some basic assertion macros defined in ``common.ant.xml``. These can be used to check for correctness at the end of a target, e.g. checking that a file exists which the target was supposed to create. + +The assertions can be enabled by defining the ``hlm.enable.asserts``. If ``hlm.enable.asserts`` is not enabled, macro will print warnings only. +There are several macros: + +``hlm:assert`` + A basic assertion that will check any task contained within it. + +``hlm:assertFileExists`` + Takes a file attribute and asserts that the file exists. + +.. index:: + single: Ivy Configuration + +Ivy Configuration +------------------ + +Ibiblio +```````` + +Libraries in Maven2 Ibiblio_ repository can use: ``helium/config/ivy/ivy.xml`` + +.. _Ibiblio: http://mirrors.ibiblio.org/pub/mirrors/maven2/ + +These parameters should be used, if library has passed legal tests: ``transitive="false"``, ``conf="subcon"`` +Otherwise use: ``transitive="false"``, ``conf="core_install"`` + +Direct URLs +``````````` + +Use these for a direct url link, if the library is needed for the subcon release:: + + helium/config/ivy/modules/jars_subcon-1.0.ivy.xml + helium/config/ivy/modules/eggs_subcon-1.0.ivy.xml + +Otherwise add to these files for non subcon libraries:: + + helium/config/ivy/modules/eggs-1.0.ivy.xml + helium/config/ivy/modules/jars-1.0.ivy.xml + +A new ivy config file can be added for a non-jar or egg type file. diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/feature_list.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/feature_list.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,391 @@ +=================== +Helium Feature List +=================== + +.. index:: + module: Helium Feature List + +.. contents:: + +.. index:: + single: feature - Framework + +Framework +========= + +.. index:: + single: feature - Logging + +Logging +------- + +* Individual log files created for most build stages. +* A summary log file is created from individual log files. + + * Shows categorized messages divided into errors, significant warnings and warnings. + +.. index:: + single: feature - Signalling + +Signaling +---------- + +* Build engineer can be signaled via email and SMS at many key points during the build. + + * The triggering and choice of when to signal can be configured. + +.. index:: + single: feature - Validation + +Validation +---------- + +* Validate an Ant configuration against the data model. + +.. index:: + single: feature - Password Handling + +Password handling +----------------- + +* Query passwords from a .netrc file or request via a dialog. + +.. index:: + single: feature - Diamonds logging + +Diamonds logging +---------------- +* Can upload build id, start and end time, creator, host name, release label. +* Can upload stage start and end time based on the configuration of stages +* Can upload build tools name and its version information. +* Can upload release location. +* Can parse multiple scan log file. +* Can upload build faults related information. +* Can upload BOM contents. +* Can upload "number of object files" and "number of generated files". +* Can upload build system and number of processors. +* Can upload distribution policy file related errors like missing, invalid encoding and error type A, B, C. +* Can upload List of Illegal APIs names if disable.analysis.tool is not set. +* Can upload custom build tags. +* Logging can be skipped if desired. + + +.. index:: + single: feature - Documentation + +Documentation +------------- + +* Quick start, manual, tutorials, How-To's and development guidelines in HTML format. +* Helium API documents the Ant targets and properties. +* Documentation for Python and Java APIs and custom Ant tasks. + + +.. index:: + single: feature - build stages + +Build stages +============ + +.. index:: + single: feature - startup + +Startup +------- + +* A number of build configurations can be run on several machines from a single work area. +* A subcon release can be bootstrapped to download required libraries for building ROMs. + +.. index:: + single: feature Synergy operations + +Synergy operations +------------------ + +* Update a Synergy work area. + + * Create snapshots. + * Checkout projects and update with folders and tasks. + +* Build management functions. + +.. index:: + single: feature Mercurial operations + +Mercurial operations +-------------------- + +* Set or show the current branch name +* Checkout a repository +* Export the header and diffs for one or more changesets +* Display information about an item +* Create a new repository in the given directory +* Show revision history of entire repository or files +* Pull changes from the specified source +* Remove the specified files on the next commit +* Add one or more tags for the current or given revision +* List repository tags +* Update working directory + +.. index:: + single: feature - Preparation + +Preparation +----------- + +* Checking the build machine environment for required tools. +* Build drive creation through subst'ing. +* Preparation of the build area. + + * Copy operations, with content filtering. + * Unzip operations, with content filtering. + * Extraction of ICDs/ICFs in order. + * Checks content is available before starting preparation steps. + +* Support for Dragonfly workspace creation. +* BOM and BOM delta creation. + + * HTML and plain text output files. + +* Unarchive a release from network. + +.. index:: + single: feature - compilation + +Compilation +----------- + +* Compilation using System Definition XML format. + + * The System Definition files are pre-processed to insert Ant properties + +* Different build systems can be selected. + + * Symbian EBS. + * Electric Cloud (EC) with history file management. + * Symbian Build System (Raptor). + +* A clean target allows a clean configuration to be built. + +* cMaker support (clean, export, what). + +.. index:: + single: feature - SIS files + +SIS files +--------- + +* SIS files can be built. + +.. index:: + single: feature - Quality Assurance + +Quality assurance +----------------- +* Policy file validation. +* Build duplicates detection. +* Internal exports detection. +* Codescanner task. + +.. index:: + single: feature - Publishing + +Publishing +---------- + +* Create zips of the EE build area. + + * Content can be split across zips depending on number of files and file sizes. + * In release metadata it holds md5checksum value and size of all the zip files. +* Zipping using EBS / EC based on the build system. +* Create delta zips for each localised region. +* Publish at several points during the build to a network directory. +* Zip content selected based on distribution.policy file content. +* Zip content selected based on component exports. + +.. index:: + single: feature - Localisation + +Localisation +------------ + +* S60 3.2.x support + + * Support for S60 localisation tool. + * Support for localise resources tool which localises using in EBS / EC based on the build system. + * Possibility to provide a different set of configuration for each region. + * Locales_xx.iby generation that support override directive from SP. + * Cenrep generation for variants (languagepack and customer). + * Languagepack automation (Should be moved to SP/iMaker in the future). + +* S60 5.0.x support + + * DTD localisation. + * Regional variation. + +.. index:: + single: feature - iMaker image creation + +iMaker image creation +--------------------- + +* Creates EE images. +* Image creation using EBS / EC based on the build system +* Language pack creation/automation. +* Customer variant creation. +* Creates SW version string for the images and override the one in ROM. (through Helium/iMaker feature). +* Firmware ID generation and automatic inclusion (through iMaker feature). +* Debug image creation (through Helium/iMaker feature). +* Core image creation. +* Auto-detection of variant folder. +* Variation from variant folder (no export/clean-export to epoc32). +* Automatic region switching. +* (Future feature) Support for languagepack automation (through iMaker, still RD feature at the moment). + +.. index:: + single: feature - Release Notes Creation + +Release notes creation +---------------------- + +* Modifies a RTF template with values from build. +* Adds table of errors and warnings. +* Generates list of baselines, projects and tasks used. + +.. index:: + single: feature - Delta Releasing + +Delta releasing +--------------- + +* Creates a MD5 list of files in a build area. +* Compares a set of these files and zips new/ changed. +* Generates a XML file for SymDEC of files deleted. + +.. index:: + single: feature - Testing + +Testing +------- + + ATS test package generation for API (unit and/or Module) and UI test + + ============== ======== =========== === ======= ========= =========== + Test Framework PKG File Dir Parsing CTC Tracing sis files Test Assets + ============== ======== =========== === ======= ========= =========== + **STIF** - - - - - + **TEF** - + **RTEST** - + **MTF** - + **EUnit** - - - - + **ASTE** - + ============== ======== =========== === ======= ========= =========== + + - Supported + + +.. index:: + single: feature - IDO builds + +IDO builds +---------- +* Codescanner integration for IDO. +* Build area preparation for IDO (ADO base copying). + +Other features +============== + +.. index:: + single: feature - Interation + +Integration +----------- + +* Overlays can be validated to check the need for merging. +* Automated merge task creation. + +.. index:: + single: feature - Miscallaneous + +Miscellaneous +------------- + +* Clean the build areas root directory of old builds based on a dialog selection. +* Print a list of target dependencies. +* The source code can be scanned for words that are classed as 'bad words' i.e. words that should not be used within the code e.g. Nokia product names, competitor names and competitor product names, these ''bad words'' are counted and displayed at the end of the build process + +.. index:: + single: feature - Supported SCM tools + +Supported SCM tools +------------------- + +* Synergy +* Mercurial + +.. index:: + single: feature - Nokia Build stages + +Nokia Build stages +================== + +.. index:: + single: feature - FOTA update packages creation + +FOTA update packages creation +----------------------------- +* Generation of FOTA packages between 2 published releases. +* Generation of FOTA toggle packages for TRUE test. +* Support of MakeUPCT: generation of _fota.cnf and .fota.conf files. + +.. index:: + single: feature - Data packaging + +Data packaging +-------------- + +* Generates VPL and DCP and signature files. +* Compresses images. +* Flashes phone to generate SPR. +* Creates input for gMES and NSU. +* Installer creation using InstallShield. + +.. index:: + single: feature - UDA creation + +UDA and Mass Memory Creation +---------------------------- + +* UDA creation using iMaker +* Mass Memory using ImageTool + +.. index:: + single: feature - RnD SDK creation + +RnD SDK creation +---------------- + +* RndSDK creation tool is used to create an SDK using S60 released Rnd environment. +* It generates the eclipse based html-documentation for the APIs present in the Rnd Environment. +* The APIs in the S60 Rnd environment can be filtered, based on the required API categories Public, Domain etc. +* The output is a zip file containing the Rnd SDK environment, along with the documentation of the APIs present in it. +* The developer can extract and use the RndSDK for further development. + +.. index:: + single: feature - API Analysis + +API analysis +------------ + +* API Analysis takes input from apidescr.xml, generated by the Analysis tool from S60 build environment and generates count of SDK, Domain and Internal APIs for diamonds logging. +* The analysis can be run as part of the RnD SDK or independently. +* API tests are supported by `Testing`_ + +.. index:: + single: feature - Releasing + +Releasing +--------- + +* Upload content to network. +* Release to Grace. diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/helium_overview.html.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/helium_overview.html.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,65 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> + + + + + + + + + +<#list doc.helium.layer as layer> + + + + + + +
    ${layer.name} + + <#list layer.row as row> + + <#list row.component as component> + + + + +
    ${component}
    +
    + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/helium_overview.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/helium_overview.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,134 @@ + + + + + Apache Ant + #FFC726 + + Apache Ant + + + + Helium domains + #66FFFF + + Preparation + Compilation + ROM/UDA creation + Localisation + Testing + + + Publishing + Releasing + Data packaging + Integration + FOTA + + + + Helium services + #C5D5A9 + + Common configuration + Logging + Signaling + Metrics recording + + + Configuration validation + API documentation + Error checking + + + + Ant libraries + #A3B8CB + + antunit + ant-contrib + commons configuration + antform + freemarker + junit + + + dom4j + svnant + xmltask + ivy + + + + External tools in Helium + #ED9B4F + + Capability scan + CheckStubSis + CruiseControl + DependencyAnalyzer + VplSignJava + + + symbiantools + filedisk + info-zip + Subversion + unxutils + + + + External tools not in Helium + #E76F00 + + 7zip + Synergy + Mercurial + CodeScanner + GRACE CLI + + + Java 1.3.1 + PCLint + RVCT + SymDEC + + + + Runtimes + #B2BC00 + + Java 6 + Python 2.5 + Perl 5.6 + + + + Platforms + #C69200 + + Windows + Linux + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/helium_pallot_small.jpg Binary file buildframework/helium/doc/src/helium_pallot_small.jpg has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/index.html Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,18 @@ + + + + + +Helium Documentation + + + + + + + +<H2>Helium Documentation</H2> + +<a href="toc.html">Apache Ant User Manual</a> + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/index.rst.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/index.rst.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,189 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +.. Helium Documentation documentation master file, created by sphinx-quickstart on Fri May 09 09:49:44 2008. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. index:: + module: Helium Documentation + +==================== +Helium documentation +==================== + +.. toctree:: + :maxdepth: 1 + +.. raw:: html + + + + + + + +
    + +.. index:: + single: Getting Started + +Getting Started +================ + +This section contains instructions on how to get started with Helium including where to get it from and how to use it at the very simplest level. +<#if !(ant?keys?seq_contains("sf"))> +This section also has a link to an elearning that goes through Helium at a very high level. + + +.. toctree:: + :maxdepth: 1 + + introduction + quick_start_guide + feature_list + user-graph + +<#if !(ant?keys?seq_contains("sf"))> +* Elearning_ + +.. _Elearning: http://lmp.nokia.com/lms/lang-en/taxonomy/TAX_Search.asp?UserMode=0&SearchStr=helium + + +.. raw:: html + + + + +Tutorials and HOWTOs +===================== +This section lists all the available tutorials on Helium and how to configure and use it. + +.. toctree:: + :maxdepth: 1 + + tutorials/configuration/SimplestConfiguration + tutorials/configuration/UseHlmTasksInConfiguration + tutorials/configuration/HowtoCreateANewSignal + tutorials/rom_image + tutorials/variant + tutorials/qt_build +<#if !ant?keys?seq_contains("sf")> + nokia/blacktusk/howto-setup-blacktusk-with-helium + +* IDO_ + +.. _IDO: ido + +* TeamCI_ + +.. _TeamCI: teamci + + +.. raw:: html + +
    + +.. index:: single: Helium Manual + +Helium Manual +============== + +This section contains the details of the various activities that can be performed by Helium, you should look +here for specific information about a task or action. + +.. toctree:: + :maxdepth: 1 + +<#if !ant?keys?seq_contains("sf")> + nokia/nokia + nokia/retrieving + + sf + manual/running + manual/configuring + manual/configuringdiamonds + manual/signaling + manual/stages +<#if !ant?keys?seq_contains("sf")> + nokia/nokiastages + nokia/rndsdk_user_manual + nokia/quality + + manual/cruisecontrol + manual/debugging + metrics + manual/APIs +<#if !ant?keys?seq_contains("sf")> + api_changes + +* helium-antlib_ + +.. _helium-antlib: helium-antlib + + +.. raw:: html + + + +Helium Architecture +=================== + +This section describes the architecture of Helium. It also contains a link to the style guide to be used for +coding conventions. + + +.. toctree:: + :maxdepth: 1 + + architecture + +.. raw:: html + +
    + +Developer Guide +================== +This section contains information on how to make changes to Helium either as a tools team developer or an external +developer. The 'developer guide' link contains information on the structure of the directories and some important +information on how to add libraries and other miscellaneous information. +It also contains details on how to test the changes made. + +.. toctree:: + :maxdepth: 1 + +<#if !ant?keys?seq_contains("sf")> + nokia/howto-contribute + nokia/legal + nokia/testing + + developer_guide + coding_conventions + +.. raw:: html + +
    + +Indices and Tables +================== + +* :ref:`genindex` +* :ref:`search` diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/introduction.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/introduction.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,82 @@ +################### +Helium Introduction +################### + +.. index:: + module: Introduction + +.. contents:: + +.. index:: + single: Introduction + +Introduction +============= + +This is the user guide and technical description for Helium, an ANT based build framework used to build S60 based products. +This documentation describes how to configure and use the Helium build framework from the point of view of an IDO integrator, +a build manager, a helium contributor and subcon user. + +Helium contains all you need in order to create a work area, a build area, perform the compilation, link, create localised +variants, submit build information to Diamonds (used for statistical analysis), create Data Packages, +zip the files to create a release and much more. The aim is for helium to be used by every build and release team working on +S60 products within Nokia. It is also used by some Subcons as part of the tool set given to them to allow subcons to build parts +of the S60 code. + +Before you start reading about Helium it is very advisable that you are familiar with ANT_ and how it works so +click on this `ANT link`_ if you are not familiar with ANT_. + +.. _ANT link: http://ant.apache.org/ +.. _ANT: http://ant.apache.org/ + +Ant makes great use of XML_ files for its configuration so if you are unfamiliar with XML_ files it is recommended that you read the +information at the XML_ link. + +.. _XML: http://www.w3.org/XML/ + +There are various parts of this documentation that are only of interest to certain users (in particular the Helium integrator), +it is hoped that eventually there will +be separate contents lists for the different users, but for the time being this is not possible, so bare with us. + + +NOTE: for best viewing you should use Windows Internet Explorer 7.0 or newer as version 6.0 has some problems with display of the +navigation bar and contents list. + + +.. index:: + single: Vision + +Vision +========= + +The Helium vision is to fulfill the following demands: + + * A "common unified toolset". + * Easy to use and configure for all different builds. + + * Fully automated builds. + * Verbose and clear messages. + + * Light. + * Simple things should be easy to do, complex things should be possible. + +.. index:: + single: Background + +Background +============ + +Helium was developed from a need to reduce "reinventing the wheel" for build tools. It was based on the mc_tools project which had the same goal within the former MC organization. + +.. index:: + single: Why Ant? + +Why Ant? +========== + +Helium is fundamentally based on Apache ANT_. Why was ANT_ chosen when there were many other similar frameworks inside Nokia, +such as sbt, isis_build and TrombiBuild. The main reason is that while the other toolkits were developed inside Nokia, +ANT_ is an open source tool from Apache, based on relatively simple XML_ files that define the build steps. +Through leveraging the power of open source Helium has integrated a large amount of functionality that would have taken +much longer to develop in-house, as well as benefit from existing, high-quality documentation. + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/junit_testing.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/junit_testing.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,245 @@ +.. index:: + module: Testing using JUnit + +#################### +Testing using JUnit +#################### + + +.. contents:: + +.. index:: + single: JUnit - what is it + +What is JUnit +============= +JUnit is a simple open source Java testing framework used to write and run repeatable automated tests. It is an +instance of the xUnit architecture for unit testing framework. Eclipse supports creating test cases and running +test suites, so it is easy to use for your Java applications. + +.. index:: + single: JUnit features include + +JUnit features include: +----------------------- + * Assertions for testing expected results + * Test fixtures for sharing common test data + * Test suites for easily organizing and running tests + * Graphical and textual test runners + +.. index:: + single: JUnit Coding Convention + +JUnit Coding Convention: +------------------------ + * Name of the test class must end with "Test". + * Name of the method must begin with "test". + * Return type of a test method must be void. + * Test method must not throw any exception. + * Test method must not have any parameter. + +.. index:: + single: JUnit write and run simple test + +How you write and run a simple test +=================================== + Lets think about we need to test the following Calculator Class + + public class Calculator + { + + int sum(int num1,int num2){ + + return num1+num2; + + } + + } + +1. Import JUnit Class. +---------------------- + +(The assumption for this code using junit v 4.4 ) + +import junit.framework.*; + +Since we are using some constructs created by the makers of JUnit we must import any of the classes we desire to use, most of these reside in the framework subdirectory, hence the import statement. + + +2. Create a subclass of TestCase: +---------------------------------- + +public class CalculatorTest extends TestCase { + + Calculator cal=new Calculator(); + +} + +Our simple class needs to define its own test method(s) to actually be of any use so it extends TestCase which provides us with the ability to define our own test methods + +3. Write a test method to assert expected results on the object under test: +--------------------------------------------------------------------------- +public void testSum() { + + assertEquals(2,cal.sum(1,1)); + +} + +4. Code location: +----------------- +Place the test class under "\helium\tools\common\java\test" + + + +5. Execute the test by the command +---------------------------------- + + hlm ju-unittest + + + +.. index:: + single: JUnit report + +JUnit report +============ + +There are few ways to check the report + +1. At console +------------- + +The test result appears in the console as below (after execute the command : hlm ju-unittest) + + [cobertura-report] Cobertura GNU GPL License (NO WARRANTY) - See COPYRIGHT file + + [cobertura-report] Cobertura: Loaded information on 14 classes. + + [cobertura-report] + + [cobertura-report] Average line coverage : 19.00% + + [cobertura-report] Average branch coverage : 15.00% + + [cobertura-report] + + [cobertura-report] class-name=nokia.ant.AntConfiguration line-rate=00.00% branch-rate=00.00% + + [cobertura-report] class-name=nokia.ant.AntLint line-rate=00.00% branch-rate=00.00% + + [cobertura-report] class-name=nokia.ant.ScanLogParser line-rate=00.00% branch-rate0.00% + + [cobertura-report] class-name=nokia.ant.XMLHandler line-rate=66.23% branch-rate=45.00% + + +2. At Buildbot +-------------- +For a regular build the result appear in buildbot as follows + + [cobertura-report] Cobertura GNU GPL License (NO WARRANTY) - See COPYRIGHT file + + [cobertura-report] Cobertura: Loaded information on 14 classes. + + [ccobertura-report] + + [cobertura-report] Average line coverage : 15.56% + + [cobertura-report] Average branch coverage : 06.96% + + [cobertura-report] + + [cobertura-report] class-name=nokia.ant.AntConfiguration line-rate=00.00% branch-rate=00.00% + + [cobertura-report] class-name=nokia.ant.AntLint line-rate=00.00% branch-rate=00.00% + + [cobertura-report] class-name=nokia.ant.AntLint$AntLintHandler line-rate=00.00% branch-rate=00.00% + + [cobertura-report] class-name=nokia.ant.BuildData line-rate=59.49% branch-rate=20.00% + + [cobertura-report] class-name=nokia.ant.BuildData$BuildFault line-rate=100.00% branch-rate=100.00% + + [cobertura-report] class-name=nokia.ant.BuildData$StageData line-rate=00.00% branch-rate=00.00% + + [cobertura-report] class-name=nokia.ant.Retry line-rate=00.00% branch-rate=00.00% + + [cobertura-report] class-name=nokia.ant.ScanLogParser line-rate=00.00% branch-rate=00.00% + + [cobertura-report] class-name=nokia.ant.XMLHandler line-rate=66.23% branch-rate=45.00% + + [cobertura-report] Report time: 640ms + + + +3. Report folder +---------------- + +If you need to generate a html report then please uncomment the below line from build.xml and check the report from ${line.coverage.reports} properties location + + + + + +.. index:: + single: JUnit execute multiple test cases + +Execute multiple test cases with TestSuite +========================================== + +If you have two tests and you'll run them together you could run the tests one at a time yourself, but you would quickly grow tired of that. Instead, JUnit provides an object TestSuite which runs any number of test cases together. The suite method is like a main method that is specialized to run tests. + +Create a suite and add each test case you want to execute: + + public static void suite(){ + + TestSuite suite = new TestSuite(); + + suite.addTest(new CalculatorTest ("testSum")); + + ****************************************; + + ****************************************; + + ****************************************; + + return suite; + + } + + +Since JUnit 2.0 there is an even simpler way to create a test suite, which holds all testXXX() methods. +You only pass the class with the tests to a TestSuite and it extracts the test methods automatically. + + +.. index:: + single: JUnit Assert + +JUnit Assert +============ + +.. csv-table:: + :header: "Assert Name" + + "``assertEquals(expected, actual)``" + "``assertEquals(message, expected, actual)``" + "``assertEquals(expected, actual, delta)``" + "``assertEquals(message, expected, actual, delta)``" + "``assertFalse(condition)``" + "``assertFalse(message, condition)``" + "``Assert(Not)Null(object)``" + "``Assert(Not)Null(message, object)``" + "``Assert(Not)Same(expected, actual)``" + "``Assert(Not)Same(message, expected, actual)``" + "``assertTrue(condition)``" + "``assertTrue(message, condition)``" + + +.. index:: + single: JUnit References + +References +========== +http://www.junit.org/ + +http://junit.sourceforge.net/doc/cookstour/cookstour.htm + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/manual/APIs.rst.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/manual/APIs.rst.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,84 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +.. index:: + module: API + +################### +API +################### + + +.. contents:: + +Introduction +============ + +This section contains the API to Helium. + + +.. index:: + single: API + +APIs +==== + +* `Search API`_ + +.. _`Search API`: ../api/index.html + +* `Helium API`_ + + The `Helium API`_ specifies all the available Ant_ targets and their + required properties. The API is the number one resource to use when + building up a Helium configuration. + +.. _`Helium API`: ../api/helium/index.html +.. _Ant: http://ant.apache.org + +* `Helium Antlib`_ + +.. _`Helium Antlib`: ../helium-antlib/index.html + +<#if !(ant?keys?seq_contains("sf"))> +* `Python API`_ + +.. _`Python API`: ../api/python/index.html + +* `Java API`_ + +.. _`Java API`: ../api/java/index.html + + +* `Ant Tasks`_ + +.. _`Ant Tasks`: ../api/ant/index.html + +<#if !(ant?keys?seq_contains("sf"))> +Customer APIs +============= + +* `IDO API`_ +* `DFS70501 API`_ + +.. _`IDO API`: ../ido/api/helium/index.html +.. _`DFS70501 API`: ../dfs70501/api/helium/index.html + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/manual/ats.dot --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/manual/ats.dot Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,26 @@ +digraph G { + +"IBY list" -> "test.mk's" +"test.mk's" -> "Build roms" +"Per product" -> "Build roms" +"Per product" -> "sysdef test layers" +"sysdef test layers" -> "components pkg" [label="Exclude any exclude.test.layers"] +"components pkg" -> "Generate install_steps" +"components pkg" -> "Generate execute_steps" +"Generate install_steps" -> "test.xml" +"Generate execute_steps" -> "test.xml" +"Build roms" -> "rom images" +"rom images" -> "ATSDrop zip" +"test.xml" -> "ATSDrop zip" +"ATSDrop zip"-> "network drive" +"network drive" -> "ats server" +"ats server" -> "Per test set (per component and or pkg)" +"Per test set (per component and or pkg)" -> "flash images" +"Per test set (per component and or pkg)" -> "install files" +"Per test set (per component and or pkg)" -> "execute tests" +"ats server" -> "send results to diamonds" + +subgraph "cluster1" {color=yellow;style=filled;label="per sysdef component or module"; "components pkg"; "Generate install_steps"; "Generate execute_steps"; "test.xml"; "ATSDrop zip"; "rom images"} + +subgraph "cluster2" {color=yellow;style=filled;label="ATS server runs each test set in parallel to protos"; "flash images"; "install files"; "execute tests"} +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/manual/configuring.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/manual/configuring.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,387 @@ +.. index:: + module: Configuring Helium + +================== +Configuring Helium +================== + +.. contents:: + +Introduction +============ + +This describes the key aspects of configuring a Helium build and other aspects of using the Helium build toolkit. + +Helium consists of several phases (the stages_ section explains these in detail) these are briefly outlined here: + +* pre-build - performs several checks on the environment and creates the Bill of Materials (BOM) before copying the relevant files from synergy to the build area and unzipping them. +* build - compiles the files. +* post-build - creates SIS files (system Installation files), creates ROM images, zips the build area for releasing, publishes releases, creates localised images, produces data packages, reports results to diamonds server. + +.. _stages: stages.html + +.. index:: + single: Configuration files + +Configuration files +=================== + +Defining a Helium build configuration can be a simple or complicated task depending on the requirements. Helium supports a lot of build +functionality but much of it is optional. All configuration files are based on XML using a number of different XML schemas or formats. +Over time more consistency and harmonisation of the formats will be implemented. Below is a list of the key formats: + +.. csv-table:: Helium configuration file types + :header: "Format", "Where used" + + "Apache Ant", "All build configurations must start with at least a ``build.xml`` file in the directory where builds will be run, that contains the minimum of Helium Ant properties to configure the build." + "Common configuration", "Several build stages: ROM build, zipping, SIS file creation." + "Environment/shell variables", "Configuring the PATH and other environment settings." + "Preparation", "Creation of a build area, using copy and unzip steps." + +.. index:: + single: Ant configuration + +Ant configuration +----------------- + +The Ant format is the most important because at least one Ant file is required to run any kind of build command. Read the `Using Ant`_ section of the Ant manual that describes how to write generic Ant files. + +.. _`Using Ant`: + +In the context of Helium, some specific elements and properties should be used. Here is an example of a very basic Helium Ant file:: + + + + + + + + + + + + + +Note that here the default target is ``product-build`` so this would be used for a product build configuration. In reality it would need many more properties to be complete. + +Refer to the `configuration reference`_ for a full list of all Helium Ant properties. + +.. _`configuration reference`: ../api/helium/index.html + +.. index:: + single: Common configuration format + +.. _common-configuration-format-label: + +Common configuration format +--------------------------- + +Several parts of the build require more complex configuration than basic ``name=value`` properties. A common format is introduced for these configurations that is closely matching the future Raptor build system format in concept. + +Currently only \`ROM Image configuration (using iMaker)\`_ and \`SIS files\`_ are configured using this format. + +Summary: + + * The XML document format consists of a ```` root element. + + * ```` subelements define specifications (configurations) to be built. + + * ```` elements can be nested, i.e. a ```` element can contain other ```` elements, etc. + + * A ``name`` attribute identifies that element. It can be used to select one or a group of configurations. + + * An ``abstract`` attribute marks that specification as being not directly buildable. Child specifications not marked as abstract may be buildable. + + * ```` elements inside ```` s define property values. A property defined in a child ```` element overrides the value of a property with the same name in a parent specification. All parent properties are inherited if not overridden. + + * Comma-separated values or repeated elements will result in a list property value when evaluated. + + +.. index:: + single: Passwords + +Passwords +========= + +Helium requires access to a few resources that require username and password authentication, like Synergy for SCM operations and a user's network login/password for GRACE upload. To avoid the need for a password dialog request, these details can be entered in a ``.netrc`` file located on the user's HOME drive. The HOME location is one of: + +Windows + H: drive + +Linux + ``/home/user`` + +A ``.netrc`` file is a standard Unix file format. + +The following entries are available: + +Synergy:: + + machine synergy login password + +``synergy`` can be replaced by the name of a specific database if the settings should apply only to that database, e.g:: + + machine vc1s60p1 login password + +Then account could be used to override the default GSCM settings:: + + machine sa1ido login password account /db/path@dbhost + +Nokia specific +-------------- + +NOE:: + + machine noe login password + +GRACE:: + + machine grace login password + +Lotus Notes:: + + machine notes login password + +nWiki:: + + machine nwiki login password + +**Note:- that the nWiki password is different to that used for NOE/Notes/Grace and therefore will typically require the use of the macro macro-netrc.username along with the macro macro-netrc.password.** + + +.. index:: + single: Signals notifications + +Signals notifications +===================== + +Helium contains a number of signal events that are triggered at various points during the build. These provide the following features: + +* Determine whether to fail the build immediately, deferred to the end or not at all. +* Send an email alert message. +* Send an SMS alert message. + +A default configuration of the signals is defined in ``config/helium_signals_default.xml``. By default the email alerts are sent to the build manager, but each signal can have a custom email list by defining a property ``.email.list``. + + +.. index:: + single: Viewing target dependencies + +Viewing target dependencies +=========================== + +The ``deps`` target can be used to display a list of the target dependencies for a given target. See the `manual page`_ for more information. Also the ``execlist`` command works in a similar way but shows a dialog showing a separated list of all the dependent targets and then just the top-level of dependencies, to help with continuing a build on the command line. + +.. _`manual page`: ../api/helium/target-deps.html + + +.. index:: + single: Automating build number assignment + +Automating build number assignment +================================== + +Typically the build number for a build is defined on the command line. However it may be desirable to automate the allocation of a new build number using a simple text database file. To do this, add the property ``read.build.int`` to the configuration or the command line. This will look for a text file in this location:: + + ${publish.root.dir}/${build.name}/builds/${build.name}_${core.build.version}_${build.tag}_build_int_db.txt + +If the file is not present it is created with a new build number value of "001". If it does exist the value is read from the file and then incremented and written back for the next build. A ``build.tag`` property can also be defined to start the build number with a text string if needed. + + +.. index:: + single: Advanced configuration + +Advanced configuration +====================== + +.. index:: + single: Custom targets + +Custom targets +-------------- + +Custom targets are often needed in a configuration to customize, extend or otherwise modify the default behaviour and build sequences of Helium. + +To override a target inside Helium define a custom target with the same name. The original target will then be named with +the prefix of the project (Ant file) name, e.g. ``common.hello``. There are three ways to customize a target: + +.. index:: + single: Completely replace the target + +Completely replace the target +::::::::::::::::::::::::::::: + +Just define the custom target:: + + + + + +.. index:: + single: Run custom code after the target + +Run custom code after the target +:::::::::::::::::::::::::::::::: + +Define the overriding custom target and make it depend on the original target:: + + + + + +.. index:: + single: Run custom code before the target + +Run custom code before the target +::::::::::::::::::::::::::::::::: + +This is a little more complicated. Two custom targets are needed, one to implement the custom behaviour, and the 2nd to override the original target and define the dependencies:: + + + + + + + +.. index:: + single: Call a target with different params + +Call a target with different params +::::::::::::::::::::::::::::::::::: + +In rare situations you may need to override a target in helium or call it with different properties, you should create a target in your config with the same name before you import helium.ant.xml:: + + + + + + + + + + + +.. index:: + single: Using Helium internal tasks and macros + +Using Helium internal tasks and macros +-------------------------------------- + +Helium contains a number of internal tasks and macros that are defined under a Helium XML namespace. This is to make it easier to distinguish them from standard Ant and 3rd party tasks inside the Helium Ant files. This means that namespaces must be correctly applied to most Helium tasks or macros. + +Helium tasks start with the prefix ``hlm:``, for example:: + + + + + +To include an XML element with a ``hlm:`` prefix the Helium namespace must be defined in the root element of the XML file:: + + + .... + + +.. index:: + single: MC Helium configuration + +MC Helium configuration +----------------------- + +Based on the former MC codeline policy the SAL organisation in MC has used a hierarchical structure for the Helium build configuration files. This is an example configuration that can be used as a guideline. + +.. index:: + single: Product family and product properties + +Product family and product properties +::::::::::::::::::::::::::::::::::::: + +These are set in hierarchical structure under mc_build:: + + /mc_build + / + / + / + +E.g:: + + /mc_build + /mc_4032_build + mc_4032_build.ant.xml - product family configuration. + /PRODUCT + PRODUCT.ant.xml - product configuration. + /RM247 + build.xml - variant configuration. + /RM297 + build.xml + /PRODUCT + /RMxxx + /mc_5132_build + /PRODUCT + /teams + juno.ant.xml + +Ant files at each level contain the configuration for that level. Builds are run from the outermost directories, e.g. RM247 and ```` statements are used to import the files in the parent directories. The ``mc_4032_build.ant.xml`` file would import ``helium.ant.xml``. + +For an example of a product build click here. + +.. toctree:: + :maxdepth: 1 + + product_example.rst + + +.. index:: + single: Team properties + +.. _`Team-Properties-label`: + +Team properties +::::::::::::::: + +For the MC build configurations are a number of properties that are related to a team and/or site. +These are all combined in a single configuration file. All the team configuration files are stored under ``/mc/mc_build/teams``. +This allows different build configurations to be run in different locations, or handle multiple product family configurations at one site. + +In order for this to work in windows environment you may need to set up an environment variable called TEAM. So click +start->settings->control panel and double click on 'system' to open the system properties window. Click on the 'advanced' tab and then click the +'environment variables' tab. Create a new variable preferably under the system varaibles but if you do not have permission to add one here then add +it to the user variables make the variable name 'TEAM' (note capital letters) and the team name is what ever your team name is. + +Also see :ref:`Setting-Team_properties-label`: + + +.. index:: + single: Setting the team/site + +Setting the team/site +::::::::::::::::::::: + +To enable running any build with any team/site configuration, the team must be defined separately from the build configuration files. The team name should be the same as the team configuration file under ``/mc/mc_build/teams`` without the "``.ant.xml``". + +The team can be set in one of the following ways (using the example of the ``juno.ant.xml`` file): + +* Define a ``TEAM`` environment variable, e.g. ``TEAM=juno``. +* Add an Ant command line parameter to set the team, e.g:: + + hlm product-build -Dteam=juno + +.. index:: + single: System definition configuration files + +System definition configuration files +::::::::::::::::::::::::::::::::::::: + +Sysdef configuration defines the source code you actually want to compile with Helium. More information about the System definition +files can be found from: http://developer.symbian.org/wiki/index.php/System_Definition. + +Under helium/testconfig/mc/mc_build/ibusal_51_build/ is the file IBUSAL51_SystemDefinition.xml which can be examined as a sample definition file. +It is used by the Helium test environment to test helium works. It consists of a list of components to compile and some special instructions to +perform whilst compiling the components e.g. run toucher.exe on certain directories. You will need to make sure this file exists and contains +the correct components when building and especialy for a product which consists of many hundreds of components. It should be possible to use +the file supplied by S60, but you may need to copy the component compile lines from the file and add them to the existing file in helium in +order to make sure you also get the special instructions which are required to make the builds create a ROM image successfully (or any +other action requested). + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/manual/configuringdiamonds.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/manual/configuringdiamonds.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,79 @@ +.. index:: + module: Configuring Diamonds + +==================== +Configuring Diamonds +==================== + +.. contents:: + +Introduction +------------ +Diamonds is web application that can collect all build related information and categorize +builds. It can represent build information in different metrics. This document describes how +to configure diamonds in helium. + +Diamonds Server setup +--------------------- +Please define ``diamonds.host`` property with server address and ``diamonds.port`` with server port number. +e. g. :: + + + + + + +Initialize diamonds +------------------- +`diamonds` target is the initialize target for diamonds logging. Call diamonds target in build target sequence +and this will log the already available data to diamonds and continue to log data onward as soon as they are available. +This is done already in helium build target sequence. So user can ignore this section. + +Disable diamonds logging +------------------------------- +Diamonds logging can be skipped by defining the property ``skip.diamonds`` to true. +e.g.:: + + hlm -Dskip.diamonds=true + + +Add targets into diamonds configuration ftl file +------------------------------------------------ +Diamonds detail configurations are in helium/config/diamonds_config.xml.ftl file. +User have to add target here(this target must be already defined in configuration) +if they want to log some additional data to diamonds after the target execution. + +Define the target with the following attributes inside ```` node: + +.. csv-table:: Target + :header: "Attribute", "Description", "Required" + + "name", "Name of the target","Yes" + "template-file", "template file to process the data","No, if not defined, consider template file name same as target name" + "logfile", "log file which will be processed","No" + "ant-properties","set true if you need values from ant properties, default is false","No" + "defer", "logging will be deferred and will be logged at the build finish time. Default is false","No" + +e.g +:: + + + + +If no logfile provided, looks for xml file to send using file or file, +if both doesn't exists does nothing. tries to pass ant properties and sends it. For below example, it looks for + or create_bom.xml and if any one exists then it will send that data. + +:: + + + + +Using only ant properties for a specific target to send data + +:: + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/manual/cruisecontrol.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/manual/cruisecontrol.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,43 @@ +CruiseControl Helium Integration +================================ + +CruiseControl version: 2.8.2 + +HCC version: 1 + +How to use CC Helium customizations +----------------------------------- + +Checks for modifications made to a Synergy repository. It does this by examining a provided reference project, getting the tasks from all folders in that project, and checking the completion time of those tasks against the last build. + +In CruiseControl config.xml: + +.. code-block:: xml + + + + + ... + +How to use Dashboard Helium customizations +------------------------------------------ + +To enable the Helium build summary widget please use the Helium specific +dashboard configuration file: + +set CCDIR= + +\cruisecontrol.bat + +How to configure the Ant builder +-------------------------------- + +To prevent log.xml missing exception while running Helium please configure the ant builder this way: + +.. code-block:: xml + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/manual/debugging.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/manual/debugging.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,90 @@ +.. index:: + module: Debugging + +######### +Debugging +######### + + +.. contents:: + + +.. _Troubleshooting-label: + +Troubleshooting +=============== + +This section contains details on how to find errors and problems within helium itself (for helium contributors) and within the configuration files +and ANT tasks etc. for the build managers and subcons. + +.. index:: + single: Output Logs + +.. index:: + single: Logs + +Output Logs +----------- + +When running Helium there are a large number of output logs created to assist with debugging and determining what has been performed and what has not. +All of the log files are generated in the build area, usually under the ``output\logs`` folder. Many of the logs are created in different formats +e.g. the Bill Of Materials log file exists as .html, .xml and .txt (all the same information). Some of the logs exist as different file formats giving +different information at various stages of the activity, e.g. the cenrep logs in which case generally the .html files are a summary of the whole activity. +For mc product builds the following log files are created +where xx is the name of the build + build id e.g. mc_5132_12.030_ant_env.log +where nn is the variant number(s): + +.. csv-table:: build logs + :header: "Log name", "File type", "Purpose" + + "xx_ant_env.log", "Ant environment Log", "Lists all the environment varaibles" + "xx_ant_build.log", "Ant build Log", "Lists all the ANT tasks that have been executed" + "xx_BOM.html", "BOM listing", "lists all the projects and tasks included in the build" + "xx_bom_delta.html", "BOM delta listing", "lists all the delta projects and tasks included in the build" + "xx_ee_roms.log", "ee ROM creation log", "lists all the .iby, .txt, etc. files included in the ee ROM creation, including missing files" + "xx_scan2.html", "compile record", "lists all the components built with their errors (0 if no errors)" + "xx_prebuild_scan2.html", "pre-compilation record", "lists all the pre-build components with their errors (0 if no errors)" + "xx_postbuild_scan2.html", "post-compilation record", "lists all the post-build components with their errors (0 if no errors)" + "xx_dtd_scan2.html", "dtd-compilation record", "lists all the dtd components with their errors (0 if no errors)" + "xx_dtd_build.log", "dtd-build record", "lists all the dtd components included in the build" + "xx_zips_scan2.html", "zips creation log", "lists all the zip files created and whether there are any errors" + "xx_cenrep_scan2.html", "cenrep creation log", "lists all the cenrep files created and whether there are any errors" + "xx_edge_bin_var_scan2.html", "Edge bin var creation log", "lists all the edge bin var files created and whether there are any errors" + "localisation_nn.html", "localisation creation log", "lists all the full build activites for localisation for a particular variant and whether there are any errors" + "xx_china_scan2.html", "China variant creation log", "lists all the build and link activites for creation of the China variant and whether there are any errors" + "xx_japan_scan2.html", "Japan variant creation log", "lists all the build and link activites for creation of the Japan variant and whether there are any errors" + "xx_western_scan2.html", "Western variant creation log", "lists all the build and link activites for creation of the Western variant and whether there are any errors" + "hlm_listener.log", "Helium debug log", "Helium debug log for internal data [Helium runtime information] and it can be found inside HELIUM_CACHE_DIR folder" + "hlm_debug.log", "Helium debug log", "Helium debug log for all other debug log (all java logs) and it can be found inside HELIUM_CACHE_DIR folder" + +Targets and their log +;;;;;;;;;;;;;;;;;;;;; + +.. image:: ../images/dependencies_log.grph.png + +.. index:: + single: Troubleshooting + + +Troubleshooting - Helium +------------------------ + +Use the ``diagnostics`` command provide debugging information when reporting problems. It lists all the environment variables and all the ANT +properties and all the ANT targets within Helium +so you might find it useful to pipe it to a log file so that you can read all of the output at your leisure. + +To run the diagnostics command type in a command window where the hlm.bat file is: + +hlm diagnostics > diag.log + +.. index:: + single: Failing early in the build + +Failing early in the build +;;;;;;;;;;;;;;;;;;;;;;;;;;; + +The ``failonerror`` property is defined in ``helium.ant.xml`` and has the default value ``false``. It is used to control whether the +tasks fail when errors occur or the build execution just continues. The build can be configured to "fail fast" if this is set to ``true``, +either on the command line or in a build configuration before importing ``helium.ant.xml``. Given that many ``exec`` tasks will return an +error code due to build errors, it is not recommended to set this to true for regular builds. + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/manual/product_example.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/manual/product_example.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,889 @@ +.. index:: + module: Example Product + +================== +Example Product +================== + +.. contents:: + +Introduction +============ + +This section gives an example of a product and its configuration files which produces a complete build, link, ROM image generation and variant creation. + + +.. index:: + single: Example - File Structure + +.. _product-example-label: + +Legacy File Structure +===================== + +The following is an example of the file structure required, 'mc' is the product root directory. The convention used here is '\' indicates a sub folder below the current folder. The mc project is saved under synergy or some other version control software. (There is a naming convention; any .xml file that contains ant configuration information is named file.ant.xml if it is purely a configuration file for the project it is named file.xml) :: + + \mc + \helium #contains the helium tool set. + \mc_build #contains the build command files and build configuration files (mostly ant configuration files). + languages.xml + team.ant.xml + \mc_number_build + delivery.xml + prep.xml + rom_image_comfig.xml + \all + bld.bat + build.xml + \product + build.xml + bld.bat + \teams + teamName.ant.xml + \mc_config #contains configuration files specific to the product being build e.g. which components to include. + \product + \rom + \include + mc_product_override.iby + \product_edge + \rom + \include + mc_product_override.iby + \product_lta + \rom + \include + mc_product_override.iby + \mc_overlay #these contain files that are to overwite code supplied by S60 in the same structure as is saved in the S60 code under 2 different folders + \common #contains overlay files common to all products + \files + \config + \epoc32 + . + . + . + \product_overlay #contains files that are to overwite S60 files that are specific to the product and not the others in the family of products. + \files + \config + \epoc32 + . + . + . + \mc_sw #contains any extra software required for the build i.e. new features to be added that are not yet in the main line code. + \mc_nummber_sw + \exports + + +Within each folder there needs to be certain files which contain certain configuration information, this is all configurable, but, this example is put here to give you tsome idea of what ot put where. + +.. index:: + single: Example - Main Configuration Files + +Main Configuration Files +========================= + +The following example files are the main files used within the example. + +.. index:: + single: Example - team.ant.xml file + +team.ant.xml file +------------------ + +This uses the TEAM variable set up in the PC control panel environment variables. The variable name must be in upper case and the value in lower case. + +.. code-block:: xml + + + + + + + +.. index:: + single: Example - languages.xml file + +languages.xml +------------- + +This file contains a list of all the languages used by the product, the example only shows 3. + +.. code-block:: xml + + + + 0uk + fre + ger + chinamly32670 + + + +.. index:: + single: Example - delivery.xml file + +Delivery.xml +------------- + +This file contains the list of projects that should be checkedout or copied (snapshot) from synergy. + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + +.. index:: + single: Example - prep.xml file + +prep.xml +----------- + +This file takes the checked out projects (and snapshots) and copies them to the build area, unzipping those files that need unzipping. + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. index:: + single: Example - bld.bat + +bld.bat +-------------------- + +This file is the one called when you start helium and it simply calls the hlm.bat file in the helium directory. :: + + @echo off + + if not defined HELIUM_HOME set HELIUM_HOME=%~dp0..\..\..\helium + + %HELIUM_HOME%\hlm.bat %* + + +.. index:: + single: Example - build.xml + +build.xml +-------------------- + +This file contains all the initial product specific configuration required by helium. + +.. code-block:: xml + + + + #the PC property 'ENVIRONMENT' is replaced with 'env' + #where to get the config file containing the team specific information. + + #the list of products to be built + + #release version + + + + + #only build for armv5 + #create the build version + + + + #these are the configuration files specific to each variant + + + + + + + + + #include the family product config file + + #locations of various system configuration files. + + + + + + + + + + + +.. index:: + single: Example - teamName.ant.xml + +teamName.ant.xml +-------------------- + +This file contains all the configuration required by a particular team, it lists where the servers are and the locations of synergy variables, GRACE variables etc.: + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. index:: + single: Example - mc_product_override.iby file + +mc_product_override.iby file +------------------------------ + + This file contains details of files that will be used to create the ROM image. :: + + + //FMTX stuff (to prevent from showing the missing file as there is already InternalHWRMFmTxPolicy.ini file in rom) + data-override=empty private\101f7a02\HWRMFmTxPolicy.ini + + // Variating ActiveIdle theme + + #ifdef MC_ACTIVEIDLE_VARIANT + #ifndef __MC_NO_FMTX_IN_ROM + data-override=concat3(ZPRIVATE\10207254\themes\271012080\270513751\271063149\1.0\AI.,MC_ACTIVEIDLE_VARIANT,.o0000) PRIVATE\10207254\themes\271012080\270513751\271063149\1.0\AI.o0000 + data-override=concat3(ZPRIVATE\10207254\themes\271012080\270513751\271063147\1.0\CI.,MC_ACTIVEIDLE_VARIANT,.o0000) PRIVATE\10207254\themes\271012080\270513751\271063147\1.0\CI.o0000 + ROM_IMAGE[2] data-override=concat3(ZPRIVATE\10207254\themes\271012080\270513751\271063149\1.0\AI.,MC_ACTIVEIDLE_VARIANT,.o0001) PRIVATE\10207254\themes\271012080\270513751\271063149\1.0\AI.o0001 + ROM_IMAGE[2] data-override=concat3(ZPRIVATE\10207254\themes\271012080\270513751\271063147\1.0\CI.,MC_ACTIVEIDLE_VARIANT,.o0001) PRIVATE\10207254\themes\271012080\270513751\271063147\1.0\CI.o0001 + #endif // __MC_NO_FMTX_IN_ROM + #endif // MC_ACTIVEIDLE_VARIANT + + // Variantion ends + + + // Product customisation + #include + #ifdef MC_PRODUCT_CUSTOMISATION_VAR + define __MC_PRODUCT_CUSTOMISATION_VAR__ MC_PRODUCT_CUSTOMISATION_VAR + file-override=ABI_DIR\BUILD_DIR\COMMONTSY.__MC_PRODUCT_CUSTOMISATION_VAR__.DLL Sys\Bin\COMMONTSY.DLL + #endif + + + ROM_IMAGE[2] { + #ifdef LPID + #ifdef product + data-override=concat3(\epoc32\data\Z\Resource\bootdata\languages.product.,LPID,.txt) "resource\Bootdata\languages.txt" + data-override=concat3(\epoc32\data\Z\Resource\versions\lang.product.,LPID,.txt) "resource\versions\lang.txt" + #endif + #ifdef product_EDGE + data-override=concat3(\epoc32\data\Z\Resource\bootdata\languages.product_edge.,LPID,.txt) "resource\Bootdata\languages.txt" + data-override=concat3(\epoc32\data\Z\Resource\versions\lang.product_edge.,LPID,.txt) "resource\versions\lang.txt" + #endif + #ifdef product_LTA + data-override=concat3(\epoc32\data\Z\Resource\bootdata\languages.product_lta.,LPID,.txt) "resource\Bootdata\languages.txt" + data-override=concat3(\epoc32\data\Z\Resource\versions\lang.product_lta.,LPID,.txt) "resource\versions\lang.txt" + #endif + #endif // LPID + } + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/manual/running.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/manual/running.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,127 @@ +.. index:: + module: Running Helium + +############## +Running Helium +############## + + +.. contents:: + + +.. index:: + single: Command line + +Command line +============ + +The Helium command line interface is basically the same as the Ant command line, the main difference being that ``hlm`` is used instead of ``ant``. Please make sure to read the `Ant documentation`_. + +.. _`Ant documentation`: http://ant.apache.org/ + +.. index:: + single: Command line help + +Command line help +----------------- + +To get a help summary on the command line, run ``hlm`` or ``hlm help``. + +To get help on a specific command, run ``hlm help ``. + +.. index:: + single: Basic Commands + +Basic commands +-------------- + +:: + + hlm hello + +Prints Hello to the command line. Very simple way to check the configuration is runnable. + +:: + + hlm version + +Prints out the Helium version information. + +:: + + hlm config + +Prints the Ant configuration properties. + +:: + + hlm diagnostics + +Prints various diagnostic information that is useful for debugging. + + +.. index:: + single: Configuration validation + +Configuration validation +======================== + +An Ant configuration can be validated against the Helium data model using the command:: + + hlm check + +This will check for a number of things: + +* Warn about deprecated properties that are defined. +* Warn about required properties in groups where at least one other property from that group is used. A group is a set of related properties for a feature. If that feature is to be used some properties may then be required and some may still be optional within that group. +* Show for information any properties that are in the configuration but not in the data model. A particular build configuration may want to define some properties that are additional to those recognised by Helium. + + +.. index:: + single: Tools version checking + +Tools version checking +====================== + +Tool version checking can be performed to ensure that all tools have correct versions present. At the same time, a path setting file will be created. Calling this file will add tools into path, so hard coding paths is no longer needed. + +To perform checking run the command:: + + hlm check-tool-versions + + +.. index:: + single: Build output + +Build output +================ + +When a build is running the targets being executed are listed on the screen there is no need to pipe this to a file as the ant targets are logged in the ``\*_ant_build.log`` for product and IDO builds. Once the build is complete it will say on the screen whether the build was successful or failed. If it has failed it should give an indication of where and why it failed on the screen but for more information you must examine the output logs. If the build says it was successfult this does not necessarily mean that the build compiled all components successfully, you must examine the logs to check that all is compiled and linked correctly. See :ref:`Troubleshooting-label` for information on logs and where they kept. + +The result of the build (compiled files, linked (flash) files etc.) are stored in the usual folders and directories under the ``\epoc32`` directory. + + +.. index:: + single: Logging + +Logging +======= + +Diamonds +-------- +Logging to the Diamonds metrics database can be disabled by setting the property:: + + skip.diamonds=true + +Internal data +------------- + +Helium can collect internal data about builds for the purpose of improving support. This can be disabled by setting an environment variable:: + + set HLM_DISABLE_INTERNAL_DATA=1 + + +Troubleshooting +================ + +See :ref:`Troubleshooting-label` for information on how to find faults with Helium. \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/manual/sbs.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/manual/sbs.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,154 @@ +.. index:: + module: SBS in Helium + +.. index:: + module: Raptor (SBS) in Helium + +======================= +SBS (raptor) In Helium +======================= + +.. contents:: + +This document describes requirements and how to run sbs builds using helium + + +SBS Requirements +----------------- + +Before starting the build, SBS needs to be updated for s60 related changes, please follow the instructions from the link below, + +`How to Build Raptor `_ + +1. SBS_HOME environment variable needs to be set +2. PATH environment variable needs to be updated with SBS related exe: + + path(SBS_HOME\\BIN;SBS_HOME\\win32\\mingw\\bin;SBS_HOME\\win32\\msys\\bin) + +3. RVCT requirement for raptor is 22_616, in IDO config / product config batch file the env variable needs to be set to +HLM_RVCT_VERSION=22_616 + +For Example: :: + + set HELIUM_HOME=E:\Build_E\ec_test\helium-trunk\helium + set PATH=e:\svn\bin;E:\sbs\bin;c:\apps\actpython;%PATH% + set SBS_HOME=E:\sbs + set MWSym2Libraries=%MWSym2Libraries%;C:\APPS\carbide\x86Build\Symbian_Support\Runtime\Runtime_x86\Runtime_Win32\Libs + set TEAM=site_name + +(Note: For IDOs, these environment variables are set automatically, for S60 option is proposed). + +Required SBS input for Helium +------------------------------ +1. To run using SBS mode the following properties need to be set with the values shown below: + + * build.system - sbs - gmake as SBS engine + * build.system - sbs-ec emake as SBS engine (ECA 4.3 or above required) + +2. sbs.config - (configurations for which the sbs needs to be run - for example (armv5 / winscw) - default is armv5 only. + +The layers to be built for SBS are obtained from System definition files (layers.sysdef.xml found in each component top level folder in the released code). The requirement for the system definition files to be run using SBS / raptor is to have a unique filter for each configuration. The current setup is using raptor\_ for example, for s60_build configuration, the filter should be raptor\_s60_build. +This is the temporary solution and discussions are on to finalise / improve the filter mechanism for raptor. The raptor\_ change has been added to the layers.sysdef.xml files supplied for the IDOs and S60_SBS build releases but when building using DFS full builds the files need to be modified to add the raptor\_ for each layer. + +Supported SBS parameters from helium +------------------------------------- + +List of parameters:: + + a. layers - No need to specify for the full IDO / product configuration. If there is a requirement to run specific layer alone, then this needs to be set. + b. config - (configuration to be built - armv5, winscw - with comma seperated values) + c. skipBuild - just to generate the makefile for SBS and not to run the targets. + d. singleJob - run in single thread for engine gmake only + e. layerOrder - If the layers need to be built using order, then this needs to be set to true. + f. command - command to be executed(SBS commands - REALLYCLEAN, EXPORT, BITMAP, RESOURCE, TARGET) + g. sysdef-base - base location for the sysdef (root directory for relative paths in the system definition files) + h. enable-filter - to use the SBS log processing using filter options from SBS, this should be set to true + to use helium log filter and scanlog. + i. retry-limit - number of times to try in case of transient failure ( -t of sbs). + j. run-check - (true / false) runs the --check sbs command if set to true + k. run-what - (true / false) runs the --what sbs command if set to true + +Command line arguments to SBS using Helium: +------------------------------------------- + +build.system=sbs +~~~~~~~~~~~~~~~~~ +To build using gmake as the engine, and all others with default values (skipBuild - false, with multiple jobs (default +set by helium is number.of.processor*2 and no layer order) + +If multiple configurations need to be built, a comma separated list needs to be passed as (armv5,winscw) to sbs.config property. + +examples:: + + + + + +This can be set in the IDO root directory build.xml file. + +Here is an example command to use (first 'cd' to IDO configuration directory ido_configuration/running/idos/abs/branches/mcl_devlon ) :: + + hlm -Dbuild.drive=z: -Dbuild.system=sbs -Dbuild.number=005 -Dskip.password.validation=true ido-build + + +build.system=sbs-ec +~~~~~~~~~~~~~~~~~~~~ +To build using emake as the engine with default values set by helium (sbs make engine as emake and other emake parameters using ec) just the ``sbs.config`` property has to be set to configuration to be built(armv5, winscw). + +Here is an example command to use (first 'cd' to IDO configuration directory ido_configuration/running/idos/abs/branches/mcl_devlon ) + +hlm -Dbuild.drive=z: -Dbuild.system.main.build=sbs-ec -Dbuild.number=005 -Dskip.password.validation=true ido-build + +Note the different flag ``-Dbuild.system.main.build=sbs-ec`` + + +Passing Make options to SBS using helium +----------------------------------------- + +Make options for different make engines could be passed to SBS using ant reference as below, +(Note: currently supported make engine options are emake options only, in the future will +be added for pvm and gmake). + +Make options for SBS using helium: + +.. code-block:: xml + + + + + + + +First user defined make options need to be defined as above, then the default ``.make.options`` +parameter needs to be overridden in the antcall of user defined config as below: + +.. code-block:: xml + + + + + +Here the ``sbs-ec.fullbuild.options`` mapped to ``sbs-ec.make.options`` and used by helium to set +emake options for SBS. + +Building for different SBS input (advanced users) +-------------------------------------------------- + +Some examples to build for different sbs input using helium are below: + +To build using a single thread, the sbs helium variable is: + +.. code-block:: xml + + + + + + +And set ``sbs.var`` to ``sbs.singlethread.var`` as below during target to call compile-main: + +.. code-block:: xml + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/manual/signaling.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/manual/signaling.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,181 @@ +Configuring Signaling +===================== + +Helium signaling framework offers you a simplest way to control +failures on build flow, and provides you an easy way to get reporting on +some crucial steps of your build. + + +The configuration +----------------- + +The signaling configuration is divided on three parts: + + * the signalConfig: defines the signal (Depreciated - please use signalListenerConfig) + * the signalListenerConfig: defines the signal + * the signalInput: defines what to do when a signal is raised + * the notifierList: defines a set of notifiers + +signalListenerConfig +.................... + +This part of the configuration is not targeted to be overridden by the build manager. + +The following example defines a custom signal named as **customSignal**. +The default configuration must reference a default signalInput configuration using a nested inputRef element, +so the signaling framework knows how to behave when a signal is raised. + +.. code-block:: xml + + + + + + + + + + + +A signal will then be triggered each time the **target-name** completed. The signalInput will then defined how it should be handled. + +Other way to trigger a signal is by using the signal task: + +.. code-block:: xml + + + + + + + + + +signalInput +........... + +This Ant type defines what a signal should do when it is raised. The failbuild attribute defines +if a build failure should be: + + * failing the build now (value: now) + * deferred at the end of the build (value: defer) + * ignored (value: never) + +Then the configuration will accept a reference to a notifierList using the notifierListRef element. + +Example of configurations + +.. code-block:: xml + + + + + +This will run all notifier from the customNotifier configuration then fail the build. + +.. code-block:: xml + + + +This will defer the failure at the end of the build, no notifier will be run. + +notifierList +............ + +The notifierList Ant type allows the user to configure a set of Notifier (e.g Email, execute task): + +The following example configures a notifier list that will send an email and run few echo task to print +some information. + +.. code-block:: xml + + + + + defaultSignalAlwaysNotifier: Signal: ${signal.name} + defaultSignalAlwaysNotifier: Status: ${signal.status} + + + +Detailed documentation of the notifier interface could be found `here <../../helium-antlib/index.html>`_. + + +Example: configuring compileSignal +---------------------------------- + +In this example we will configure the compileSignal to behave this way: + + * send an email to additional users e.g: user@foo.com, user@bar.com + * defer the build failure. + +You configuration should contains (e.g build.xml) + +.. code-block:: xml + + + + ... + + ... + + + + + + + + + + + + +A custom notifierList has been created with **myCustomNotifierList** as reference ID. It defines +a emailNotifier which uses the default email template under Helium (${helium.dir}/tools/common/templates/log/email_new.html.ftl). +It also set the title of you email to be "[signal] My build goes wrong: ${signal.name}" (signal.name property will be replace by the signal name raised). +**notifyWhen** attribute will make the notifier to send a notification only on build failure. +Finally the two additional email addresses will be set using the **additionalrecipients** attribute. + +We then need to link the signal configuration and our custom the notifier list. The signalInput element is use to achieve that. +It must be defined using the same reference ID (see reference overriding howto) as the one in the Helium configuration, the naming convention for this is: **Input**. +Its **failbuild** attribute is set to **defer** which will configure the build to keepgoing, and fail at the end of the build flow. +Finally an embedded notifierListRef element will reference our custom notifier list: **myCustomNotifierList**. + +While failing the signaling framework will execute all notifier defined and then store internally the build failure so it can raise it again at the end of the execution. + + +Example: Report specific errors not included by default +------------------------------------------------------- + +Target prep-work-area has extra log extraction added and output xml is read by a new signal. + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/manual/stages.rst.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/manual/stages.rst.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,2088 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +.. index:: + module: Stages + +============= +Helium stages +============= + +.. contents:: + +This section gives details of each of the phases of a Helium build and what they do. + + +.. index:: + single: Stage - startup + +Stage: Startup +============== + +.. index:: + single: Remote builds + +Remote builds +------------- + +.. index:: + single: Remote build Commands + +Remote build Commands +::::::::::::::::::::: + +Remote builds are used when a number of build configurations need to be run on several machines from a single work area. For a remote machine to receive the commands, a build manager must login and start the antserver process by running ``c:\apps\antserver\run_ant_server.bat``. + +Two commands are supported:: + + hlm distribute-work-area + +Tars up the work area, copies it to a network location defined by the work.area.temp.dir property, and sends a command to the remote servers to untar the work area. On the remote servers the basedir is deleted before the work area is untarred. :: + + hlm start-remote-builds + +Sends commands to start the builds based on the remote builds configuration file entries. + + +.. index:: + single: Remote build configuration + +Remote build configuration +:::::::::::::::::::::::::: + +The configuration file format defines one or more builds:: + + + + + + + +Each ```` element has a number of attributes: + +machine + The name of the remote build machine. The commands will only work if an Ant server instance is running, so be careful not to run the server on the local machine! + +ccmhomedir + This should match to the ``ccm.home.dir`` property. + +basedir + This defines the directory in which the current work area (under ``ccm.home.dir``) is located. + +executable + The file to be executed when starting a build. Typically this can be left as ``hlm``. + +dir + The directory where the executable should be found and where the command will be run from. + +args + The arguments passed to the executable. These should consist of Ant arguments, as the build is run using Ant. Note that this attribute value is treated in the same way as the line attribute in the Ant ``exec`` task - spaces are interpreted as separating the arguments. + +The ``remote.builds.config.file`` property defines the location of the configuration file. This should be defined in a team Ant configuration file. + + +.. Commented out because we will not use this for our releases + Subcon bootstrap + ---------------- + + The subcon edition of Helium does not include any 3rd party libraries due to licensing restrictions. + Before you start using a copy of helium for the first time you need to call ``hlm-bootstrap.bat``. + + Run like this if you get timeout errors and set to the values of your proxy server:: + + hlm-bootstrap.bat -Dproxy.host=172.16.42.137 -Dproxy.port=8080 + + Or if you have no proxy server:: + + hlm-bootstrap.bat -Dproxy.disabled=y + + The bootstrap process is: + + * Download Ivy jars. + * Use Ivy to download dependencies. + * Extract and install dependencies. + + +.. index:: + single: Stage - Preparation + +Stage: Preparation +================== + +At the start of preparation a new directory is created for the build and subst'ed to ``build.drive``. If a directory with this name already exists, it is renamed to have a current timestamp on the end. + +.. index:: + single: How to prepare the build area? + +How to prepare the build area? +------------------------------ + +A key part of build preparation is initialising the build drive by copying or unzipping the input files. The ``build.prep.config.file`` should reference a file that follows the prep XML file format (e.g. mc\mc_build\mc_4031_build\prep.xml). A suggestion is that this file is called prep.xml by default. + +The XML format of the prep file is as follows: + +Beginning of the file and config +::::::::::::::::::::::::::::::::: + +.. code-block:: xml + + + + + + + + + + + + +Each exclude under config defines which files are NOT extracted during unzip phases. + +Unzip +::::: + +.. code-block:: xml + + + + + + + + +Each separate unzip phase is defined beginning with source. Each file that needs to be unzipped is specified with unzip. It is also possible to define what parts of the zips are extracted using include tags. + +ICD/ICF Unzip +:::::::::::::: + +.. code-block:: xml + + + + + + + + +ICDs/ICFs (Intermediate Code Fix\Drop) are extracted using unzipicds tag. Using this command ensures that the files are extracted in the correct order. Multiple ICD/ICF directories can be given to be extracted by giving multiple locations. + +Copy +:::: + +.. code-block:: xml + + + + + + + + +Each separate copy phase is defined beginning with source. The dest parameter for each copy command defines to what folder the files are copied starting fron the given basedir. It is also possible to exclude files using the exclude tag. + +File end +:::::::: + +:: + + + + +ICF/ICD: +```````` + +This information is extracted from the filesystem, it uses the sources defined in the preparation xml configuration file to retreive the ICF/ICD content. + +.. Note:: + This means that all ICD/ICF extracted from any other source will not be considered. + So you MUST use the statement of the preparation configuration file. + +Flags: +`````` + +Flags are extracted from the ProductVariant.hrh (mc_config/${r'$'}{build.configuration}_config/${r'$'}{product.name}/include/ProductVariant.hrh). + +.. index:: + single: Stage - Source preparation + +Stage: Source preparation +========================= + +The build preparation consists in two parts: + + * Getting delivery content (Synergy, zips...), + * Preparing the build area. + +How to get delivery content from Synergy? + +It is possible to automatically get content from Synergy using the Helium framework. +To handle that you have to configure the delivery.xml file from your family build configuration folder and reference by the property prep.delivery.file. + +Example configurations like a minibuild can be found under the Helium source tree. + +Example of configuration: + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Checkout: only need to define this when extra tasks are required on top of the listed project, otherwise use the snapshot type. + The following properties are required: + - release : synergy release to use. + - dir : the location of your target snapshot. + - database: the name of the synergy database you want to use. + The following properties are optional: + - thread : optional parameter, this define the number of process to run for parallel snapshots. + - purpose : Purpose to check out with. + - sync : Force a sync step after the work area update. + - version : the version to check out toward to. + - tasks : add additional tasks to the reconfigure properties. + - folders : add additional folders to the reconfigure properties. + - use.reconfigure.template: enable the usage of the reconfigure templates, this means the project will just be reconfigured, the reconfigure properties will not be modified. + - fix.missing.baselines: automatically detect new projects and check them out. + - replace.subprojects: boolean value to enable/disable project replacement during update (default: true). + - skip.ci: boolean value to include/exclude the project from CC modificationset checking. + - ci.custom.query: Extend the synergy query for CC modificationset checking eg.(release='MinibuildDomain/next'). + - show.conflicts: boolean value to check for task conflicts. + - show.conflicts.objects: boolean value to check for object conflicts. +Snapshot: define type of the spec as snapshot and name as the baseline name. + The following properties are required: + - dir : the location of your target snapshot. + - database: the name of the synergy database you want to use. + The following properties are optional: + - thread : optional parameter, this define the number of process to run for parallel snapshots. + +Update: define type of the spec as update and name as the project to update. + The following properties are required: + - database: the name of the synergy database you want to use. + +To get synergy source you just have to run:: + + hlm prep-work-area + +.. index:: + single: Stage - Compilation + +Stage: Compilation +================== + +Compilation is based on configuration using Symbian System Definition XML files. +See http://developer.symbian.org/wiki/index.php/System_Definition + +Every System Definition file can contain content for two separate sections: + +System model + A definition of the system describing the components that exist, broken into layers, modules, etc. + +Build model + Build configurations that define what is to be built and how it will be built. Separate unitLists define groups of components. + +The steps to configure a Helium build for main compilation are as follows: + +1. Put together a list of the System Definition files that define the components needing to be built in the system model sections. This could be one or several files depending on what components need building. They should be defined in an Ant ```` type with an ``id`` atttribute set to ``system.definition.files``, e.g: + +.. code-block:: xml + + + + + + + + + + The order of the files is significant. If building Symbian OS, the Symbian System Definition file must come first. Here both ``fileset`` and ``pathelement`` are used. ``pathelement`` selects just one file whereas a ``fileset`` can use wildcards to select multiple files or handle problems of filenames changing across different platform releases. + +2. Determine if an existing build configuration in any of the build model sections of the files are suitable for what needs to be built. A build configuration typically looks something like this: + +.. code-block:: xml + + + + + + + + + + + + + + + + + + A ``unitListRef`` includes a ``unitList`` defined somewhere else as part of this configuration. The ``buildLayer`` elements define ``abld`` steps to run on each component. If an existing configuration is not sufficient a new one must be defined in a separate file (which should be included in the ``path`` type). + +3. Define the ``sysdef.configurations`` Ant property to contain a comma-separated list of build configuration names that must match the ``name`` attribute of the ``configuration``. Each configuration will be built in turn in the ``compile-main`` Ant target. + +Note: Build will fail if compilation error exceeds the number specified in ``build.errors.limit``. Default value is ``0`` and set it to ``-1`` to ignore this. + +.. index:: + triple: Builds; EBS; EC + +EBS and EC compilation +---------------------- + +If you want to get Helium to switch compiler version you need to define the HLM_RVCT_VERSION environment variable (Nokia specific feature):: + + set HLM_RVCT_VERSION=22_593 + + +The setting could be mentioned under the configuration's Helium bootstrapper. + + +By default Helium is configured to run EBS builds. The ``build.system`` property determines what build system to use. An EC build can be run from the command line using:: + + hlm -Dbuild.system=ec-helium + + +EC build could be configured to be running in parallel (default) or in serial mode (1 node build):: + + hlm -Dbuild.system=ec-helium -Dec.mode=serial + +Also the --emake-debug could be configured either by the environment using the EMAKE_DEBUG variable or using the ``emake_debug_flag`` property. Its default value is 'g'. + + +SBS (Raptor) compilation +------------------------ + +.. toctree:: + :maxdepth: 1 + + sbs + + +.. index:: + single: Stage - Post Build + +Stage: Post Build +================= + +.. index:: + single: SIS Files + +Sis Files +--------- +SIS files can be built during the postbuild stage. The ``sis.config.file`` property defines the path to a :ref:`common-configuration-format-label` file, e.g. + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + +The propertes are: + +.. csv-table:: Property descriptions + :header: "Property", "Description", "Values" + + "``makesis.tool``", "The path for the makesis tool that builds a .sis file.", "" + "``signsis.tool``", "The path for the signsis tool that signs a .sis file to create a .sisx file.", "" + "``publish.unsigned``", "This will copy .sis files into ${r'$'}{build.output.dir}/sisfiles.", "true, false" + "``build.sisfiles.dir``", "The directory where the .sis file should be put.", "" + "``key``", "The key to use for signing.", "" + "``cert``", "The certificate to use for signing.", "" + "``name``", "The name of the .pkg file to parse.", "" + "``sis.name``", "The name of the .sis file to create. If omitted it will default to the name of the .pkg file.", "" + "``path``", "The path where the .pkg file exists as input to building the .sis file.", "" + +Checking Stub SIS files +----------------------- +This step involves checking stub sis files published to ``z:/epoc32/data/z/system/install`` and it ensures that only valid stub sis files are published.The target is included in postbuild and using ParseStubSis.pl script to do the work, it will run automatically and save the output in stubresult.log.xml. It can also be run from the command line by using:: + + hlm check-stub-sis + +It checks all files in the target folder and renames the invalid sis files with .bak extention. + +.. index:: + single: S60 3.2 Localisation + +Stage: S60 3.2 Localisation +=========================== + +.. csv-table:: Ant property descriptions + :header: "Property", "Description", "Default Values" + + "``localisation.language.file``", "This defines where to find the languages.xml database.", "/epoc32/tools/s60tools/languages.xml" + "``rombuild.config.file``", "This key defines where this parsed file will be located.", "" + "``localisation.files``", "This key defines which files should be used to localise the build.", "-i ${r'$'}{build.drive}/epoc32/tools/s60tools/LocInfo_input_S60.txt" + "``localisation.tool``", "This key defines which tool should be used to localise the build area (localise-resources or localisation-s60-localiser).", "localise-resources" + +The process uses the information from the languages.xml to know what languages have to be localised. In order to have language pack configured correctly you also have to configure them (as explained in the next section). + +.. index:: + single: Creation of core, language pack and customer variant images + +Creation of core, language pack and customer variant images +----------------------------------------------------------- + +Core, language pack and customer variant images are created automatically in product-build. +They can also be created separately calling localisation target:: + + hlm -Dbuild.number=xx localisation + + +Stage: ROM creation +=================== + +Called by ``build-roms`` target. + +.. index:: + single: imakerconfigurationset type + +The imakerconfigurationset type +------------------------------- + +Information on how to configure the properties is given below: + +The imakerconfigurationset supports imakerconfiguration nested elements. + +'''imakerconfiguration''' element: + +.. csv-table:: Ant properties to modify + :header: "Attribute", "Description", "Values" + + "``regionalVariation``", "Enable regional variation switching.", "false" + +The imakerconfiguration supports three sub-types: + +.. csv-table:: Ant properties to modify + :header: "Sub-type", "Description" + + "``makefileset``", "Defines the list of iMaker configuration to run image creation on." + "``targetset``", "List of regular expression used to match which target need to be executed." + "``variableset``", "List of variable to set when executing iMaker." + + +Example of configuration: + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + +.. index:: + single: The iMaker Task + +The imaker task +--------------- + +.. csv-table:: Ant properties to modify + :header: "Attribute", "Description", "Values" + + "``executor``", "Name of the build system to be used.", "ebs, helium-ec and ec" + "``name``", "Log and intermediate file differentiator.", "" + "``signal``", "Enable/disable signaling mechanism.", "true, false" + +Example: + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + +.. index:: + single: Legacy ROM creation + +.. _ROM-creation-label: + +Stage: Legacy ROM creation +========================== + +A S60 3.2 build uses the localisation target which calls localisation-roms. A S60 5.0 build only requires the localisation-roms target since localisation is done differently. + +There are 2 targets used to create the ROM images these are 'ee-roms' and 'localisation-roms'. The 'ee-roms' target +builds an Engineering English version and the 'localisation-roms' target builds all the localised ROM images. Both require +some configuration particularly the 'localisation-roms' target so that it knows which variants to build etc. This configuration +is explained below but 1st here is an example of how to create the EE ROM image using Helium:: + + hlm -Dbuild.number=xx ee-roms + +where xx is the build number. + +To see an example of how to build the localised versions click :ref:`localised example `: + +.. index:: + single: ROM Image configuration + +Legacy ROM Image configuration +------------------------------ + +Engineering English ROMs, including debug/trace images, can be configured per build configuration. The path to the configuration file is defined by the ``rombuild.config.file`` property. The :ref:`common-configuration-format-label` is used, e.g. + +.. code-block:: xml + + + + + + .... + + + + + + + + + + + +The properties that can be set for configuring each ROM image are described below: + +.. csv-table:: Property descriptions + :header: "Property", "Description", "Values" + + "``output.makefile.template``", "This defines the name of the output makefile (MUST NOT contain path info).", "${r'$'}{rombuild.makefile.name}" + "``main.makefile.template``", "This defines the location of the main part of the makefile (template).", "${r'$'}{mc_5132_build.dir}/imaker.mk" + "``flash.makefile.template``", "This defines template location for flash makefile targets (ee roms).", "${r'$'}{mc_5132_build.dir}/flash.mk" + "``mytraces.file``", "The path for the mytraces.txt file that contains the list of debug binaries to include. (Template)", "" + "``version.product.name``", "The name of the product that appears in the version string.", "e.g. N91" + "``version.pd.milestone``", "The current PD milestone.", "" + "``version.pr``", "The current PR branch number.", "" + "``version.bandvariant``", "The band variant.", "" + "``version.buildnumber``", "The build number. This should be set to the Ant property.", "${r'$'}{build.number} (default)" + "``version.variant``", "The variant version number.", "" + "``version.product.type``", "The product type shown in the version string.", "e.g. RM43" + "``version.rimcycle``", "The year and week of the current RIM cycle.", "" + "``rom.id``", "An identifier for the ROM image filenames. Currently based on Ant ``build.id`` property.", "" + "``rommake.hwid``", "The hardware ID provided to the ROM build tool.", "" + "``rommake.product.name``", "The product name provided to the ROM build tool.", "e.g. devlon4" + "``rom.output.dir``", "The directory where the ROM image files will be copied.", "" + "``cmt``", "The CMT to use (if included).", "" + "``image.ui``", "The UI type.", "gui, text" + "``image.iby``", "The path for the top-level .iby file", ".iby path" + "``image.nocmt``", "Whether the image should include a CMT or not", "true, false (default)" + "``image.name.extension``", "A text extension added to the image filename.", "Optional" + "``version.copyright``", "Copyright text used in the version string.", "" + "``core.template``", "The template for the core version string format.", "" + "``variant.template``", "The template for the variant version string format.", "" + "``uda.template``", "The template for the UDA version string format.", "" + "``model.template``", "The template for the model version string format.", "" + "``core.txt.path``", "Path to the sw.txt version file.", "" + "``variant.txt.path``", "Path to the langsw.txt version file.", "" + "``model.txt.path``", "Path to the model.txt version file.", "" + "``uda.txt.path``", "Path to the UDA version file.", "" + "``mytraces.binaries``", "A list of binaries that should be ``UDEB``. The list will be included in ``mytraces.txt``. Either comma-separated items can be used or multiple properties defined.", "" + "``build.parallel``", "Defines if a group is buildable in parallel.", "true/false" + + +Ant properties can be used and they will be replaced by their values before the file is processed. + +All abstract ```` element will be considered as makefile group target. You have to ensure that you defined an ee_roms abstract spec to be able to build EE roms. + +This example configuration will build one rom during ee_roms call that will use flash template: + +.. code-block:: xml + + + + + + + +Mandatory keys: + "``flash.id``" defines a uniq id for the rom creation, used to define makefile template. + + +.. index:: + single: Main makefile template + +Main makefile template +---------------------- + +The ROM image creation tools use a makefile template to generate a target for each image. The main.makefile.template is used as the top-level part of the makefile, you can define any common custom steps in there. The template allows us to easily add any custom dependencies before creating the variant (also post steps could be added). The current version of the main makefile template should look like that, dont't forget it is tied to the product family. + +.. index:: + single: Xinclude + +.. _`Xinclude-label`: + +Xinclude +--------- + +Xinclude is a generic tool to include lists of files in tasks. However, Xinclude for ROM creation is deprecated, so please ensure you are using iMaker for all ROM image creation. Click on :ref:`iMaker-label` for details. + + +.. _localisation-label: + +Legacy Customer variant configuration +::::::::::::::::::::::::::::::::::::: +To create a new customer variant, just add a spec of the type customer: e.g: + +.. code-block:: xml + + + + + + + + + +This specification must be added in the specification of the appropriate region (western, china, japan or thai). + +For each customer specification, helium creates + * the customer variant image + * the flash configuration file (during publishing.). + +If compatible.languagepack property is omitted, the system assumes the customer variant is compatible with all language packs. A flash configuration file is created for each language pack. + +In case a variant created with a previous build is re-used with the current build, an extra property must be declared: e.g: + +.. code-block:: xml + + + + + + + + + +customer.image.version.name is the build ID with which the re-used variant was created. + + +.. index:: + single: Trace image creation + +Trace image creation +-------------------- +Initial support for recompiling and creating rom images is provided by the build-traces target. This feature will be refactored and revised, so the details will still change. + +.. csv-table:: Ant property descriptions + :header: "Property", "Description", "Values" + + "``tracebuild.tracetype``", "This defines the type of traces to create", "general, phone or all" + "``tracebuild.product``", "This defines the product for which to create images.", "" + "``tracebuild.variant``", "This defines the imaker target to use in image creation", "" + + +.. index:: + single: Stage - Publishing + +Stage: Publishing +================= + +.. index:: + single: Uploading to Diamonds + +Uploading build information to Diamonds web application +------------------------------------------------------- + +Diamonds is a utility tool that keeps track of build and release information. See the **Metrics** manual under section `Helium Configuration`_ for more info. + +.. _Helium Configuration: ../metrics.html#helium-configuration + + +.. index:: + single: Zipping Build area + +Zipping of the build area +------------------------- + +The Engineering English build area is archived in the ``zip-ee`` target. Zipping of the localised build area is done by ``zip-localisation`` target. These properties need to be set: + +``zip.config.file`` + Location of the config file. + +``zips.ee.spec.name`` + Spec name for ee zipping (e.g. "ee"). + +``zips.localised.spec.name`` + Spec name for localised build area zipping (e.g. "localised"). + +The ``zip.config.file`` property defines the path to a :ref:`common-configuration-format-label` file that defines the content of the zips created. It can consist of multiple configs, e.g. + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. csv-table:: Common property descriptions + :header: "Property", "Description", "Values" + + "``temp.build.dir``", "Directory to store temporary files generated during the process.", "" + "``name``", "The name of the zip file.", "" + + +.. csv-table:: File System scanner property descriptions (default) + :header: "Property", "Description", "Values" + + "``include``", "Path to include files/directories in the zip. Follows the Ant fileset convention.", "" + "``exclude``", "Path to exclude files/directories in the zip. Follows the Ant fileset convention.", "" + "``exclude.lst``", "Location of a file containing an exclude list(one pattern per line).", "" + "``distribution.policy.s60``", "Defines that the included files will be filtered based on the value of the ``Distribution.Policy.S60`` files. The file found closest to the root will override those in subdirectories.", "The value found in the file, e.g. 0 or 1. This can be negated by putting a '!' in front." + + +.. csv-table:: Abld what scanner property descriptions (abld.what) + :header: "Property", "Description", "Values" + + "``exclude``", "Path to exclude files/directories in the zip. Follows the Ant fileset convention.", "" + "``exclude.lst``", "Location of a file containing an exclude list(one pattern per line).", "" + "``abld.buildpath``", "The path to an bld.inf directory. The files built from this component will be included.", "" + "``abld.type``", "For what platform should abld be run for.", "armv5" + "``abld.epocroot``", "To specify an EPOCROOT other than \\.", "" + + +.. csv-table:: Default Mappers property description (default) + :header: "Property", "Description", "Values" + + "``name``", "The name of the zip file.", "" + "``max.uncompressed.size``", "Maximum size in bytes of the content being included in each zip file. If the included content exceeds this, multiple zips will be created.", "" + "``max.files.per.archive``", "Maximum number of files that can be included in an archive. If the total exceeds this, multiple zips will be created.", "" + "``archive.tool``", "The command-line archiving tool. 7zip and zip are supported.", "7za, zip" + "``root.dir``", "The root directory of the content being zipped.", "" + "``archives.dir``", "The directory where the zip files are saved to.", "" + "``zip.root.dir``", "The root directory for the content inside the zip file.", "root.dir value" + + +.. csv-table:: Policy Mappers property description (policy) + :header: "Property", "Description", "Values" + + "``name``", "The name of the zip file.", "" + "``policy.internal.name``", "Suffix of the archive that contains the confidential content.", "internal" + "``policy.filenames``", "Comma separated list of policy filename.", "Distribution.Policy.S60" + "``archive.tool``", "The command-line archiving tool. 7zip and zip are supported.", "7za, zip" + "``archives.dir``", "The directory where the zip files are saved to.", "" + "``policy.csv``", "This property defines the location of the policy definition file.", "" + "``policy.default.value``", "This property defines the policy value when policy file is missing or invalid (e.g. wrong format).", "9999" + +The policy mapper enables the sorting of the content compare to its policy value. The mapper is looking for a policy file in the file to archive directory. +If the distribution policy file is missing then the file will go to the ``policy.default.value`` archive. Else it tries to open the file which +MUST be ASCII encoded, and have its content matching the following expression: ``^\\d+\\s*$``. +File not matching those specifications will be reported as invalid and the assiociated content will go to the ``policy.default.value`` archive. + +Archive filenames are generated the following way: + +Policy value is 0:: + + ${r'$'}{archive.dir}/${r'$'}{name}.zip + +Policy value is different from 0:: + + ${r'$'}{archive.dir}/${r'$'}{name}_${r'$'}{policy.internal.name}_.zip + +If the policy file is missing or its content is invalid ot the olicy value is not found in the ``${r'$'}{policy.csv}``:: + + ${r'$'}{archive.dir}/${r'$'}{name}_${r'$'}{policy.internal.name}_${r'$'}{policy.default.value}.zip + + +.. csv-table:: Policy Remover Mappers property description (policy) + :header: "Property", "Description", "Values" + + "``name``", "The name of the zip file.", "" + "``policy.internal.name``", "Suffix of the archive that contains the confidential content.", "internal" + "``policy.filenames``", "Comma separated list of policy filename.", "Distribution.Policy.S60" + "``archive.tool``", "The command-line archiving tool. 7zip and zip are supported.", "7za, zip" + "``archives.dir``", "The directory where the zip files are saved to.", "" + "``policy.root.dir``", "This property allows the user to restrict the root of policy scanning.", "root.dir value" + "``policy.default.value``", "This property defines the policy value when policy file is missing or invalid (e.g. wrong format).", "9999" + +The remover mapper in addition to policy mapper behaviour will remove the content not required for the build. +The removal process is based on the policy.csv file information, content will be kept in the following cases: + + * Included in build column is ``yes`` + * Included in build column is ``bin`` + + +Two additionals removers have been introduced to support action from SFL and EPL column, you use the following +named mappers to use them: + + * sfl.policy.remover based on the 4th column of the csv + * epl.policy.remover based on the 5th column of the csv + +They support the same set of configuration properties as the default policy.remover. + + +.. index:: + single: Zipping SUBCON + +Subcon zipping +-------------- + +Subcon zipping is also configured using the same XML format as ``zip-ee`` and implemented in the ``zip-subcon`` target. A ``zips.subcon.spec.name`` property must be defined but currently it is still a separate configuration file. + +.. index:: + single: Zipping .loc files + +Zipping .loc files +------------------ + +```zip-loc-files``` -target finds, sorts into language specific folders and archives all the .loc files from the build area. Usage:: + + hlm -Dbuild.number=XX zip-loc-files + +The following properties are needed (default values defined in helium.ant.xml): + +- loc.temp.dir - the temporary directory used by zip-loc-files +- loc.output.dir - the directory where the output zip file is stored +- loc.output.filename - the name of the output-file (xxx.zip) +- loc.files.zipper - The location of the tool (should not be changed) + + +.. index:: + single: Stage - Releasing + +Stage: Releasing +================ + +A published build can be made into a release by running the command:: + + hlm release + +from the root of the directory on the network where the build is located. This will create a matching release directory and copy the appropriate files there. The selected files are defined in ``release.ant.xml``. + +.. index:: + single: Stage - Delta Releasing + +Stage: Delta releasing +====================== + +Introduction: + +A delta release is a zip file with only the changed and new files between two build areas. A xml file is also generated that contains the list of files removed between the two build areas. This xml file is read by SymDEC and deletes these files. + +Prequisities for automated use: + +- Publish is run after this stage + +Each build should run the 'delta-zip' target which creates a delta from a previous build to the current one. (This target looks at previous builds in the publish dir for the md5 file and chooses the most recent one). + +Optionally: A previous builds md5 can be passed as a argument, this might be the last bi-weekly release or used when builds are not published (The last build would have run the delta-zip target):: + + hlm delta-zip -Dold.md5.file=e:\wk01_build\output\build_area\delta_zip\0.0742.3.X.15.md5 -Dold.md5.file.present=y + +Exclude directories from the zip:: + + + +Uploading of this into Grace is similar to the grace-upload target:: + + hlm delta-zip-grace-upload + +Output:: + + Z:\output\build_area\delta_zip + + delta_zip.zip + + specialInstructions.xml + + release_metadata.xml + + +.. index:: + single: Stage - Release Notes + +Stage: Release Notes +==================== + +Introduction: + +This generates a release note by modifying a template (that you can edit yourself) with values from the build and Synergy. + +Usage:: + + hlm release-notes -Dbuild.number=1 + +Define in your build configuration the path to the config of relnotes:: + + e.g. + +The contents of "config_template" in helium/extensions/nokia/config/relnotes should be copied to the appropriate directory:: + + e.g. mc/mc_config/mc_5132_config/mc_5132/relnotes + +Contents of template: + * logo.png : the logo of your product + * template.rtf : the document that is modified to form the output + * relnotes_properties.ant.xml : the names of the tokens in template.rtf that will be replaced + Many of the values are commented out as they change rapidly and will need to be added to the output RTF file manually. + * relnotes.properties : the values of the tokens + New values can be added e.g. token1=1.0 and referenced in relnotes.xml by ${r'$'}{token1} + If you want a link to a file start with .\\filename or .\\folder\\filename or \\\\share1\\file + +Project names can be looked up from the BOM and are set into properties, see ``config_template/relnotes/relnotes_properties.ant.xml`` for example + +If you want to add a new value to the output that is dynamic then you should: + +1) Open your template.rtf in Word and add some text that is unique eg. NewValueHere +2) Open your template.rtf in a plain text editor such as UltraEdit and search for your value. You may find it is split over two lines or contains RTF markup language mixed into the value e.g. New\\pardValueHere + If this is the case reformat so you get the value all on one line and remove extra markup. +3) Check your template still works in Word +4) Add a new property to relnotes.properties or use existing properties from Helium or your build config files +5) Add a new replace statement to relnotes_properties.ant.xml that references the property in step 4 + +Output:: + + Z:\output\relnotes + +.. index:: + single: Executing a build + +Executing a build +==================== + +This section explains how to execute a general build step-by-step. + + + +.. index:: + single: Running build operations + +Running build operations +------------------------ + +Needed configuration +:::::::::::::::::::: + +TODO + +Setting the build number +:::::::::::::::::::::::: + +The ``build.number`` property is typically not defined in a configuration file, as it changes for every new build. It should be defined as a command line parameter:: + + -Dbuild.number=123 + +A shortcut can also be used:: + + -Dbn=123 + +.. index:: + single: Setting the team property + +.. _Setting-Team_properties-label: + +Setting the team property +::::::::::::::::::::::::: + +SET TEAM= (this defines which team specific .xml file from /mc/mc_build/teams is used for build configuration). + +Also see :ref: `Team-Properties-label` for more information. + +.. index:: + single: ANT properties + +ANT properties +:::::::::::::: + +build.configuration +build.drive +ec.cluster.manager +major.version +minor.version +prep.root.dir +product.name + + +.. index:: + single: Build Types + +Types of build +:::::::::::::: + +There are different types of builds that can be run depending on the required output. + +.. index:: + single: Build Main + +build-main +:::::::::: + +Before this phase it is needed to run the prebuild command (hlm prebuild -Dbuild.number=123) which creates necessary folders to the build area. + +Build-main phase is used to compile the components defined in the build.configuration property which refers to defined configuration in System_Definition.xml file(s) (ANT property system.definition.files in /mc/mc_build/PLATFORM/PLATFORM_build.ant.xml). The command to run is: hlm build-main -Dbuild.number=123 + + +.. index:: + single: Product-Build + +product-build +::::::::::::: + +A product build executes the typical stages for building product software and ROM images. Generally this involves building all the software completely from scratch. It can be run using the command: + hlm product-build -Dbuild.number=123 + +This can be run from a product build configuration directory, e.g. /mc/mc_build/mc_4031_build/cogsworth. + +Product-build command combines all needed subcommands for doing a build. The subcommands run in product-build are: +prep -> Prepares the build area (see prep instructions above) +build-generic -> Runs prebuild, build-main, postbuild, flashfiles, java-certification-rom, zip-main and publish-generic commands. +build-variants -> Runs notify-errors, mobilecrash-prep, zip-flashfiles, zip-localization and publish-variants commands. +final -> Notifies of errors and creates log files. + +.. index:: + single: platform build + +platform-build +:::::::::::::: + +A platform build executes the typical stages for building a platform deliverable. This is more limited than a product build, as some of the stages are unnecessary, e.g. building variant ROM images. + +The commands executed are: +prep -> Prepares the build area +build-main -> Compiles the components defined in the build.configuration +flashfiles -> Creates flashfiles +zip-main -> Zips the build area + +.. index:: + single: Incremental Build + +Incremental build +::::::::::::::::: + +An incremental build will use a previous completed product build as a starting point (probably unzipping it during preparation) and will clean and rebuild a handful of components. This is useful for testing platform component releases and off-cycle integration operations. An incremental build can be run using the command:: + + hlm incremental-build + +.. Note:: + + Incremental builds are not currently supported. + + +Cenrep creation (S60 3.2.3 - 5.x) +::::::::::::::::::::::::::::::::: +<#if !(ant?keys?seq_contains("sf"))> +See: http://s60wiki.nokia.com/S60Wiki/Central_Repository_Usage + + +The target ``configtool`` can be used to run the Configuration Tool. + +Currently supported Configuration Tool arguments are: + +command_line | name + +-master_conf : master_conf +-confml : confml +-impl : impl +-iby : iby +-ignore_errors : keepgoing(true - uses -ignore_errors, otherwise not, setting + true generates cenrep incase of errors, and signals has to be configured to stop the build + in case of errors). + +Default values are: + +.. code-block:: xml + + + + + + + + + + + +Running individual build commands +--------------------------------- + +Individual build stages can be run from command line with a command "hlm _COMMAND_ -Dbuild.number=123". Each of the commands defined in this guide can be run individually. The functionality of a certain command can be looked up by searching ' + + + + +To build the uda you have to run the following Ant target: (use uda.makefile.target to specify which rom you want to build) + hlm uda-roms -Dteam=kawa -Dbuild.number=xx + + +.. index:: + single: Core and Variant images creation + +Core and Variant images creation +-------------------------------- + +Core and variant images are created automatically in product-build. They can also be created separately calling do-localisation target:: + + hlm localisation-roms -Dteam=kawa -Dbuild.number=xx + +Variation (S60 3.2.3 - 5.x) +--------------------------- + +See ../tutorials/imaker/iMakerUseCaseCustomerVariantConfml.html + +Variation (S60 3.2) +------------------- + +In the new process the variation handling deviate from regular Nokia variation rule as the backup/export/restore process from Creator.pl has been dropped. Now each variant is self contained, which means the content must be reference from the variation folder! On the same way language pack configuration is automated, which means that branching files like ``languages.txt``, ``lang.txt``... is strictly forbiden. + +Structure and Naming +:::::::::::::::::::: + +The variation folder naming must match that rule ``.+_${r'$'}{variant.id}``. + +Finally your variation folder must have the following structure:: + + + variation + + euro1_01 + + data + + VariantData_01.xml + + euro2_02 + + data + + VariantData_02.xml + + japan_15 + + data + + VariantData_15.xml + + ... + + +Cenrep variation +:::::::::::::::: + + +Developer has to create a VariantData_${r'$'}{variant.id}.xml file for each variant that references product one (SPP/PRODUCT process). + +Example of an dummy PRODUCT variant configuration: + +.. code-block:: xml + + + + + + + +To rebuild cenrep configuration using Customisation Tool for all variants you can use the following command: + hlm -Dbuild.number=xx localisation-create-cenrep + +Note: for Xinclude information see :ref:`Xinclude-label`: + +.. index:: + single: iMaker image creation template + +iMaker image creation template +------------------------------ + +:: + + ############################################################################### + # iMaker templates + ############################################################################### + + # defining helium in the build area if not set by the environment + HELIUM_HOME?=\mc\helium + PYTHONPATH?=$(HELIUM_HOME)\install\python\lib\python2.4\win32;$(HELIUM_HOME)\tools\common\python\lib + + # using winimage from helium delivery. + WINIMAGE_TOOL=$(HELIUM_HOME)/tools/localisation/exports/winimage.exe + + CALL_IMAKER_PLATFORM=imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) -f $(E32ROMCFG)/helium_features.mk + CALL_IMAKER=imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) $(if $(UI_PLATFORM),-u$(UI_PLATFORM)) -f $(E32ROMCFG)/helium_features.mk + CALL_TARGET=imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) -f $(E32ROMCFG)/$(COREPLAT_NAME)/$(PRODUCT_NAME)/mc_imaker.mk + + transfer_option=$(foreach option,$1,$(if $($(option)),"$(option)=$($(option))",)) + + # + # Variation handling + # + unzip_%: + @echo Unzipping variation $*... + -@unzip -o -qq -d $(subst \,/,$(EPOCROOT)) /output/build_area/localised/delta_$*_package.zip + + + include helium_features.mk + ############################################################################### + + +.. index:: + single: Flash makefile template + +Flash makefile template +----------------------- + +This is the currently used template for flash rom type. + +:: + + ############################################################################### + # Flash template + ############################################################################### + + flash${r'$'}{flash.id}${r'$'}{image.type}: TYPE=${r'$'}{image.type} + flash${r'$'}{flash.id}${r'$'}{image.type}: NAME=${r'$'}{build.id}_$(TYPE)$(if ${r'$'}{flash.id},_${r'$'}{flash.id},) + flash${r'$'}{flash.id}${r'$'}{image.type}: WORKDIR=${r'$'}{rom.output.dir}/${r'$'}{rommake.product.name}/${r'$'}{image.type} + flash${r'$'}{flash.id}${r'$'}{image.type}: OBYPARSE_UDEBFILE=${r'$'}{mytraces.file} + flash${r'$'}{flash.id}${r'$'}{image.type}: FEAT_UDEBFILE=$(if "${r'$'}{mytraces.binaries}",1,0) + flash${r'$'}{flash.id}${r'$'}{image.type}: BLDROM_OPTVAR=${r'$'}{rommake.flags} + flash${r'$'}{flash.id}${r'$'}{image.type}: HWID=${r'$'}{rommake.hwid} + flash${r'$'}{flash.id}${r'$'}{image.type}: OPTION_LIST=TYPE NAME WORKDIR OBYPARSE_UDEBFILE CORE_UDEBFILE BLDROM_OPTVAR HWID + flash${r'$'}{flash.id}${r'$'}{image.type}: unzip_western + -@echo $(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) flash + -@$(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) flash + +The target is using target specific variable to override the default iMaker values. The script also makes sure that the current environment is western, so do not need anymore to switch between environments. You can customize your target as needed, e.g. call custom scripts... + +.. Note:: + Don't forget that all template are parsed and concatenated, which means a modification in the main one could affect any target one. + +.. index:: + single: Create a customize makefile target + +How to create a customize makefile target +----------------------------------------- + +In order to create a custom makefile target for rom image creation you have to first create the makefile template: You will call your target test for example. In that case you have to create a test.mk file that should define your target. E.g + +:: + + ############################################################################### + # Test template + ############################################################################### + + flash_${r'$'}{target.name}_${r'$'}{image.type}: TYPE=${r'$'}{image.type} + flash_${r'$'}{target.name}_${r'$'}{image.type}: OPTION_LIST=TYPE + -@echo $(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) flash + -@$(CALL_IMAKER) $(call transfer_option,$(OPTION_LIST)) flash + +Then you have to declare it into your configuration file, just add the following line to your main configuration: +:: + + + +Then to create a ROM according to that template just add a specification to the configuration file:: + + + + + + +This will create two targets in the generated makefiles: test_ui_rom_rnd and test_ui_rom_prd. + +.. index:: + single: Language pack configuration + +Language pack configuration +--------------------------- + +Please read the ``ROM Image configuration (using iMaker)`` part first to have a better understanding of this part. + +.. index:: + single: Main Language configuration + +Main configuration +------------------ + +These keys must be defined in order to enbable localisation/variation process. + +.. csv-table:: Configuration property descriptions + :header: "Property", "Description", "Values" + + "``zips.loc.dir``", "The directory where to find variation delta packages.", "${r'$'}{zips.loc.dir}" + "``languages.xml.location``", "This defines where to find the languages.xml database.", "${r'$'}{localisation.language.file}" + "``variation.dir``", "This defines the path where variation for a product is located.", "${r'$'}{mc_5132_config.dir}\${r'$'}{product.name}\variation" + "``rombuild.config.file``", "That key defines where this parsed file will be located.", "${r'$'}{rombuild.config.file.parsed}" + "``core.makefile.template``", "This defines what template to use for core creation.", "${r'$'}{mc_5132_build.dir}/core.mk" + "``languagepack.makefile.template``", "This defines what template to use for core creation.", "${r'$'}{mc_5132_build.dir}/languagepack.mk" + "``operator.makefile.template``", "This defines what template to use for core creation.", "${r'$'}{mc_5132_build.dir}/operator.mk" + +Other keys could be defined accordingly to the template you are using. + + +.. index:: + single: Language pack configuration + +Legacy Language pack configuration +---------------------------------- + +Language pack could be defined into the rom image configuration, the name of the template is "``languagepack``" (this is used to render the correct makefile template). +Example of configuration: + +.. code-block:: xml + + + + + + + + + +The following fields are mandatories to define a correct language pack: +"``variant.id``" defines the variant id from the variant chart. +"``description``" defines variant content (must not contains space). +"``default``" default language id. +"``languages``" comma separated list of languages to be included. +"``variation``" defines which variation to use (western, china, japan) You can define western variation at top level and override it on target. + + +.. index:: + single: Customer Variant configuration + +Legacy Customer variant configuration +------------------------------------- + +Customer variant could be define the same way. +Example: + +.. code-block:: xml + + + ... + + + + + + + + + + ... + + + + + + ... + + +Only description and customer.id and variation.dir are mandatory for customer variants. + +The variant creation process is now working without any copy on top of epoc32 directory, you can override epoc32 content directly from the variant directory. + +To run the creation of all images under the '''customer_variants''' group, just call the following command line on your configuration: + + hlm customer-roms -Dteam=kawa -Dbuild.number=xx + +If you just want to build one particular customer variant just invoke the following command: + + hlm customer-roms -Dteam=kawa -Dbuild.number=xx -Dcustomer.makefile.target=customer99rnd + +The naming of the target follows this template: customer``customer.id````image.type``. + + +.. index:: + single: ATS3 - STIF, TEF, RTEST, MTF and EUnit + +.. _`Stage-ATS3-label`: + +Stage: ATS3 - STIF, TEF, RTEST, MTF and EUnit (also Qt) +======================================================= + +ATS testing is the automatic testing of the phone code once it has been compiled and linked to create a ROM image. + +Explanation of the process for getting ATS3 (`STIF`_ and `EUnit`_) tests compiled and executed by Helium, through the use of the ``ats-test`` target. + +http://developer.symbian.org/wiki/index.php/Symbian_Test_Tools + +<#if !(ant?keys?seq_contains("sf"))> +.. _`STIF`: http://s60wiki.nokia.com/S60Wiki/STIF +.. _`EUnit`: http://s60wiki.nokia.com/S60Wiki/EUnit + + +.. image:: ats.dot.png + +Prerequisites +---------------- + +* `Harmonized Test Interface (HTI)`_ needs to be compiled and into the image. +* The reader is expected to already have a working ATS3 setup in which test cases can be executed. ATS3 server names, + access rights and authentication etc. is supposed to be already taken care of. + +<#if !(ant?keys?seq_contains("sf"))> +.. _`Harmonized Test Interface (HTI)`: http://s60wiki.nokia.com/S60Wiki/HTI +<#else> +.. _`Harmonized Test Interface (HTI)`: http://developer.symbian.org/wiki/index.php/HTI_Tool + + +Test source components +------------------------- + +Test source usually lives in a component's ``tsrc`` directory. Test source components are created like any other Symbian SW component; +there is a ``group`` directory with a ``bld.inf`` file for building, ``.mmp`` files for defining the targets, and so on. + +The test generation code expects ``.pkg`` file in the ``group`` directory of test component to be compiled, to get the paths of the files +(can be data, configuration, initialization etc. files) to be installed and where to install on the phone. + +Three STEPS to setup ATS with Helium +-------------------------------------- + +**STEP 1: Configure System Definition Files** + If the tsrc directory structure meets the criteria defined in the `new API test automation guidelines`_, then test components + should be included in the System Definition files; **layers** in ``layers.sysdef.xml`` file and **configuration** in ``build.sysdef.xml`` + file (`Structure of System Definition files`_). + + <#if !(ant?keys?seq_contains("sf"))> +.. _`new API test automation guidelines`: http://s60wiki.nokia.com/S60Wiki/Test_Asset_Guidelines +.. _`Structure of System Definition files`: http://delivery.nmp.nokia.com/trac/helium/wiki/SystemDefinitionFiles + + +A template of layer in layers.sysdef.xml + +.. code-block:: xml + + + + + + + + + + + +* Layer name should end with **_test_layer** +* Two standard names for ATS test layers are being used; ``unit_test_layer`` and ``api_test_layer``. Test components (the``unit`` tags) + should be specified under these layers and grouped by ``module`` tag(s). +* In the above, two modules means two drop files will be created; ``module`` may have one or more ``unit`` +* By using property ``exclude.test.layers``, complete layers can be excluded and the components inside that layer will not be included in the AtsDrop. This property is a comma (,) separated list + + +**STEP 2: Configure ATS properties in build.xml** + +**(A)** Username and Password for the ATS3 should be set in the `.netrc file`_ + +.. code-block:: text + + machine ats login ats_user_name password ats_password + +Add the above line in the .netrc file and replace *ats_user_name* with your real ats username and "ats_password" with ats password. + +**(B)** The following properties are ATS dependent with their edit status + +* [must] - must be set by user +* [recommended] - should be set by user but not mandatory +* [allowed] - should **not** be set by user however, it is possible. + +.. table:: + + ============================== =============== =============== + **Property Name** **Edit Status** **Description** + ============================== =============== =============== + **ats.server** [must] For example: "4fix012345" or "catstresrv001.cats.noklab.net:80". Default server port is "8080", but it is not allowed between intra and Noklab. Because of this we need to define server port as 80. The host can be different depending on site and/or product. + **ats.drop.location** [must] Server location (UNC path) to save the ATSDrop file, before sending to the ATS Server. For example: \\\\trwsem00\\some_folder\\. In case, ``ats.script.type`` is set to "import", ATS doesn't need to have access to ats.drop.location, its value can be any local folder on build machine, for example c:/temp (no network share needed). + **ats.product.name** [must] Name of the product to be tested. For example: "PRODUCT". + **eunit.test.package** [recommended] The EUnit package name to be unzipped on the environment, for executing EUnit tests. " + **eunitexerunner.flags** [recommended] Flags for EUnit exerunner can be set by setting the value of this variable. The default flags are set to "/E S60AppEnv /R Off". + **ats.email.list** [recommended] The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon(s) ";" separated email addresses. + **ats.flashfiles.minlimit** [recommended] Limit of minimum number of flash files to execute ats-test target, otherwise ATSDrop.zip will not be generated. Default value is "2" files. + **ats.plan.name** [recommended] Modify the plan name if you have understanding of test.xml file or leave it as it is. Deafault value is "plan". + **ats.product.hwid** [recommended] Product HardWare ID (HWID) attached to ATS. By default the value of HWID is not set. + **ats.script.type** [recommended] There are two types of ats script files to send drop to ATS server, "runx" and "import"; only difference is that with "import" ATS doesn't have to have access rights to testdrop.zip file, as it is sent to the system over http and import doesn't need network shares. If that is not needed "import" should not be used. Default value is "runx" as "import" involves heavy processing on ATS server. + **ats.target.platform** [recommended] Sets target platform for compiling test components. Default value is "armv5 urel". + **ats.test.timeout** [recommended] To set test commands execution time limit on ATS3 server, in seconds. Default value is "60". + **ats.testrun.name** [recommended] Modify the test-run name if you have understanding of test.xml file or leave it as it is. Deafault value is a string consist of build id, product name, major and minor versions. + **ats.trace.enabled** [recommended] Should be "True" if tracing is needed during the tests running on ATS3. Deafault value is "False", the values are case-sensitive. + **ats.ctc.enabled** [recommended] Should be "True" if coverage measurement and dynamic analysis (CTC) tool support is to be used by ATS. Deafault value is "False", the values are case-sensitive. + **ats.ctc.host** [recommended] CTC host, provided by CATS used to create coverage measurement reports. MON.sym files are copied to this location, for example "10.0.0.1". If not given, code coverage reports are not created + **ats.obey.pkgfiles.rule** [recommended] If the property is set to "True", then the only test components which will have PKG files, will be included into the test.xml as a test-set. Which means, even if there's a test component (executable) but there's no PKG file, it should not be considered as a test component and hence not included into the test.xml as a separate test. By default the property value is False. + **reference.ats.flash.images** [recommended] Fileset for list of flash images (can be .fpsx, .C00, .V01 etc) It is recommended to set the fileset, default filset is given below which can be overwritten. set *dir=""* attribute of the filset to "${r'$'}{build.output.dir}/variant_images" if "variant-image-creation" target is being used. + **tsrc.data.dir** [allowed] The default value is "data" and refers to the 'data' directory under 'tsrc' directory. + **tsrc.path.list** [allowed] Contains list of the tsrc directories. Gets the list from system definition layer files. Assuming that the test components are defined already in te layers.sysdef.xml files to get compiled. Not recommended, but the property value can be set if there are no system definition file(s), and tsrc directories paths to set manually. + **ats.report.location** [allowed] Sets ATS reports store location. Default location is "${r'$'}{publish.dir}/${r'$'}{publish.subdir}". + **ats.multiset.enabled** [allowed] Should be "True" so a set is used for each pkg file in a component, this allows tests to run in parallel on several devices. + + ============================== =============== =============== + + +An example of setting up properties: + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + ... + + ... + + + + + + + + + + + + +*PLEASE NOTE:* Always declare *Properties* before and *filesets* after importing helium.ant.xml. + +**STEP 3: Call target ats-test** + +To execute the target, a property should be set(````). + +Then call ``ats-test``, which will create the ATSDrop.zip (test package). + +If property *ats.email.list* is set, an email (test report) will be sent when the tests are ready on ATS. + +CTC: +---- + +CTC code coverage measurement can be created automatically by enabling property ``ats.ctc.enabled`` + +Also, property ``ats.ctc.host`` must be defined (See the description above) + +Qt Tests: +--------- + +QtTest.lib is supported and the default harness is set to EUnit. If ``QtTest.lib`` is there in ``.mmp`` file, Helium sets the Harness to Eunit and ATS supported Qt steps are added to test.xml file + +In ``layers.sysdef.xml`` file, the layer name should end with "_test_layer" e.g. "qt_unit_test_layer". + +There are several ``.PKG`` files created after executing ``qmake``, but only one is selected based on which target platform is set. Please read the property (``ats.target.platform``) description above. + +.. _`Skip-Sending-AtsDrop-label`: + +Skip Sending AtsDrop to ATS3 +---------------------------- + +By setting property of ``skip.ats.sending``, ``ats-test`` target only creates a drop file, and does not send the drop (or package) to ATS3 server. + +Customizing the test.xml in ATS3 +-------------------------------- + +The user can customize the generated test.xml with files: + +* **preset_custom.xml** goes before first set +* **postset_custom.xml** goes after last set +* **precase_custom.xml** goes before first case +* **postcase_custom.xml** goes after last case +* **prestep_custom.xml** goes before first step +* **poststep_custom.xml** goes after last step +* **prerun_custom.xml** goes before first run or execute step +* **postrun_custom.xml** goes after last run or execute step +* **prepostaction.xml** goes before first postaction +* **postpostaction.xml** goes after last postaction + +The files must be in the directory custom under the tsrc folder processed. + +The files need to be proper XML snippets that fit to their place. In case of an error an error is logged and a comment inserted to the generated XML file. + +A postaction section customization file ( prepostaction.xml or postpostaction.xml) could look like this + +.. code-block:: xml + + + Pre PostAction from custom file + + + + + + + +The ``prestep_custom.xml`` can be used to flash and unstall something custom. + +.. code-block:: xml + + + + install + + + + + ... + + + +And then the ``prerun_custom.xml`` can be used to start measuring. + +.. code-block:: xml + + + + execute + + + + + + + + + +**Note:** The users is expected to check the generated test.xml manually, as there is no validation. Invalid XML input files will be disregarded and a comment will be inserted to the generated XML file. + +Overriding Test xml values +-------------------------- + +Set the property ``ats.config.file`` to the location of the config file. + +Example configuration: + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + +.. index:: + single: ATS3 - ASTE + +Stage: ATS3 - ASTE +=================== + +Explanation of the process for getting ATS3 `ASTE`_ tests compiled and executed by Helium, through the use of the ``ats-aste`` target. + +<#if !(ant?keys?seq_contains("sf"))> +.. _`ASTE`: http://s60wiki.nokia.com/S60Wiki/ASTE + + +Prerequisites +-------------- + +* `Harmonized Test Interface (HTI)`_ needs to be compiled and into the image. +* The reader is expected to already have a working ATS3 setup in which test cases can be executed. ATS3 server names, access rights and authentication etc. is supposed to be already taken care of. +* `SW Test Asset`_ location and type of test should be known. + +<#if !(ant?keys?seq_contains("sf"))> +.. _`Harmonized Test Interface (HTI)`: http://s60wiki.nokia.com/S60Wiki/HTI +.. _`SW Test Asset`: http://s60wiki.nokia.com/S60Wiki/MC_SW_Test_Asset_documentation + + +Test source components +-------------------------- + +Unlike STIF, EUnit etc tests, test source components (or ``tsrc`` structure) is not needed for `ASTE`_ tests. + +Two STEPS to setup ASTE with Helium +------------------------------------ + +**STEP 1: Configure ASTE properties in build.xml** + +**(A)** Username and Password for the ATS3 should be set in the `.netrc file`_ + +.. code-block:: text + + machine ats login ats_user_name password ats_password + +Add the above line in the .netrc file and replace *ats_user_name* with your real ats username and "ats_password" with ats password. + +.. _`.netrc file`: configuring.html?highlight=netrc#passwords + + +**(B)** The following properties are ASTE dependent with their edit status + +* [must] - must be set by user +* [recommended] - should be set by user but not mandatory +* [allowed] - should **not** be set by user however, it is possible. + +.. table:: + + =============================== =============== =============== + **Property Name** **Edit Status** **Description** + =============================== =============== =============== + **ats.server** [must] For example: "4fio00105" or "catstresrv001.cats.noklab.net:80". Default server port is "8080", but it is not allowed between intra and Noklab. Because of this we need to define server port as 80. The host can be different depending on site and/or product. + **ats.drop.location** [must] Server location (UNC path) to save the ATS3Drop file, before sending to the ATS. For example: \\\\trwsem00\\some_folder\\. In case, ``ats.script.type`` is set to "import", ATS doesn't need to have access to ats.drop.location, its value can be any local folder on build machine, for example c:/temp (no network share needed). + **ats.product.name** [must] Name of the product to be tested. For example: "PRODUCT". + **ats.aste.testasset.location** [must] Location of SW Test Assets, if the TestAsset is not packaged then it is first compressed to a ``.zip`` file. It should be a UNC path. + **ats.aste.software.release** [must] Flash images releases, for example "SPP 51.32". + **ats.aste.software.version** [must] Version of the software to be tested. For example: "W810" + **ats.aste.email.list** [recommended] The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon(s) ";" separated email addresses. + **ats.flashfiles.minlimit** [recommended] Limit of minimum number of flash files to execute ats-test target, otherwise ATSDrop.zip will not be generated. Default value is "2" files. + **ats.aste.plan.name** [recommended] Modify the plan name if you have understanding of test.xml file or leave it as it is. Deafault value is "plan". + **ats.product.hwid** [recommended] Product HardWare ID (HWID) attached to ATS. By default the value of HWID is not set. + **ats.test.timeout** [recommended] To set test commands execution time limit on ATS3 server, in seconds. Default value is "60". + **ats.aste.testrun.name** [recommended] Modify the test-run name if you have understanding of test.xml file or leave it as it is. Default value is a string consists of build id, product name, major and minor versions. + **ats.aste.test.type** [recommended] Type of test to run. Default is "smoke". + **ats.aste.testasset.caseids** [recommended] These are the cases that which tests should be run from the TestAsset. For example, value can be set as "100,101,102,103,105,106,". A comma is needed to separate case IDs + **ats.aste.language** [recommended] Variant Language to be tested. Default is "English" + **reference.ats.flash.images** [recommended] Fileset for list of flash images (can be .fpsx, .C00, .V01 etc) It is recommended to set the fileset, default filset is given below which can be overwritten. set *dir=""* attribute of the filset to "${r'$'}{build.output.dir}/variant_images" if "variant-image-creation" target is being used. + + =============================== =============== =============== + +An example of setting up properties: + +.. code-block:: xml + + + + + + + + + + + + + + + + + + ... + + ... + + + + + + + + + + + + +*PLEASE NOTE:* Always declare *Properties* before and *filesets* after importing helium.ant.xml. + +**STEP 2: Call target ats-aste** + +To execute the target, a property should be set(````). + +Then call ``ats-aste``, which will create the ATSDrop.zip (test package). + +If property ``ats.aste.email.list`` is set, an email (test report) will be sent when the tests are ready on ATS/ASTE. + + +Skip Sending AtsDrop to ATS3 +------------------------------ + +click :ref:`Skip-Sending-AtsDrop-label`: + +.. index:: + single: MATTI + +Stage: MATTI +============= + +MATTI testing is very similar to ATS3 testing, so for details of how it all links together see :ref:`Stage-ATS3-label`: `and the matti website`_. + +<#if !(ant?keys?seq_contains("sf"))> +.. _`and the matti website`: http://trmatti1.nmp.nokia.com/help/ + + +The set up of parameters is very similar (a few less parameters and it mostly uses ATS3 values). The main difference is that once the drop file has been uploaded to the ATS3 server it uses MATTI to perform the tests and not ATS3, this is achieved by calling the MATTIDrop.py script instead of the ATSE or ATS3 scripts when creating the drop file (the drop file contains the flash files and the ruby tests to be performed). + +The following parameters are the ones that are not listed in the ATS3 parameters, all other parameters required are as listed in the ATS3 section above. + +* [must] - must be set by user +* [recommended] - should be set by user but not mandatory +* [allowed] - should **not** be set by user however, it is possible. + +.. table:: + + =============================== =============== =============== + **Property Name** **Edit Status** **Description** + =============================== =============== =============== + **matti.scripts** [must] The location of the test scrips as ruby test files i.e. .rb files. + **enabled.matti** [must] Enable MATTI testing to occur, if not present the target 'matti-test' will not run. + **template.file** [must] Location of the matti template file. + **ats.sis.images.dir** [recommended] Location of the the .sis installation files needed to flash to the phone (if required and present). + **ats.script.type** [must] Always set to import, this means the MATTI server will retrieve the tests. + **ats.image.type** [must] Image type whether Engineering English or localised. + **ats.flashfiles.minlimit** [must] Minimum number of flash files required in to add to the drop file. + **tsrc.data.dir** [recommended] Test source code data directory. only required for testing the ANT MATTI code. + **ta.flag.list** [recommended] TA flag list. + + =============================== =============== =============== + +All you need to do is setup the following parameters: + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + +In order to upload and view the test run you need to have a valid user id and password that matches that in your .netrc file. To create the account open a web browser window and enter the name of the ats.server with /ats3 at the end e.g. http://123456:80/ats3. Click on the link in the top right hand corner to create the account. To view the test run once your account is active you need to click on the 'test runs' tab. + +To run the tests call the target `matti-test` (you will need to define the 'build.drive', 'build.number' and it is best to create the 'core.build.version' on the command line as well if you do not add it to the list of targets run that create the ROM image). e.g. +:: + + hlm -Dbuild.number=001 -Dbuild.drive=z: -Dcore.build.version=001 matti-test + +If it displays the message 'Testdrop created!' with the file name then the MATTIDrops.py script has done what it needs to do. The next thing to check is that the drop file has been uploaded to the ATS3 server OK. If that is performed successfully then the rest of the testing needs to be performed by the ATS3 server. There is also a test.xml file created that contains details needed for debugging any problems that might occur. To determine if the tests have run correctly you need to read the test run details from the server. diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/manual/tool-dependencies.rst.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/manual/tool-dependencies.rst.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +.. index:: + single: Helium tools dependencies + +.. csv-table:: Helium tools dependencies + :header: "Tool", "Purpose", "Optionality" + +<#list doc["ivy-report/dependencies/module"] as module> + "${module.@name} ${module.revision.@name}", "", "${module.revision.caller.@conf}" + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/mc_tools_design.vsd Binary file buildframework/helium/doc/src/mc_tools_design.vsd has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/metrics.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/metrics.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,217 @@ +#################### +Helium Build Metrics +#################### + +.. index:: + module: Helium Build Metrics + + +.. contents:: + +Introduction +============ + +This describes the types of build and release metrics that can be collected using Helium and a Diamonds installation and how they can be collected. + +.. index:: + single: Diamonds + +Diamonds Link for builds: +========================= + Diamonds Homepage: + + +Helium configuration +==================== +To enable logging to diamonds from Helium one needs to ensure that: + +* The properties *diamonds.host* and *diamonds.port* are set correctly. +* By default they are taken from *helium/tools/common/companyproperties.ant.xml*, + but can be overridden by using: + + * **Command line** + + For example, if the Diamonds server IP address changed to **new.diamonds.server:newport** then you would use: + + * *hlm.bat -Ddiamonds.host=new.diamonds.server -Ddiamonds.port=newport* + + * **ANT team file** + + For example, if the Diamonds server IP address changed to **new.diamonds.server:newport** then you would put the following lines in your .ant.xml: + + * ** + * ** + +* If you define the property skip.diamonds to 'true' diamonds is disabled. + + +.. index:: + single: Diamonds server configuration + +Diamonds server configuration +============================= + + Config File: helium/config/diamonds_config.xml.ftl + + +Properties need to be defined for successful logging: +----------------------------------------------------- + + ========================== ============ + Property name Description + ========================== ============ + diamonds.host Diamonds server address + diamonds.port Server port number + diamonds.path Builds path in diamonds server + build.family Category of product + time-stamp Time stamp format + stages Start and end target of a stages with logical stage name + sysdef.configurations.list System definition name list to log component faults + build.name Name of product + release.label Name of release + publish Set this property to publish to network + publish.dir Published build environment location + release.grace.dir Published location + disable.analysis.tool Set this property to disable API Usage Metrics + diamonds.build.tags Set this property to send custom build tag(s) to Diamonds + ========================== ============ + + +.. index:: + single: Metrics + +Metrics +======= + + +Metrics name: Build duration +---------------------------- + +Description +~~~~~~~~~~~~ + Build duration in hours as a function of time. + +Collection method +~~~~~~~~~~~~~~~~~~~ + The started time and finished time are uploaded to diamonds automatically from Helium. + +Location in Diamonds +~~~~~~~~~~~~~~~~~~~~~~ + In Diamonds, Builds->Summary. + + For categorization by product programs, Build->Click "category" hyperlink. For + categorization by build accelerators, Build->Other->Click "Build system" hyperlink. + + +RVCT compiler warnings +---------------------- + +Description +~~~~~~~~~~~ + Number of build warnings in SW build - RVCT compiler warnings to tell about the quality of the software. + +Collection Method +~~~~~~~~~~~~~~~~~ + Number of RVCT bad warnings, warnings and errors are send to diamond aumatically from Helium after each build. + +Location in Diamonds +~~~~~~~~~~~~~~~~~~~~~~ + In Diamonds, Builds->Summary->Compilation error summary. + + +Metrics name: "number of object files" and "number of generated files" +---------------------------------------------------------------------- + +Description +~~~~~~~~~~~~ + Number of object files and generated files for a build + +Collection method +~~~~~~~~~~~~~~~~~~~ + Necessary data are collected from build information automatically + + Based on helium/config/diamonds_config.xml.ftl cofiguration, Helium automatically sends the start and end time of a stage to diamonds. + + +Location in Diamonds +~~~~~~~~~~~~~~~~~~~~~~ + In Diamonds, Builds->Others->Object files & Generated files. + + +Metrics name: Build stage duration +---------------------------------- + +Description +~~~~~~~~~~~~ + Date and time of start and finish. A=Date and time of start B= Date and time of finish. + Metric = B-A calculated for each build stages. In the graph only the 4 main stages are shown.\ + + * *1. pre-build (Synergy check outs and snapshots, build area preparation)* + * *2. build (main build)* + * *3. post build (Post build, China, Japan, EE images, EE zip, Localization, Localized roms)* + * *4. release to channels (db, ftp, network disk)* + +Collection method +~~~~~~~~~~~~~~~~~~~ + The started time and finished time are uploaded to diamonds automatically from Helium. + +Location in Diamonds +~~~~~~~~~~~~~~~~~~~~~~ + In Diamonds, Builds->Summary. Click "Stages>>" + + +Metrics name: API Usage +---------------------------------- + +Description +~~~~~~~~~~~~ + Types of api are private, internal, domain and sdk. Illegal API is (internal+private), if any illegal api exists it will show the Illegal API's name with path. + +Collection method +~~~~~~~~~~~~~~~~~~~ + If disable.analysis.tool is not set, data will be uploaded to diamonds automatically from Helium. + +Location in Diamonds +~~~~~~~~~~~~~~~~~~~~~~ + In Diamonds, Builds->Other->API usage + + +Metrics name: Build tags +------------------------ + +Description +~~~~~~~~~~~~ + Build tags are used to group builds for metric collection purposes. + +Collection method +~~~~~~~~~~~~~~~~~~~ + To send custom build tags to Diamonds the property diamonds.build.tags should be set as follows: + * For a single build tag (e.g. "build_tag1") -> hlm -Ddiamonds.build.tags="build_tag1" + * For multiple build tags (e.g. "build_tag1" and "build_tagN") -> hlm -Ddiamonds.build.tags="build_tag1,build_tagN" + + Note: + * Build tags should not exceed 50 characters. + * Duplicate build tags will be ignored. + * If an "Available Tag" is set, then in Diamonds it gets removed from that list and transferred to "Build's Tags" list. + +Location in Diamonds +~~~~~~~~~~~~~~~~~~~~~~ + In Diamonds, Builds->Tags->Build's Tags. + + For categorization by tags, Click Builds->"Navigation" pane->"Build Archives"->by tags + + +Metrics name: Information about "base environment" +-------------------------------------------------- + +Description +~~~~~~~~~~~~ + Information about what "base environment" is unzipped. + +Collection method +~~~~~~~~~~~~~~~~~~~ + Necessary data are collected from build information automatically if currentRelease.xml exists in the environment. + +Location in Diamonds +~~~~~~~~~~~~~~~~~~~~~~ + In Diamonds, Builds->Content. See "Input" for s60. diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/minibuilds.rst.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/minibuilds.rst.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,42 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +.. index:: + module: Minibuild test configurations + +Minibuild test configurations +============================= + +Minibuilds are buildbots (automated test systems) that are used to test parts of Helium. For each platform/family of products e.g. 5132 and 5152 +a buildbot is created that tests the platform using +a subset of the complete build. All build bots are automatically executed each time something is checked in to the Helium subversion trunk. + +.. index:: + single: Minibuild test configurations- getting started + +Getting Started +--------------- + +.. toctree:: + +<#list project.getReference('internal.ref.minibuilds')?split(';') as filename> + ${filename?replace('\\', '/')} + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/quick_start_guide.rst.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/quick_start_guide.rst.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,123 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +######################## +Helium Quick Start Guide +######################## + +.. index:: + module: Helium Quick Start Guide + +.. contents:: + +Introduction +============ + +This document is a quick start guide for Ant based Helium build framework. More information can be found from `Helium manual`_. + +.. _`Helium manual`: index.html#index-65 + +This quick start guide is aimed at getting you helium on the build machine and showing you how to run helium in the very +simplest of ways. Further reading and configuration is required to perform a complete build of a component or a product. + +<#if !ant?keys?seq_contains("sf")> +To set up your environment please follow the `Helium Environment Setup`_ also make sure you have correct SymSEE version mentioned in this link. + +.. _`Helium Environment Setup`: nokia/nokia.html + + +<#if ant?keys?seq_contains("sf")> +To set up your environment please follow the steps of `Helium Environment Setup`_. + +.. _`Helium Environment Setup`: sf.html + + + +.. index:: + single: Helium configuration + +Helium configuration +-------------------- + +- Helium is configured using a combination of Ant configuration elements (properties, filesets, etc) and other XML files for more complex + configuration of particular parts of the build. For initial tests run in this quick start guide you do not need to configure anything, but + do please read the following references for more information: + + - `Using Ant `_: specifically the Projects and Properties sections. + - `Configure Helium `_: `common configuration format `_ and `Helium stages `_. + - `Helium glossary `_: lists the specific properties used in Helium. + +.. index:: + single: Running builds with Helium + +.. _Running-helium-label: + +Running builds with Helium +========================== + +After configuring the framework, running builds with Helium is simple. The command-line interface is the same as for Apache Ant. +Please read `Running Ant `_ for more information. + +You start the build with ``hlm`` command. Navigate into 'helium' directory (should contain the file hlm.bat) and type:: + + hlm [target] [-D=] [-f ] [-h] [-p -v] + + [target] Run Ant target + [-D=] Set an Ant property + [-f ] Use another Ant build file + [-h] Print Ant help text + [-p -v] List all Ant targets + + Variable properties for helium: + -Dsysdef.configuration=default set build configuration, default value is 'default' + -Dbuild.system=ebs set build system, default value is 'ebs' + - possible values are 'ebs' and 'ec' + + Usage examples: + hlm build the default build target + hlm -Dbuild.system=ec-helium use electric cloud build system + + +Eg:: + + hlm -Dbuild.number=1 hi + +This is a very simple task found in the file ``\helium\tool\common\common.ant.xml`` + +The code is shown below:: + + This is a comment line + indicates comment text + This is the target name 'hello' + what the task does echo the word 'hello' + Conditional branch + If the property build.number is present + then + echo additional text 'Ant libs found OK' + end of 'then' action + end of 'if' action + end of target/task + + + this is the called target which depends + upon the target 'hello' being run before + this target is run. + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/sf.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/sf.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ +====================================== +Setting up Helium (Symbian Foundation) +====================================== + +Installation +------------ + +Install the following tools: + +* `ActivePython 2.5`_ + +.. _`ActivePython 2.5`: http://www.activestate.com/activepython/downloads + +* `ActivePerl 5.6.1`_ + +.. _`ActivePerl 5.6.1`: http://www.activestate.com/activeperl/downloads + +Included in Helium release: + +* `Apache Ant 1.7.0`_ + +.. _`Apache Ant 1.7.0`: http://archive.apache.org/dist/ant/binaries/apache-ant-1.7.0-bin.zip + +* `Java 6`_ + +.. _`Java 6`: http://java.com/en/download/index.jsp + +* 7zip_ + +.. _7zip: http://www.7-zip.org \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/toc.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/toc.html Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,42 @@ + + + + +Apache Ant User Manual + + + + + +

    Table of Contents

    +Introduction
    +Quick start guide
    +Feature list
    + +

    Manual

    +Installing Helium
    +Using Helium
    +Running Helium
    +Helium stages
    +Configuration reference
    +Metrics
    +Data Package reference
    +Helium API
    + +

    Tutorials

    +IDOs
    +Variant teams - Customer Variant creation
    +Variant teams - UDA creation
    +Developers
    +Testing Helium pre-releases
    + +

    Development

    +Architecture
    +Design
    +Style guide
    +Python API
    +Java API
    +Ant Task Doc
    + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/tutorials/configuration/HowtoCreateANewSignal.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/tutorials/configuration/HowtoCreateANewSignal.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,113 @@ +How to create a new signal +========================== + +This document will help you implementing a new signal in your configuration. + +Use case +-------- +You have one target named **custom-action** which +should generate an artifact in some know location, and you would like the build to continue as far +as possible even if that artifact is missing, but being informed during the build it is not going as expected. + + +Base configuration +------------------ + +The following code snippet will be the base configuration for this exercise. + +build.xml + +.. code-block:: xml + + + + + + + + + + + + + + + + + + My artifact + + + + + + + + + + + + +To declare a new signal to the framework you need to define a new signalConfig reference. +You also need to create a signalInput configuration to define your signal behaviour. + +.. code-block:: xml + + + + + + + + + + + + + + +The signalListenerConfig defines which target to listen and raise signal for. The target name is defined through the **name** attribute. +Then the nested **targetCondition** element is used to configure how the signal should be triggered. +This element accepts any nested `Ant conditions `_. +In this case the signal will get raised only id the file is not present after the execution of the **custom-action** target. + +The framework then uses the defined signalInput from the signalNotifierInput configuration to know how to behave when the signal is raised. In the previous example it will +simply keep running and fail the build at the end. Then files defined by the nested notifierInput will be passed to the notifier. + +The execution of the **custom-action custom-dummy** build sequence will happen entirely even if the artifact is not +created properly, then fail the build mentioning the faulty target:: + + > hlm custom-action custom-dummy + Internal data listening enabled. + Buildfile: build.xml + [echo] Using build drive X: + + custom-action: + 18:21:14,503 INFO - Signal customActionSignal will be deferred. + + custom-dummy: + [echo] Dummy action + + BUILD FAILED + customActionSignal: custom-action target ended. : custom-action + + + Total time: 2 seconds + + +If you enable the artifact creation then the build will proceed successfully:: + + >hlm custom-action custom-dummy -Dcreate.artifact=true + Internal data listening enabled. + Buildfile: build.xml + [echo] Using build drive X: + + custom-action: + + custom-dummy: + [echo] Dummy action + + BUILD SUCCESSFUL + Total time: 2 seconds + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/tutorials/configuration/SimplestConfiguration.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/tutorials/configuration/SimplestConfiguration.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,46 @@ + + +Basic Helium configuration +========================== + +These two files define the smallest Helium configuration possible: + +First the build.xml, it consists in two Ant instructions: + + * The creation of a 'env' property which stores current environment variables (see http://ant.apache.org/manual/CoreTasks/property.html). + * Then the inclusion of Helium features importing the ${helium.dir}/helium.ant.xml, the helium.dir is automatically defined by the Helium bootstrapper. + +build.xml: + +.. code-block:: xml + + + + + + + + +Finally the Helium bootstrapper, which consists in a simple batch file (or shell script under Linux). +Its job is to redirect calls to the hlm.bat script under the HELIUM_HOME dir. Additional checks could be added there e.g: + + * check if the user has defined the HELIUM_HOME environment variable. + * set/modify environment + * define the HELIUM_HOME if Helium is in a known location + +hlm.bat:: + + @echo off + setlocal + if not defined HELIUM_HOME ( + echo HELIUM_HOME is not defined. + goto :eof + ) + %HELIUM_HOME%\hlm.bat %* + endlocal + + + +Download the example: +`simple_config.zip `_ + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/tutorials/configuration/UseHlmTasksInConfiguration.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/tutorials/configuration/UseHlmTasksInConfiguration.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,55 @@ + + +How to use Helium ant tasks in configuration +============================================= + +Sometimes customer may need to use helium ant tasks from their configurations and in the +following way customer can use helium ant tasks by importing helium_preinclude.ant.xml: + +Here is a example of build.xml: + + * The creation of a 'env' property which stores current environment variables (see http://ant.apache.org/manual/CoreTasks/property.html). + * Import ${helium.dir}/helium_preinclude.ant.xml to include helium ant tasks. + * Then a target which is using a helium ant task. + * Then the inclusion of Helium features importing the ${helium.dir}/helium.ant.xml, the helium.dir is automatically defined by the Helium bootstrapper. + +build.xml: + +.. code-block:: xml + + + + Helium pre include test. + + + + + + + Should not print anything. + + Should print something. + + + + + + +Finally the Helium bootstrapper, which consists in a simple batch file (or shell script under Linux). +Its job is to redirect calls to the hlm.bat script under the HELIUM_HOME dir. Additional checks could be added there e.g: + + * check if the user has defined the HELIUM_HOME environment variable. + * set/modify environment + * define the HELIUM_HOME if Helium is in a known location + +hlm.bat:: + + @echo off + setlocal + if not defined HELIUM_HOME ( + echo HELIUM_HOME is not defined. + goto :eof + ) + %HELIUM_HOME%\hlm.bat %* + endlocal + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/tutorials/configuration/simple_config.zip Binary file buildframework/helium/doc/src/tutorials/configuration/simple_config.zip has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/tutorials/imaker/buildinfo_creation.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/tutorials/imaker/buildinfo_creation.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,93 @@ +How to generate iMaker buildinfo using Helium +============================================= + +Config location: http://helium.nmp.nokia.com/trac/browser/configs/test/test_buildinfo + +The configuration +----------------- + +build.xml +~~~~~~~~~ + +The configuration shows how to override the default Helium template by overriding the *rombuild.buildinfo.template* Ant property:: + + + + + +FTL template +~~~~~~~~~~~~ + +It is possible to extract custom data by updating the templete using the `FreeMarker `_ Template Language (http://fmpp.sourceforge.net/freemarker/). +The following example extract all ant properties starting with *"build."*: +[[IncludeSource(/configs/test/test_buildinfo/image_conf_buildinfo.mk.ftl,include_templates/include_text)]] + +Creating the configuration +-------------------------- + +To create the file on your build area (Z: drive in our case) you simply need to invoke *rombuild-imaker-create-buildinfo* Helium target: +(Just make sure you have defined HELIUM_HOME first) + +:: + + > hlm.bat -Dbuild.drive=Z: rombuild-imaker-create-buildinfo + *** WARNING: Can't find vcvars32.bat - MS Visual Studio not present. + Buildfile: build.xml + + create-data-model-db: + + validate-at-startup: + [python] ERROR: Description has no content for 'read.build.int' + [python] WARNING: Required property not defined: sysdef.configurations.list + [python] WARNING: Required property not defined: tsrc.data.dir + [python] WARNING: Required property not defined: ats3.pathToDrop + [python] WARNING: Required property not defined: ats3.host + [python] WARNING: Required property not defined: ats.flash.images + [python] WARNING: Required property not defined: ats.image.type + [python] WARNING: Required property not defined: ats.drop.file + [python] WARNING: Required property not defined: ats3.username + [python] WARNING: Required property not defined: cache.drive + [python] WARNING: Required property not defined: ats.product.name + [python] WARNING: Required property not defined: ats3.password + + rombuild-imaker-create-buildinfo: + [fmpp] File processed. + + BUILD SUCCESSFUL + Total time: 3 seconds + + +The output +~~~~~~~~~~ + +The file image_conf_buildinfo.mk should be generated under /epoc32/rom/config, and should contains something similar to:: + + ########################################################################## + # + # Helium - iMaker buildinfo template. + # + ########################################################################## + + BUILD_LOGGING_KEY_STAGES = prep,build-ebs-main,postbuild,flashfiles,java-certification-rom,zip-main,publish-generic,variants-core,variants-elaf,variants-china,variants-thai,variants-japan,variants,mobilecrash-prep,localise-tutorial-content,hdd-images,zip-flashfiles,zip-localisation,data-packaging-prep + BUILD_SUMMARY_FILE_2 = Z:\output\logs\summary\pf_5250_16_wk2008_summary.log2.xml + BUILD_LOG = Z:\output\logs\pf_5250_16_wk2008_ant_build.log + BUILD_NAME = pf_5250 + BUILD_CACHE_LOG_DIR = C:\DOCUME~1\wbernard\LOCALS~1\Temp\helium\wbernard\pf_5250_16_wk2008\logs + BUILD_SYSTEM = ebs + BUILD_LOG_DIR = Z:\output\logs + BUILD_CACHE_DIR = C:\DOCUME~1\wbernard\LOCALS~1\Temp\helium\wbernard\pf_5250_16_wk2008 + BUILD_OUTPUT_DIR = Z:\output + BUILD_SUMMARY_FILE = Z:\output\logs\pf_5250_16_wk2008_build_summary.xml + BUILD_VERSION = 0.0.1 + BUILD_SYSTEM_EBS = Not used + BUILD_SISFILES_DIR = Z:\output\sisfiles + BUILD_ERRORS_LIMIT = 0 + BUILD_DRIVE = Z: + BUILD_NUMBER = 1 + BUILD_DUPLICATES_LOG = Z:\output\logs\pf_5250_16_wk2008_build_duplicates.xml + BUILD_LOGGING_START_STAGE = check-env-prep + BUILD_ID = pf_5250_16_wk2008 + + + +Download the example: `buildinfo_creation.zip `_ \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/tutorials/imaker/buildinfo_creation.zip Binary file buildframework/helium/doc/src/tutorials/imaker/buildinfo_creation.zip has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/tutorials/qt_build.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/tutorials/qt_build.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,64 @@ +.. index:: + module: How to create a ROM Image + +################################ +Configure Helium for Qt building +################################ + +.. contents:: + +This tutorial explains how to update your configuration to enable Qt building. + +Configuring Qt +============== + +Helium has a ready to use target which allows you to configure Qt. You just need to make sure the qt.dir +property is configured with the correct location of your Qt source. +Then you can run the target as follow:: + + > hlm -Dbuild.drive=Q: -Dbuild.number=1 configure-qt + ... + +This target has now been depreciated in Helium 6.0, please consider building Qt using Symbian toolchain (SBS or SBSv2). + +Building Qt components +====================== + +Qt component can be configured using system definition files version 1.5.1, its definition could be +found under HELIUM_HOME/tools/common/dtd/sysdef_1_5_1.dtd. You also need to define this schema as the +main one for the system definition file merging operations, this can be done by adding the following +line to your build configuration:: + + + + +Then qmake building needs to be activated by defining the ``qmake.enabled`` property. + +Then you can configure your Qt components by using the proFile attribute under the system definition files. +The proFile attribute defines the name of the pro file relatively to the path defined by the bldFile attribute. +Default qMake command line parameters can be overridden by using the optional qmakeArgs attribute. +Example:: + + + + + + + + + + + + + + + +The system definition files can now be merged and filtered(similarly to Raptor). Helium will use the filtered information +during the build to run qMake and generate the bld.inf required to make Symbian builds. +This will follow this algorithm:: + + foreach unit from the filtered system definition file: + cd + qmake + +The file qmake.generated.txt is created with the list of files generated. diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/tutorials/rom_image.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/tutorials/rom_image.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,97 @@ +.. index:: + module: How to create a ROM Image + +################################ +How to create a ROM Image +################################ + +.. contents:: + +This tutorial explains how to create a ROM image and all the configurations required to achieve this. + + +Introduction +============= + +The ROM image is the end product which is flashed (downloaded) in to the phone and makes the phone behave the way it is supposed to behave (or not if there are problems present). ROM images are created within Helium using the S60 tool iMaker. iMaker is a ROM-image creation tool which provides a simple, standardized and configurable ROM-image creation framework. iMaker is based on the standardized GNU Make system and is therefore platform-independent. iMaker is a tool that creates a flash image from a set of Symbian binary and data files. iMaker mainly functions on top of the Symbian buildrom utility. + +The iMaker tool itself runs the Make tool and consists of thin layer of Perl. +iMaker offers a standardized framework for defining configuration parameters for the ROM-image +creation. The framework tools and configurability can easily be extended in the end customer interface, +without changing the core iMaker functionality. + +Within Helium there are a series of targets that can be run that call iMaker and hence build the ROM image. +This section is targeting build managers and IDOs who need to configure Helium to build ROM images using iMaker. + + +In order to use Helium for ROM-image creation your ROMs need to be configured to +be created using Helium. The creation is supported by the iMaker task which supports the '''imakerconfigurationset''' +element to configure what needs to be built. + +.. index:: + single: How to Install iMaker + +How to Install iMaker +===================== + +iMaker comes as part of S60 code and therefore should be automatically installed when S60 is installed. However, if you are not using S60 +it is also available via Helium under the 'helium_trunk/external/imaker/bin' directory, the main executable is called 'mingw_make.exe'. + + +.. index:: + single: ROM Creation Commands + +ROM Creation Commands +====================== + +To build an Engineering English (EE) version of the ROM use the target 'ee-roms' for localised images use the target +'localisation'. These are both for product builds and need several parameters to be configured before they will work successfully. +For details on how to configure helium for ROM image creation click :ref:`ROM-creation-label`. + +.. index:: + single: Engineering English - brief description + +Engineering English - brief description +---------------------------------------- + +EE builds are the basic builds that contain all the required components but the only available language is English. +It is often used to prove that a build can be made or for basic testing, without the added complication of different languages. + +.. index:: + single: Localisation - brief description + +Localisation - brief description +--------------------------------- + +Localisation is the process used to create the different variants for different parts of the world. For each different language +available in a phone there is one or more text files that contain the text to be displayed, e.g. contacts, options, exit, keypad locked, +all have to be translated to the relevent language text. There are various regional variations as well which need to be implemented +so the correct files need to be included, this is all part of the configuration for localisation. + + +.. index:: + single: iMaker User Guide + +.. _iMaker-label: + +iMaker User Guide +================= + +There is an `iMaker User Guide` available from helium in the \\helium-trunk\\external\\imaker\\doc folder +it is a PDF file (S60_iMaker_User_Guide.pdf) and explains +everything you need to know about iMaker. iMaker is based on `GNU Make`_ click on the link to view a .html version of `GNU Make`_ documentation. + +.. _`GNU Make`: http://www.gnu.org/software/make/manual/make.html + +.. index:: + single: iMaker tutorials + +iMaker tutorials +================ + +This section lists all available tutorials on how to configure and use iMaker. + +.. toctree:: + :maxdepth: 1 + + imaker/buildinfo_creation diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/tutorials/variant.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/tutorials/variant.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,185 @@ +.. index:: + module: Variant creation tutorial + +################################ +Legacy Variant creation tutorial +################################ + +This section describes the configuration required to create a variants and UDA, this should be read along with the :ref:`localisation-label`: +sections else where. + +Variant Creation +----------------- + +This section aims to describe the creation of Customer Variants using Helium. + + +The variant team should configure their variant using the following template: + + variation (configurable location) + operator_xx_51 + data + ibys + cenreps + rscs + variation + rss rebuilt using binary variation (like spp psw folder) + config + hlm.bat + build.xml (mini-configuration referencing product release one) + customer_rom_config.xml (external configuration to define the variant image) + + + +Keep in mind that with MultiROFS nothing will get exported by image creation, ibys and content will be directly +referenced from the variant location: data directory and variant root will be added to the ROM creation include path. + + +You can configure your variant build environment with the following template files: + + +* build.xml: + +.. code-block:: xml + + + + + + + + + + + + + + + +* customer_rom_config.xml: + +.. code-block:: xml + + + + + + + + + + + + + + + + + +What is happening when generating the Customer Variant? +The customer file will be included by the platform configuration and be included by the XInclude mechanism. +This currently means that the platform has to explicitly add the include information. But we will try to remove that dependence in the future. + +UDA creation +------------- + +The main concept of this section is to explain how the Variant Team should use Helium to handle UDA creation. +First of all the UDA environment is split in 2 different parts: the content and the config:: + + + uda_delivery + + uda_content + + common + - content.zip + + application1 + - file1.zip + - file2.zip + + application2 + - file.zip + + + config + - hlm.bat + - build.xml + - uda_rom_config.xml (standalone configuration) + + +* The content must contain subdirectories that represents different kind of features which store them as zip files. + All the zip files under that folder will be unzipped when generating the UDA. +* The configuration is a standalone Helium configuration that would be used to configure the UDA creation. + + +Example of configuration: + +* build.xml + +.. code-block:: xml + + + + + + + + + + + + + +* uda_rom_config.xml + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. csv-table:: Property descriptions + :header: "Property", "Description" + + "``uda.id``", "Defines the uda identification number" + "``uda.revision``", "Defines the revision number for the version string" + "``uda.content``", "Comma separated list that defines the UDA content" + "``uda.content.dir``", "Location of the content subdirectories" + "``uda.template``", "Template that defines the how to generate the version string" + "``uda.image.path``", "Template that defines where to generated the UDA" + "``uda.image.name``", "Template that defines how to name the UDA" + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/user-graph.dot.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/user-graph.dot.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,157 @@ +<#-- +============================================================================ +Name : +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> + +strict digraph G { + compound=true; + subgraph cluster_0 { + node [style=filled]; + <#if !(ant?keys?seq_contains("sf"))> + Ant -> "Quick Guide"[dir=none]; + "Quick Guide" -> "Setting up Helium at Nokia"[dir=none]; + "Setting up Helium at Nokia" -> "Running Helium"[dir=none]; + "Running Helium" -> "Feature List"[dir=none]; + "Feature List" -> Diamonds[dir=none]; + Diamonds -> "Helium Wiki"[dir=none]; + "Helium Wiki" -> "Helium Forum"[dir=none]; + <#else> + Ant -> "Quick Guide"[dir=none]; + "Quick Guide" -> "Setting up Helium"[dir=none]; + "Setting up Helium" -> "Running Helium"[dir=none]; + "Running Helium" -> "Feature List"[dir=none]; + + label = "Beginners"; + } + + subgraph cluster_1 { + node [style=filled]; + <#if !(ant?keys?seq_contains("sf"))> + "Configure Helium" -> IDO[dir=none]; + "Configure Helium" -> TeamCI[dir=none]; + "Configure Helium" -> MCL[dir=none]; + <#else> + "Configure Helium"; + + label = "Intermediate"; + } + + subgraph cluster_2 { + node [style=filled]; + <#if !(ant?keys?seq_contains("sf"))> + "ROM Image" -> "Variant Creation"[dir=none]; + "Variant Creation" -> "Helium Stages"[dir=none]; + "Helium Stages" -> "Helium Nokia Stages"[dir=none]; + "Helium Nokia Stages" -> "SDK Creation"[dir=none]; + <#else> + "ROM Image" -> "Variant Creation"[dir=none]; + "Variant Creation" -> "Helium Stages"[dir=none]; + + label = "Advanced"; + } + + + subgraph cluster_4 { + node [style=filled]; + <#if !(ant?keys?seq_contains("sf"))> + "Helium Developer Guide" -> "Coding Convention"[dir=none]; + "Coding Convention" -> "Helium Test Plan"[dir=none]; + "Helium Test Plan" -> Python[dir=none]; + Python -> Java[dir=none]; + Java -> FMPP[dir=none]; + FMPP -> "DOS Scripting"[dir=none]; + <#else> + "Helium Developer Guide" -> "Coding Convention"[dir=none]; + "Coding Convention" -> Python[dir=none]; + Python -> Java[dir=none]; + Java -> FMPP[dir=none]; + FMPP -> "DOS Scripting"[dir=none]; + + label = "Helium Developer"; + } + + <#if !(ant?keys?seq_contains("sf"))> + subgraph cluster_2_1{ + node [style=filled, rankdir=LR]; + EBS [fontcolor=navyblue,fontsize=12,shape=box,href="http://s60wiki.nokia.com/S60Wiki/EBS"]; + Raptor [fontcolor=navyblue,fontsize=12,shape=box,href="http://s60wiki.nokia.com/S60Wiki/Raptor"]; + "Electric Cloud" [fontcolor=navyblue,fontsize=12,shape=box,href="http://www.connecting.nokia.com/nmp/tpm/nmpglosw.nsf/document/ES21T6K9FM4?OpenDocument"]; + ATS [fontcolor=navyblue,fontsize=12,shape=box,href="manual/stages.html#stage-ats3-stif-and-eunit"]; + BlackTusk [fontcolor=navyblue,fontsize=12,shape=box,href="nokia/blacktusk/howto-setup-blacktusk-with-helium.html"]; + } + + + subgraph cluster_4_1 { + node [style=filled, rankdir=LR]; + ANTUnit [fontcolor=navyblue,fontsize=12,shape=box,href="http://ant.apache.org/antlibs/antunit/"]; + NOSE [fontcolor=navyblue,fontsize=12,shape=box,href="http://ivory.idyll.org/articles/nose-intro.html"]; + JUnit [fontcolor=navyblue,fontsize=12,shape=box,href="http://helium.nmp.nokia.com/trac/wiki/JUnit"]; + } + + Start -> Ant [lhead=cluster_0]; + Start -> "Configure Helium" [lhead=cluster_1]; + Start -> "ROM Image" [lhead=cluster_2]; + Start -> "Helium Developer Guide" [lhead=cluster_4]; + <#if !(ant?keys?seq_contains("sf"))> + "SDK Creation" -> "Electric Cloud"[dir=none, lhead=cluster_2_1, ltail=cluster_2]; + + "DOS Scripting" -> NOSE[dir=none, lhead=cluster_4_1, ltail=cluster_4]; + + + Start [fontcolor=navyblue,fontsize=12,style=filled,href="introduction.html"]; + + Ant [fontcolor=navyblue,fontsize=12,shape=box,href="http://ant.apache.org/manual/"]; + "Quick Guide" [fontcolor=navyblue,fontsize=12,shape=box,href="quick_start_guide.html"]; + "Running Helium" [fontcolor=navyblue,fontsize=12,shape=box,href="manual/running.html"]; + + <#if (ant?keys?seq_contains("sf"))> + "Setting up Helium" [fontcolor=navyblue,fontsize=12,shape=box,href="sf.html"]; + + + "Feature List" [fontcolor=navyblue,fontsize=12,shape=box,href="feature_list.html"]; + "Configure Helium" [fontcolor=navyblue,fontsize=12,shape=box,href="manual/configuring.html"]; + "Helium Stages" [fontcolor=navyblue,fontsize=12,shape=box,href="manual/stages.html"]; + + + "ROM Image" [fontcolor=navyblue,fontsize=12,shape=box,href="tutorials/rom_image.html"]; + "Variant Creation" [fontcolor=navyblue,fontsize=12,shape=box,href="tutorials/variant.html"]; + + <#if !(ant?keys?seq_contains("sf"))> + "Setting up Helium at Nokia" [fontcolor=navyblue,fontsize=12,shape=box,href="nokia/nokia.html"]; + "Helium Nokia Stages" [fontcolor=navyblue,fontsize=12,shape=box,href="nokia/nokiastages.html"]; + Diamonds [fontcolor=navyblue,fontsize=12,shape=box,href="http://diamonds.nmp.nokia.com/diamonds/"]; + "Helium Wiki" [fontcolor=navyblue,fontsize=12,shape=box,href="http://delivery.nmp.nokia.com/trac/helium/wiki"]; + "Helium Forum" [fontcolor=navyblue,fontsize=12,shape=box,href="http://forums.connecting.nokia.com/forums/forum.jspa?forumID=262"]; + MCL [fontcolor=navyblue,fontsize=12,shape=box,href="http://s60wiki.nokia.com/S60Wiki/S60_Software_Asset_Management/Organization/Delivery_Services/Howto_build_DFS70.91.91_/_S60.MCL_with_Helium"]; + "SDK Creation" [fontcolor=navyblue,fontsize=12,shape=box,href="nokia/rndsdk_user_manual.html"]; + IDO [fontcolor=navyblue,fontsize=12,shape=box,href="ido/index.html"]; + TeamCI [fontcolor=navyblue,fontsize=12,shape=box,href="teamci/index.html"]; + "Helium Test Plan" [fontcolor=navyblue,fontsize=12,shape=box,href="nokia/testing.html"]; + + + "Helium Developer Guide" [fontcolor=navyblue,fontsize=12,shape=box,href="developer_guide.html"]; + "Coding Convention" [fontcolor=navyblue,fontsize=12,shape=box,href="coding_conventions.html"]; + Python [fontcolor=navyblue,fontsize=12,shape=box,href="http://www.python.org/"]; + Java [fontcolor=navyblue,fontsize=12,shape=box,href="http://java.sun.com/j2se/"]; + FMPP [fontcolor=navyblue,fontsize=12,shape=box,href="http://fmpp.sourceforge.net/"]; + "DOS Scripting" [fontcolor=navyblue,fontsize=12,shape=box,href="http://en.wikipedia.org/wiki/Batch_script"]; + ANTUnit [fontcolor=navyblue,fontsize=12,shape=box,href="http://ant.apache.org/antlibs/antunit/"]; + NOSE [fontcolor=navyblue,fontsize=12,shape=box,href="http://ivory.idyll.org/articles/nose-intro.html"]; +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/doc/src/user-graph.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/doc/src/user-graph.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,15 @@ +################### +Users' Flow Diagram +################### + +.. raw:: html + + Flow Diagram + + +.. raw:: html + :file: user-graph.dot.cmap + +.. raw:: html + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/ant-antunit-1.1.jar Binary file buildframework/helium/external/antlibs/ant-antunit-1.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/ant-contrib-1.0b2.jar Binary file buildframework/helium/external/antlibs/ant-contrib-1.0b2.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/antform.jar Binary file buildframework/helium/external/antlibs/antform.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/asm-2.2.1.jar Binary file buildframework/helium/external/antlibs/asm-2.2.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/bliki-3.0.7.jar Binary file buildframework/helium/external/antlibs/bliki-3.0.7.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/bsf-2.4.0.jar Binary file buildframework/helium/external/antlibs/bsf-2.4.0.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/bsh-2.1b0-1.0.jar Binary file buildframework/helium/external/antlibs/bsh-2.1b0-1.0.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/com/kirkk/analyzer/framework/Filter.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/antlibs/com/kirkk/analyzer/framework/Filter.properties Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,2 @@ +filter.packages = javax.*;java.*;org.omg*;org.ietf.jgss*;org.w3c.dom*;org.xml.sax*;sun.*;sunw.*;com.sun.* +filter.jars= \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/commons-codec-1.3.jar Binary file buildframework/helium/external/antlibs/commons-codec-1.3.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/commons-collections-3.2.jar Binary file buildframework/helium/external/antlibs/commons-collections-3.2.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/commons-configuration-1.5.jar Binary file buildframework/helium/external/antlibs/commons-configuration-1.5.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/commons-discovery-0.2.jar Binary file buildframework/helium/external/antlibs/commons-discovery-0.2.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/commons-httpclient-3.1.jar Binary file buildframework/helium/external/antlibs/commons-httpclient-3.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/commons-io-1.4.jar Binary file buildframework/helium/external/antlibs/commons-io-1.4.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/commons-jxpath-1.2.jar Binary file buildframework/helium/external/antlibs/commons-jxpath-1.2.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/commons-lang-2.4.jar Binary file buildframework/helium/external/antlibs/commons-lang-2.4.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/commons-logging-1.1.1.jar Binary file buildframework/helium/external/antlibs/commons-logging-1.1.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/dom4j-1.6.1.jar Binary file buildframework/helium/external/antlibs/dom4j-1.6.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/emma.jar Binary file buildframework/helium/external/antlibs/emma.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/emma_ant.jar Binary file buildframework/helium/external/antlibs/emma_ant.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/fmpp-0.9.13.jar Binary file buildframework/helium/external/antlibs/fmpp-0.9.13.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/freemarker-2.3.13.jar Binary file buildframework/helium/external/antlibs/freemarker-2.3.13.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/ivy-helium-2.0.0-beta2.jar Binary file buildframework/helium/external/antlibs/ivy-helium-2.0.0-beta2.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/jakarta-oro-2.0.8.jar Binary file buildframework/helium/external/antlibs/jakarta-oro-2.0.8.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/jaranalyzer-1.2.jar Binary file buildframework/helium/external/antlibs/jaranalyzer-1.2.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/jaxen-1.1.1.jar Binary file buildframework/helium/external/antlibs/jaxen-1.1.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/jsch-0.1.39.jar Binary file buildframework/helium/external/antlibs/jsch-0.1.39.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/junit-4.5.jar Binary file buildframework/helium/external/antlibs/junit-4.5.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/jython-2.5.jar Binary file buildframework/helium/external/antlibs/jython-2.5.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/log4j-1.2.9.jar Binary file buildframework/helium/external/antlibs/log4j-1.2.9.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/mail-1.4.1.jar Binary file buildframework/helium/external/antlibs/mail-1.4.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/maven-scm-api-1.1.jar Binary file buildframework/helium/external/antlibs/maven-scm-api-1.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/maven-scm-provider-hg-1.1.jar Binary file buildframework/helium/external/antlibs/maven-scm-provider-hg-1.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/plexus-utils-1.5.6.jar Binary file buildframework/helium/external/antlibs/plexus-utils-1.5.6.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/antlibs/readme.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,2 @@ + +antdoclet.jar: 1.1 \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/serializer.jar Binary file buildframework/helium/external/antlibs/serializer.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/sqlitejdbc-v053.jar Binary file buildframework/helium/external/antlibs/sqlitejdbc-v053.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/velocity-dep-1.3.1.jar Binary file buildframework/helium/external/antlibs/velocity-dep-1.3.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/wsdl4j-1.5.1.jar Binary file buildframework/helium/external/antlibs/wsdl4j-1.5.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/xalan.jar Binary file buildframework/helium/external/antlibs/xalan.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/xia-1.0.jar Binary file buildframework/helium/external/antlibs/xia-1.0.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/xincluder.jar Binary file buildframework/helium/external/antlibs/xincluder.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/xmltask-v1.15.1.jar Binary file buildframework/helium/external/antlibs/xmltask-v1.15.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/antlibs/xmlunit-1.2.jar Binary file buildframework/helium/external/antlibs/xmlunit-1.2.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/antlibs/bsf-2.4.0.jar Binary file buildframework/helium/external/cc-customizations/antlibs/bsf-2.4.0.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/antlibs/bsh-2.1b0-1.0.jar Binary file buildframework/helium/external/cc-customizations/antlibs/bsh-2.1b0-1.0.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/antlibs/commons-logging-1.1.1.jar Binary file buildframework/helium/external/cc-customizations/antlibs/commons-logging-1.1.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/antlibs/junit-4.5.jar Binary file buildframework/helium/external/cc-customizations/antlibs/junit-4.5.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/bin/HELIUM-README.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/bin/HELIUM-README.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,51 @@ +Cruise control Helium Integration +================================= + +Cruise Control version: 2.8.2 +HCC version: 1 + +Helium additions +---------------- +cruisecontrol-bin-2.8.2\HELIUM-README.txt +cruisecontrol-bin-2.8.2\cruisecontrol.bat +cruisecontrol-bin-2.8.2\distribution.policy.S60 +cruisecontrol-bin-2.8.2\etc\distribution.policy.S60 +cruisecontrol-bin-2.8.2\etc\jetty.xml +cruisecontrol-bin-2.8.2\helium-dashboard-config.xml +cruisecontrol-bin-2.8.2\lib\distribution.policy.S60 +cruisecontrol-bin-2.8.2\lib\nokia_helium_cc.jar + + + +How to use CC Helium customizations +----------------------------------- + +In config.xml: +----8<----8<----8<----8<----8<----8<----8<---- + + + + + ... +----8<----8<----8<----8<----8<----8<----8<---- + +How to use Dashboard Helium customizations +------------------------------------------ + +To enable the Helium build summary widget please use the Helium specific +dashboard configuration file: +set CCDIR= +\cruisecontrol.bat + +How to configure the Ant builder +-------------------------------- + +To prevent log.xml missing exception while running Helium please configure the ant builder this way: + + + + + + +_______________ +The Helium Team diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/bin/cruisecontrol.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/bin/cruisecontrol.bat Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,37 @@ +@echo off + +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of the License "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: +rem + +setlocal +set HELIUMCCEXT_HOME=%~dp0 + +REM Detecting CruiseControl +if not defined CCDIR ( +if exist "%HELIUMCCEXT_HOME%..\..\cruisecontrol\cruisecontrol.bat" ( +set CCDIR=%HELIUMCCEXT_HOME%..\..\cruisecontrol +) else ( +echo CCDIR is not defined +goto :end +) +) + +if not defined DASHBOARD_CONFIG set DASHBOARD_CONFIG=%HELIUMCCEXT_HOME%helium-dashboard-config.xml +set CC_OPTS=%CC_OPTS% -Ddashboard.config=%DASHBOARD_CONFIG% -Dhelium.cc.ext.home=%HELIUMCCEXT_HOME% +set CC_ARGS=-lib %HELIUMCCEXT_HOME%lib -webapppath %CCDIR%/webapps/cruisecontrol -dashboard %CCDIR%/webapps/dashboard -jettyxml %HELIUMCCEXT_HOME%etc/jetty.xml %CC_ARGS% +call %CCDIR%\cruisecontrol.bat %CC_ARGS% %* +:end +endlocal diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/bin/etc/jetty.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/bin/etc/jetty.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,240 @@ + + + + + + + + + + + + 10 + 200 + 20 + 2 + + + + + + + + + + + + + + + + + + + + 30000 + 2 + false + 8443 + 5000 + 5000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /contexts + 1 + + + + + + + + + + + + + + + + + + + + + + /webapps + false + true + false + /etc/webdefault.xml + /lib/nokia_helium_cc.jar + + + + + + + + + + + + + + + + Test Realm + /etc/realm.properties + 0 + + + + + + + + + + + + + + + + /yyyy_mm_dd.request.log + yyyy_MM_dd + 90 + true + true + false + GMT + + + + + + + + true + true + true + 1000 + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/bin/helium-dashboard-config.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/bin/helium-dashboard-config.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,61 @@ + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/bin/lib/nokia_helium_cc.jar Binary file buildframework/helium/external/cc-customizations/bin/lib/nokia_helium_cc.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/build.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/build.bat Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,25 @@ +@echo off + +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of the License "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: +rem + +setlocal +if not defined JAVA_6_HOME ( +set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02 +) ELSE set TESTED_JAVA=%JAVA_6_HOME% +if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%) +set PATH=%JAVA_HOME%\bin;%PATH% +ant -lib antlibs %* \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/build.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/build.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${cc.zip} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/overlay/cruisecontrol.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/overlay/cruisecontrol.bat Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,37 @@ +@echo off + +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of the License "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: +rem + +setlocal +set HELIUMCCEXT_HOME=%~dp0 + +REM Detecting CruiseControl +if not defined CCDIR ( +if exist "%HELIUMCCEXT_HOME%..\..\cruisecontrol\cruisecontrol.bat" ( +set CCDIR=%HELIUMCCEXT_HOME%..\..\cruisecontrol +) else ( +echo CCDIR is not defined +goto :end +) +) + +if not defined DASHBOARD_CONFIG set DASHBOARD_CONFIG=%HELIUMCCEXT_HOME%helium-dashboard-config.xml +set CC_OPTS=%CC_OPTS% -Ddashboard.config=%DASHBOARD_CONFIG% -Dhelium.cc.ext.home=%HELIUMCCEXT_HOME% +set CC_ARGS=-lib %HELIUMCCEXT_HOME%lib -webapppath %CCDIR%/webapps/cruisecontrol -dashboard %CCDIR%/webapps/dashboard -jettyxml %HELIUMCCEXT_HOME%etc/jetty.xml %CC_ARGS% +call %CCDIR%\cruisecontrol.bat %CC_ARGS% %* +:end +endlocal diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/overlay/etc/jetty.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/overlay/etc/jetty.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,240 @@ + + + + + + + + + + + + 10 + 200 + 20 + 2 + + + + + + + + + + + + + + + + + + + + 30000 + 2 + false + 8443 + 5000 + 5000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /contexts + 1 + + + + + + + + + + + + + + + + + + + + + + /webapps + false + true + false + /etc/webdefault.xml + /lib/nokia_helium_cc.jar + + + + + + + + + + + + + + + + Test Realm + /etc/realm.properties + 0 + + + + + + + + + + + + + + + + /yyyy_mm_dd.request.log + yyyy_MM_dd + 90 + true + true + false + GMT + + + + + + + + true + true + true + 1000 + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/overlay/helium-dashboard-config.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/overlay/helium-dashboard-config.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,61 @@ + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/readme.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,11 @@ +Cruise Control Helium integration +--------------------------------- + +Requirements: +JDK 1.5/1.6 + +How to build the delivery? +> build.bat + +_______________ +The Helium Team \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/ant/HeliumCCLogger.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/ant/HeliumCCLogger.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,595 @@ +/* ============================================================================ +Name : HeliumBuilder.java +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ */ + +package com.nokia.cruisecontrol.ant; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintStream; +import java.io.Writer; +import java.util.Hashtable; +import java.util.Stack; +import java.util.Enumeration; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import org.apache.tools.ant.util.DOMElementWriter; +import org.apache.tools.ant.util.StringUtils; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Text; +import org.apache.tools.ant.*; + +/** + * Generates a file in the current directory with an XML description of what + * happened during a build. The default filename is "log.xml", but this can be + * overridden with the property XmlLogger.file. + * + * This implementation assumes in its sanity checking that only one thread runs + * a particular target/task at a time. This is enforced by the way that parallel + * builds and antcalls are done - and indeed all but the simplest of tasks could + * run into problems if executed in parallel. + * + * @see Project#addBuildListener(BuildListener) + */ +public class HeliumCCLogger implements org.apache.tools.ant.BuildLogger +{ + /** Message priority of "error". */ + public static final int MSG_ERR = 0; + + /** Message priority of "warning". */ + public static final int MSG_WARN = 1; + + /** Message priority of "information". */ + public static final int MSG_INFO = 2; + + /** Message priority of "verbose". */ + public static final int MSG_VERBOSE = 3; + + /** Message priority of "debug". */ + public static final int MSG_DEBUG = 4; + + /** DocumentBuilder to use when creating the document to start with. */ + private static DocumentBuilder builder = getDocumentBuilder(); + + /** XML element name for a build. */ + private static final String BUILD_TAG = "build"; + + /** XML element name for a target. */ + private static final String TARGET_TAG = "target"; + + /** XML element name for a task. */ + private static final String TASK_TAG = "task"; + + /** XML element name for a message. */ + private static final String MESSAGE_TAG = "message"; + + /** XML attribute name for a name. */ + private static final String NAME_ATTR = "name"; + + /** XML attribute name for a time. */ + private static final String TIME_ATTR = "time"; + + /** XML attribute name for a message priority. */ + private static final String PRIORITY_ATTR = "priority"; + + /** XML attribute name for a file location. */ + private static final String LOCATION_ATTR = "location"; + + /** XML attribute name for an error description. */ + private static final String ERROR_ATTR = "error"; + + /** XML element name for a stack trace. */ + private static final String STACKTRACE_TAG = "stacktrace"; + + /** The complete log document for this build. */ + private Document doc = builder.newDocument(); + + /** Mapping for when tasks started (Task to TimedElement). */ + private Hashtable tasks = new Hashtable(); + + /** Mapping for when targets started (Task to TimedElement). */ + private Hashtable targets = new Hashtable(); + + /** + * Mapping of threads to stacks of elements (Thread to Stack of + * TimedElement). + */ + private Hashtable threadStacks = new Hashtable(); + + /** + * When the build started. + */ + private TimedElement buildElement; + + private int msgOutputLevel = MSG_DEBUG; + + private PrintStream outStream; + + + /** + * Returns a default DocumentBuilder instance or throws an + * ExceptionInInitializerError if it can't be created. + * + * @return a default DocumentBuilder instance. + */ + private static DocumentBuilder getDocumentBuilder() + { + try + { + return DocumentBuilderFactory.newInstance().newDocumentBuilder(); + } + catch (Exception exc) + { + throw new ExceptionInInitializerError(exc); + } + } + + + /** Utility class representing the time an element started. */ + private static class TimedElement + { + /** + * Start time in milliseconds (as returned by + * System.currentTimeMillis()). + */ + private long startTime; + + /** Element created at the start time. */ + private Element element; + + public String toString() + { + return element.getTagName() + ":" + element.getAttribute("name"); + } + } + + + /** + * Fired when the build starts, this builds the top-level element for the + * document and remembers the time of the start of the build. + * + * @param event + * Ignored. + */ + public void buildStarted(BuildEvent event) + { + } + + /** + * Fired when the build finishes, this adds the time taken and any error + * stacktrace to the build element and writes the document to disk. + * + * @param event + * An event with any relevant extra information. Will not be + * null. + */ + public void buildFinished(BuildEvent event) + { + long totalTime = System.currentTimeMillis() - buildElement.startTime; + // buildElement.element.setAttribute(TIME_ATTR, + // DefaultLogger.formatTime(totalTime)); + + System.out.println("Build finished in cruise control HeliumCCLogger"); + + if (event.getException() != null) + { + System.out.println("Build finished exception occured in cruise control HeliumCCLogger"); + System.out.println("Build finished exception is:-----" + + event.getException().toString()); + buildElement.element.setAttribute(ERROR_ATTR, event.getException().toString()); + // print the stacktrace in the build file it is always useful... + // better have too much info than not enough. + Throwable t = event.getException(); + Text errText = doc.createCDATASection(StringUtils.getStackTrace(t)); + Element stacktrace = doc.createElement(STACKTRACE_TAG); + stacktrace.appendChild(errText); + buildElement.element.appendChild(stacktrace); + } + String outFilename = event.getProject().getProperty("HeliumCCLogger.file"); + System.out.println("Build finished writing to log file1" + outFilename); + if (outFilename == null) + { + outFilename = "log.xml"; + } + System.out.println("Build finished writing to log file2"); + String xslUri = event.getProject().getProperty("ant.HeliumCCLogger.stylesheet.uri"); + if (xslUri == null) + { + xslUri = "log.xsl"; + } + System.out.println("Build finished writing to log file3"); + Writer out = null; + try + { + // specify output in UTF8 otherwise accented characters will blow + // up everything + System.out.println("Build finished writing to log file3"); + + OutputStream stream = outStream; + if (stream == null) + { + stream = new FileOutputStream(outFilename); + } + out = new OutputStreamWriter(stream, "UTF8"); + System.out.println("Build finished writing to log file4"); + + out.write("\n"); + if (xslUri.length() > 0) + { + out.write("\n\n"); + } + System.out.println("Build finished writing to log file5"); + (new DOMElementWriter()).write(buildElement.element, out, 0, "\t"); + out.flush(); + } + catch (IOException exc) + { + System.out.println("Build finished writing to log file6"); + throw new BuildException("Unable to write log file", exc); + } + finally + { + System.out.println("Build finished writing to log file7"); + + if (out != null) + { + try + { + out.close(); + } + catch (IOException e) + { + // ignore + e = null; + } + } + } + buildElement = null; + } + + /** + * Returns the stack of timed elements for the current thread. + * + * @return the stack of timed elements for the current thread + */ + private Stack getStack() + { + Stack threadStack = (Stack) threadStacks.get(Thread.currentThread()); + if (threadStack == null) + { + threadStack = new Stack(); + threadStacks.put(Thread.currentThread(), threadStack); + } + /* + * For debugging purposes uncomment: org.w3c.dom.Comment s = + * doc.createComment("stack=" + threadStack); + * buildElement.element.appendChild(s); + */ + return threadStack; + } + + /** + * Fired when a target starts building, this pushes a timed element for the + * target onto the stack of elements for the current thread, remembering the + * current time and the name of the target. + * + * @param event + * An event with any relevant extra information. Will not be + * null. + */ + public void targetStarted(BuildEvent event) + { + System.out.println("target started in cruise control HeliumCCLogger"); + Target target = event.getTarget(); + TimedElement targetElement = new TimedElement(); + targetElement.startTime = System.currentTimeMillis(); + targetElement.element = doc.createElement(TARGET_TAG); + targetElement.element.setAttribute(NAME_ATTR, target.getName()); + targets.put(target, targetElement); + getStack().push(targetElement); + } + + /** + * Fired when a target finishes building, this adds the time taken and any + * error stacktrace to the appropriate target element in the log. + * + * @param event + * An event with any relevant extra information. Will not be + * null. + */ + public void targetFinished(BuildEvent event) + { + System.out.println("target finished in cruise control HeliumCCLogger"); + Target target = event.getTarget(); + TimedElement targetElement = (TimedElement) targets.get(target); + if (targetElement != null) + { + long totalTime = System.currentTimeMillis() - targetElement.startTime; + // targetElement.element.setAttribute(TIME_ATTR, + // DefaultLogger.formatTime(totalTime)); + + TimedElement parentElement = null; + Stack threadStack = getStack(); + if (!threadStack.empty()) + { + TimedElement poppedStack = (TimedElement) threadStack.pop(); + if (poppedStack != targetElement) + { + throw new RuntimeException("Mismatch - popped element = " + poppedStack + + " finished target element = " + targetElement); + } + if (!threadStack.empty()) + { + parentElement = (TimedElement) threadStack.peek(); + } + } + if (parentElement == null) + { + buildElement.element.appendChild(targetElement.element); + } + else + { + parentElement.element.appendChild(targetElement.element); + } + } + targets.remove(target); + } + + /** + * Fired when a task starts building, this pushes a timed element for the + * task onto the stack of elements for the current thread, remembering the + * current time and the name of the task. + * + * @param event + * An event with any relevant extra information. Will not be + * null. + */ + public void taskStarted(BuildEvent event) + { + TimedElement taskElement = new TimedElement(); + taskElement.startTime = System.currentTimeMillis(); + taskElement.element = doc.createElement(TASK_TAG); + + Task task = event.getTask(); + String name = event.getTask().getTaskName(); + if (name == null) + { + name = ""; + } + taskElement.element.setAttribute(NAME_ATTR, name); + taskElement.element.setAttribute(LOCATION_ATTR, event.getTask().getLocation().toString()); + tasks.put(task, taskElement); + getStack().push(taskElement); + } + + /** + * Fired when a task finishes building, this adds the time taken and any + * error stacktrace to the appropriate task element in the log. + * + * @param event + * An event with any relevant extra information. Will not be + * null. + */ + public void taskFinished(BuildEvent event) + { + Task task = event.getTask(); + TimedElement taskElement = (TimedElement) tasks.get(task); + if (taskElement != null) + { + long totalTime = System.currentTimeMillis() - taskElement.startTime; + // taskElement.element.setAttribute(TIME_ATTR, + // DefaultLogger.formatTime(totalTime)); + Target target = task.getOwningTarget(); + TimedElement targetElement = null; + if (target != null) + { + targetElement = (TimedElement) targets.get(target); + } + if (targetElement == null) + { + buildElement.element.appendChild(taskElement.element); + } + else + { + targetElement.element.appendChild(taskElement.element); + } + Stack threadStack = getStack(); + if (!threadStack.empty()) + { + TimedElement poppedStack = (TimedElement) threadStack.pop(); + if (poppedStack != taskElement) + { + throw new RuntimeException("Mismatch - popped element = " + poppedStack + + " finished task element = " + taskElement); + } + } + tasks.remove(task); + } + else + { + throw new RuntimeException("Unknown task " + task + " not in " + tasks); + } + } + + /** + * Get the TimedElement associated with a task. + * + * Where the task is not found directly, search for unknown elements which + * may be hiding the real task + */ + private TimedElement getTaskElement(Task task) + { + TimedElement element = (TimedElement) tasks.get(task); + if (element != null) + { + return element; + } + + for (Enumeration e = tasks.keys(); e.hasMoreElements();) + { + Task key = (Task) e.nextElement(); + if (key instanceof UnknownElement) + { + if (((UnknownElement) key).getTask() == task) + { + return (TimedElement) tasks.get(key); + } + } + } + + return null; + } + + /** + * Fired when a message is logged, this adds a message element to the most + * appropriate parent element (task, target or build) and records the + * priority and text of the message. + * + * @param event + * An event with any relevant extra information. Will not be + * null. + */ + public void messageLogged(BuildEvent event) + { + + if (buildElement == null) + { + buildElement = new TimedElement(); + buildElement.startTime = System.currentTimeMillis(); + buildElement.element = doc.createElement(BUILD_TAG); + } + int priority = event.getPriority(); + if (priority > msgOutputLevel) + { + return; + } + Element messageElement = doc.createElement(MESSAGE_TAG); + + String name = "debug"; + switch (event.getPriority()) + { + case MSG_ERR: + name = "error"; + break; + case MSG_WARN: + name = "warn"; + break; + case MSG_INFO: + name = "info"; + break; + default: + name = "debug"; + break; + } + messageElement.setAttribute(PRIORITY_ATTR, name); + + Throwable ex = event.getException(); + if (MSG_DEBUG <= msgOutputLevel && ex != null) + { + Text errText = doc.createCDATASection(StringUtils.getStackTrace(ex)); + Element stacktrace = doc.createElement(STACKTRACE_TAG); + stacktrace.appendChild(errText); + buildElement.element.appendChild(stacktrace); + } + Text messageText = doc.createCDATASection(event.getMessage()); + messageElement.appendChild(messageText); + + TimedElement parentElement = null; + + Task task = event.getTask(); + + Target target = event.getTarget(); + if (task != null) + { + parentElement = getTaskElement(task); + } + if (parentElement == null && target != null) + { + parentElement = (TimedElement) targets.get(target); + } + + /* + * if (parentElement == null) { Stack threadStack = (Stack) + * threadStacks.get(Thread.currentThread()); if (threadStack != null) { + * if (!threadStack.empty()) { parentElement = (TimedElement) + * threadStack.peek(); } } } + */ + + if (parentElement != null) + { + parentElement.element.appendChild(messageElement); + } + else + { + buildElement.element.appendChild(messageElement); + } + } + + // -------------------------------------------------- BuildLogger interface + + /** + * Set the logging level when using this as a Logger + * + * @param level + * the logging level - see + * {@link org.apache.tools.ant.Project#MSG_ERR Project} class for + * level definitions + */ + public void setMessageOutputLevel(int level) + { + msgOutputLevel = level; + } + + /** + * Set the output stream to which logging output is sent when operating as a + * logger. + * + * @param output + * the output PrintStream. + */ + public void setOutputPrintStream(PrintStream output) + { + this.outStream = new PrintStream(output, true); + } + + /** + * Ignore emacs mode, as it has no meaning in XML format + * + * @param emacsMode + * true if logger should produce emacs compatible output + */ + public void setEmacsMode(boolean emacsMode) + { + } + + /** + * Ignore error print stream. All output will be written to either the XML + * log file or the PrintStream provided to setOutputPrintStream + * + * @param err + * the stream we are going to ignore. + */ + public void setErrorPrintStream(PrintStream err) + { + } + +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/dashboard/widgets/HeliumSummary.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/dashboard/widgets/HeliumSummary.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,103 @@ +/* +============================================================================ +Name : HeliumSummary.java +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ + */ +package com.nokia.cruisecontrol.dashboard.widgets; + +import java.io.*; +import java.util.Map; +import net.sourceforge.cruisecontrol.dashboard.widgets.Widget; + +public class HeliumSummary implements Widget +{ + public String getDisplayName() + { + return "Helium summary"; + } + + public Object getOutput(Map parameters) + { + String output = "Error retreiving logs."; + try + { + File projectLogDir = findHeliumLogDir(parameters); + if (projectLogDir.exists()) + { + File log = findCCLog(projectLogDir); + if (log != null) + { + FileReader fr = new FileReader(log); + BufferedReader br = new BufferedReader(fr); + String s; + output = ""; + while ((s = br.readLine()) != null) + { + output += s; + } + fr.close(); + } + else + { + output = "Could not find CC summary."; + } + } + else + { + output = "Could not find " + projectLogDir.getAbsolutePath(); + } + } + catch (Exception e) + { + return e.toString(); + } + return output; + } + + protected File findCCLog(File location) + { + if (location.exists() && location.isDirectory()) + { + File[] list = location.listFiles(); + for (int i = 0; i < list.length; i++) + { + if (list[i].isDirectory()) + { + File result = findCCLog(list[i]); + if (result != null) + return result; + } + else if (list[i].getName().toLowerCase().endsWith("_cc_summary.html")) + { + return list[i]; + } + } + } + return null; + } + + protected File findHeliumLogDir(Map parameters) throws Exception + { + File projectLogDir = (File) parameters.get(Widget.PARAM_BUILD_ARTIFACTS_ROOT); + if (projectLogDir != null) + return projectLogDir; + + throw new Exception("Could not retieve the log directory."); + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/HLMSynergy.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/HLMSynergy.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1300 @@ +/******************************************************************************** + * CruiseControl, a Continuous Integration Toolkit + * Copyright (c) 2001, ThoughtWorks, Inc. + * 200 E. Randolph, 25th Floor + * Chicago, IL 60601 USA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * + Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * + Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ********************************************************************************/ +/* + ============================================================================ + Name : HLMSynergy.java + Part of : Helium + + Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. + + ============================================================================ + */ +package com.nokia.cruisecontrol.sourcecontrol; + +import java.io.File; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Properties; +import org.jdom.*; +import org.jdom.input.SAXBuilder; + +import net.sourceforge.cruisecontrol.CruiseControlException; +import net.sourceforge.cruisecontrol.SourceControl; +import net.sourceforge.cruisecontrol.sourcecontrols.SourceControlProperties; +import net.sourceforge.cruisecontrol.util.ManagedCommandline; +import net.sourceforge.cruisecontrol.util.Util; +import net.sourceforge.cruisecontrol.Modification; +import net.sourceforge.cruisecontrol.util.ValidationHelper; + +import org.apache.log4j.Logger; +import org.apache.log4j.Level; + +/** + * Checks for modifications made to a Telelogic CM Synergy repository. It does + * this by examining a provided reference project, getting the tasks from all + * folders in that project, and checking the completion time of those tasks + * against the last build. + * + * @author Robert J. Smith + */ +public class HLMSynergy implements SourceControl +{ + /** + * A delimiter used for data values returned from a CM Synergy query + */ + public static final String CCM_ATTR_DELIMITER = "@#@#@#@"; + + /** + * A delimiter used to mark the end of a multi-lined result from a query + */ + public static final String CCM_END_OBJECT = "<<<#@#@#>>>"; + + /** + * The default CM Synergy command line client executable + */ + public static final String CCM_EXE = "ccm"; + + /** + * The environment variable used by CM Synergy to determine which backend + * ccmSession to use when issuing commands. + */ + public static final String CCM_SESSION_VAR = "CCM_ADDR"; + + /** + * The default CM Synergy session map file + */ + public static final String CCM_SESSION_FILE = System.getProperty("user.home") + File.separator + + ".ccmsessionmap"; + + /** + * An instance of the logging class + */ + private static final Logger LOG = Logger.getLogger(HLMSynergy.class); + + /** + * Configuration file. + */ + private String filename; + + /** + * detectBaselineUpdate + */ + private boolean detectBaselineUpdate; + /** + * A collection of properties which will be passed to and set within the + * builder. + */ + + private SourceControlProperties properties = new SourceControlProperties(); + + /** + * The name of the property which will be set and passed to the builder if + * any object has changed since the last build. + */ + private String property = "cc.ccm.haschanged"; + + /** + * The version number delimeter used by the database with which this CM + * Synergy session is connected. + */ + private String ccmDelimiter = "-"; + + /** + * The URL for your installation of Change Synergy + */ + private String changeSynergyURL; + + /** + * The CCM database with which we wish to connect + */ + private String ccmDb; + + /** + * The CM Synergy executable used for executing commands. If not set, we + * will use the default value "ccm". + */ + private String ccmExe; + + /** + * The CM Synergy project spec (2 part name). + */ + private String projectSpec; + + /** + * The instance number of the project. This is almost always "1", but might + * need to be overridden if you are using DCM? + */ + private String projectInstance = "1"; + + /** + * The CM Synergy project four part name we will use as a template to + * determine if any new tasks have been completed. + */ + private String projectFourPartName; + + /** + * If set to true, the contents of the folders contained within the + * project's reconfigure properties will be updated before we query to find + * new tasks. + */ + private boolean updateFolders = true; + + /** + * The file which contains the mapping between CM Synergy session names and + * IDs. + */ + private File sessionFile; + + /** + * The name of the CM Synergy session to use. + */ + private String sessionName; + + /** + * The date format as returned by your installation of CM Synergy. + */ + private String ccmDateFormat = "EEE MMM dd HH:mm:ss yyyy"; // Fri Dec 3 + + // 17:51:56 2004 + + /** + * If set to true, the project will be reconfigured when changes are + * detected. + */ + private boolean reconfigure; + + /** + * Used in conjunction with reconfigure. If set to true, all subprojects + * will be reconfigured when changes are detected. + */ + private boolean recurse = true; + + /** + * If set to true, the time a task came into a reconfigure folder is used to + * determine modified tasks instead of the tasks completion time. Works for + * Synergy 6.3SP1 and newer only. + */ + private boolean useBindTime; + + /** + * If set to true, the work area location will not be queried and passed to + * the builder. + */ + private boolean ignoreWorkarea; + + /** + * The locale used for parsing dates. + */ + private Locale locale; + + /** + * The language used to set the locale for parsing CM Synergy dates. + */ + private String language = "en"; + + /** + * A reusable commandline for issuing CM Synergy commands + */ + private ManagedCommandline cmd; + + /** + * The country used to set the locale for parsing CM Synergy dates. + */ + private String country = "US"; + + /** + * The number of modified tasks found + */ + private int numTasks; + + /** + * The number of modified objects found + */ + private int numObjects; + + /** + * The baseline modification cache. + */ + private ModificationCache baselineCache = new ModificationCache(); + + /** + * The constructor. + */ + public HLMSynergy() + { + // Configure the logger to be always in debug mode. + LOG.setLevel(Level.DEBUG); + } + + /** + * Setting the file attribute. + */ + public void setFile(String filename) + { + LOG.debug("Set CCM configuration file: " + filename); + this.filename = filename; + } + + /** + * Setting the file BaseLine Update. + */ + public void setDetectBaselineUpdate(boolean detectBaselineUpdate) + { + this.detectBaselineUpdate = detectBaselineUpdate; + } + + /** + * Sets the name of the CM Synergy executable to use when issuing commands. + * + * @param ccmExe + * the name of the CM Synergy executable + */ + public void setCcmExe(String ccmExe) + { + this.ccmExe = ccmExe; + } + + /** + * Sets the CM Synergy project spec to be used as a template for calculating + * changes. The value set here can be accessed from within the build as the + * property "cc.ccm.project". + * + * @param projectSpec + * The project spec (in 2 part name format). + */ + public void setProject(String projectSpec) + { + this.projectSpec = projectSpec; + } + + /** + * Sets the project's instance value. This value will be used in any query + * which involves the project. Defaults to "1". This default should work for + * most people. You might, however, need to override this value when using + * DCM? + * + * @param projectInstance + * The instance number of the project. + */ + public void setInstance(String projectInstance) + { + this.projectInstance = projectInstance; + } + + /** + * Sets the URL for your installation of Change Synergy. This is used to + * create active links from the modification report to the Change Requests + * associated with the modified tasks. If not set, the links will not be + * created. If you wish to use this feature, you must also set the ccmdb + * attribute to the remote location of the Synergy database. + * + * @param url + * The URL of your ChangeSynergy installation + */ + public void setChangeSynergyURL(String url) + { + this.changeSynergyURL = url; + } + + /** + * Sets the remote Synergy database with which to connect. This is only + * needed if you wish to create active links from the build results page to + * your installation of Change Synergy. If you set this attribute, you must + * also set the changesynergyurl attribute. + * + * @param db + * The remote Synergy database with which to connect (e.g. + * /ccmdb/mydb). + */ + public void setCcmDb(String db) + { + this.ccmDb = db; + } + + /** + * Sets the value of the updateFolders attribute. If set to true, the + * contents of the folders contained within the project's reconfigure + * properties will be updated before we query to find new tasks. + */ + public void setUpdateFolders(boolean updateFolders) + { + this.updateFolders = updateFolders; + } + + /** + * Sets the file which contains the mapping between CM Synergy session names + * and IDs. This file should be in the standard properties file format. Each + * line should map one name to a CM Synergy session ID (as returned by the + * "ccm status" command). + *

    + * example:
    + *
    + * session1=localhost:65024:192.168.1.17 + * + * @param sessionFile + * The session file + */ + public void setSessionFile(String sessionFile) + { + this.sessionFile = new File(sessionFile); + } + + /** + * Sets the name of the CM Synergy session to use with this plugin. This + * name should appear in the specified session file. + * + * @param sessionName + * The session name + * + * @see #setSessionFile(String) + */ + public void setSessionName(String sessionName) + { + this.sessionName = sessionName; + } + + /** + * Sets the date format used by your installation of CM Synergy. The format + * string should use the syntax described in SimpleDateFormat. + * The default is "EEE MMM dd HH:mm:ss yyyy" The value set here can be + * accessed from within the build as the property "cc.ccm.dateformat". + * + * @param format + * the date format + */ + public void setCcmDateFormat(String format) + { + this.ccmDateFormat = format; + } + + /** + * Sets the value of the reconfigure attribute. If set to true, the project + * will be reconfigured when changes are detected. Default value is false. + */ + public void setReconfigure(boolean reconfigure) + { + this.reconfigure = reconfigure; + } + + /** + * Sets the value of the useBindtime attribute. If set to true, the time the + * task came into the reconfigure folders is used to query the modifications + * instead of the time the task was completed. Works for Synergy 6.3SP1 and + * newer only. Default value is false. + */ + public void setUseBindTime(boolean useBindTime) + { + this.useBindTime = useBindTime; + } + + /** + * Sets the value of the recurse attribute. Used in conjuction with the + * reconfigure attribute. If set to true, all subprojects will also be + * reconfigured when changes are detected. Default is true. + */ + public void setRecurse(boolean recurse) + { + this.recurse = recurse; + } + + /** + * Sets the value of the ignoreWorkarea attribute. If set to true, we will + * not attempt to determine the location of the project's workarea, nor will + * we pass the cc.ccm.workarea attribute to the builders. Default is false. + */ + public void setIgnoreWorkarea(boolean ignoreWorkarea) + { + this.ignoreWorkarea = ignoreWorkarea; + } + + /** + * Sets the language used to create the locale for parsing CM Synergy dates. + * The format should follow the ISO standard as specified by + * java.util.Locale. The default is "en" (English). + * + * @param language + * The language to use when creating the Locale + */ + public void setLanguage(String language) + { + this.language = language; + } + + /** + * Sets the country used to create the locale for parsing CM Synergy dates. + * The format should follow the ISO standard as specified by + * java.util.Locale. The default is "US" (United States). + * + * @param country + * The ISO country code to use + */ + public void setCountry(String country) + { + this.country = country; + } + + public Map getProperties() + { + return properties.getPropertiesAndReset(); + } + + public void setProperty(String property) + { + this.property = property; + } + + public void validate() throws CruiseControlException + { + // ValidationHelper.assertIsSet(projectSpec, "project", + // this.getClass()); + ValidationHelper.assertIsSet(filename, "file", this.getClass()); + } + + public List getModifications(Date lastBuild, Date now) + { + baselineCache.cleanup(lastBuild); + // Create a Locale appropriate for this installation + try + { + LOG.info("Parsing " + filename); + SAXBuilder saxBuilder = new SAXBuilder("org.apache.xerces.parsers.SAXParser"); + org.jdom.Document jdomDocument = saxBuilder.build(new File(filename)); + Element root = jdomDocument.getRootElement(); + List projects = root.getChildren("project"); + List mresult = new ArrayList(); + String action; + String name; + String database; + for (int i = 0; i < projects.size(); i++) + { + Element project = (Element) projects.get(i); + action = project.getAttribute("action").getValue(); + name = project.getAttribute("name").getValue(); + database = project.getAttribute("database").getValue(); + if (action != null && name != null && database != null) + { + if (action.equals("to_be_checkout")) + { + LOG.info("Creating a HLM modification"); + Modification m = new Modification(); + m.type = "to_be_checkout"; + m.userName = "user"; + m.modifiedTime = new Date(lastBuild.getTime() + 100); + mresult.add(m); + properties.put(property, "true"); + /* + * Currently one notification, but in general it should + * be the list of projects checked out to be added and + * only those project needs to be checked out. + */ + return mresult; + } + else + { + LOG.info("Creating a CC modification"); + projectFourPartName = name; + sessionName = database; + ccmDb = database; + locale = new Locale(language, country); + + if (!locale.equals(Locale.US)) + { + LOG.info("Locale has been set to " + locale.toString()); + } + + // Attempt to get the database delimiter + cmd = createCcmCommand(ccmExe, sessionName, sessionFile); + cmd.createArgument("delimiter"); + try + { + cmd.execute(); + cmd.assertExitCode(0); + this.ccmDelimiter = cmd.getStdoutAsString().trim(); + } + catch (Exception e1) + { + StringBuffer buff = new StringBuffer( + "Could not connect to provided CM Synergy session"); + LOG.error(buff.toString(), e1); + return null; + } + + LOG.info("Checking for modifications between " + lastBuild.toString() + + " and " + now.toString()); + + // If we were asked to update the folders, do so + if (updateFolders) + { + SynergyBaselineProjects q = new SynergyBaselineProjects(cmd, + projectFourPartName); + List before = null; + if (detectBaselineUpdate) { + before = q.getBaselineProjects(); + } + refreshReconfigureProperties(); + if (detectBaselineUpdate) { + LOG.info("Checking for new baselines between " + lastBuild.toString() + + " and " + now.toString()); + List after = q.getBaselineProjects(); + mresult.addAll(getBaselineModifications(lastBuild, now, before, after)); + } + } + + // Create a list of modifications based upon tasks + // completed + // since the last build. + numObjects = 0; + numTasks = 0; + List taskList = getModifiedTasks(lastBuild); + if (taskList != null && !taskList.isEmpty()) + { + mresult.addAll(taskList); + } + + LOG.info("Found " + numObjects + " modified object(s) in " + numTasks + + " new task(s)."); + + // If we were asked to reconfigure the project, do so + if (reconfigure && (numObjects > 0)) + { + reconfigureProject(); + } + + // Pass to the build any relevent properties + properties.put("cc.ccm.project", projectFourPartName); + properties.put("cc.ccm.dateformat", ccmDateFormat); + String sessionID = cmd.getVariable(CCM_SESSION_VAR); + if (sessionID != null) + { + properties.put("cc.ccm.session", sessionID); + } + if (numObjects > 0) + { + properties.put(property, "true"); + } + if (!ignoreWorkarea) + { + properties.put("cc.ccm.workarea", getWorkarea()); + } + } + } + } + return mresult; + } + catch (Exception e) + { + LOG.info("Exception in modificationset" + e.getMessage()); + e.printStackTrace(); + return null; + } + } + + /** + * Return the list of baseline modifications + * @param lastBuild + * @param now + * @param before + * @param after + * @return a List of Modification objects + */ + protected List getBaselineModifications(Date lastBuild, Date now, List before, List after) { + for (String aname : after) + { + LOG.debug(aname + " in before?"); + if (!before.contains(aname)) + { + LOG.info("Baseline added: " + aname); + Modification m = new Modification("baseline"); + Modification.ModifiedFile f = m.createModifiedFile(aname, ""); + f.action = "added"; + m.userName = "user"; + m.comment = "Added baseline: " + aname; + m.modifiedTime = new Date(lastBuild.getTime() + 100); + baselineCache.add(m); + } + } + for (String bname : before) + { + LOG.debug(bname + " in after?"); + if (!after.contains(bname)) + { + LOG.info("Baseline removed: " + bname); + Modification m = new Modification("baseline"); + Modification.ModifiedFile f = m.createModifiedFile(bname, ""); + f.action = "deleted"; + m.type = "baseline_removal"; + m.userName = "user"; + m.comment = "Removed baseline: " + bname; + m.modifiedTime = new Date(lastBuild.getTime() + 100); + baselineCache.add(m); + } + } + return baselineCache.getModifications(lastBuild, now); + } + + /** + * Update the folders within the given project's reconfigure properties. + */ + private void refreshReconfigureProperties() + { + LOG.info("Refreshing reconfigure properties for project " + projectFourPartName + "."); + + // Construct the CM Synergy command + cmd.clearArgs(); + cmd.createArgument("reconfigure_properties"); + if (recurse) + { + cmd.createArgument("-recurse"); + } + cmd.createArguments("-refresh", projectFourPartName); + try + { + cmd.execute(); + cmd.assertExitCode(0); + } + catch (Exception e) + { + String message = "Could not refresh reconfigure properties for project \"" + + projectFourPartName + "\"."; + LOG.error(message, e); + throw new OperationFailedException(message, e); + } + } + + /** + * Get a list of all tasks which are contained in all folders in the + * reconfigure properties of the specified project and were completed after + * the last build. If useBindTime is true not the completion + * time of the task is considered but the time the task came into the + * folder. + * + * @return A list of HLMSynergyModifications which represent + * the new tasks + */ + private List getModifiedTasks(Date lastBuild) + { + + // The format used for converting Java dates into CM Synergy dates + // Note that the format used to submit commands differs from the + // format used in the results of that command!?! + SimpleDateFormat toCcmDate = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", locale); + boolean isBaselineBasedProject = false; + + // Determine if the project has a System Testing purpose + cmd.clearArgs(); + cmd.createArgument("prop"); + cmd.createArgument("-p"); + cmd.createArgument(projectFourPartName); + cmd.createArgument("-f"); + cmd.createArgument("%purpose"); + try + { + cmd.execute(); + } + catch (Exception e) + { + String message = "Could not query for new tasks."; + LOG.error(message, e); + throw new OperationFailedException(message, e); + } + + // Determine if the project is either of a System Testing or + // Insulated Development purpose. If it is, set the appropriate flag + if (cmd.getStdoutAsString().startsWith("System Testing")) + { + isBaselineBasedProject = true; + } + else if (cmd.getStdoutAsString().startsWith("Insulated Development")) + { + isBaselineBasedProject = true; + } + + // get the release of the project + String release = getProjectRelease(projectFourPartName); + String latestBaseline = getLatestBaseline(release); + + // Construct the CM Synergy command + cmd.clearArgs(); + cmd.createArgument("query"); + cmd.createArgument("-u"); + + // Set up the output format + cmd.createArgument("-f"); + cmd.createArgument("%displayname" + CCM_ATTR_DELIMITER + // 0 + "%release" + CCM_ATTR_DELIMITER + // 1 + "%owner" + CCM_ATTR_DELIMITER + // 2 + "%completion_date" + CCM_ATTR_DELIMITER + // 3 + "%task_synopsis" + CCM_END_OBJECT); // 4 + + // Construct the query string + if (useBindTime & (!isBaselineBasedProject)) + { + cmd.createArgument("is_task_in_folder_of(is_folder_in_rp_of('" + projectFourPartName + + "'), '>', time('" + toCcmDate.format(lastBuild) + "'))"); + } + else if (!isBaselineBasedProject) + { + cmd.createArgument("is_task_in_folder_of(is_folder_in_rp_of('" + projectFourPartName + + "')) and (completion_date>time('" + toCcmDate.format(lastBuild) + "')" + + " or dcm_receive_time>time('" + toCcmDate.format(lastBuild) + "'))"); + } + else if (useBindTime & isBaselineBasedProject) + { + cmd.createArgument("is_task_in_baseline_of('" + latestBaseline + "'), '>', time('" + + toCcmDate.format(lastBuild) + + "') or is_task_in_folder_of(is_folder_in_rp_of('" + projectFourPartName + + "'), '>', time('" + toCcmDate.format(lastBuild) + "'))"); + } + else + { + cmd.createArgument("(is_task_in_baseline_of('" + latestBaseline + + "') and (completion_date>time('" + toCcmDate.format(lastBuild) + + "') or dcm_receive_time>time('" + toCcmDate.format(lastBuild) + "'))) or " + + "(is_task_in_folder_of(is_folder_in_rp_of('" + projectFourPartName + + "')) and ((completion_date>time('" + toCcmDate.format(lastBuild) + + "')) or (dcm_receive_time>time('" + toCcmDate.format(lastBuild) + "'))))"); + } + + // Execute the command + try + { + cmd.execute(); + } + catch (Exception e) + { + String message = "Could not query for new tasks."; + LOG.error(message, e); + throw new OperationFailedException(message, e); + } + + // create a modification list with discovered tasks + List modificationList = new ArrayList(); + Iterator tasks = format(cmd.getStdoutAsList()).iterator(); + while (tasks.hasNext()) + { + numTasks++; + String[] attributes = tokeniseEntry((String) tasks.next(), 5); + if (attributes == null) + { + LOG.warn("Could not determine attributes for at least one " + + "discovered task! The modification set is suspect."); + continue; + } + HLMSynergyModification mod = new HLMSynergyModification(); + mod.setTaskNumber(attributes[0]); + mod.revision = attributes[1]; + mod.userName = attributes[2]; + mod.modifiedTime = getDateFromSynergy(attributes[3]); + mod.comment = attributes[4]; + + // Populate the included files by quering for objects in the task + getModifiedObjects(mod); + + // Find any Change Requests with which the task is associated + getAssociatedCRs(mod); + + // Add the modification to the list + modificationList.add(mod); + } + + return modificationList; + } + + /** + * Get the latest baseline name for a given release value + * + * @param release + * The release value for which to find the latest baseline + * @return The name of the latest Synergy baseline for the supplied release + * value + */ + + private String getLatestBaseline(String release) + { + String baseline = new String(); + String nextBaseline = new String(); + // The format used for converting Java dates into CM Synergy dates + // Note that the format used to submit commands differs from the + // format used in the results of that command!?! + SimpleDateFormat toCcmDate = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", locale); + + // Construct the CM Synergy command + cmd.clearArgs(); + cmd.createArgument("query"); + cmd.createArgument("-u"); + cmd.createArgument("-ns"); + + // Set up the output format + cmd.createArgument("-f"); + cmd.createArgument("%objectname"); + + // Construct the query string + cmd.createArgument("status='published_baseline' and release='" + release + "'"); + + // Execute the command + try + { + cmd.execute(); + } + catch (Exception e) + { + String message = "Could not query for latest baseline"; + LOG.error(message, e); + throw new OperationFailedException(message, e); + } + String baselineString = cmd.getStdoutAsString(); + String[] baselineList = baselineString.split("\r\n|\r|\n"); + return baselineList[baselineList.length - 1].trim(); + } + + /** + * Get the Synergy Release value for a given project + * + * @param projectFourPartName + * The project whose release you wish to obtain + * @return The release value for the given project + */ + + private String getProjectRelease(String projectFourPartName) + { + + cmd.clearArgs(); + cmd.createArgument("prop"); + cmd.createArgument("-p"); + cmd.createArgument(projectFourPartName); + cmd.createArgument("-f"); + cmd.createArgument("%release"); + try + { + cmd.execute(); + } + catch (Exception e) + { + String message = "Could not get project release"; + LOG.error(message, e); + throw new OperationFailedException(message, e); + } + String[] release = cmd.getStdoutAsString().split("\r\n|\r|\n"); + return release[0].trim(); + } + + /** + * Split the results of a CM Synergy query into individual tokens. This + * method was added for compatibility with the 1.3 JRE. + * + * @param line + * The line to be tokenised. + * @param maxTokens + * The maximum number of tokens in the line + * + * @return The tokens found + */ + private String[] tokeniseEntry(String line, int maxTokens) + { + int minTokens = maxTokens - 1; // comment may be absent. + String[] tokens = new String[maxTokens]; + Arrays.fill(tokens, ""); + int tokenIndex = 0; + for (int oldIndex = 0, index = line.indexOf(CCM_ATTR_DELIMITER, 0); true; oldIndex = index + + CCM_ATTR_DELIMITER.length(), index = line.indexOf(CCM_ATTR_DELIMITER, oldIndex), tokenIndex++) + { + if (tokenIndex > maxTokens) + { + LOG.debug("Too many tokens; skipping entry"); + return null; + } + if (index == -1) + { + tokens[tokenIndex] = line.substring(oldIndex); + break; + } + + tokens[tokenIndex] = line.substring(oldIndex, index); + } + if (tokenIndex < minTokens) + { + LOG.debug("Not enough tokens; skipping entry"); + return null; + } + return tokens; + } + + /** + * Populate the object list of a Modification by querying for objects + * associated with the task. + */ + private void getModifiedObjects(HLMSynergyModification mod) + { + // Construct the CM Synergy command + cmd.clearArgs(); + cmd.createArgument("task"); + cmd.createArguments("-show", "objects"); + + // Set up the output format + cmd.createArgument("-f"); + cmd.createArgument("%name" + CCM_ATTR_DELIMITER + // 0 + "%version" + CCM_ATTR_DELIMITER + // 1 + "%type" + CCM_ATTR_DELIMITER + // 2 + "%instance" + CCM_ATTR_DELIMITER + // 3 + "%project" + CCM_ATTR_DELIMITER + // 4 + "%comment" + CCM_END_OBJECT); // 5 + + // Construct the query string + cmd.createArgument(mod.getTaskNumber()); + + // Execute the command + try + { + cmd.execute(); + } + catch (Exception e) + { + LOG.warn("Could not query for objects in task \"" + mod.getTaskNumber() + + "\". The modification list will be incomplete!", e); + } + + // Populate the modification with the object data from the task + Iterator objects = format(cmd.getStdoutAsList()).iterator(); + while (objects.hasNext()) + { + numObjects++; + String object = (String) objects.next(); + String[] attributes = tokeniseEntry(object, 6); + if (attributes == null) + { + LOG.warn("Could not determine attributes for object associated " + "with task \"" + + mod.revision + "\"."); + continue; + } + // Add each object to the HLMSynergyModification + mod.createModifiedObject(attributes[0], attributes[1], attributes[2], attributes[3], + attributes[4], attributes[5]); + } + } + + /** + * Queries the CM Synergy repository to find any Change Requests with which + * a task is associated. If the Change Synergy URL and database were + * provided, we will add HTML based links to those CRs. + * + * @param mod + * The modification object + */ + private void getAssociatedCRs(HLMSynergyModification mod) + { + // Construct the CM Synergy command + cmd.clearArgs(); + cmd.createArgument("query"); + cmd.createArgument("-u"); + + // Set up the output format + cmd.createArguments("-f", "%displayname"); + + // Construct the query string + cmd.createArgument("cvtype='problem' and has_associated_task('task" + mod.getTaskNumber() + + ccmDelimiter + "1:task:probtrac')"); + + // Execute the command + try + { + cmd.execute(); + } + catch (Exception e) + { + LOG.warn("Could not query for associated CRs. The modification list " + + "may be incomplete!", e); + } + + // Add the Change Request(s) to the modification + List crList = cmd.getStdoutAsList(); + if (crList != null) + { + Iterator crs = crList.iterator(); + while (crs.hasNext()) + { + String crNum = ((String) crs.next()).trim(); + HLMSynergyModification.ChangeRequest cr = mod.createChangeRequest(crNum); + if (changeSynergyURL != null && ccmDb != null) + { + StringBuffer href = new StringBuffer(changeSynergyURL); + href.append("/servlet/com.continuus.webpt.servlet.PTweb?"); + href + .append("ACTION_FLAG=frameset_form&TEMPLATE_FLAG=ProblemReportView&database="); + href.append(ccmDb); + href.append("&role=User&problem_number="); + href.append(crNum); + cr.setHref(href.toString()); + } + } + } + } + + /** + * Determine the work area location for the specified project. + * + * @return The work area location + */ + private String getWorkarea() + { + String defaultWorkarea = "."; + + // Get the literal workarea from Synergy + cmd.clearArgs(); + cmd.createArgument("attribute"); + cmd.createArguments("-show", "wa_path"); + cmd.createArguments("-project", projectFourPartName); + + try + { + cmd.execute(); + cmd.assertExitCode(0); + } + catch (Exception e) + { + LOG.warn("Could not determine the workarea location for project \"" + + projectFourPartName + "\".", e); + return defaultWorkarea; + } + + // The command will return the literal work area, but what we are + // really interested in is the top level directory within that work + // area. + File workareaPath = new File(cmd.getStdoutAsString().trim()); + if (!workareaPath.isDirectory()) + { + LOG + .warn("The workarea reported by Synergy does not exist or is not accessible by this session - \"" + + workareaPath.toString() + "\"."); + return defaultWorkarea; + } + String[] dirs = workareaPath.list(); + if (dirs.length != 1) + { + LOG.warn("The workarea reported by Synergy is invalid - \"" + workareaPath.toString() + + "\"."); + return defaultWorkarea; + } + + // Found it! + return workareaPath.getAbsolutePath() + File.separator + dirs[0]; + } + + /** + * Reconfigure the project + */ + private void reconfigureProject() + { + LOG.debug("Reconfiguring project " + projectFourPartName + "."); + + // Construct the CM Synergy command + cmd.clearArgs(); + cmd.createArgument("reconfigure"); + if (recurse) + { + cmd.createArgument("-recurse"); + } + cmd.createArguments("-project", projectFourPartName); + + try + { + cmd.execute(); + cmd.assertExitCode(0); + } + catch (Exception e) + { + String message = "Could not reconfigure project \"" + projectFourPartName + "\"."; + LOG.error(message, e); + throw new OperationFailedException(message, e); + } + } + + /** + * Format the output of a CM Synergy query by removing newlines introduced + * by comments. + * + * @param in + * The List to be formated + * @return The formated List + */ + private List format(List in) + { + // Concatenate output lines until we hit the end of object delimiter. + List out = new ArrayList(); + Iterator it = in.iterator(); + StringBuffer buff = new StringBuffer(); + while (it.hasNext()) + { + buff.append((String) it.next()); + int index = buff.toString().lastIndexOf(CCM_END_OBJECT); + if (index > -1) + { + buff.delete(index, buff.length()); + out.add(buff.toString()); + buff = new StringBuffer(); + } + } + return out; + } + + /** + * Parse a CM Synergy date string into a Java Date. If the + * string cannot be parsed, a warning is written to the log, and the current + * date is returned. + * + * @param dateString + * the date string to parse + * @return The date + * + * @see #setCcmDateFormat(String) + */ + private Date getDateFromSynergy(String dateString) + { + SimpleDateFormat fromCcmDate = new SimpleDateFormat(ccmDateFormat, locale); + Date date; + try + { + date = fromCcmDate.parse(dateString); + } + catch (ParseException e) + { + LOG.warn("Could not parse CM Synergy date \"" + dateString + + "\" into Java Date using format \"" + ccmDateFormat + "\".", e); + date = new Date(); + } + return date; + } + + /** + * Given a CM Synergy session name, looks up the corresponding session ID. + * + * @param sessionName + * The CM Synergy session name + * @param sessionFile + * The session map file + * @return The session ID. + */ + public static String getSessionID(String sessionName, File sessionFile) + throws CruiseControlException + { + + // If no session file was provided, try to use the default + if (sessionFile == null) + { + sessionFile = new File(CCM_SESSION_FILE); + } + + // Load the persisted session information from file + Properties sessionProperties; + try + { + sessionProperties = Util.loadPropertiesFromFile(sessionFile); + } + catch (IOException e) + { + throw new CruiseControlException(e); + } + + // Look up and return the full session ID + return sessionProperties.getProperty(sessionName); + } + + /** + * Creates a ManagedCommandline configured to run CM Synergy + * commands. + * + * @param ccmExe + * Full path of the CM Synergy command line client (or + * null to use the default). + * @param sessionName + * The name of the session as stored in the map file (or + * null to use the default session). + * @param sessionFile + * The CM Synergy session map file (or null to use + * the default). + * @return A configured ManagedCommandline + */ + public static ManagedCommandline createCcmCommand(String ccmExe, String sessionName, + File sessionFile) + { + + // If no executable name was provided, use the default + if (ccmExe == null) + { + ccmExe = CCM_EXE; + } + + // Attempt to get the appropriate CM Synergy session + String sessionID = null; + if (sessionName != null) + { + try + { + sessionID = getSessionID(sessionName, sessionFile); + if (sessionID == null) + { + LOG.error("Could not find a session ID for CM Synergy session named \"" + + sessionName + "\". Attempting to use the default (current) session."); + } + } + catch (CruiseControlException e) + { + LOG.error("Failed to look up CM Synergy session named \"" + sessionName + + "\". Attempting to use the default (current) session.", e); + } + } + + // Create a managed command line + ManagedCommandline command = new ManagedCommandline(ccmExe); + + // If we were able to find a CM Synergy session ID, use it + if (sessionID != null) + { + command.setVariable(CCM_SESSION_VAR, sessionID); + } + + return command; + } + +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/HLMSynergyModification.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/HLMSynergyModification.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,614 @@ +/******************************************************************************** + * CruiseControl, a Continuous Integration Toolkit + * Copyright (c) 2001, ThoughtWorks, Inc. + * 200 E. Randolph, 25th Floor + * Chicago, IL 60601 USA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * + Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * + Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ********************************************************************************/ +/* +============================================================================ +Name : HLMSynergyModification.java +Part of : Helium + +Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. + +============================================================================ + */ +package com.nokia.cruisecontrol.sourcecontrol; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.List; + +import org.apache.log4j.Logger; +import org.jdom.CDATA; +import org.jdom.Element; +import org.jdom.output.XMLOutputter; + +import net.sourceforge.cruisecontrol.Modification; + +/** + * Data structure which holds data specific to a single modification within a CM + * Synergy repository. + * + * @author Robert J. Smith + */ +public class HLMSynergyModification extends Modification +{ + + private static final Logger LOG = Logger.getLogger(HLMSynergyModification.class); + + private static final String MODIFICATION_TYPE = "ccmtask"; + + private static final String TAGNAME_MODIFICATION = "modification"; + + private static final String TAGNAME_OBJECT = "ccmobject"; + + private static final String TAGNAME_CHANGEREQUEST = "ccmcr"; + + private static final String TAGNAME_NAME = "name"; + + private static final String TAGNAME_TASKNUMBER = "task"; + + private static final String TAGNAME_VERSION = "version"; + + private static final String TAGNAME_TYPE = "type"; + + private static final String TAGNAME_INSTANCE = "instance"; + + private static final String TAGNAME_PROJECT = "project"; + + private static final String TAGNAME_COMMENT = "comment"; + + private static final String TAGNAME_DATE = "date"; + + private static final String TAGNAME_USER = "user"; + + private static final String TAGNAME_EMAIL = "email"; + + private static final String TAGNAME_REVISION = "revision"; + + private static final String TAGNAME_HTML_LINK = "a"; + + private static final String TAGNAME_HTML_LINK_HREF = "href"; + + private static final String TAGNAME_HTML_INS = "ins"; + + /** + * The CM Synergy task number represented by this modification + */ + private String taskNumber; + + /** + * A list of change requests associated with this modification + */ + private List changeRequests = new ArrayList(); + + /** + * Creates a new CMSynergyModification object and sets it's + * modification type to "ccmtask". + */ + public HLMSynergyModification() + { + super(MODIFICATION_TYPE); + } + + public String getTaskNumber() + { + return taskNumber; + } + + public void setTaskNumber(String taskNumber) + { + this.taskNumber = taskNumber; + } + + public List getChangeRequests() + { + return changeRequests; + } + + public void setChangeRequests(List changeRequests) + { + this.changeRequests = changeRequests; + } + + /** + * Creates a new ModifiedObject, and adds it to the list of CM + * Synergy objects associated with the task. + * + * @return A new ModifiedObject + */ + public final ModifiedObject createModifiedObject() + { + ModifiedObject obj = new ModifiedObject(); + files.add(obj); + return obj; + } + + /** + * Creates a new ModifiedObject, populates the fields, and adds + * it to the list of CM Synergy objects associated with the task. + * + * @param name + * The object's name + * @param version + * The object's version + * @param type + * The object's type within CM Synergy + * @param instance + * The object's instance + * @param project + * The project with which the object is associated + * @param comment + * The comment provided when checking in the object + * + * @return A new ModifiedObject + */ + public final ModifiedObject createModifiedObject(String name, String version, String type, + String instance, String project, String comment) + { + ModifiedObject obj = createModifiedObject(); + obj.name = name; + obj.version = version; + obj.type = type; + obj.instance = instance; + obj.project = project; + obj.comment = comment; + return obj; + } + + /** + * Creates a new ChangeRequest, and adds it to the list of + * change requests associated with the task. + * + * @param number + * The CR number + * + * @return A new ChangeRequest + */ + public final ChangeRequest createChangeRequest(String number) + { + ChangeRequest cr = new ChangeRequest(); + cr.number = number; + changeRequests.add(cr); + return cr; + } + + /* + * (non-Javadoc) + * + * @see + * net.sourceforge.cruisecontrol.Modification#toElement(java.text.DateFormat + * ) + */ + public Element toElement(final DateFormat formatter) + { + Element modificationElement = new Element(TAGNAME_MODIFICATION); + modificationElement.setAttribute(TAGNAME_TYPE, type); + + if (modifiedTime != null) + { + Element dateElement = new Element(TAGNAME_DATE); + dateElement.addContent(formatter.format(modifiedTime)); + modificationElement.addContent(dateElement); + } + + if (userName != null) + { + Element userElement = new Element(TAGNAME_USER); + userElement.addContent(userName); + modificationElement.addContent(userElement); + } + + if (comment != null) + { + Element commentElement = new Element(TAGNAME_COMMENT); + CDATA cd; + try + { + cd = new CDATA(comment); + } + catch (org.jdom.IllegalDataException e) + { + LOG.error(e); + cd = new CDATA("Unable to parse comment. It contains illegal data."); + } + commentElement.addContent(cd); + modificationElement.addContent(commentElement); + } + + if (taskNumber != null) + { + Element taskNumberElement = new Element(TAGNAME_TASKNUMBER); + taskNumberElement.addContent(taskNumber); + modificationElement.addContent(taskNumberElement); + } + + if (revision != null) + { + Element revisionElement = new Element(TAGNAME_REVISION); + revisionElement.addContent(revision); + modificationElement.addContent(revisionElement); + } + + if (emailAddress != null) + { + Element emailAddressElement = new Element(TAGNAME_EMAIL); + emailAddressElement.addContent(emailAddress); + modificationElement.addContent(emailAddressElement); + } + + for (final ModifiedFile file : files) + { + final ModifiedObject obj = (ModifiedObject) file; + modificationElement.addContent(obj.toElement()); + } + + for (final ChangeRequest cr : changeRequests) + { + modificationElement.addContent(cr.toElement()); + } + + return modificationElement; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + public String toString() + { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + StringBuffer sb = new StringBuffer(); + + sb.append("Task Number: ").append(taskNumber).append('\n'); + sb.append("Owner: ").append(userName).append('\n'); + sb.append("Release: ").append(revision).append('\n'); + sb.append("Completion Date: ").append(formatter.format(modifiedTime)).append('\n'); + sb.append("Synopsis: ").append(comment).append('\n'); + + for (final ChangeRequest cr : changeRequests) + { + sb.append("\tChange Request: ").append(cr.number).append('\n'); + } + + for (final ModifiedFile file : files) + { + ModifiedObject obj = (ModifiedObject) file; + sb.append("\tAssociated Object: ").append(obj.name).append('\n'); + sb.append("\tVersion: ").append(obj.version).append('\n'); + sb.append("\tType: ").append(obj.type).append('\n'); + sb.append("\tInstance: ").append(obj.instance).append('\n'); + sb.append("\tProject: ").append(obj.project).append('\n'); + sb.append("\tComment: ").append(obj.comment).append('\n'); + } + + sb.append('\n'); + return sb.toString(); + } + + /* + * (non-Javadoc) + * + * @see net.sourceforge.cruisecontrol.Modification#log(java.text.DateFormat) + */ + public void log(final DateFormat formatter) + { + if (LOG.isDebugEnabled()) + { + LOG.debug("Task Number: " + taskNumber); + LOG.debug("Owner: " + userName); + LOG.debug("Release: " + revision); + LOG.debug("Completion Date: " + formatter.format(modifiedTime)); + LOG.debug("Synopsis: " + comment); + + for (final ChangeRequest cr : changeRequests) + { + LOG.debug("\tChange Request: " + cr.number + "\n"); + } + + for (final ModifiedFile file : files) + { + final ModifiedObject obj = (ModifiedObject) file; + LOG.debug("\tAssociated Object: " + obj.name); + LOG.debug("\tVersion: " + obj.version); + LOG.debug("\tType: " + obj.type); + LOG.debug("\tInstance: " + obj.instance); + LOG.debug("\tProject: " + obj.project); + LOG.debug("\tComment: " + obj.comment); + } + + LOG.debug(""); + } + } + + /* + * (non-Javadoc) + * + * @see + * net.sourceforge.cruisecontrol.Modification#fromElement(org.jdom.Element, + * java.text.DateFormat) + */ + public void fromElement(final Element modification, final DateFormat formatter) + { + + type = modification.getAttributeValue(TAGNAME_TYPE); + + try + { + String s = modification.getChildText(TAGNAME_DATE); + if (s == null) + { + XMLOutputter outputter = new XMLOutputter(); + LOG.info("XML: " + outputter.outputString(modification)); + } + modifiedTime = formatter.parse(s); + } + catch (ParseException e) + { + modifiedTime = new Date(); + } + + taskNumber = modification.getChildText(TAGNAME_TASKNUMBER); + revision = modification.getChildText(TAGNAME_REVISION); + userName = modification.getChildText(TAGNAME_USER); + comment = modification.getChildText(TAGNAME_COMMENT); + emailAddress = modification.getChildText(TAGNAME_EMAIL); + + files.clear(); + List modfiles = modification.getChildren(TAGNAME_OBJECT); + if (modfiles != null) + { + Iterator it = modfiles.iterator(); + while (it.hasNext()) + { + Element modfileElement = (Element) it.next(); + ModifiedObject modfile = new ModifiedObject(); + modfile.fromElement(modfileElement); + files.add(modfile); + } + } + + changeRequests.clear(); + List crs = modification.getChildren(TAGNAME_CHANGEREQUEST); + if (crs != null) + { + Iterator it = crs.iterator(); + while (it.hasNext()) + { + Element crElement = (Element) it.next(); + ChangeRequest cr = new ChangeRequest(); + cr.fromElement(crElement); + changeRequests.add(cr); + } + } + } + + /** + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object o) + { + if (o == null || !(o instanceof HLMSynergyModification)) + { + return false; + } + HLMSynergyModification mod = (HLMSynergyModification) o; + return type.equals(mod.type) && taskNumber.equals(mod.taskNumber); + } + + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + ((type == null) ? 0 : type.hashCode()) + + ((taskNumber == null) ? 0 : taskNumber.hashCode()); + return result; + } + + /** + * Data structure which holds data specific to a single object included in a + * modification within a CM Synergy repository. + * + * @author Robert J. Smith + */ + public class ModifiedObject extends Modification.ModifiedFile + { + + // Let's not deal with possible null values + private String name = ""; + + private String version = ""; + + private String type = ""; + + private String instance = ""; + + private String project = ""; + + private String comment = ""; + + // Only the parent class should call the constructor + protected ModifiedObject() + { + super(null, null, null, null); + } + + /* + * (non-Javadoc) + * + * @see + * net.sourceforge.cruisecontrol.Modification#fromElement(org.jdom.Element + * , java.text.DateFormat) + */ + public Element toElement() + { + Element element = new Element(TAGNAME_OBJECT); + + Element nameElement = new Element(TAGNAME_NAME); + nameElement.addContent(name); + element.addContent(nameElement); + + Element versionElement = new Element(TAGNAME_VERSION); + versionElement.addContent(version); + element.addContent(versionElement); + + Element typeElement = new Element(TAGNAME_TYPE); + typeElement.addContent(type); + element.addContent(typeElement); + + Element instanceElement = new Element(TAGNAME_INSTANCE); + instanceElement.addContent(instance); + element.addContent(instanceElement); + + Element projectElement = new Element(TAGNAME_PROJECT); + projectElement.addContent(project); + element.addContent(projectElement); + + Element commentElement = new Element(TAGNAME_COMMENT); + CDATA cd; + try + { + cd = new CDATA(comment); + } + catch (org.jdom.IllegalDataException e) + { + LOG.error(e); + cd = new CDATA("Unable to parse comment. It contains illegal data."); + } + commentElement.addContent(cd); + element.addContent(commentElement); + + return element; + } + + /* + * (non-Javadoc) + * + * @see + * net.sourceforge.cruisecontrol.Modification#fromElement(org.jdom.Element + * , java.text.DateFormat) + */ + public void fromElement(Element modification) + { + name = modification.getChildText(TAGNAME_NAME); + version = modification.getChildText(TAGNAME_VERSION); + type = modification.getChildText(TAGNAME_TYPE); + instance = modification.getChildText(TAGNAME_INSTANCE); + project = modification.getChildText(TAGNAME_PROJECT); + comment = modification.getChildText(TAGNAME_COMMENT); + } + + } + + /** + * Data structure which holds data specific to a Change Request associated + * with a modification within a CM Synergy repository. + * + * @author Robert J. Smith + */ + public class ChangeRequest + { + + private String href; + + private String number = ""; + + // Only the parent class should call the constructor + protected ChangeRequest() + { + } + + public void setHref(String href) + { + this.href = href; + } + /* + * (non-Javadoc) + * + * @see + * net.sourceforge.cruisecontrol.Modification#fromElement(org.jdom.Element + * , java.text.DateFormat) + */ + public Element toElement() + { + Element element = new Element(TAGNAME_CHANGEREQUEST); + + if (href != null) + { + Element linkElement = new Element(TAGNAME_HTML_LINK); + linkElement.setAttribute(TAGNAME_HTML_LINK_HREF, href); + linkElement.addContent(number); + element.addContent(linkElement); + } + else + { + Element insElement = new Element(TAGNAME_HTML_INS); + insElement.addContent(number); + element.addContent(insElement); + } + + return element; + } + + /* + * (non-Javadoc) + * + * @see + * net.sourceforge.cruisecontrol.Modification#fromElement(org.jdom.Element + * , java.text.DateFormat) + */ + public void fromElement(Element modification) + { + Element linkElement = modification.getChild(TAGNAME_HTML_LINK); + if (linkElement != null) + { + href = linkElement.getAttributeValue(TAGNAME_HTML_LINK_HREF); + number = linkElement.getText(); + } + else + { + Element insElement = modification.getChild(TAGNAME_HTML_INS); + if (insElement != null) + { + number = insElement.getText(); + } + } + } + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/ModificationCache.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/ModificationCache.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,76 @@ +/* +============================================================================ +Name : BaselineModificationCache.java +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ + */ +package com.nokia.cruisecontrol.sourcecontrol; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import net.sourceforge.cruisecontrol.Modification; + +/** + * This helper class is a cache to store baseline changes, + * which are not timed based operations. + * + */ +public class ModificationCache +{ + private List cache = new ArrayList(); + + /** + * Add a modification to the cache. + * @param m the modification. + */ + public synchronized void add(Modification m) { + cache.add(m); + } + + /** + * Get the modification between the interval. + * @param lastBuild + * @param now + * @return + */ + public synchronized List getModifications(Date lastBuild, Date now) { + List result = new ArrayList(); + for (Modification m : cache) { + if (m.modifiedTime.after(lastBuild) && m.modifiedTime.before(now)) { + result.add(m); + } + } + return result; + } + + /** + * Remove cleanup the cache, removes all stuff older than last build. + * @param lastBuild + */ + public synchronized void cleanup(Date lastBuild) { + List result = new ArrayList(); + for (Modification m : cache) { + if (m.modifiedTime.after(lastBuild)) { + result.add(m); + } + } + cache = result; + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/OperationFailedException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/OperationFailedException.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,64 @@ +/******************************************************************************** + * CruiseControl, a Continuous Integration Toolkit + * Copyright (c) 2001, ThoughtWorks, Inc. + * 200 E. Randolph, 25th Floor + * Chicago, IL 60601 USA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * + Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * + Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ********************************************************************************/ +/* +============================================================================ +Name : HLMSynergyModification.java +Part of : Helium + +Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. + +============================================================================ + */ +package com.nokia.cruisecontrol.sourcecontrol; + +public class OperationFailedException extends RuntimeException +{ + /** + * The serial ID. + */ + private static final long serialVersionUID = 1778679212994311647L; + + /** + * The constructor + * @param message error message + * @param e the real error. + */ + public OperationFailedException(String message, Exception e) + { + super(message, e); + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/SynergyBaselineProjects.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/SynergyBaselineProjects.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,92 @@ +/* +============================================================================ +Name : SynergyBaselineProjects.java +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ + */ +package com.nokia.cruisecontrol.sourcecontrol; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; + +import net.sourceforge.cruisecontrol.util.ManagedCommandline; + +public class SynergyBaselineProjects +{ + private static final Logger LOG = Logger.getLogger(SynergyBaselineProjects.class); + + private ManagedCommandline cmd; + + private String project; + + public SynergyBaselineProjects(ManagedCommandline cmd, String project) + { + this.cmd = cmd; + this.project = project; + // Configure the logger to be always in debug mode. + LOG.setLevel(Level.DEBUG); + } + + /** + * Running the following command: ccm query + * "hierarchy_project_members(is_project_in_baseline_of(is_baseline_in_pg_of + * ( is_project_grouping_of(''))),none)" + * + * @return a list of baseline projects + * @throws IOException + */ + public List getBaselineProjects() + { + List baselines = new ArrayList(); + LOG.info("Querying baselines projects for " + project); + cmd.clearArgs(); + cmd.createArgument("query"); + cmd.createArgument("hierarchy_project_members(is_project_in_baseline_of(" + + "is_baseline_in_pg_of(is_project_grouping_of('" + project + "'))),none)"); + cmd.createArgument("-u"); + cmd.createArgument("-f"); + cmd.createArgument("%objectname"); + try + { + cmd.execute(); + cmd.assertExitCode(0); + } + catch (Exception e) + { + String message = "Could not query baseline projects for \"" + project + "\"."; + LOG.error(message, e); + throw new OperationFailedException(message, e); + } + LOG.info("stderr: " + cmd.getStderrAsString()); + LOG.info("stdout: " + cmd.getStdoutAsString()); + + for (Object o : cmd.getStdoutAsList()) + { + String l = (String) o; + if (l.length() > 0) + { + LOG.info("Baseline: " + l); + baselines.add(l); + } + } + return baselines; + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/XPathMapper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/XPathMapper.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,112 @@ +/* +============================================================================ +Name : XPathMapper.java +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ + */ +package com.nokia.cruisecontrol.sourcecontrol; + +import java.util.List; +import net.sourceforge.cruisecontrol.CruiseControlException; +import org.jdom.*; +import org.jdom.xpath.*; +import org.apache.log4j.Logger; + +public class XPathMapper +{ + private static final Logger LOG = Logger.getLogger(XPathMapper.class); + + private String expression; + + private String value; + + private String name = ""; + + + /** + * Validating the configuration input. + * @throws CruiseControlException + */ + public void validate() throws CruiseControlException + { + // Has expression been defined? + if (name == null) + throw new CruiseControlException("'expression' attribute not defined."); + if (expression == null && value == null) + throw new CruiseControlException( + "Either 'expression' or 'value' attribute must be defined."); + if (value != null && expression != null) + throw new CruiseControlException( + "You can define both attributes 'expression' and 'value'."); + } + + public void setName(String name) + { + this.name = name; + } + + public String getName() + { + return name; + } + + public void setExpression(String expression) + { + this.expression = expression; + } + + public String getExpression() + { + return expression; + } + + public void setValue(String value) + { + this.value = value; + } + + public String getValue() + { + return value; + } + + public String extract(Object element) throws CruiseControlException + { + if (value != null) + return value; + + try + { + List nodes = (List) XPath.selectNodes(element, this.getExpression()); + if (nodes.size() > 1) + throw new CruiseControlException("'" + this.getExpression() + + "' returns several results."); + if (nodes.size() < 1) + throw new CruiseControlException("'" + this.getExpression() + + "' does not return any result."); + + Attribute attr = (Attribute) nodes.get(0); + return attr.getValue(); + } + catch (org.jdom.JDOMException exc) + { + throw new CruiseControlException("Could not extract data using '" + + this.getExpression() + "' " + exc); + } + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/XPathMatcher.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/src/com/nokia/cruisecontrol/sourcecontrol/XPathMatcher.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,117 @@ +/* ============================================================================ +Name : XPathMatcher.java +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ */ +package com.nokia.cruisecontrol.sourcecontrol; + +import net.sourceforge.cruisecontrol.CruiseControlException; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Vector; +import java.util.Map; +import org.apache.log4j.Logger; + +public class XPathMatcher +{ + /** + * An instance of the logging class + */ + private static final Logger LOG = Logger.getLogger(XPathMatcher.class); + + private String expression; + + private String name = ""; + + private Vector mappers = new Vector(); + + + public List getModifications(Date arg0, Date arg1) + { + return null; + } + + public Map getProperties() + { + return null; + } + + /** + * Validate the input from the configuration. + * @throws CruiseControlException + */ + public void validate() throws CruiseControlException + { + // Has expression been defined? + if (expression == null) + throw new CruiseControlException("'expression' attribute not defined."); + for (Iterator i = mappers.iterator(); i.hasNext();) + { + XPathMapper mapper = (XPathMapper) i.next(); + mapper.validate(); + } + } + + public void setName(String name) + { + this.name = name; + } + + public String getName() + { + return name; + } + + public void setExpression(String expression) + { + this.expression = expression; + } + + public String getExpression() + { + return expression; + } + + public Object createMap() + { + LOG.info("==== Creating a mapper object."); + XPathMapper mapper = new XPathMapper(); + mappers.add(mapper); + return mapper; + } + + public XPathMapper getMapper(String name) + { + LOG.info("==== Get mapper: " + name); + + for (Iterator i = mappers.iterator(); i.hasNext();) + { + XPathMapper mapper = (XPathMapper) i.next(); + if (mapper.getName().equals(name)) + return mapper; + } + return null; + } + + public boolean hasMapper(String name) + { + LOG.info("==== Has mapper: => " + name); + return this.getMapper(name) != null; + } + +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/src/com/nokia/jetty/deployer/WebAppDeployer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/src/com/nokia/jetty/deployer/WebAppDeployer.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,302 @@ +//======================================================================== +//$Id: WebAppDeployer.java 2032 2007-07-26 06:11:24Z janb $ +//Copyright 2006 Mort Bay Consulting Pty. Ltd. +//------------------------------------------------------------------------ +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +//http://www.apache.org/licenses/LICENSE-2.0 +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. +//======================================================================== +/* + ============================================================================ + Name : WebAppDeployer.java + Part of : Helium + + Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. + + ============================================================================ + */ + +package com.nokia.jetty.deployer; + +import java.util.ArrayList; + +import org.apache.log4j.Logger; +import org.mortbay.component.AbstractLifeCycle; +import org.mortbay.jetty.Handler; +import org.mortbay.jetty.HandlerContainer; +import org.mortbay.jetty.handler.ContextHandler; +import org.mortbay.jetty.handler.ContextHandlerCollection; +import org.mortbay.jetty.webapp.WebAppContext; +import org.mortbay.resource.Resource; +import org.mortbay.util.URIUtil; + +/** + * Web Application Deployer. + * + * The class searches a directory for and deploys standard web application. At + * startup, the directory specified by {@link #setWebAppDir(String)} is searched + * for subdirectories (excluding hidden and CVS) or files ending with ".zip" or + * "*.war". For each webapp discovered is passed to a new instance of + * {@link WebAppContext} (or a subclass specified by {@link #getContexts()}. + * {@link ContextHandlerCollection#getContextClass()} + * + * This deployer does not do hot deployment or undeployment. Nor does it support + * per webapplication configuration. For these features see + * {@link ContextDeployer}. + * + * @see {@link ContextDeployer} + */ +public class WebAppDeployer extends AbstractLifeCycle +{ + private Logger log = Logger.getLogger(this.getClass()); + + private HandlerContainer contexts; + + private String webAppDir; + + private String defaultsDescriptor; + + private String[] configurationClasses; + + private boolean extract; + + private boolean parentLoaderPriority; + + private boolean allowDuplicates; + + private ArrayList deployed; + + private String extraClasspath; + + public String[] getConfigurationClasses() + { + return configurationClasses; + } + + public void setConfigurationClasses(String[] configurationClasses) + { + this.configurationClasses = configurationClasses; + } + + public HandlerContainer getContexts() + { + return contexts; + } + + public void setContexts(HandlerContainer contexts) + { + this.contexts = contexts; + } + + public String getDefaultsDescriptor() + { + return defaultsDescriptor; + } + + public void setDefaultsDescriptor(String defaultsDescriptor) + { + this.defaultsDescriptor = defaultsDescriptor; + } + + public boolean isExtract() + { + return extract; + } + + public void setExtract(boolean extract) + { + this.extract = extract; + } + + public boolean isParentLoaderPriority() + { + return parentLoaderPriority; + } + + public void setParentLoaderPriority(boolean parentPriorityClassLoading) + { + parentLoaderPriority = parentPriorityClassLoading; + } + + public String getWebAppDir() + { + return webAppDir; + } + + public void setWebAppDir(String dir) + { + this.webAppDir = dir; + } + + public boolean getAllowDuplicates() + { + return allowDuplicates; + } + + public void setExtraClasspath(String extraClasspath) + { + this.extraClasspath = extraClasspath; + } + + public String getExtraClasspath() + { + return extraClasspath; + } + + /* ------------------------------------------------------------ */ + /** + * @param allowDuplicates + * If false, do not deploy webapps that have already been + * deployed or duplicate context path + */ + public void setAllowDuplicates(boolean allowDuplicates) + { + this.allowDuplicates = allowDuplicates; + } + + /* ------------------------------------------------------------ */ + /** + * @throws Exception + */ + public void doStart() throws Exception + { + deployed = new ArrayList(); + + scan(); + + } + + /* ------------------------------------------------------------ */ + /** + * Scan for webapplications. + * + * @throws Exception + */ + public void scan() throws Exception + { + if (contexts == null) + throw new IllegalArgumentException("No HandlerContainer"); + + Resource r = Resource.newResource(this.webAppDir); + if (!r.exists()) + throw new IllegalArgumentException("No such webapps resource " + r); + + if (!r.isDirectory()) + throw new IllegalArgumentException("Not directory webapps resource " + r); + + String[] files = r.list(); + + files: for (int f = 0; files != null && f < files.length; f++) + { + String context = files[f]; + + if (context.equalsIgnoreCase("CVS/") || context.equalsIgnoreCase("CVS") + || context.startsWith(".")) + continue; + + Resource app = r.addPath(r.encode(context)); + + if (context.toLowerCase().endsWith(".war") || context.toLowerCase().endsWith(".jar")) + { + context = context.substring(0, context.length() - 4); + Resource unpacked = r.addPath(context); + if (unpacked != null && unpacked.exists() && unpacked.isDirectory()) + continue; + } + else if (!app.isDirectory()) + continue; + + if (context.equalsIgnoreCase("root") || context.equalsIgnoreCase("root/")) + context = URIUtil.SLASH; + else + context = "/" + context; + if (context.endsWith("/") && context.length() > 0) + context = context.substring(0, context.length() - 1); + + // Check the context path has not already been added or the webapp + // itself is not already deployed + if (!allowDuplicates) + { + Handler[] installed = contexts.getChildHandlersByClass(ContextHandler.class); + for (int i = 0; i < installed.length; i++) + { + ContextHandler c = (ContextHandler) installed[i]; + + if (context.equals(c.getContextPath())) + continue files; + + String path; + if (c instanceof WebAppContext) + path = ((WebAppContext) c).getWar(); + else + path = (c.getBaseResource() == null) ? "" : c.getBaseResource().getFile() + .getAbsolutePath(); + + if (path.equals(app.getFile().getAbsolutePath())) + continue files; + + } + } + + // create a webapp + WebAppContext wah = null; + if (contexts instanceof ContextHandlerCollection + && WebAppContext.class.isAssignableFrom(((ContextHandlerCollection) contexts) + .getContextClass())) + { + try + { + wah = (WebAppContext) ((ContextHandlerCollection) contexts).getContextClass() + .newInstance(); + } + catch (Exception e) + { + throw new Error(e); + } + } + else + { + wah = new WebAppContext(); + } + + // configure it + wah.setContextPath(context); + if (configurationClasses != null) + wah.setConfigurationClasses(configurationClasses); + if (defaultsDescriptor != null) + wah.setDefaultsDescriptor(defaultsDescriptor); + wah.setExtractWAR(extract); + wah.setWar(app.toString()); + wah.setParentLoaderPriority(parentLoaderPriority); + log.info("Adding additional path to the WebAppContext"); + if (extraClasspath != null) + { + log.info("Adding additional path to the WebAppContext: " + extraClasspath); + System.out.println("Adding additional path to the WebAppContext: " + + extraClasspath); + wah.setExtraClasspath(extraClasspath); + } + // add it + contexts.addHandler(wah); + deployed.add(wah); + + if (contexts.isStarted()) + contexts.start(); // TODO Multi exception + } + } + + public void doStop() throws Exception + { + for (int i = deployed.size(); i-- > 0;) + { + ContextHandler wac = (ContextHandler) deployed.get(i); + wac.stop();// TODO Multi exception + } + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/templates/HELIUM-README.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/templates/HELIUM-README.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,43 @@ +Cruise control Helium Integration +================================= + +Cruise Control version: ${cc.version} +HCC version: ${helium.custom.version} + +Helium additions +---------------- +${overlay.content} + + +How to use CC Helium customizations +----------------------------------- + +In config.xml: +----8<----8<----8<----8<----8<----8<----8<---- + + + + + ... +----8<----8<----8<----8<----8<----8<----8<---- + +How to use Dashboard Helium customizations +------------------------------------------ + +To enable the Helium build summary widget please use the Helium specific +dashboard configuration file: +set CCDIR= +\cruisecontrol.bat + +How to configure the Ant builder +-------------------------------- + +To prevent log.xml missing exception while running Helium please configure the ant builder this way: + + + + + + +_______________ +The Helium Team diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/templates/ivy.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/templates/ivy.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/cc-customizations/tests/src/com/nokia/cruisecontrol/sourcecontrol/tests/TestModificationCache.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/cc-customizations/tests/src/com/nokia/cruisecontrol/sourcecontrol/tests/TestModificationCache.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,103 @@ +/* +============================================================================ +Name : TestModificationCache.java +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ + */ +package com.nokia.cruisecontrol.sourcecontrol.tests; + +import org.junit.*; + +import com.nokia.cruisecontrol.sourcecontrol.ModificationCache; + +import static org.junit.Assert.*; +import net.sourceforge.cruisecontrol.Modification; +import java.util.Date; +import java.util.List; + +public class TestModificationCache +{ + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + /** + * Check the getModifications. + * @throws Exception + */ + @Test + public void test_getModifications() throws Exception { + ModificationCache cache = new ModificationCache(); + // before + Modification m = new Modification(); + m.comment = "before"; + m.modifiedTime = new Date(100); + cache.add(m); + + // in + m = new Modification(); + m.comment = "in"; + m.modifiedTime = new Date(150); + cache.add(m); + + // after + m = new Modification(); + m.comment = "after"; + m.modifiedTime = new Date(200); + cache.add(m); + + List mods = cache.getModifications(new Date(110), new Date(199)); + assertTrue("The result must contain only one element.", mods.size() == 1); + assertTrue("The element should have the comment 'in'.", mods.get(0).comment.equals("in")); + } + + /** + * Check the cleanup. + * @throws Exception + */ + @Test + public void test_cleanup() throws Exception { + ModificationCache cache = new ModificationCache(); + // before + Modification m = new Modification(); + m.comment = "before"; + m.modifiedTime = new Date(100); + cache.add(m); + + // in + m = new Modification(); + m.comment = "in"; + m.modifiedTime = new Date(150); + cache.add(m); + + // after + m = new Modification(); + m.comment = "after"; + m.modifiedTime = new Date(200); + cache.add(m); + + cache.cleanup(new Date(199)); + List mods = cache.getModifications(new Date(0), new Date(1000)); + assertTrue("The result must contain only one element.", mods.size() == 1); + assertTrue("The element should have the comment 'in'.", mods.get(0).comment.equals("after")); + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/COPYING.TXT --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/COPYING.TXT Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/example.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/example.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,70 @@ +C:\>filedisk +syntax: +filedisk /mount [size[k|M|G] | /ro | /cd] +filedisk /umount +filedisk /status + +filename formats: + c:\path\filedisk.img + \Device\Harddisk0\Partition1\path\filedisk.img + \\server\share\path\filedisk.img + +example: +filedisk /mount 0 c:\temp\filedisk.img 8M f: +filedisk /mount 1 c:\temp\cdimage.iso /cd i: +filedisk /umount f: +filedisk /umount i: + +C:\>filedisk /mount 0 c:\temp\filedisk.img 8M f: + +C:\>format /fs:fat f: +The type of the file system is RAW. +The new file system is FAT. + +WARNING, ALL DATA ON NON-REMOVABLE DISK +DRIVE F: WILL BE LOST! +Proceed with Format (Y/N)? y +Verifying 7M +Initializing the File Allocation Table (FAT)... +Volume label (11 characters, ENTER for none)? filedisk +Format complete. + + 8 353 792 bytes total disk space. + 8 353 792 bytes available on disk. + + 2 048 bytes in each allocation unit. + 4 079 allocation units available on disk. + + 12 bits in each FAT entry. + +Volume Serial Number is 28DF-0C81 + +C:\>dir f: + Volume in drive F is FILEDISK + Volume Serial Number is 28DF-0C81 + + Directory of F:\ + +File Not Found + +C:\>chkdsk f: +The type of the file system is FAT. +Volume FILEDISK created 2002-11-24 14:25 +Volume Serial Number is 28DF-0C81 +Windows is verifying files and folders... +File and folder verification is complete. +Windows has checked the file system and found no problems. + + 8 353 792 bytes total disk space. + 8 353 792 bytes available on disk. + + 2 048 bytes in each allocation unit. + 4 079 total allocation units on disk. + 4 079 allocation units available on disk. + +C:\>filedisk /status f: +f: \??\c:\temp\filedisk.img Size: 8388608 bytes + +C:\>filedisk /umount f: + +C:\> diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/exe/MAKEFILE --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/exe/MAKEFILE Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,7 @@ +# +# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source +# file to this component. This file merely indirects to the real make file +# that is shared by all the driver components of the Windows NT DDK +# + +!INCLUDE $(NTMAKEENV)\makefile.def diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/exe/filedisk.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/exe/filedisk.c Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,423 @@ +/* + Control program for a virtual disk driver for Windows NT/2000/XP. + Copyright (C) 1999, 2000, 2001, 2002 Bo Brantén. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include +#include +#include +#include "filedisk.h" + +int FileDiskSyntax(void) +{ + fprintf(stderr, "syntax:\n"); + fprintf(stderr, "filedisk /mount [size[k|M|G] | /ro | /cd] \n"); + fprintf(stderr, "filedisk /umount \n"); + fprintf(stderr, "filedisk /status \n"); + fprintf(stderr, "\n"); + fprintf(stderr, "filename formats:\n"); + fprintf(stderr, " c:\\path\\filedisk.img\n"); + fprintf(stderr, " \\Device\\Harddisk0\\Partition1\\path\\filedisk.img\n"); + fprintf(stderr, " \\\\server\\share\\path\\filedisk.img\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "example:\n"); + fprintf(stderr, "filedisk /mount 0 c:\\temp\\filedisk.img 8M f:\n"); + fprintf(stderr, "filedisk /mount 1 c:\\temp\\cdimage.iso /cd i:\n"); + fprintf(stderr, "filedisk /umount f:\n"); + fprintf(stderr, "filedisk /umount i:\n"); + + return -1; +} + +void PrintLastError(char* Prefix) +{ + LPVOID lpMsgBuf; + + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + 0, + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + + fprintf(stderr, "%s %s", Prefix, (LPTSTR) lpMsgBuf); + + LocalFree(lpMsgBuf); +} + +int +FileDiskMount( + int DeviceNumber, + POPEN_FILE_INFORMATION OpenFileInformation, + char DriveLetter, + BOOLEAN CdImage +) +{ + char VolumeName[] = "\\\\.\\ :"; + char DeviceName[255]; + HANDLE Device; + DWORD BytesReturned; + + VolumeName[4] = DriveLetter; + + Device = CreateFile( + VolumeName, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_FLAG_NO_BUFFERING, + NULL + ); + + if (Device != INVALID_HANDLE_VALUE) + { + SetLastError(ERROR_BUSY); + PrintLastError(&VolumeName[4]); + return -1; + } + + if (CdImage) + { + sprintf(DeviceName, DEVICE_NAME_PREFIX "Cd" "%u", DeviceNumber); + } + else + { + sprintf(DeviceName, DEVICE_NAME_PREFIX "%u", DeviceNumber); + } + + if (!DefineDosDevice( + DDD_RAW_TARGET_PATH, + &VolumeName[4], + DeviceName + )) + { + PrintLastError(&VolumeName[4]); + return -1; + } + + Device = CreateFile( + VolumeName, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_FLAG_NO_BUFFERING, + NULL + ); + + if (Device == INVALID_HANDLE_VALUE) + { + PrintLastError(&VolumeName[4]); + DefineDosDevice(DDD_REMOVE_DEFINITION, &VolumeName[4], NULL); + return -1; + } + + if (!DeviceIoControl( + Device, + IOCTL_FILE_DISK_OPEN_FILE, + OpenFileInformation, + sizeof(OPEN_FILE_INFORMATION) + OpenFileInformation->FileNameLength - 1, + NULL, + 0, + &BytesReturned, + NULL + )) + { + PrintLastError("FileDisk:"); + DefineDosDevice(DDD_REMOVE_DEFINITION, &VolumeName[4], NULL); + return -1; + } + + return 0; +} + +int FileDiskUmount(char DriveLetter) +{ + char VolumeName[] = "\\\\.\\ :"; + HANDLE Device; + DWORD BytesReturned; + + VolumeName[4] = DriveLetter; + + Device = CreateFile( + VolumeName, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_FLAG_NO_BUFFERING, + NULL + ); + + if (Device == INVALID_HANDLE_VALUE) + { + PrintLastError(&VolumeName[4]); + return -1; + } + + if (!DeviceIoControl( + Device, + FSCTL_LOCK_VOLUME, + NULL, + 0, + NULL, + 0, + &BytesReturned, + NULL + )) + { + PrintLastError(&VolumeName[4]); + return -1; + } + + if (!DeviceIoControl( + Device, + IOCTL_FILE_DISK_CLOSE_FILE, + NULL, + 0, + NULL, + 0, + &BytesReturned, + NULL + )) + { + PrintLastError("FileDisk:"); + return -1; + } + + if (!DeviceIoControl( + Device, + FSCTL_DISMOUNT_VOLUME, + NULL, + 0, + NULL, + 0, + &BytesReturned, + NULL + )) + { + PrintLastError(&VolumeName[4]); + return -1; + } + + if (!DeviceIoControl( + Device, + FSCTL_UNLOCK_VOLUME, + NULL, + 0, + NULL, + 0, + &BytesReturned, + NULL + )) + { + PrintLastError(&VolumeName[4]); + return -1; + } + + CloseHandle(Device); + + if (!DefineDosDevice( + DDD_REMOVE_DEFINITION, + &VolumeName[4], + NULL + )) + { + PrintLastError(&VolumeName[4]); + return -1; + } + + return 0; +} + +int FileDiskStatus(char DriveLetter) +{ + char VolumeName[] = "\\\\.\\ :"; + HANDLE Device; + POPEN_FILE_INFORMATION OpenFileInformation; + DWORD BytesReturned; + + VolumeName[4] = DriveLetter; + + Device = CreateFile( + VolumeName, + GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_FLAG_NO_BUFFERING, + NULL + ); + + if (Device == INVALID_HANDLE_VALUE) + { + PrintLastError(&VolumeName[4]); + return -1; + } + + OpenFileInformation = malloc(sizeof(OPEN_FILE_INFORMATION) + MAX_PATH); + + if (!DeviceIoControl( + Device, + IOCTL_FILE_DISK_QUERY_FILE, + NULL, + 0, + OpenFileInformation, + sizeof(OPEN_FILE_INFORMATION) + MAX_PATH, + &BytesReturned, + NULL + )) + { + PrintLastError(&VolumeName[4]); + return -1; + } + + if (BytesReturned < sizeof(OPEN_FILE_INFORMATION)) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + PrintLastError(&VolumeName[4]); + return -1; + } + + printf("%c: %.*s Size: %I64u bytes%s\n", + DriveLetter, + OpenFileInformation->FileNameLength, + OpenFileInformation->FileName, + OpenFileInformation->FileSize, + OpenFileInformation->ReadOnly ? ", ReadOnly" : "" + ); + + return 0; +} + +int __cdecl main(int argc, char* argv[]) +{ + char* Command; + int DeviceNumber; + char* FileName; + char* Option; + char DriveLetter; + BOOLEAN CdImage = FALSE; + POPEN_FILE_INFORMATION OpenFileInformation; + + Command = argv[1]; + + if ((argc == 5 || argc == 6) && !strcmp(Command, "/mount")) + { + DeviceNumber = atoi(argv[2]); + FileName = argv[3]; + + if (strlen(FileName) < 2) + { + return FileDiskSyntax(); + } + + OpenFileInformation = + malloc(sizeof(OPEN_FILE_INFORMATION) + strlen(FileName) + 7); + + memset( + OpenFileInformation, + 0, + sizeof(OPEN_FILE_INFORMATION) + strlen(FileName) + 7 + ); + + if (FileName[0] == '\\') + { + if (FileName[1] == '\\') + // \\server\share\path\filedisk.img + { + strcpy(OpenFileInformation->FileName, "\\??\\UNC"); + strcat(OpenFileInformation->FileName, FileName + 1); + } + else + // \Device\Harddisk0\Partition1\path\filedisk.img + { + strcpy(OpenFileInformation->FileName, FileName); + } + } + else + // c:\path\filedisk.img + { + strcpy(OpenFileInformation->FileName, "\\??\\"); + strcat(OpenFileInformation->FileName, FileName); + } + + OpenFileInformation->FileNameLength = + (USHORT) strlen(OpenFileInformation->FileName); + + if (argc > 5) + { + Option = argv[4]; + DriveLetter = argv[5][0]; + + if (!strcmp(Option, "/ro")) + { + OpenFileInformation->ReadOnly = TRUE; + } + else if (!strcmp(Option, "/cd")) + { + CdImage = TRUE; + } + else + { + if (Option[strlen(Option) - 1] == 'G') + { + OpenFileInformation->FileSize.QuadPart = + _atoi64(Option) * 1024 * 1024 * 1024; + } + else if (Option[strlen(Option) - 1] == 'M') + { + OpenFileInformation->FileSize.QuadPart = + _atoi64(Option) * 1024 * 1024; + } + else if (Option[strlen(Option) - 1] == 'k') + { + OpenFileInformation->FileSize.QuadPart = + _atoi64(Option) * 1024; + } + else + { + OpenFileInformation->FileSize.QuadPart = + _atoi64(Option); + } + } + } + else + { + DriveLetter = argv[4][0]; + } + return FileDiskMount(DeviceNumber, OpenFileInformation, DriveLetter, CdImage); + } + else if (argc == 3 && !strcmp(Command, "/umount")) + { + DriveLetter = argv[2][0]; + return FileDiskUmount(DriveLetter); + } + else if (argc == 3 && !strcmp(Command, "/status")) + { + DriveLetter = argv[2][0]; + return FileDiskStatus(DriveLetter); + } + else + { + return FileDiskSyntax(); + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/exe/filedisk.rc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/exe/filedisk.rc Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,104 @@ +//Microsoft Developer Studio generated resource script. +// + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,11 + PRODUCTVERSION 1,0,0,11 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Bo Brantén\0" + VALUE "FileDescription", "FileDisk Virtual Disk Driver\0" + VALUE "FileVersion", "1.0.0.11\0" + VALUE "InternalName", "filedisk\0" + VALUE "LegalCopyright", "Copyright © 1999-2002 Bo Brantén\0" + VALUE "OriginalFilename", "filedisk.exe\0" + VALUE "ProductName", "filedisk\0" + VALUE "ProductVersion", "1.0.0.11\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/exe/sources --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/exe/sources Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,6 @@ +TARGETNAME=filedisk +TARGETPATH=obj +TARGETTYPE=PROGRAM +UMTYPE=console +INCLUDES=..\sys\inc +SOURCES=filedisk.c filedisk.rc diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/filedisk.exe Binary file buildframework/helium/external/filedisk/filedisk.exe has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/filedisk.reg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/filedisk.reg Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,18 @@ +REGEDIT4 + +[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FileDisk] + +"ErrorControl"=dword:00000001 + +# +# When to start the driver: +# At boot: Start=1 +# Manually: Start=3 +# +"Start"=dword:00000001 + +"Type"=dword:00000001 + +[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FileDisk\Parameters] + +"NumberOfDevices"=dword:00000004 diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/filedisk.sys Binary file buildframework/helium/external/filedisk/filedisk.sys has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/install.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/install.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,11 @@ +Copy the driver (filedisk.sys) to %systemroot%\system32\drivers\. + +Optionally edit filedisk.reg for automatic/manually start and +number of devices. + +Import filedisk.reg to the Registry. + +Reboot. + +Use the program filedisk.exe to mount/umount files, for an example +of use see the file example.txt. diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/readme.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,82 @@ + + This is a virtual disk driver for Windows NT/2000/XP that uses + one or more files to emulate physical disks. + Copyright (C) 1999-2006 Bo Brantén. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + The GNU General Public License is also available from: + http://www.gnu.org/copyleft/gpl.html + + Windows and Windows NT are either registered trademarks or trademarks of + Microsoft Corporation in the United States and/or other countries. + + Please send comments, corrections and contributions to bosse@acc.umu.se + + The most recent version of this program is available from: + http://www.acc.umu.se/~bosse/ + + Revision history: + + 14. 2006-01-05 + Updated impersonation so that use of image files stored on network + drives work on Windows 2000 SP4, Windows XP SP2 and + Windows Server 2003 SP1. + + 13. 2004-06-09 + Small fix in file size handling. + + 12. 2004-05-27 + Possible fix for memory leak. + + 11. 2002-11-30 + Added ioctl to query information about mounted disk image files by + request from developer of GUI. + + 10. 2002-11-24 + Added a check so that FileDisk doesn't use compressed or encrypted + images. For an explanation why this doesn't work see comment in the + source code. + + 9. 2002-08-26 + Corrected the share access for read-only FileDisk images. + + 8. 2002-08-11 + Updated the control application to support UNC paths. + Changed the handling of CD-ROM device objects to avoid some problems on + Windows XP. + Corrected the handling of file sizes so that FileDisk images can be + sparse files. + + 7. 2002-02-28 + Added support for CD-images. + + 6. 2002-01-21 + Added support for impersonation so that FileDisk images can be stored + on network drives. + + 5. 2002-01-18 + Updated for Windows XP by Robert A. Rose. + + 4. 2001-07-08 + Formating to FAT on Windows 2000 now works. + + 3. 2001-05-14 + Corrected the error messages from the usermode control application. + + 2. 2000-03-15 + Added handling of IOCTL_DISK_CHECK_VERIFY to make the driver work on + Windows 2000 (tested on beta 3, build 2031). Formating to FAT still + doesn't work but formating to NTFS does. + + 1. 1999-06-09 + Initial release. diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/sys/inc/filedisk.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/sys/inc/filedisk.h Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,50 @@ +/* + This is a virtual disk driver for Windows NT/2000/XP that uses one or more + files to emulate physical disks. + Copyright (C) 1999, 2000, 2001, 2002 Bo Brantén. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef _FILE_DISK_ +#define _FILE_DISK_ + +#ifndef __T +#ifdef _NTDDK_ +#define __T(x) L ## x +#else +#define __T(x) x +#endif +#endif + +#ifndef _T +#define _T(x) __T(x) +#endif + +#define DEVICE_BASE_NAME _T("\\FileDisk") +#define DEVICE_DIR_NAME _T("\\Device") DEVICE_BASE_NAME +#define DEVICE_NAME_PREFIX DEVICE_DIR_NAME DEVICE_BASE_NAME + +#define FILE_DEVICE_FILE_DISK 0x8000 + +#define IOCTL_FILE_DISK_OPEN_FILE CTL_CODE(FILE_DEVICE_FILE_DISK, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_FILE_DISK_CLOSE_FILE CTL_CODE(FILE_DEVICE_FILE_DISK, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_FILE_DISK_QUERY_FILE CTL_CODE(FILE_DEVICE_FILE_DISK, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS) + +typedef struct _OPEN_FILE_INFORMATION { + LARGE_INTEGER FileSize; + BOOLEAN ReadOnly; + USHORT FileNameLength; + UCHAR FileName[1]; +} OPEN_FILE_INFORMATION, *POPEN_FILE_INFORMATION; + +#endif diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/sys/obj/i386/checked/filedisk.sys Binary file buildframework/helium/external/filedisk/sys/obj/i386/checked/filedisk.sys has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/sys/obj/i386/free/filedisk.sys Binary file buildframework/helium/external/filedisk/sys/obj/i386/free/filedisk.sys has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/sys/src/MAKEFILE --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/sys/src/MAKEFILE Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,7 @@ +# +# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source +# file to this component. This file merely indirects to the real make file +# that is shared by all the driver components of the Windows NT DDK +# + +!INCLUDE $(NTMAKEENV)\makefile.def diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/sys/src/Sources --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/sys/src/Sources Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,5 @@ +TARGETNAME=filedisk +TARGETPATH=..\obj +TARGETTYPE=DRIVER +INCLUDES=..\inc +SOURCES=filedisk.c filedisk.rc diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/sys/src/filedisk.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/sys/src/filedisk.c Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1537 @@ +/* + This is a virtual disk driver for Windows NT/2000/XP that uses + one or more files to emulate physical disks. + Copyright (C) 1999-2006 Bo Brantén. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include +#include +#include + +// +// We include some stuff from newer DDK:s here so that one +// version of the driver for all versions of Windows can +// be compiled with the Windows NT 4.0 DDK. +// +#if (VER_PRODUCTBUILD < 2195) + +#define FILE_DEVICE_MASS_STORAGE 0x0000002d +#define IOCTL_STORAGE_CHECK_VERIFY2 CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FILE_ATTRIBUTE_ENCRYPTED 0x00004000 + +#endif + +#if (VER_PRODUCTBUILD < 2600) + +#define IOCTL_DISK_GET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE, 0x0012, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_GET_LENGTH_INFO CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS) + +typedef enum _PARTITION_STYLE { + PARTITION_STYLE_MBR, + PARTITION_STYLE_GPT +} PARTITION_STYLE; + +typedef unsigned __int64 ULONG64, *PULONG64; + +typedef struct _PARTITION_INFORMATION_MBR { + UCHAR PartitionType; + BOOLEAN BootIndicator; + BOOLEAN RecognizedPartition; + ULONG HiddenSectors; +} PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR; + +typedef struct _PARTITION_INFORMATION_GPT { + GUID PartitionType; + GUID PartitionId; + ULONG64 Attributes; + WCHAR Name[36]; +} PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT; + +typedef struct _PARTITION_INFORMATION_EX { + PARTITION_STYLE PartitionStyle; + LARGE_INTEGER StartingOffset; + LARGE_INTEGER PartitionLength; + ULONG PartitionNumber; + BOOLEAN RewritePartition; + union { + PARTITION_INFORMATION_MBR Mbr; + PARTITION_INFORMATION_GPT Gpt; + }; +} PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX; + +typedef struct _GET_LENGTH_INFORMATION { + LARGE_INTEGER Length; +} GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION; + +#endif // (VER_PRODUCTBUILD < 2600) + +// +// We include some stuff from ntifs.h here so that +// the driver can be compiled with only the DDK. +// + +#define TOKEN_SOURCE_LENGTH 8 + +typedef enum _TOKEN_TYPE { + TokenPrimary = 1, + TokenImpersonation +} TOKEN_TYPE; + +typedef struct _TOKEN_SOURCE { + CCHAR SourceName[TOKEN_SOURCE_LENGTH]; + LUID SourceIdentifier; +} TOKEN_SOURCE, *PTOKEN_SOURCE; + +typedef struct _TOKEN_CONTROL { + LUID TokenId; + LUID AuthenticationId; + LUID ModifiedId; + TOKEN_SOURCE TokenSource; +} TOKEN_CONTROL, *PTOKEN_CONTROL; + +typedef struct _SECURITY_CLIENT_CONTEXT { + SECURITY_QUALITY_OF_SERVICE SecurityQos; + PACCESS_TOKEN ClientToken; + BOOLEAN DirectlyAccessClientToken; + BOOLEAN DirectAccessEffectiveOnly; + BOOLEAN ServerIsRemote; + TOKEN_CONTROL ClientTokenControl; +} SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT; + +#define PsDereferenceImpersonationToken(T) \ + {if (ARGUMENT_PRESENT(T)) { \ + (ObDereferenceObject((T))); \ + } else { \ + ; \ + } \ +} + +#define PsDereferencePrimaryToken(T) (ObDereferenceObject((T))) + +NTKERNELAPI +VOID +PsRevertToSelf ( + VOID +); + +NTKERNELAPI +NTSTATUS +SeCreateClientSecurity ( + IN PETHREAD Thread, + IN PSECURITY_QUALITY_OF_SERVICE QualityOfService, + IN BOOLEAN RemoteClient, + OUT PSECURITY_CLIENT_CONTEXT ClientContext +); + +#define SeDeleteClientSecurity(C) { \ + if (SeTokenType((C)->ClientToken) == TokenPrimary) { \ + PsDereferencePrimaryToken( (C)->ClientToken ); \ + } else { \ + PsDereferenceImpersonationToken( (C)->ClientToken ); \ + } \ +} + +NTKERNELAPI +VOID +SeImpersonateClient ( + IN PSECURITY_CLIENT_CONTEXT ClientContext, + IN PETHREAD ServerThread OPTIONAL +); + +NTKERNELAPI +TOKEN_TYPE +SeTokenType ( + IN PACCESS_TOKEN Token +); + +#ifndef SE_IMPERSONATE_PRIVILEGE +#define SE_IMPERSONATE_PRIVILEGE (29L) +#endif + +#define TOKEN_ASSIGN_PRIMARY (0x0001) +#define TOKEN_DUPLICATE (0x0002) +#define TOKEN_IMPERSONATE (0x0004) +#define TOKEN_QUERY (0x0008) +#define TOKEN_QUERY_SOURCE (0x0010) +#define TOKEN_ADJUST_PRIVILEGES (0x0020) +#define TOKEN_ADJUST_GROUPS (0x0040) +#define TOKEN_ADJUST_DEFAULT (0x0080) + +#define TOKEN_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + TOKEN_ASSIGN_PRIMARY |\ + TOKEN_DUPLICATE |\ + TOKEN_IMPERSONATE |\ + TOKEN_QUERY |\ + TOKEN_QUERY_SOURCE |\ + TOKEN_ADJUST_PRIVILEGES |\ + TOKEN_ADJUST_GROUPS |\ + TOKEN_ADJUST_DEFAULT) + +typedef struct _TOKEN_PRIVILEGES { + ULONG PrivilegeCount; + LUID_AND_ATTRIBUTES Privileges[1]; +} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenProcessToken ( + IN HANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE TokenHandle +); + +NTSYSAPI +NTSTATUS +NTAPI +NtAdjustPrivilegesToken ( + IN HANDLE TokenHandle, + IN BOOLEAN DisableAllPrivileges, + IN PTOKEN_PRIVILEGES NewState, + IN ULONG BufferLength, + OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL, + OUT PULONG ReturnLength +); + +// +// For backward compatibility with Windows NT 4.0 by Bruce Engle. +// +#ifndef MmGetSystemAddressForMdlSafe +#define MmGetSystemAddressForMdlSafe(MDL, PRIORITY) MmGetSystemAddressForMdlPrettySafe(MDL) + +PVOID +MmGetSystemAddressForMdlPrettySafe ( + PMDL Mdl + ) +{ + CSHORT MdlMappingCanFail; + PVOID MappedSystemVa; + + MdlMappingCanFail = Mdl->MdlFlags & MDL_MAPPING_CAN_FAIL; + + Mdl->MdlFlags |= MDL_MAPPING_CAN_FAIL; + + MappedSystemVa = MmGetSystemAddressForMdl(Mdl); + + if (MdlMappingCanFail == 0) + { + Mdl->MdlFlags &= ~MDL_MAPPING_CAN_FAIL; + } + + return MappedSystemVa; +} +#endif + +#include "filedisk.h" + +#define PARAMETER_KEY L"\\Parameters" + +#define NUMBEROFDEVICES_VALUE L"NumberOfDevices" + +#define DEFAULT_NUMBEROFDEVICES 4 + +#define SECTOR_SIZE 512 + +#define TOC_DATA_TRACK 0x04 + +HANDLE dir_handle; + +typedef struct _DEVICE_EXTENSION { + BOOLEAN media_in_device; + HANDLE file_handle; + ANSI_STRING file_name; + LARGE_INTEGER file_size; + BOOLEAN read_only; + PSECURITY_CLIENT_CONTEXT security_client_context; + LIST_ENTRY list_head; + KSPIN_LOCK list_lock; + KEVENT request_event; + PVOID thread_pointer; + BOOLEAN terminate_thread; +} DEVICE_EXTENSION, *PDEVICE_EXTENSION; + +NTSTATUS +DriverEntry ( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath +); + +NTSTATUS +FileDiskCreateDevice ( + IN PDRIVER_OBJECT DriverObject, + IN ULONG Number, + IN DEVICE_TYPE DeviceType +); + +VOID +FileDiskUnload ( + IN PDRIVER_OBJECT DriverObject +); + +PDEVICE_OBJECT +FileDiskDeleteDevice ( + IN PDEVICE_OBJECT DeviceObject +); + +NTSTATUS +FileDiskCreateClose ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp +); + +NTSTATUS +FileDiskReadWrite ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp +); + +NTSTATUS +FileDiskDeviceControl ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp +); + +VOID +FileDiskThread ( + IN PVOID Context +); + +NTSTATUS +FileDiskOpenFile ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp +); + +NTSTATUS +FileDiskCloseFile ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp +); + +NTSTATUS +FileDiskAdjustPrivilege ( + IN ULONG Privilege, + IN BOOLEAN Enable +); + +int swprintf(wchar_t *, const wchar_t *, ...); + +#pragma code_seg("INIT") + +NTSTATUS +DriverEntry ( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath + ) +{ + UNICODE_STRING parameter_path; + RTL_QUERY_REGISTRY_TABLE query_table[2]; + ULONG n_devices; + NTSTATUS status; + UNICODE_STRING device_dir_name; + OBJECT_ATTRIBUTES object_attributes; + ULONG n; + USHORT n_created_devices; + + parameter_path.Length = 0; + + parameter_path.MaximumLength = RegistryPath->Length + sizeof(PARAMETER_KEY); + + parameter_path.Buffer = (PWSTR) ExAllocatePool(PagedPool, parameter_path.MaximumLength); + + if (parameter_path.Buffer == NULL) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + RtlCopyUnicodeString(¶meter_path, RegistryPath); + + RtlAppendUnicodeToString(¶meter_path, PARAMETER_KEY); + + RtlZeroMemory(&query_table[0], sizeof(query_table)); + + query_table[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; + query_table[0].Name = NUMBEROFDEVICES_VALUE; + query_table[0].EntryContext = &n_devices; + + status = RtlQueryRegistryValues( + RTL_REGISTRY_ABSOLUTE, + parameter_path.Buffer, + &query_table[0], + NULL, + NULL + ); + + ExFreePool(parameter_path.Buffer); + + if (!NT_SUCCESS(status)) + { + KdPrint(("FileDisk: Query registry failed, using default values.\n")); + n_devices = DEFAULT_NUMBEROFDEVICES; + } + + RtlInitUnicodeString(&device_dir_name, DEVICE_DIR_NAME); + + InitializeObjectAttributes( + &object_attributes, + &device_dir_name, + OBJ_PERMANENT, + NULL, + NULL + ); + + status = ZwCreateDirectoryObject( + &dir_handle, + DIRECTORY_ALL_ACCESS, + &object_attributes + ); + + if (!NT_SUCCESS(status)) + { + return status; + } + + ZwMakeTemporaryObject(dir_handle); + + for (n = 0, n_created_devices = 0; n < n_devices; n++) + { + status = FileDiskCreateDevice(DriverObject, n, FILE_DEVICE_DISK); + + if (NT_SUCCESS(status)) + { + n_created_devices++; + } + } + + for (n = 0; n < n_devices; n++) + { + status = FileDiskCreateDevice(DriverObject, n, FILE_DEVICE_CD_ROM); + + if (NT_SUCCESS(status)) + { + n_created_devices++; + } + } + + if (n_created_devices == 0) + { + ZwClose(dir_handle); + return status; + } + + DriverObject->MajorFunction[IRP_MJ_CREATE] = FileDiskCreateClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = FileDiskCreateClose; + DriverObject->MajorFunction[IRP_MJ_READ] = FileDiskReadWrite; + DriverObject->MajorFunction[IRP_MJ_WRITE] = FileDiskReadWrite; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FileDiskDeviceControl; + + DriverObject->DriverUnload = FileDiskUnload; + + return STATUS_SUCCESS; +} + +NTSTATUS +FileDiskCreateDevice ( + IN PDRIVER_OBJECT DriverObject, + IN ULONG Number, + IN DEVICE_TYPE DeviceType + ) +{ + WCHAR device_name_buffer[MAXIMUM_FILENAME_LENGTH]; + UNICODE_STRING device_name; + NTSTATUS status; + PDEVICE_OBJECT device_object; + PDEVICE_EXTENSION device_extension; + HANDLE thread_handle; + + ASSERT(DriverObject != NULL); + + if (DeviceType == FILE_DEVICE_CD_ROM) + { + swprintf( + device_name_buffer, + DEVICE_NAME_PREFIX L"Cd" L"%u", + Number + ); + } + else + { + swprintf( + device_name_buffer, + DEVICE_NAME_PREFIX L"%u", + Number + ); + } + + RtlInitUnicodeString(&device_name, device_name_buffer); + + status = IoCreateDevice( + DriverObject, + sizeof(DEVICE_EXTENSION), + &device_name, + DeviceType, + 0, + FALSE, + &device_object + ); + + if (!NT_SUCCESS(status)) + { + return status; + } + + device_object->Flags |= DO_DIRECT_IO; + + device_extension = (PDEVICE_EXTENSION) device_object->DeviceExtension; + + device_extension->media_in_device = FALSE; + + if (DeviceType == FILE_DEVICE_CD_ROM) + { + device_object->Characteristics |= FILE_READ_ONLY_DEVICE; + device_extension->read_only = TRUE; + } + + InitializeListHead(&device_extension->list_head); + + KeInitializeSpinLock(&device_extension->list_lock); + + KeInitializeEvent( + &device_extension->request_event, + SynchronizationEvent, + FALSE + ); + + device_extension->terminate_thread = FALSE; + + status = PsCreateSystemThread( + &thread_handle, + (ACCESS_MASK) 0L, + NULL, + NULL, + NULL, + FileDiskThread, + device_object + ); + + if (!NT_SUCCESS(status)) + { + IoDeleteDevice(device_object); + return status; + } + + status = ObReferenceObjectByHandle( + thread_handle, + THREAD_ALL_ACCESS, + NULL, + KernelMode, + &device_extension->thread_pointer, + NULL + ); + + if (!NT_SUCCESS(status)) + { + ZwClose(thread_handle); + + device_extension->terminate_thread = TRUE; + + KeSetEvent( + &device_extension->request_event, + (KPRIORITY) 0, + FALSE + ); + + IoDeleteDevice(device_object); + + return status; + } + + ZwClose(thread_handle); + + return STATUS_SUCCESS; +} + +#pragma code_seg("PAGE") + +VOID +FileDiskUnload ( + IN PDRIVER_OBJECT DriverObject + ) +{ + PDEVICE_OBJECT device_object; + + PAGED_CODE(); + + device_object = DriverObject->DeviceObject; + + while (device_object) + { + device_object = FileDiskDeleteDevice(device_object); + } + + ZwClose(dir_handle); +} + +PDEVICE_OBJECT +FileDiskDeleteDevice ( + IN PDEVICE_OBJECT DeviceObject + ) +{ + PDEVICE_EXTENSION device_extension; + PDEVICE_OBJECT next_device_object; + + PAGED_CODE(); + + ASSERT(DeviceObject != NULL); + + device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension; + + device_extension->terminate_thread = TRUE; + + KeSetEvent( + &device_extension->request_event, + (KPRIORITY) 0, + FALSE + ); + + KeWaitForSingleObject( + device_extension->thread_pointer, + Executive, + KernelMode, + FALSE, + NULL + ); + + ObDereferenceObject(device_extension->thread_pointer); + + if (device_extension->security_client_context != NULL) + { + SeDeleteClientSecurity(device_extension->security_client_context); + ExFreePool(device_extension->security_client_context); + } + + next_device_object = DeviceObject->NextDevice; + + IoDeleteDevice(DeviceObject); + + return next_device_object; +} + +NTSTATUS +FileDiskCreateClose ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PAGED_CODE(); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = FILE_OPENED; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + +#pragma code_seg() + +NTSTATUS +FileDiskReadWrite ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PDEVICE_EXTENSION device_extension; + PIO_STACK_LOCATION io_stack; + + device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension; + + if (!device_extension->media_in_device) + { + Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_NO_MEDIA_IN_DEVICE; + } + + io_stack = IoGetCurrentIrpStackLocation(Irp); + + if (io_stack->Parameters.Read.Length == 0) + { + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; + } + + IoMarkIrpPending(Irp); + + ExInterlockedInsertTailList( + &device_extension->list_head, + &Irp->Tail.Overlay.ListEntry, + &device_extension->list_lock + ); + + KeSetEvent( + &device_extension->request_event, + (KPRIORITY) 0, + FALSE + ); + + return STATUS_PENDING; +} + +NTSTATUS +FileDiskDeviceControl ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PDEVICE_EXTENSION device_extension; + PIO_STACK_LOCATION io_stack; + NTSTATUS status; + + device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension; + + io_stack = IoGetCurrentIrpStackLocation(Irp); + + if (!device_extension->media_in_device && + io_stack->Parameters.DeviceIoControl.IoControlCode != + IOCTL_FILE_DISK_OPEN_FILE) + { + Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_NO_MEDIA_IN_DEVICE; + } + + switch (io_stack->Parameters.DeviceIoControl.IoControlCode) + { + case IOCTL_FILE_DISK_OPEN_FILE: + { + SECURITY_QUALITY_OF_SERVICE security_quality_of_service; + + if (device_extension->media_in_device) + { + KdPrint(("FileDisk: IOCTL_FILE_DISK_OPEN_FILE: Media already opened\n")); + + status = STATUS_INVALID_DEVICE_REQUEST; + Irp->IoStatus.Information = 0; + break; + } + + if (io_stack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(OPEN_FILE_INFORMATION)) + { + status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } + + if (io_stack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(OPEN_FILE_INFORMATION) + + ((POPEN_FILE_INFORMATION)Irp->AssociatedIrp.SystemBuffer)->FileNameLength - + sizeof(UCHAR)) + { + status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } + + if (device_extension->security_client_context != NULL) + { + SeDeleteClientSecurity(device_extension->security_client_context); + } + else + { + device_extension->security_client_context = + ExAllocatePool(NonPagedPool, sizeof(SECURITY_CLIENT_CONTEXT)); + } + + RtlZeroMemory(&security_quality_of_service, sizeof(SECURITY_QUALITY_OF_SERVICE)); + + security_quality_of_service.Length = sizeof(SECURITY_QUALITY_OF_SERVICE); + security_quality_of_service.ImpersonationLevel = SecurityImpersonation; + security_quality_of_service.ContextTrackingMode = SECURITY_STATIC_TRACKING; + security_quality_of_service.EffectiveOnly = FALSE; + + SeCreateClientSecurity( + PsGetCurrentThread(), + &security_quality_of_service, + FALSE, + device_extension->security_client_context + ); + + IoMarkIrpPending(Irp); + + ExInterlockedInsertTailList( + &device_extension->list_head, + &Irp->Tail.Overlay.ListEntry, + &device_extension->list_lock + ); + + KeSetEvent( + &device_extension->request_event, + (KPRIORITY) 0, + FALSE + ); + + status = STATUS_PENDING; + + break; + } + + case IOCTL_FILE_DISK_CLOSE_FILE: + { + IoMarkIrpPending(Irp); + + ExInterlockedInsertTailList( + &device_extension->list_head, + &Irp->Tail.Overlay.ListEntry, + &device_extension->list_lock + ); + + KeSetEvent( + &device_extension->request_event, + (KPRIORITY) 0, + FALSE + ); + + status = STATUS_PENDING; + + break; + } + + case IOCTL_FILE_DISK_QUERY_FILE: + { + POPEN_FILE_INFORMATION open_file_information; + + if (io_stack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(OPEN_FILE_INFORMATION) + device_extension->file_name.Length - sizeof(UCHAR)) + { + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = 0; + break; + } + + open_file_information = (POPEN_FILE_INFORMATION) Irp->AssociatedIrp.SystemBuffer; + + open_file_information->FileSize.QuadPart = device_extension->file_size.QuadPart; + open_file_information->ReadOnly = device_extension->read_only; + open_file_information->FileNameLength = device_extension->file_name.Length; + + RtlCopyMemory( + open_file_information->FileName, + device_extension->file_name.Buffer, + device_extension->file_name.Length + ); + + status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(OPEN_FILE_INFORMATION) + + open_file_information->FileNameLength - sizeof(UCHAR); + + break; + } + + case IOCTL_DISK_CHECK_VERIFY: + case IOCTL_CDROM_CHECK_VERIFY: + case IOCTL_STORAGE_CHECK_VERIFY: + case IOCTL_STORAGE_CHECK_VERIFY2: + { + status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + break; + } + + case IOCTL_DISK_GET_DRIVE_GEOMETRY: + case IOCTL_CDROM_GET_DRIVE_GEOMETRY: + { + PDISK_GEOMETRY disk_geometry; + ULONGLONG length; + + if (io_stack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(DISK_GEOMETRY)) + { + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = 0; + break; + } + + disk_geometry = (PDISK_GEOMETRY) Irp->AssociatedIrp.SystemBuffer; + + length = device_extension->file_size.QuadPart; + + disk_geometry->Cylinders.QuadPart = length / SECTOR_SIZE / 32 / 2; + disk_geometry->MediaType = FixedMedia; + disk_geometry->TracksPerCylinder = 2; + disk_geometry->SectorsPerTrack = 32; + disk_geometry->BytesPerSector = SECTOR_SIZE; + + status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(DISK_GEOMETRY); + + break; + } + + case IOCTL_DISK_GET_LENGTH_INFO: + { + PGET_LENGTH_INFORMATION get_length_information; + + if (io_stack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(GET_LENGTH_INFORMATION)) + { + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = 0; + break; + } + + get_length_information = (PGET_LENGTH_INFORMATION) Irp->AssociatedIrp.SystemBuffer; + + get_length_information->Length.QuadPart = device_extension->file_size.QuadPart; + + status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(GET_LENGTH_INFORMATION); + + break; + } + + case IOCTL_DISK_GET_PARTITION_INFO: + { + PPARTITION_INFORMATION partition_information; + ULONGLONG length; + + if (io_stack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(PARTITION_INFORMATION)) + { + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = 0; + break; + } + + partition_information = (PPARTITION_INFORMATION) Irp->AssociatedIrp.SystemBuffer; + + length = device_extension->file_size.QuadPart; + + partition_information->StartingOffset.QuadPart = 0; + partition_information->PartitionLength.QuadPart = length; + partition_information->HiddenSectors = 1; + partition_information->PartitionNumber = 0; + partition_information->PartitionType = 0; + partition_information->BootIndicator = FALSE; + partition_information->RecognizedPartition = FALSE; + partition_information->RewritePartition = FALSE; + + status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION); + + break; + } + + case IOCTL_DISK_GET_PARTITION_INFO_EX: + { + PPARTITION_INFORMATION_EX partition_information_ex; + ULONGLONG length; + + if (io_stack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(PARTITION_INFORMATION_EX)) + { + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = 0; + break; + } + + partition_information_ex = (PPARTITION_INFORMATION_EX) Irp->AssociatedIrp.SystemBuffer; + + length = device_extension->file_size.QuadPart; + + partition_information_ex->PartitionStyle = PARTITION_STYLE_MBR; + partition_information_ex->StartingOffset.QuadPart = 0; + partition_information_ex->PartitionLength.QuadPart = length; + partition_information_ex->PartitionNumber = 0; + partition_information_ex->RewritePartition = FALSE; + partition_information_ex->Mbr.PartitionType = 0; + partition_information_ex->Mbr.BootIndicator = FALSE; + partition_information_ex->Mbr.RecognizedPartition = FALSE; + partition_information_ex->Mbr.HiddenSectors = 1; + + status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION_EX); + + break; + } + + case IOCTL_DISK_IS_WRITABLE: + { + if (!device_extension->read_only) + { + status = STATUS_SUCCESS; + } + else + { + status = STATUS_MEDIA_WRITE_PROTECTED; + } + Irp->IoStatus.Information = 0; + break; + } + + case IOCTL_DISK_MEDIA_REMOVAL: + case IOCTL_STORAGE_MEDIA_REMOVAL: + { + status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + break; + } + + case IOCTL_CDROM_READ_TOC: + { + PCDROM_TOC cdrom_toc; + + if (io_stack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(CDROM_TOC)) + { + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = 0; + break; + } + + cdrom_toc = (PCDROM_TOC) Irp->AssociatedIrp.SystemBuffer; + + RtlZeroMemory(cdrom_toc, sizeof(CDROM_TOC)); + + cdrom_toc->FirstTrack = 1; + cdrom_toc->LastTrack = 1; + cdrom_toc->TrackData[0].Control = TOC_DATA_TRACK; + + status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(CDROM_TOC); + + break; + } + + case IOCTL_DISK_SET_PARTITION_INFO: + { + if (device_extension->read_only) + { + status = STATUS_MEDIA_WRITE_PROTECTED; + Irp->IoStatus.Information = 0; + break; + } + + if (io_stack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(SET_PARTITION_INFORMATION)) + { + status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } + + status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + break; + } + + case IOCTL_DISK_VERIFY: + { + PVERIFY_INFORMATION verify_information; + + if (io_stack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(VERIFY_INFORMATION)) + { + status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } + + verify_information = (PVERIFY_INFORMATION) Irp->AssociatedIrp.SystemBuffer; + + status = STATUS_SUCCESS; + Irp->IoStatus.Information = verify_information->Length; + + break; + } + + default: + { + KdPrint(( + "FileDisk: Unknown IoControlCode %#x\n", + io_stack->Parameters.DeviceIoControl.IoControlCode + )); + + status = STATUS_INVALID_DEVICE_REQUEST; + Irp->IoStatus.Information = 0; + } + } + + if (status != STATUS_PENDING) + { + Irp->IoStatus.Status = status; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + + return status; +} + +VOID +FileDiskThread ( + IN PVOID Context + ) +{ + PDEVICE_OBJECT device_object; + PDEVICE_EXTENSION device_extension; + PLIST_ENTRY request; + PIRP irp; + PIO_STACK_LOCATION io_stack; + PUCHAR system_buffer; + PUCHAR buffer; + + ASSERT(Context != NULL); + + device_object = (PDEVICE_OBJECT) Context; + + device_extension = (PDEVICE_EXTENSION) device_object->DeviceExtension; + + KeSetPriorityThread(KeGetCurrentThread(), LOW_REALTIME_PRIORITY); + + FileDiskAdjustPrivilege(SE_IMPERSONATE_PRIVILEGE, TRUE); + + for (;;) + { + KeWaitForSingleObject( + &device_extension->request_event, + Executive, + KernelMode, + FALSE, + NULL + ); + + if (device_extension->terminate_thread) + { + PsTerminateSystemThread(STATUS_SUCCESS); + } + + while (request = ExInterlockedRemoveHeadList( + &device_extension->list_head, + &device_extension->list_lock + )) + { + irp = CONTAINING_RECORD(request, IRP, Tail.Overlay.ListEntry); + + io_stack = IoGetCurrentIrpStackLocation(irp); + + switch (io_stack->MajorFunction) + { + case IRP_MJ_READ: + system_buffer = (PUCHAR) MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); + if (system_buffer == NULL) + { + irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + irp->IoStatus.Information = 0; + break; + } + buffer = (PUCHAR) ExAllocatePool(PagedPool, io_stack->Parameters.Read.Length); + if (buffer == NULL) + { + irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + irp->IoStatus.Information = 0; + break; + } + ZwReadFile( + device_extension->file_handle, + NULL, + NULL, + NULL, + &irp->IoStatus, + buffer, + io_stack->Parameters.Read.Length, + &io_stack->Parameters.Read.ByteOffset, + NULL + ); + RtlCopyMemory(system_buffer, buffer, io_stack->Parameters.Read.Length); + ExFreePool(buffer); + break; + + case IRP_MJ_WRITE: + if ((io_stack->Parameters.Write.ByteOffset.QuadPart + + io_stack->Parameters.Write.Length) > + device_extension->file_size.QuadPart) + { + irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + irp->IoStatus.Information = 0; + } + ZwWriteFile( + device_extension->file_handle, + NULL, + NULL, + NULL, + &irp->IoStatus, + MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority), + io_stack->Parameters.Write.Length, + &io_stack->Parameters.Write.ByteOffset, + NULL + ); + break; + + case IRP_MJ_DEVICE_CONTROL: + switch (io_stack->Parameters.DeviceIoControl.IoControlCode) + { + case IOCTL_FILE_DISK_OPEN_FILE: + + SeImpersonateClient(device_extension->security_client_context, NULL); + + irp->IoStatus.Status = FileDiskOpenFile(device_object, irp); + + PsRevertToSelf(); + + break; + + case IOCTL_FILE_DISK_CLOSE_FILE: + irp->IoStatus.Status = FileDiskCloseFile(device_object, irp); + break; + + default: + irp->IoStatus.Status = STATUS_DRIVER_INTERNAL_ERROR; + } + break; + + default: + irp->IoStatus.Status = STATUS_DRIVER_INTERNAL_ERROR; + } + + IoCompleteRequest( + irp, + (CCHAR) (NT_SUCCESS(irp->IoStatus.Status) ? + IO_DISK_INCREMENT : IO_NO_INCREMENT) + ); + } + } +} + +#pragma code_seg("PAGE") + +NTSTATUS +FileDiskOpenFile ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PDEVICE_EXTENSION device_extension; + POPEN_FILE_INFORMATION open_file_information; + UNICODE_STRING ufile_name; + NTSTATUS status; + OBJECT_ATTRIBUTES object_attributes; + FILE_END_OF_FILE_INFORMATION file_eof; + FILE_BASIC_INFORMATION file_basic; + FILE_STANDARD_INFORMATION file_standard; + FILE_ALIGNMENT_INFORMATION file_alignment; + + PAGED_CODE(); + + ASSERT(DeviceObject != NULL); + ASSERT(Irp != NULL); + + device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension; + + open_file_information = (POPEN_FILE_INFORMATION) Irp->AssociatedIrp.SystemBuffer; + + if (DeviceObject->DeviceType != FILE_DEVICE_CD_ROM) + { + device_extension->read_only = open_file_information->ReadOnly; + } + + device_extension->file_name.Length = open_file_information->FileNameLength; + device_extension->file_name.MaximumLength = open_file_information->FileNameLength; + device_extension->file_name.Buffer = ExAllocatePool(NonPagedPool, open_file_information->FileNameLength); + + RtlCopyMemory( + device_extension->file_name.Buffer, + open_file_information->FileName, + open_file_information->FileNameLength + ); + + status = RtlAnsiStringToUnicodeString( + &ufile_name, + &device_extension->file_name, + TRUE + ); + + if (!NT_SUCCESS(status)) + { + ExFreePool(device_extension->file_name.Buffer); + Irp->IoStatus.Status = status; + Irp->IoStatus.Information = 0; + return status; + } + + InitializeObjectAttributes( + &object_attributes, + &ufile_name, + OBJ_CASE_INSENSITIVE, + NULL, + NULL + ); + + status = ZwCreateFile( + &device_extension->file_handle, + device_extension->read_only ? GENERIC_READ : GENERIC_READ | GENERIC_WRITE, + &object_attributes, + &Irp->IoStatus, + NULL, + FILE_ATTRIBUTE_NORMAL, + device_extension->read_only ? FILE_SHARE_READ : 0, + FILE_OPEN, + FILE_NON_DIRECTORY_FILE | + FILE_RANDOM_ACCESS | + FILE_NO_INTERMEDIATE_BUFFERING | + FILE_SYNCHRONOUS_IO_NONALERT, + NULL, + 0 + ); + + if (status == STATUS_OBJECT_NAME_NOT_FOUND || status == STATUS_NO_SUCH_FILE) + { + if (device_extension->read_only || open_file_information->FileSize.QuadPart == 0) + { + ExFreePool(device_extension->file_name.Buffer); + RtlFreeUnicodeString(&ufile_name); + + Irp->IoStatus.Status = STATUS_NO_SUCH_FILE; + Irp->IoStatus.Information = 0; + + return STATUS_NO_SUCH_FILE; + } + else + { + status = ZwCreateFile( + &device_extension->file_handle, + GENERIC_READ | GENERIC_WRITE, + &object_attributes, + &Irp->IoStatus, + &open_file_information->FileSize, + FILE_ATTRIBUTE_NORMAL, + 0, + FILE_OPEN_IF, + FILE_NON_DIRECTORY_FILE | + FILE_RANDOM_ACCESS | + FILE_NO_INTERMEDIATE_BUFFERING | + FILE_SYNCHRONOUS_IO_NONALERT, + NULL, + 0 + ); + + if (!NT_SUCCESS(status)) + { + ExFreePool(device_extension->file_name.Buffer); + RtlFreeUnicodeString(&ufile_name); + return status; + } + + if (Irp->IoStatus.Information == FILE_CREATED) + { + file_eof.EndOfFile.QuadPart = open_file_information->FileSize.QuadPart; + + status = ZwSetInformationFile( + device_extension->file_handle, + &Irp->IoStatus, + &file_eof, + sizeof(FILE_END_OF_FILE_INFORMATION), + FileEndOfFileInformation + ); + + if (!NT_SUCCESS(status)) + { + ExFreePool(device_extension->file_name.Buffer); + RtlFreeUnicodeString(&ufile_name); + ZwClose(device_extension->file_handle); + return status; + } + } + } + } + else if (!NT_SUCCESS(status)) + { + ExFreePool(device_extension->file_name.Buffer); + RtlFreeUnicodeString(&ufile_name); + return status; + } + + RtlFreeUnicodeString(&ufile_name); + + status = ZwQueryInformationFile( + device_extension->file_handle, + &Irp->IoStatus, + &file_basic, + sizeof(FILE_BASIC_INFORMATION), + FileBasicInformation + ); + + if (!NT_SUCCESS(status)) + { + ExFreePool(device_extension->file_name.Buffer); + ZwClose(device_extension->file_handle); + return status; + } + +/* + // + // The NT cache manager can deadlock if a filesystem that is using the cache + // manager is used in a virtual disk that stores its file on a filesystem + // that is also using the cache manager, this is why we open the file with + // FILE_NO_INTERMEDIATE_BUFFERING above, however if the file is compressed + // or encrypted NT will not honor this request and cache it anyway since it + // need to store the decompressed/unencrypted data somewhere, therefor we put + // an extra check here and don't alow disk images to be compressed/encrypted. + // + if (file_basic.FileAttributes & (FILE_ATTRIBUTE_COMPRESSED | FILE_ATTRIBUTE_ENCRYPTED)) + { + ExFreePool(device_extension->file_name.Buffer); + ZwClose(device_extension->file_handle); + Irp->IoStatus.Status = STATUS_ACCESS_DENIED; + Irp->IoStatus.Information = 0; + return STATUS_ACCESS_DENIED; + } +*/ + + status = ZwQueryInformationFile( + device_extension->file_handle, + &Irp->IoStatus, + &file_standard, + sizeof(FILE_STANDARD_INFORMATION), + FileStandardInformation + ); + + if (!NT_SUCCESS(status)) + { + ExFreePool(device_extension->file_name.Buffer); + ZwClose(device_extension->file_handle); + return status; + } + + device_extension->file_size.QuadPart = file_standard.EndOfFile.QuadPart; + + status = ZwQueryInformationFile( + device_extension->file_handle, + &Irp->IoStatus, + &file_alignment, + sizeof(FILE_ALIGNMENT_INFORMATION), + FileAlignmentInformation + ); + + if (!NT_SUCCESS(status)) + { + ExFreePool(device_extension->file_name.Buffer); + ZwClose(device_extension->file_handle); + return status; + } + + DeviceObject->AlignmentRequirement = file_alignment.AlignmentRequirement; + + if (device_extension->read_only) + { + DeviceObject->Characteristics |= FILE_READ_ONLY_DEVICE; + } + else + { + DeviceObject->Characteristics &= ~FILE_READ_ONLY_DEVICE; + } + + device_extension->media_in_device = TRUE; + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + return STATUS_SUCCESS; +} + +NTSTATUS +FileDiskCloseFile ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PDEVICE_EXTENSION device_extension; + + PAGED_CODE(); + + ASSERT(DeviceObject != NULL); + ASSERT(Irp != NULL); + + device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension; + + ExFreePool(device_extension->file_name.Buffer); + + ZwClose(device_extension->file_handle); + + device_extension->media_in_device = FALSE; + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + return STATUS_SUCCESS; +} + +NTSTATUS +FileDiskAdjustPrivilege ( + IN ULONG Privilege, + IN BOOLEAN Enable + ) +{ + NTSTATUS status; + HANDLE token_handle; + TOKEN_PRIVILEGES token_privileges; + + PAGED_CODE(); + + status = ZwOpenProcessToken( + NtCurrentProcess(), + TOKEN_ALL_ACCESS, + &token_handle + ); + + if (!NT_SUCCESS(status)) + { + return status; + } + + token_privileges.PrivilegeCount = 1; + token_privileges.Privileges[0].Luid = RtlConvertUlongToLuid(Privilege); + token_privileges.Privileges[0].Attributes = Enable ? SE_PRIVILEGE_ENABLED : 0; + + // + // Normaly one would use ZwAdjustPrivilegesToken but it is only available + // on Windows 2000 and later versions, however since we are in a system + // thread does ExGetPreviousMode always return KernelMode and therefore + // can NtAdjustPrivilegesToken be used directly. + // + status = NtAdjustPrivilegesToken( + token_handle, + FALSE, + &token_privileges, + sizeof(token_privileges), + NULL, + NULL + ); + + ZwClose(token_handle); + + return status; +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/filedisk/sys/src/filedisk.rc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/filedisk/sys/src/filedisk.rc Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,104 @@ +//Microsoft Developer Studio generated resource script. +// + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,14 + PRODUCTVERSION 1,0,0,14 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x3L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Bo Brantén\0" + VALUE "FileDescription", "FileDisk Virtual Disk Driver\0" + VALUE "FileVersion", "1.0.0.14\0" + VALUE "InternalName", "filedisk\0" + VALUE "LegalCopyright", "Copyright © 1999-2006 Bo Brantén\0" + VALUE "OriginalFilename", "filedisk.sys\0" + VALUE "ProductName", "filedisk\0" + VALUE "ProductVersion", "1.0.0.14\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/antlibs/ant-antunit-1.1.jar Binary file buildframework/helium/external/helium-antlib/antlibs/ant-antunit-1.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/antlibs/ant-contrib-1.0b2.jar Binary file buildframework/helium/external/helium-antlib/antlibs/ant-contrib-1.0b2.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/antlibs/emma.jar Binary file buildframework/helium/external/helium-antlib/antlibs/emma.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/antlibs/emma_ant.jar Binary file buildframework/helium/external/helium-antlib/antlibs/emma_ant.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/antlibs/fmpp-0.9.13.jar Binary file buildframework/helium/external/helium-antlib/antlibs/fmpp-0.9.13.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/antlibs/junit-4.5.jar Binary file buildframework/helium/external/helium-antlib/antlibs/junit-4.5.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/antlibs/velocity-dep-1.3.1.jar Binary file buildframework/helium/external/helium-antlib/antlibs/velocity-dep-1.3.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/antlibs/xmlunit-1.2.jar Binary file buildframework/helium/external/helium-antlib/antlibs/xmlunit-1.2.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/bin/helium-core.jar Binary file buildframework/helium/external/helium-antlib/bin/helium-core.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/bin/helium-diamonds.jar Binary file buildframework/helium/external/helium-antlib/bin/helium-diamonds.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/bin/helium-metadata.jar Binary file buildframework/helium/external/helium-antlib/bin/helium-metadata.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/bin/helium-quality.jar Binary file buildframework/helium/external/helium-antlib/bin/helium-quality.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/bin/helium-scm.jar Binary file buildframework/helium/external/helium-antlib/bin/helium-scm.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/bin/helium-signaling.jar Binary file buildframework/helium/external/helium-antlib/bin/helium-signaling.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/bld.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/bld.bat Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,61 @@ +@echo off + +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of the License "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: +rem + +setlocal +if not defined JAVA_6_HOME ( +set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02 +) ELSE set TESTED_JAVA=%JAVA_6_HOME% +if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%) + +REM Configure Ant +if not defined TESTED_ANT_HOME ( +set TESTED_ANT_HOME=C:\Apps\ant_1.7 +) +if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%) + +REM Configure the expected Ant Version details below +SET expMajorVer=1 +SET expMinorVer=7 + +rem *** Verify Ant Version *** +rem -- Run the 'ant -version' command and capture the output to a variable +for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a) +echo *** Installed Version : %antversion% + +rem -- Parse the version string obtained above and get the version number +for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a +rem -- Parse the version number delimiting the '.' and set the major and +rem minor versions +for /f "tokens=1-2 delims=." %%a in ("%val%") do ( +set /A majorVersion=%%a +set /A minorVersion=%%b +) +rem -- Check whether major version is greater than or equal to the expected. +if %majorVersion% geq %expMajorVer% ( +rem -- if major version is valid, check minor version. If minor version is less +rem than expected display message and abort the execution. +if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) +) + +set ANT_ARGS=-lib antlibs -lib lib -lib core/lib -lib diamonds/lib -lib scm/lib +ant %* +endlocal + +:errorstop +@echo *** Build aborted with error +exit /b 1 \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/bld.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/bld.sh Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,23 @@ +#!/bin/csh + +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +module load java/1.6.0 +module load "tww/ant/1.7.1" +module load mercurial +setenv ANT_ARGS "-lib antlibs -lib lib" +ant $* diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/build.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/build.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,74 @@ + + + + Helium Antlib build file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/bld.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/bld.bat Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,60 @@ +@echo off + +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of the License "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: +rem + +setlocal +if not defined JAVA_6_HOME ( +set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02 +) ELSE set TESTED_JAVA=%JAVA_6_HOME% +if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%) + +REM Configure Ant +if not defined TESTED_ANT_HOME ( +set TESTED_ANT_HOME=C:\Apps\ant_1.7 +) +if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%) + +REM Configure the expected Ant Version details below +SET expMajorVer=1 +SET expMinorVer=7 + +rem *** Verify Ant Version *** +rem -- Run the 'ant -version' command and capture the output to a variable +for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a) +echo *** Installed Version : %antversion% + +rem -- Parse the version string obtained above and get the version number +for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a +rem -- Parse the version number delimiting the '.' and set the major and +rem minor versions +for /f "tokens=1-2 delims=." %%a in ("%val%") do ( +set /A majorVersion=%%a +set /A minorVersion=%%b +) +rem -- Check whether major version is greater than or equal to the expected. +if %majorVersion% geq %expMajorVer% ( +rem -- if major version is valid, check minor version. If minor version is less +rem than expected display message and abort the execution. +if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) +) + +ant %* +endlocal + +:errorstop +@echo *** Build aborted with error +exit /b 1 \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/build.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/build.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,36 @@ + + + + Helium Antlib Core build file. + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/lib/jakarta-oro-2.0.8.jar Binary file buildframework/helium/external/helium-antlib/core/lib/jakarta-oro-2.0.8.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/AbstractTemplateInputSource.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/AbstractTemplateInputSource.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,45 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core; + +/** + * Implements the source name handling. + */ +public abstract class AbstractTemplateInputSource implements + TemplateInputSource { + + private String sourceName; + /** + * Get template source name. + * @return + * template source name. + */ + public String getSourceName() { + return sourceName; + } + /** + * Add template source name + * @param String + * template source name + */ + public void setSourceName(String souceName) { + this.sourceName = souceName; + } + +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/EmailDataSender.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/EmailDataSender.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,357 @@ +/* + * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the License "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +package com.nokia.helium.core; + +import java.util.Arrays; +import java.util.Properties; +import java.util.Hashtable; +import java.util.zip.GZIPOutputStream; +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import javax.mail.*; +import javax.mail.internet.*; +import javax.naming.*; +import javax.naming.directory.*; + +import javax.activation.DataHandler; +import javax.mail.util.ByteArrayDataSource; +import org.apache.log4j.Logger; +import org.apache.commons.io.FileUtils; + +/** + * Send compressed or uncompressed xml data with email. + */ +public class EmailDataSender { + + // Logger + private static Logger log = Logger.getLogger(EmailDataSender.class); + + // Address email is sent from + private String from; + + // The target address + private String[] toAddressList; + + // LDAP config + private String ldapURL; + // TODO all reference to nokia internals MUST be removed. + private String rootdn = "o=Nokia"; + + // Configured smtp server address + private String smtpServerAddress; + /** + * Constructor + * + * @param String + * comma separeted email recepients list + * @param String + * smtp server + * @param String + * ldap server + */ + public EmailDataSender(String toStrings, String smtpServer, + String ldapAddress) { + if (toStrings != null) { + String[] splitList = toStrings.split(","); + toAddressList = splitList; + } + smtpServerAddress = smtpServer; + ldapURL = ldapAddress; + } + /** + * Constructor + * + * @param String + * email recepient list in array + * @param String + * smtp server + * @param String + * ldap server + */ + public EmailDataSender(String[] toList, String smtpServer, + String ldapAddress) { + toAddressList = toList; + smtpServerAddress = smtpServer; + ldapURL = ldapAddress; + } + /** + * Constructor + * + * @param String + * email recepients list in array + * @param String + * smtp server + * @param String + * ldap server + * @param String + * root domain in ldap server + */ + public EmailDataSender(String[] toList, String smtpServer, + String ldapAddress, String rootdn) { + toAddressList = toList; + smtpServerAddress = smtpServer; + ldapURL = ldapAddress; + this.rootdn = rootdn; + } + /** + * Set sender address. + * + * @param String + * mail sender address + */ + public void setFrom(String from) { + this.from = from; + } + /** + * Add current user to recipient list. + * + */ + public void addCurrentUserToAddressList() { + // Create an empty array if needed + if (toAddressList == null) + toAddressList = new String[0]; + try { + String userEmail; + userEmail = getUserEmail(); + toAddressList = Arrays.copyOf(toAddressList, + toAddressList.length + 1); + toAddressList[toAddressList.length - 1] = userEmail; + } catch (Exception e) { + return; + } + } + /** + * Get recipient address list. + * + * @return + * Recipient address list. + */ + private InternetAddress[] getToAddressList() { + int toListLength = 0; + if (toAddressList != null) + toListLength = toAddressList.length; + InternetAddress[] addressList = new InternetAddress[toListLength]; + try { + log.debug("EmailDataSender:getToAddressList:length: " + + toListLength); + for (int i = 0; i < toListLength; i++) { + log.debug("EmailDataSender:getToAddressList:address:" + + toAddressList[i]); + addressList[i] = new InternetAddress(toAddressList[i]); + } + } catch (Exception aex) { + log.error("EmailDataSender:AddressException: " + aex); + } + return addressList; + } + /** + * Send xml data without compression + * + * @param String + * purpose of this email + * @param String + * file to send + * @param String + * mime type + * @param String + * subject of email + * @param String + * header of email + */ + public void sendData(String purpose, String fileToSend, String mimeType, + String subject, String header) { + sendData(purpose, fileToSend, mimeType, subject, header, false); + } + + + /** + * Sending the XML data(compressed) through email. + * + * @param String + * purpose of this email + * @param String + * file to send + * @param String + * subject of email + * @param String + * header of email + */ + public void compresseAndSendData(String purpose, String fileToSend, + String subject, String header) { + sendData(purpose, fileToSend, null, subject, header, true); + } + /** + * Send xml data + * + * @param String + * purpose of this email + * @param String + * file to send + * @param String + * mime type + * @param String + * subject of email + * @param String + * header of mail + * @param boolean + * compress data if true + */ + public void sendData(String purpose, String fileToSend, String mimeType, + String subject, String header, boolean compressData) { + try { + log.debug("EmailDataSender:sendData:file: " + fileToSend); + log.debug("EmailDataSender:sendData:mimetype: " + mimeType); + if (fileToSend != null) { + log.debug("EmailDataSender:sendData:smtp address: " + + smtpServerAddress); + InternetAddress[] toAddresses = getToAddressList(); + Properties props = new Properties(); + props.setProperty("mail.smtp.host", smtpServerAddress); + Session mailSession = Session.getDefaultInstance(props, null); + MimeMessage message = new MimeMessage(mailSession); + String subjectToSend = subject; + if (subject == null) { + subjectToSend = ""; + } + message.setSubject(subjectToSend); + MimeMultipart multipart = new MimeMultipart("related"); + BodyPart messageBodyPart = new MimeBodyPart(); + ByteArrayDataSource dataSrc = null; + log.debug("EmailDataSender:sendData:Send file: " + fileToSend); + String fileName = new File(fileToSend).getName(); + if (compressData) { + log.debug("EmailDataSender: Sending compressed data"); + dataSrc = compressFile(fileToSend); + dataSrc.setName(fileName + ".gz"); + messageBodyPart.setFileName(fileName + ".gz"); + } else { + log.debug("EmailDataSender: Sending uncompressed data:"); + dataSrc = new ByteArrayDataSource(new FileInputStream( + new File(fileToSend)), mimeType); + + message.setContent(FileUtils.readFileToString(new File( + fileToSend)), "text/html"); + multipart = null; + } + String headerToSend = null; + if (header == null) { + headerToSend = ""; + } + messageBodyPart.setHeader("helium-bld-data", headerToSend); + messageBodyPart.setDataHandler(new DataHandler(dataSrc)); + + if (multipart != null) { + multipart.addBodyPart(messageBodyPart); // add to the + // multipart + message.setContent(multipart); + } + try { + InternetAddress fromAddress = getFromAddress(); + message.setFrom(fromAddress); + } catch (Exception e) { + log.debug("Error retrieving current user email address: " + e.getMessage()); + } + message.addRecipients(Message.RecipientType.TO, toAddresses); + log.info("Sending email alert: " + subject); + Transport.send(message); + } + } catch (Exception e) { + log.info("Not sending e-mail signal because of errors"); + log.debug("Failed sending e-mail: " + purpose + ": ", e); + } + } + + /** + * GZipping a string. + * + * @param data + * the content to be gzipped. + * @param filename + * the name for the file. + * @return a ByteArrayDataSource. + */ + protected ByteArrayDataSource compressFile(String fileName) + throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + GZIPOutputStream gz = new GZIPOutputStream(out); + BufferedInputStream bufferedInputStream = new BufferedInputStream( + new FileInputStream(new File(fileName))); + byte[] dataBuffer = new byte[512]; + while ((bufferedInputStream.read(dataBuffer)) != -1) { + gz.write(dataBuffer); + } + gz.close(); + bufferedInputStream.close(); + ByteArrayDataSource dataSrc = new ByteArrayDataSource( + out.toByteArray(), "application/x-gzip"); + return dataSrc; + } + /** + * Get sender address. + * + * @return + * sender address. + */ + private InternetAddress getFromAddress() throws Exception { + if (from != null) { + return new InternetAddress(from); + } + return new InternetAddress(getUserEmail()); + } + + /** + * Getting user email. + * + * @return + * the user email address. + */ + protected String getUserEmail() throws Exception { + String username = System.getProperty("user.name"); + log.debug("EmailDataSender:getUserEmail:username: " + username); + + // Set up environment for creating initial context + Hashtable env = new Hashtable(11); + env.put(Context.INITIAL_CONTEXT_FACTORY, + "com.sun.jndi.ldap.LdapCtxFactory"); + env.put(Context.PROVIDER_URL, ldapURL + "/" + rootdn); + + // Create initial context + DirContext ctx = new InitialDirContext(env); + SearchControls controls = new SearchControls(); + controls.setSearchScope(SearchControls.SUBTREE_SCOPE); + try { + NamingEnumeration en = ctx.search("", "uid=" + username, controls); + if (en.hasMore()) { + SearchResult sr = en.next(); + String email = (String) sr.getAttributes().get("mail").get(); + log.debug("EmailDataSender:getUserEmail:" + email); + return email; + } + } catch (javax.naming.NameNotFoundException ex) { + log.debug("EmailDataSender:username:" + username + "finding error"); + throw new HlmAntLibException("Error find user email"); + } + throw new HlmAntLibException("Could not find user email in LDAP."); + } +} + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/HlmAntLibException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/HlmAntLibException.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the License "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +package com.nokia.helium.core; + +/** + * HlmAntlib exception handling class + */ +public class HlmAntLibException extends RuntimeException { + + private static final long serialVersionUID = -2504337723465536053L; + + /** + * Constructor + * + * @param String + * exception message + */ + public HlmAntLibException(String msg) { + super("HlmAntLibException:generic:" + msg); + } + + /** + * Constructor + * + * @param String + * module which throws the exception + * @param String + * exception message + */ + public HlmAntLibException(String module, String msg) { + super("HlmAntLibException:" + module + ":" + msg); + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/LogSource.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/LogSource.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,36 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core; + +import java.io.File; + +import org.apache.tools.ant.types.DataType; + +/** + * This class is the base class for all types of logs + * + */ +public class LogSource extends DataType { + + public File getFilename() { + //will be implemented by subclasses + throw new HlmAntLibException("Improper logsource usage"); + } + +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/PPHash.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/PPHash.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,151 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import freemarker.template.ObjectWrapper; +import freemarker.template.SimpleCollection; +import freemarker.template.SimpleScalar; +import freemarker.template.TemplateCollectionModel; +import freemarker.template.TemplateHashModelEx; +import freemarker.template.TemplateModel; +import fmpp.Engine; +import fmpp.models.AddTransform; +import fmpp.models.ClearTransform; +import fmpp.models.CopyWritableVariableMethod; +import fmpp.models.NewWritableHashMethod; +import fmpp.models.NewWritableSequenceMethod; +import fmpp.models.RemoveTransform; +import fmpp.models.SetTransform; + +/** + * Downgraded implementation which makes the PPHash public (from FMPP). + */ +public class PPHash implements TemplateHashModelEx { + private Map map = new HashMap(); + + /** + * Constructor + * + */ + public PPHash() { + // transforms + put("set", new SetTransform()); + put("add", new AddTransform()); + put("remove", new RemoveTransform()); + put("clear", new ClearTransform()); + + // methods + put("newWritableSequence", new NewWritableSequenceMethod()); + put("newWritableHash", new NewWritableHashMethod()); + put("copyWritable", new CopyWritableVariableMethod()); + + // constants + put("slash", File.separator); + put("version", Engine.getVersionNumber()); + put("freemarkerVersion", Engine.getFreeMarkerVersionNumber()); + + } + /** + * Get number of templates. + * + * @return + * Number of templates. + */ + public int size() { + return map.size(); + } + + /** + * Get templates. + * + * @return + * templates. + */ + public TemplateCollectionModel keys() { + return new SimpleCollection(map.keySet(), ObjectWrapper.SIMPLE_WRAPPER); + } + + /** + * Get template values. + * + * @return + * template values. + */ + public TemplateCollectionModel values() { + return new SimpleCollection(map.values(), ObjectWrapper.SIMPLE_WRAPPER); + } + + /** + * Get a template. + * + * @param String + * key for template + * @return + * a template. + */ + public TemplateModel get(String key) { + return map.get(key); + } + + /** + * Check if there are any template. + * + * @return + * True if no template. + */ + public boolean isEmpty() { + return map.isEmpty(); + } + /** + * Add template + * + * @param String + * name of template + * @param TemplateModel + * value + */ + public void put(String name, TemplateModel value) { + map.put(name, value); + } + /** + * Add template + * + * @param String + * name of template + * @param String + * value + */ + public void put(String name, String value) { + map.put(name, new SimpleScalar(value)); + } + + /** + * Delete template + * + * @param String + * name of template + */ + public void remove(String name) { + map.remove(name); + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/PPInputSource.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/PPInputSource.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core; +/** + * Template source. + */ +public class PPInputSource implements TemplateInputSource { + + private String name = "pp"; + + /** + * Get source name + * + * @return + * name of source + */ + @Override + public String getSourceName() { + return name; + } + + /** + * Get hash + * + * @return + * hash + */ + public PPHash getPPHash() { + return new PPHash(); + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/PropertiesSource.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/PropertiesSource.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the License "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +package com.nokia.helium.core; + +import java.util.Hashtable; +import java.util.Map; +import java.util.Properties; +import java.util.Map.Entry; + +/** + * Property set configuration holder. Will make the defined properties available + * under a named variable. + */ +public class PropertiesSource extends AbstractTemplateInputSource { + private Map properties; + + /** + * Constructor + * + * @param String + * Name of template + * @param Hashtable + * properties + */ + public PropertiesSource(String name, Map props) { + setSourceName(name); + properties = props; + } + + /** + * Constructor + * + * @param String + * Name of template + * @param Properties + * properties + */ + public PropertiesSource(String name, Properties props) { + setSourceName(name); + properties = new Hashtable(); + for (Entry entry : props.entrySet()) { + properties.put((String) entry.getKey(), (String) entry.getValue()); + } + } + + /** + * Get properties. + * + * @return Properties. + */ + public Map getProperties() { + return properties; + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateInputSource.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateInputSource.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + +package com.nokia.helium.core; + +/** + * Generic interface between all input sources. + */ +public interface TemplateInputSource { + /** + * Get the name of the source inside the template. + * + * @return + * source name. + */ + String getSourceName(); +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateProcessor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateProcessor.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the License "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +package com.nokia.helium.core; + +import freemarker.template.Template; +import freemarker.template.Configuration; + +import java.io.FileWriter; +import java.io.File; +import java.util.List; +import java.util.HashMap; +import java.util.Map; +import org.apache.log4j.Logger; + +/** + * Template processor. + * + */ +public class TemplateProcessor { + + private Logger log = Logger.getLogger(TemplateProcessor.class); + + /** + * Create a Map of FreeMarker compatible data from the list of input source. + * + * @param inputSources + * @return + * @throws TemplateProcessorException + */ + private HashMap getTemplateMap( + List inputSources) { + HashMap templateMap = new HashMap(); + try { + for (TemplateInputSource source : inputSources) { + if (source instanceof XMLTemplateSource) { + XMLTemplateSource xmlSource = (XMLTemplateSource) source; + File inputFile = xmlSource.getSourceLocation(); + if (inputFile.exists()) { + templateMap.put(xmlSource.getSourceName(), + freemarker.ext.dom.NodeModel.parse(inputFile)); + } else { + log.debug("TemplateProcessor: input file " + inputFile + + " for the template does not exists"); + } + } else if (source instanceof PropertiesSource) { + PropertiesSource propSource = (PropertiesSource) source; + templateMap.put(propSource.getSourceName(), propSource + .getProperties()); + } else if (source instanceof PPInputSource) { + PPInputSource ppSource = (PPInputSource) source; + templateMap.put(ppSource.getSourceName(), ppSource + .getPPHash()); + } + } + } catch (java.io.IOException e) { + log.warn("I/O Error during template conversion: " + e.getMessage()); + throw new TemplateProcessorException( + "I/O Error during template conversion: " + e.getMessage()); + } catch (org.xml.sax.SAXException e1) { + log.warn("XML parser error: " + e1); + throw new TemplateProcessorException("XML parser error: " + + e1.getMessage()); + } catch (javax.xml.parsers.ParserConfigurationException e3) { + log.warn("Parser error: " + e3); + throw new TemplateProcessorException("Parser error: " + + e3.getMessage()); + } + return templateMap; + } + + /** + * Convert a template. + * + * @param templateFile + * @param outputFile + * @param sourceList + * @throws TemplateProcessorException + */ + public void convertTemplate(String templateFile, String outputFile, + List sourceList) { + convertTemplate(new File(templateFile), new File(outputFile), + sourceList); + } + + /** + * Convert a template. + * + * @param templateFile + * @param outputFile + * @param sourceList + * @throws TemplateProcessorException + */ + public void convertTemplate(File templateFile, File outputFile, + List sourceList) { + if (templateFile != null) { + convertTemplate(templateFile.getParent(), templateFile.getName(), + outputFile.toString(), sourceList); + } else { + log.error("Template file is not defined."); + throw new TemplateProcessorException("Template file not defined."); + } + } + + /** + * Converts the template to generate xml file to be sent to the server. + * + * @param templateFile + * - template file to be converted + * @param input + * - input source file. + * @param outputFile + * - location to store the converted file + * @param antProperties + * - used as one of the input for conversion. + * @param inputSourceType + * - source input type (xml / properties from file). Currently + * xml input source is the only one supported. + * @return - location of the input source. + * @throws TemplateProcessorException + */ + public void convertTemplate(String templateDir, String templateFile, + String outputFile, List sourceList) { + + Configuration cfg = new Configuration(); + File templateDirFile = new File(templateDir); + if (templateDir != null && templateDirFile.exists()) { + try { + cfg.setDirectoryForTemplateLoading(templateDirFile); + log + .debug("diamonds:TemplateProcessor:adding template directory loader: " + + templateDir); + } catch (java.io.IOException ie) { + log.debug("Template directory configuring error."); + log.info("Template directory configuring error."); + throw new TemplateProcessorException( + "Template directory configuring error: " + ie); + } + } else { + log.debug("Template directory does not exist: " + + templateDirFile.getAbsolutePath()); + log.info("Template directory does not exist: " + + templateDirFile.getAbsolutePath()); + throw new TemplateProcessorException( + "Template directory does not exist: " + + templateDirFile.getAbsolutePath()); + } + try { + Template template = cfg.getTemplate(templateFile); + Map templateMap = getTemplateMap(sourceList); + template.process(templateMap, new FileWriter(outputFile)); + } catch (freemarker.core.InvalidReferenceException ivx) { + log.warn("Invalid reference in configuration: ", ivx); + throw new TemplateProcessorException( + "Invalid reference in config: " + ivx); + } catch (freemarker.template.TemplateException e2) { + log.warn("TemplateException: ", e2); + throw new TemplateProcessorException("TemplateException: " + e2); + } catch (java.io.IOException e) { + log.warn("I/O Error during template conversion: " + e.getMessage()); + throw new TemplateProcessorException( + "I/O Error during template conversion: " + e); + } + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateProcessorException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/TemplateProcessorException.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,37 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + +package com.nokia.helium.core; + +/** + * Template Exception handler. + * + */ +public class TemplateProcessorException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + /** + * Default constructor. + * @param message the error message. + */ + public TemplateProcessorException(String message) { + super(message); + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/XMLTemplateSource.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/XMLTemplateSource.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + +package com.nokia.helium.core; + +import java.io.File; + +/** + * HlmAntlib exception handling class + */ +public class XMLTemplateSource extends AbstractTemplateInputSource +{ + private File sourceLocation; + + /** + * Constructor + * + * @param String + * Name of template + * @param String + * location of template + */ + public XMLTemplateSource(String name, File location) { + setSourceName(name); + sourceLocation = location; + } + + /** + * Get source location + * + * @return + * source location. + */ + public File getSourceLocation() { + return sourceLocation; + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HeliumExecutor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HeliumExecutor.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the License "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +package com.nokia.helium.core.ant; + +import java.util.StringTokenizer; +import java.util.Vector; +import java.util.Enumeration; +import java.util.List; +import java.io.BufferedReader; +import java.io.FileWriter; +import java.io.InputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.JarURLConnection; +import java.net.URL; +import java.util.ArrayList; + +import org.apache.tools.ant.taskdefs.ImportTask; +import org.apache.tools.ant.helper.DefaultExecutor; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Target; +import org.apache.tools.ant.Location; +import com.nokia.helium.core.ant.types.*; + +import java.util.HashMap; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import org.apache.log4j.Logger; + +/** + * This class implements a flexible Ant Executor which allows dynamic discovery + * and automatic loading of new features. It also supports pre/post actions to + * be executed. + */ +public class HeliumExecutor extends DefaultExecutor { + private HashMap> preOperations = new HashMap>(); + private HashMap> postOperations = new HashMap>(); + private HashMap> exceptionHandlers = new HashMap>(); + private Project project; + private Logger log = Logger.getLogger(HeliumExecutor.class); + + /** + * Override the default Ant executor. + * + * @param project + * Object of the project + * @param targetNames + * Array of target names to execute + * + */ + public void executeTargets(Project project, String[] targetNames) { + this.project = project; + log.debug("[HeliumExecutor] Running executeTargets"); + BuildException failure = null; + try { + loadModules(project); + doOperations(preOperations, project, targetNames); + super.executeTargets(project, targetNames); + } catch (BuildException e) { + // Saving current issue + failure = e; + } + + try { + doOperations(postOperations, project, targetNames); + } catch (BuildException e) { + // Treating possible new issues... + if (failure != null) { + failure = new BuildException(e.toString() + failure.toString()); + } else { + failure = e; + } + } + // Propagating any raised issues. + if (failure != null) { + handleExceptions(project, failure); + throw failure; + } + } + + /** + * Loading all the discovered modules. + * + * @param module + * @param prj + */ + private void loadModules(Project prj) { + List moduleList = loadAvailableModules(); + for (File moduleName : moduleList) { + loadModule(moduleName, prj); + } + } + + /** + * Load a specific module. + * + * @param moduleLib + * @param prj + */ + private void loadModule(File moduleLib, Project prj) { + String file = getHlmAntLibFile(moduleLib); + if (file == null) { + return; + } + log.debug("[HeliumExecutor] Loading " + moduleLib.getName()); + ImportTask task = new ImportTask(); + Target target = new Target(); + target.setName(""); + target.setProject(prj); + task.setOwningTarget(target); + task.setLocation(new Location(file)); + task.setFile(file); + task.setProject(prj); + task.execute(); + String moduleName = getModuleName(moduleLib); + Object refObject = prj.getReference(moduleName + ".list"); + + if (refObject == null) { + log.debug(moduleName + ".list not found"); + } + if (refObject != null && refObject instanceof HlmDefList) { + HlmDefList defList = (HlmDefList) refObject; + Vector tempDefList = new Vector( + defList.getPreDefList()); + if (tempDefList != null) { + preOperations.put(moduleName, tempDefList); + } + Vector tempPostDefList = new Vector( + defList.getPostDefList()); + if (tempPostDefList != null) { + postOperations.put(moduleName, tempPostDefList); + } + Vector tempExceptionDefList = defList + .getExceptionHandlerList(); + if (tempExceptionDefList != null) { + exceptionHandlers.put(moduleName, tempExceptionDefList); + } + log.debug("HeliumExecutor:loadModule:pre-opsize" + + preOperations.size()); + log.debug("HeliumExecutor:loadModule:post-opsize" + + postOperations.size()); + log.debug("HeliumExecutor:loadModule:exception-opsize" + + exceptionHandlers.size()); + log.debug("[HeliumExecutor] Checking " + moduleLib); + } + } + + /** + * Search for helium.antlib.xml under the module Jar. + * + * @param moduleLib + * @return + * @throws IOException + */ + protected URL findHeliumAntlibXml(File moduleLib) throws IOException { + JarFile jarFile = new JarFile(moduleLib); + Enumeration jee = jarFile.entries(); + while (jee.hasMoreElements()) { + JarEntry je = jee.nextElement(); + if (je.getName().endsWith("/helium.antlib.xml")) { + return new URL("jar:" + moduleLib.toURI().toString() + "!/" + + je.getName()); + } + } + return null; + } + + /** + * Retrieve the found helium.antlib.xml. TODO improve if possible without + * extracting the file. + * + * @param moduleLib + * @return + */ + private String getHlmAntLibFile(File moduleLib) { + log.debug("[HeliumExecutor] Checking " + moduleLib); + try { + URL url = findHeliumAntlibXml(moduleLib); + if (url == null) + return null; + log.debug("[HeliumExecutor] Getting " + url); + + JarURLConnection jarConnection = (JarURLConnection) url + .openConnection(); + JarEntry jarEntry = jarConnection.getJarEntry(); + JarFile jarFile = new JarFile(moduleLib); + InputStream is = jarFile.getInputStream(jarEntry); + InputStreamReader isr = new InputStreamReader(is); + BufferedReader reader = new BufferedReader(isr); + File file = File.createTempFile("helium", "antlib.xml"); + file.deleteOnExit(); + FileWriter writer = new FileWriter(file); + String line; + while ((line = reader.readLine()) != null) { + writer.write(line + "\n"); + } + writer.close(); + reader.close(); + log.debug("[HeliumExecutor] Temp file " + file.getAbsolutePath()); + return file.getAbsolutePath(); + } catch (Exception ex) { + log.error("[HeliumExecutor] Error: ", ex); + return null; + } + } + + private void doOperations( + HashMap> operations, Project prj, + String[] targetNames) { + log.debug("HeliumExecutor:doOperations: start"); + for (String moduleName : operations.keySet()) { + log.debug("HeliumExecutor:doOperations: module" + moduleName); + for (HlmDefinition definition : operations.get(moduleName)) { + definition.execute(prj, moduleName, targetNames); + } + } + } + + private void handleExceptions(Project prj, Exception e) { + log.debug("HeliumExecutor:handleExceptions: start"); + for (String moduleName : this.exceptionHandlers.keySet()) { + log.debug("HeliumExecutor:handleExceptions: module" + moduleName); + for (HlmExceptionHandler exceptionHandler : this.exceptionHandlers + .get(moduleName)) { + exceptionHandler.handleException(prj, moduleName, e); + } + } + } + + private String getModuleName(File moduleLib) { + String name = moduleLib.getName(); + return name.substring(0, name.lastIndexOf('.')); + } + + private List loadAvailableModules() { + List moduleList = new ArrayList(); + String classpathString = System.getProperty("java.class.path"); + StringTokenizer tokenizier = new StringTokenizer(classpathString, + File.pathSeparator); + String token; + while (tokenizier.hasMoreTokens()) { + token = (String) tokenizier.nextToken(); + if (new File(token).isFile() && token.endsWith(".jar")) { + moduleList.add(new File(token)); + } + } + return moduleList; + } + + protected Project getProject() { + return project; + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HlmDefinition.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HlmDefinition.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,35 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core.ant; + +import org.apache.tools.ant.Project; + +/** + * This interface defines the API of an HeliumExecutor task. + */ +public interface HlmDefinition { + + /** + * This method will implement the action to be performed by the + * HeliumExecutor plugin. + * @param prj + * @param module + */ + void execute(Project prj, String module, String[] targetNames); +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HlmExceptionHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/HlmExceptionHandler.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,36 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core.ant; + +import org.apache.tools.ant.Project; + +/** + * This interface defines the API of an HeliumExecutor task. + */ +public interface HlmExceptionHandler { + + /** + * This method will implement the action to be performed by the + * HeliumExecutor plugin. + * @param project + * @param module + * @param exception + */ + void handleException(Project project, String module, Exception exception); +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/antlib.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/antlib.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/conditions/XMLLogCondition.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/conditions/XMLLogCondition.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the License "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +package com.nokia.helium.core.ant.conditions; + +import java.io.File; +import org.apache.tools.ant.BuildException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import org.xml.sax.*; +import org.xml.sax.helpers.*; +import com.nokia.helium.core.ant.types.ConditionType; + +/** + * This class implements a Ant Condition which report true if it finds any + * matching severity inside an XML log. + * + * Example: + *

    + * <target name="fail-on-build-error">
    + *   <fail message="The build contains errors">
    + *     <hlm:hasSeverity file="build_log.log.xml" severity="error"/>
    + *   </fail>
    + * </target>
    + * 
    + * + * The condition will eval as true if the build_log.log.xml contains any error message in the log. + * + * @ant.type name="hasSeverity" category="Core" + */ +public class XMLLogCondition extends ConditionType { + + // The severity to count + private String severity; + private String logRegexp; + private File fileName; + + /** + * Sets which severity will be counted. + * + * @param severity + * @ant.required + */ + public void setSeverity(String severity) { + this.severity = severity; + } + + public void setFile(File file) { + fileName = file; + } + + /** + * Regular expression which used to match a specific log filename. + * + * @param regex + * @ant.not-required + */ + public void setLogMatcher(String regex) { + this.logRegexp = regex; + } + + /** + * Get the number of a particular severity. + * + * @return the number of a particular severity. + */ + public int getSeverity() { + int messageCount = 0; + if (fileName == null || !fileName.exists()) { + //this.log("Error: Log file does not exist " + fileName); + return -1; + } + if (severity == null) + throw new BuildException("'severity' attribute is not defined"); + + this.log("Looking for severity '" + severity + "' under '" + + fileName.getAbsolutePath() + "'"); + SAXParserFactory factory = SAXParserFactory.newInstance(); + try { + SAXParser saxParser = factory.newSAXParser(); + MessageHandler handler = new MessageHandler(); + saxParser.parse(fileName, handler); + this.log("Found " + handler.getMessageCount() + " " + severity + + "(s)."); + messageCount += handler.getMessageCount(); + } catch (Exception exc) { + throw new BuildException(exc); + } + return messageCount; + } + + /** + * This method open the defined file and count the number of message tags + * with their severity attribute matching the configured one. + * + * @return if true if message with the defined severity have been found. + */ + public boolean eval() { + int severity = getSeverity(); + if (severity < 0) { + return false; + } + return severity > 0; + } + + /** + * Implements a SAX handler specialized in counting message tag with a + * specific severity. + */ + class MessageHandler extends DefaultHandler { + + private int count; + + public MessageHandler() { + } + + @Override + public void startElement(String uri, String localName, String name, + Attributes attributes) throws SAXException { + super.startElement(uri, localName, name, attributes); + if (name.equals(severity) && count == 0) { + count = Integer.valueOf(attributes.getValue("count")); + } + } + + public int getMessageCount() { + return count; + } + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/AntCall.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/AntCall.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,40 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core.ant.taskdefs; + +import org.apache.tools.ant.taskdefs.Ant; +import org.apache.tools.ant.taskdefs.CallTarget; + +/** + * This task extends current AntCall task by + * supporting any kind of Reference object. + * + * @ant.task name="antcall" category="Core" + */ +public class AntCall extends CallTarget { + + /** + * Add a Reference object. + * @param ref the reference object. + */ + public void add(Ant.Reference ref) { + this.addReference(ref); + } + +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/SerializePathTask.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/SerializePathTask.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,137 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core.ant.taskdefs; + +import java.io.*; +import java.util.Vector; +import java.util.Iterator; + +import org.apache.tools.ant.Task; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.types.Path; + +/** + * This class implements a Path de/serializer which can dumps the list of files + * to a UTF-8 file or retrieve a list path from a file into a path datatype. + * + * Examples: + *
    + * <target name="serialize">
    + *   <hlm:path2file file="output.txt">
    + *     <path>
    + *         <pathelement path="/temp/filename.ext"/>
    + *     </path>
    + *   </hlm:path2file>
    + * </target>
    + * 
    + * + * The execution of the serialize task will produce a file called output.txt that will contains + * a line referencing the /temp/filename.ext. + + *
    + * <target name="deserialize">
    + *   <hlm:path2file reference="output.ref"> file="output.txt"/>
    + * </target>
    + * 
    + * + * The execution of the deserialize task will create a path datatype that will + * contains a pathelement pointing on /temp/filename.ext. + * + * @ant.task name="path2file" category="Core" + */ +public class SerializePathTask extends Task { + + private Vector paths = new Vector(); + private File filename; + private String reference; + + /** + * Add path datatype to the task. + * + * @param path + */ + public void add(Path path) { + paths.add(path); + } + + /** + * Set reference attribute. + * + * @param reference + */ + public void setReference(String reference) { + this.reference = reference; + } + + /** + * Set file attribute. It is a mandatory setting. + * + * @param filename + */ + public void setFile(File filename) { + this.filename = filename; + } + + /** + * Excecute the task. If filename is defined and reference is not, it will + * try to dump the paths content into a file. Else if a filename and a + * reference is defined it will covert each line of the file into a + * pathelement of a path datatype. + */ + public void execute() { + if (filename == null) { + throw new BuildException("'file' attribute must be defined"); + } + if (filename != null && reference == null) { + this.log("Dumping paths into file " + filename); + try { + OutputStreamWriter os = new OutputStreamWriter( + new FileOutputStream(filename), "UTF8"); + for (Iterator ipath = paths.iterator(); ipath.hasNext();) { + Path path = ipath.next(); + String[] plist = path.list(); + for (int i = 0; i < plist.length; i++) { + os.write(plist[i] + "\n"); + } + } + os.close(); + } catch (Exception exc) { + throw new BuildException(exc); + } + } else if (filename != null && reference != null) { + this.log("Converting " + filename + " content into path."); + try { + Path path = new Path(getProject()); + BufferedReader is = new BufferedReader(new InputStreamReader( + new FileInputStream(filename), "UTF-8")); + String line = null; + while ((line = is.readLine()) != null) { + path.createPathElement().setPath(line); + } + this.log("Creating reference " + reference + "."); + getProject().addReference(reference, path); + } catch (Exception exc) { + throw new BuildException(exc); + } + } else { + new BuildException("The task is not configured properly."); + } + + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/ValidateUserLogin.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/ValidateUserLogin.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,236 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +package com.nokia.helium.core.ant.taskdefs; + +import org.apache.tools.ant.Task; +import org.apache.tools.ant.BuildException; +import javax.naming.*; +import javax.naming.directory.*; +import java.util.Hashtable; +import org.apache.tools.ant.taskdefs.condition.Condition; + +/** + * Task is to validate noe user with LDAP server. + *
    + * Usage: <hlm:ldapauthenticate url="${email.ldap.server}" 
    +                                rootdn="${email.ldap.rootdn}" 
    +                                searchdn="${ldap.organization.unit.rootdn}, ${ldap.people.rootdn}" 
    +                                filter="uid=${env.USERNAME}" 
    +                                outputproperty="is.authentication.sucess" 
    +                                key="employeeNumber"
    +                                password="${noe.password}"/>
    +   
    +
    + * Usage:   <condition property="is.authentication.sucess" >
    +                <hlm:ldapauthenticate url="${email.ldap.server}" 
    +                                rootdn="${email.ldap.rootdn}" 
    +                                searchdn="${ldap.organization.unit.rootdn}, ${ldap.people.rootdn}" 
    +                                filter="uid=${env.USERNAME}" 
    +                                key="employeeNumber"
    +                                password="${noe.password}"/>
    +            <condition/>
    +   
    + @ant.task name="ldapauthenticate" category="Core" + */ +public class ValidateUserLogin extends Task implements Condition +{ + private String url; + private String rootdn; + private String filter; + private String key; + private String property; + private String searchdn; + private String password; + + public void execute() + { + + if (property == null) + throw new BuildException("'property' attribute is not defined"); + validateParameters(url, rootdn, filter, key, searchdn, password); + log("Authenticating the user..."); + if (authenticateUser(url, searchUser(url, rootdn, filter, key, searchdn))) { + getProject().setProperty(property, "true"); + } + else { + getProject().setProperty(property, "false"); + } + } + + public boolean eval() { + + validateParameters(url, rootdn, filter, key, searchdn, password); + return authenticateUser(url, searchUser(url, rootdn, filter, key, searchdn)); + + } + + public String searchUser(String url, String rootdn, String filter, String key, String searchdn) { + + String userSearchDN = null; + // Set up environment for creating initial context + Hashtable env = new Hashtable(); + env.put(Context.INITIAL_CONTEXT_FACTORY, + "com.sun.jndi.ldap.LdapCtxFactory"); + env.put(Context.PROVIDER_URL, url + "/" + rootdn); + + // Create initial context + env.put(Context.SECURITY_AUTHENTICATION, "simple"); + DirContext ctx = null; + NamingEnumeration results = null; + try { + ctx = new InitialDirContext(env); + SearchControls controls = new SearchControls(); + controls.setSearchScope(SearchControls.SUBTREE_SCOPE); + results = ctx.search("", filter, controls); + while (results.hasMore()) { + SearchResult searchResult = (SearchResult) results.next(); + Attributes attributes = searchResult.getAttributes(); + Attribute attr = attributes.get(key); + userSearchDN = key + "=" + (String) attr.get() + ", " + searchdn + ", " + rootdn; + } + } catch (NamingException e) { + e.printStackTrace(); + throw new BuildException("LDAP Naming exception"); + } + return userSearchDN; + } + + public void validateParameters(String url, String rootdn, String filter, String key, String searchdn, String password) { + + if (url == null) + throw new BuildException("'url' attribute is not defined"); + if (rootdn == null) + throw new BuildException("'rootdn' attribute is not defined"); + if (filter == null) + throw new BuildException("'filter' attribute is not defined"); + if (key == null) + throw new BuildException("'key' attribute is not defined"); + if (searchdn == null) + throw new BuildException("'searchdn' attribute is not defined"); + if (password == null) + throw new BuildException("'password' attribute is not defined"); + } + + public boolean authenticateUser(String ldapurl, String rooTdn) { + + Hashtable env = new Hashtable(11); + env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); + env.put(Context.PROVIDER_URL, ldapurl); + env.put(Context.SECURITY_AUTHENTICATION, "simple"); + env.put(Context.SECURITY_PRINCIPAL, rooTdn); + env.put(Context.SECURITY_CREDENTIALS, password); + try { + DirContext authContext = new InitialDirContext(env); + return true; + } catch (NamingException e) { + return false; + } + + } + public String getUrl() + { + return url; + } + /** + * ldap URL + * @ant.required + */ + public void setUrl(String url) + { + this.url = url; + } + + + public String getRootdn() + { + return rootdn; + } + /** + * user password to authenticate + * @ant.required + */ + public void setpassword(String password) + { + this.password = password; + } + + public String getpassword() + { + return password; + } + /** + * ldap root distinguished name to search user. + * @ant.required + */ + public void setRootdn(String rootdn) + { + this.rootdn = rootdn; + } + + public String getsearchdn() + { + return searchdn; + } + /** + * ldap distinguished name to search user + * @ant.required + */ + public void setsearchdn(String searchdn) + { + this.searchdn = searchdn; + } + + public String getFilter() + { + return filter; + } + /** + * object name to search in the ldap. + * @ant.required + */ + public void setFilter(String filter) + { + this.filter = filter; + } + + public String getOutputProperty() + { + return property; + } + /** + * output property to set if the user found. + * @ant.required + */ + public void setOutputProperty(String property) + { + this.property = property; + } + + public String getKey() + { + return key; + } + /** + * key to search the user information + * @ant.required + */ + public void setKey(String key) + { + this.key = key; + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/XMLLogCount.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/taskdefs/XMLLogCount.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the License "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +package com.nokia.helium.core.ant.taskdefs; + +import java.io.File; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; +import com.nokia.helium.core.ant.conditions.XMLLogCondition; + +/** + * This class sets a property to the number of matching severity inside a XML log. + * + * @ant.task name="countSeverity" category="Core" + */ +public class XMLLogCount extends Task { + + private File fileName; + private String severity; + private String logRegexp; + private String property; + + /** + * File to be parsed. + * + * @param filename + * @ant.required + */ + public void setFile(File filename) { + fileName = filename; + } + + /** + * Defines the severity name to be counted. + * + * @param severity + * @ant.required + */ + public void setSeverity(String severity) { + this.severity = severity; + } + + /** + * Name of the property to be set. + * @param property the property name + * @ant.required + */ + public void setProperty(String property) { + this.property = property; + } + + /** + * Regular expression which used to match a specific log filename. + * @param regex + * @ant.not-required + */ + public void setLogMatcher(String regex) { + this.logRegexp = regex; + } + + /** + * Execute the task. Set the property with number of severities. + * @throws BuildException + */ + public void execute() { + if (property == null) + throw new BuildException("'property' attribute is not defined"); + + XMLLogCondition cond = new XMLLogCondition(); + cond.setFile(fileName); + cond.setLogMatcher(logRegexp); + cond.setSeverity(severity); + getProject().setNewProperty(property, "" + cond.getSeverity()); + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/ConditionType.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/ConditionType.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core.ant.types; + +import org.apache.tools.ant.ProjectComponent; +import org.apache.tools.ant.taskdefs.condition.Condition; + +/** + * Base class for conditions. + */ +public class ConditionType extends ProjectComponent implements Condition { + + public boolean eval() { + return false; + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/FallbackReference.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/FallbackReference.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,65 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core.ant.types; + +import org.apache.tools.ant.Project; +import org.apache.tools.ant.taskdefs.Ant; + +/** + * This DataType implements a reference fallback. + * If refid is not defined then the implementation, + * can fallback on a defaultRefid. + * + * @ant.type name="fallbackReference" category="Core" + */ +public class FallbackReference extends Ant.Reference { + + private String defaultRefid; + + /** + * Set the refid if it is defined, else it uses the defaultRefid + * @param id + */ + public void setRefid(String id) { + getProject().log("Setting reference: " + id, Project.MSG_DEBUG); + super.setRefId(id); + if (getProject().getReference(super.getRefId()) == null + && defaultRefid != null) { + super.setRefId(defaultRefid); + } + } + + /** + * Set the default refid if it refid doesn't exists then + * it configures the reference to use the defaultRefid. + * @param id + */ + public void setDefaultRefid(String defaultRefid) { + getProject().log("Setting default reference: " + defaultRefid, + Project.MSG_DEBUG); + this.defaultRefid = defaultRefid; + if (getProject().getReference(super.getRefId()) == null) { + getProject().log( + "Reference not defined using default reference: " + + defaultRefid, Project.MSG_DEBUG); + setRefId(defaultRefid); + } + } + +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmDefList.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmDefList.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,108 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core.ant.types; + +import java.util.Vector; +import org.apache.tools.ant.types.DataType; +import com.nokia.helium.core.ant.HlmExceptionHandler; + +/** + * + */ +public class HlmDefList extends DataType { + + private Vector preDefList = new Vector(); + private Vector postDefList = new Vector(); + private Vector exceptionHandlerList = new Vector(); + + /** + * Creates an empty hlm post-action definition and adds it to the list. + */ + public HlmPreDefImpl createHlmPreDefImpl() { + HlmPreDefImpl def = new HlmPreDefImpl(); + add(def); + return (HlmPreDefImpl) def; + } + + /** + * Creates an empty hlm post-action definition and adds it to the list. + */ + public HlmPostDefImpl createHlmPostDefImpl() { + HlmPostDefImpl def = new HlmPostDefImpl(); + add(def); + return (HlmPostDefImpl) def; + } + + /** + * Add a given variable to the list + * + * @param var + * variable to add + */ + public void add(HlmPreDefImpl definition) { + if (definition != null) { + preDefList.add(definition); + } + } + + /** + * Add a post-action to the list. + */ + public void add(HlmPostDefImpl definition) { + if (definition != null) { + postDefList.add(definition); + } + } + + /** + * Add a exception handler to the list. + */ + public void add(HlmExceptionHandler exceptionHandler) { + if (exceptionHandler != null) { + exceptionHandlerList.add(exceptionHandler); + } + } + + /** + * Get the pre-action list. + * + * @return a vector containing all the pre-actions + */ + public Vector getPreDefList() { + return preDefList; + } + + /** + * Get the post-action list. + * + * @return a vector containing all the post-actions + */ + public Vector getPostDefList() { + return postDefList; + } + + /** + * Get the exception handler list. + * + * @return a vector containing all the exception handlers + */ + public Vector getExceptionHandlerList() { + return exceptionHandlerList; + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmImportDef.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmImportDef.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,60 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core.ant.types; + +import org.apache.log4j.Logger; +import org.apache.tools.ant.taskdefs.ImportTask; +import org.apache.tools.ant.Target; +import org.apache.tools.ant.Location; +import org.apache.tools.ant.Project; + +import java.io.File; + +/** + * This class implements an Executor importer pre-action. + * + * @ant.type name="importdef" category="Core" + */ +public class HlmImportDef extends HlmPreDefImpl { + + private static Logger log = Logger.getLogger(HlmImportDef.class); + + private File file ; + + public void setFile(File file) { + this.file = file; + } + + /** + * Will import the given file. + */ + public void execute(Project prj, String module, String[] targetNames) { + log.debug("importdef:fileName" + file.toString()); + log.debug("importdef:prj name" + prj.getName()); + ImportTask task = new ImportTask(); + Target target = new Target(); + target.setName(""); + target.setProject(prj); + task.setOwningTarget(target); + task.setLocation(new Location(file.getAbsolutePath())); + task.setFile(file.toString()); + task.setProject(prj); + task.execute(); + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmListenerDef.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmListenerDef.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,54 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core.ant.types; + +import org.apache.tools.ant.Project; +import org.apache.tools.ant.BuildListener; + +/** + * This class implements a listener registration action. + * + * @ant.type name="listenerdef" category="Core" + */ +public class HlmListenerDef extends HlmPreDefImpl { + + private String classname; + + public void setClassname(String classname) { + this.classname = classname; + } + + /** + * Register given listener to the project. + */ + public void execute(Project prj, String module, String[] targetNames) { + try { + Class listenerClass = Class.forName(classname); + BuildListener listener = (BuildListener) listenerClass + .newInstance(); + prj.addBuildListener(listener); + } catch (ClassNotFoundException ex) { + ex.printStackTrace(); + } catch (InstantiationException ex1) { + ex1.printStackTrace(); + } catch (IllegalAccessException ex1) { + ex1.printStackTrace(); + } + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmPostDefImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmPostDefImpl.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,40 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core.ant.types; + +import org.apache.tools.ant.Project; +import org.apache.tools.ant.types.DataType; +import org.apache.log4j.Logger; + +import com.nokia.helium.core.ant.HeliumExecutor; +import com.nokia.helium.core.ant.HlmDefinition; + +/** + * Implement an abstract post-action. + */ +public class HlmPostDefImpl extends DataType implements HlmDefinition { + private Logger log = Logger.getLogger(HeliumExecutor.class); + + /** + * Do nothing. + */ + public void execute(Project prj, String module, String[] targetNames) { + log.debug("HlmPostDefImpl:execute:" + module); + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmPreDefImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/HlmPreDefImpl.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,36 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core.ant.types; + +import org.apache.tools.ant.Project; +import org.apache.tools.ant.types.DataType; + +import com.nokia.helium.core.ant.HlmDefinition; + +/** + * Implement an abstract pre-action. + */ +public class HlmPreDefImpl extends DataType implements HlmDefinition { + /** + * Do nothing. + */ + public void execute(Project prj, String module, String[] targetNames) { + // empty will implemented by the sub classes. + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/ReferenceType.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/com/nokia/helium/core/ant/types/ReferenceType.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.core.ant.types; + +import org.apache.tools.ant.types.DataType; +import org.apache.tools.ant.types.Reference; + +/** + * Helper class to force user providing a reference. It doesn't implement any + * particular Ant interface. + */ +public class ReferenceType extends DataType { + /** + * Returns the referenced object. + * + * @return the reference object. + */ + public Object getReferencedObject() { + Reference reference = getRefid(); + Object obj = reference.getReferencedObject(getProject()); + return obj; + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/src/log4j.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/src/log4j.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/tests/bld.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/tests/bld.sh Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,23 @@ +#!/bin/csh + +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + + + +module load java/1.6.0 +setenv ANT_ARGS "-lib ../../antlibs -lib ../../bin/helium-core.jar -lib ../../lib" +ant -Dant.executor.class="com.nokia.helium.core.ant.HeliumExecutor" $* diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/tests/build.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/tests/build.bat Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,26 @@ +@echo off + +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of the License "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: +rem + +setlocal +if not defined JAVA_6_HOME ( +set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02 +) ELSE set TESTED_JAVA=%JAVA_6_HOME% +if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%) +set ANT_ARGS=-lib %CD%\lib -lib %CD%\..\..\lib -lib %CD%\..\..\antlibs -lib %CD%\..\..\bin\helium-core.jar +ant -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor %* +endlocal \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/tests/build.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/tests/build.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,34 @@ + + + + Helium antlib core tests. + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/tests/core/executor/build.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/tests/core/executor/build.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ + + + + Helium antlib core executor test config. + + + Running target. + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/tests/core/executor/test_executor.ant.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/tests/core/executor/test_executor.ant.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,48 @@ + + + + Helium antlib core executor tests. + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/tests/core/serializepath/data/folder1/test.txt diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/tests/core/serializepath/data/folder2/test.txt diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/tests/core/serializepath/test_serializepath.ant.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/tests/core/serializepath/test_serializepath.ant.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,81 @@ + + + + Helium antlib core serializepath tests. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/tests/core/xmllogcondition/data/helium_minibuild_ido_compile.log.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/tests/core/xmllogcondition/data/helium_minibuild_ido_compile.log.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/tests/core/xmllogcondition/test_countseverity.ant.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/tests/core/xmllogcondition/test_countseverity.ant.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,68 @@ + + + + Helium antlib core countseverity tests. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/tests/core/xmllogcondition/test_hasseverity.ant.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/core/tests/core/xmllogcondition/test_hasseverity.ant.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,59 @@ + + + + Helium antlib core hasseverity tests. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/core/tests/lib/ant-antunit-1.0.jar Binary file buildframework/helium/external/helium-antlib/core/tests/lib/ant-antunit-1.0.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/bld.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/bld.bat Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,60 @@ +@echo off + +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of the License "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: +rem + +setlocal +if not defined JAVA_6_HOME ( +set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02 +) ELSE set TESTED_JAVA=%JAVA_6_HOME% +if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%) + +REM Configure Ant +if not defined TESTED_ANT_HOME ( +set TESTED_ANT_HOME=C:\Apps\ant_1.7 +) +if exist %TESTED_ANT_HOME% (set ANT_HOME=%TESTED_ANT_HOME%) + +REM Configure the expected Ant Version details below +SET expMajorVer=1 +SET expMinorVer=7 + +rem *** Verify Ant Version *** +rem -- Run the 'ant -version' command and capture the output to a variable +for /f "tokens=*" %%a in ('ant -version') do (set antversion=%%a) +echo *** Installed Version : %antversion% + +rem -- Parse the version string obtained above and get the version number +for /f "tokens=4 delims= " %%a in ("%antversion%") do set val=%%a +rem -- Parse the version number delimiting the '.' and set the major and +rem minor versions +for /f "tokens=1-2 delims=." %%a in ("%val%") do ( +set /A majorVersion=%%a +set /A minorVersion=%%b +) +rem -- Check whether major version is greater than or equal to the expected. +if %majorVersion% geq %expMajorVer% ( +rem -- if major version is valid, check minor version. If minor version is less +rem than expected display message and abort the execution. +if %minorVersion% lss %expMinorVer% (echo *** Incorrect version of Ant found. Please check you have atleast Ant 1.7.0 & goto :errorstop ) +) + +ant %* +endlocal + +:errorstop +@echo *** Build aborted with error +exit /b 1 diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/build.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/build.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,37 @@ + + + + Helium Antlib build file. + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/lib/commons-codec-1.3.jar Binary file buildframework/helium/external/helium-antlib/diamonds/lib/commons-codec-1.3.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/lib/commons-configuration-1.5.jar Binary file buildframework/helium/external/helium-antlib/diamonds/lib/commons-configuration-1.5.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/lib/commons-httpclient-3.1.jar Binary file buildframework/helium/external/helium-antlib/diamonds/lib/commons-httpclient-3.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/lib/commons-lang-2.4.jar Binary file buildframework/helium/external/helium-antlib/diamonds/lib/commons-lang-2.4.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/lib/commons-logging-1.1.1.jar Binary file buildframework/helium/external/helium-antlib/diamonds/lib/commons-logging-1.1.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/lib/dom4j-1.6.1.jar Binary file buildframework/helium/external/helium-antlib/diamonds/lib/dom4j-1.6.1.jar has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsClient.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsClient.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,242 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.diamonds; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.methods.FileRequestEntity; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.methods.RequestEntity; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import com.nokia.helium.core.EmailDataSender; + +import java.io.IOException; +import java.io.File; + +/** + * Diamonds client used to connect to get build id and also to send the build + * results + * + */ +public class DiamondsClient { + + private static final int INT_SERV_ERROR = 500; + + private static final int SERV_NOT_FOUND = 404; + + private static final int SERV_OK = 200; + + private boolean isRecordOnly; + + private Logger log = Logger.getLogger(DiamondsClient.class); + + private String host; + + private String port; + + private String path; + + private String emailID; + + private HttpClient httpClient; + + + public DiamondsClient(String hst, String prt, String pth, String mailID) { + host = hst; + port = prt; + path = pth; + emailID = mailID; + httpClient = new HttpClient(); + } + + private int executeMethod(PostMethod postMethod) throws DiamondsException { + int result = 0; + try { + result = httpClient.executeMethod(postMethod); + } catch (IOException e) { + log.info("IOException while sending http request"); + log.debug("IOException while sending http request: ", e); + isRecordOnly = true; + throw new DiamondsException("Exception in executeMethod"); + // e.printStackTrace(); + } + return result; + } + + private String checkForProtocol(String url) throws DiamondsException { + String retURL = url; + try { + if (!StringUtils.containsIgnoreCase(url, "http://")) { + retURL = "http://" + url; + } + } catch (Exception ex) { + // ex.printStackTrace(); + isRecordOnly = true; + log.info("Failed to check url, defaulting to input."); + throw new DiamondsException("Exception verifying URL"); + } + return retURL; + } + + private String getURL() throws DiamondsException { + return getURL(null); + } + + private String getURL(String subPath) throws DiamondsException { + String urlPath = path; + if (subPath != null) { + urlPath = subPath; + } + return checkForProtocol("http://" + host + ":" + port + urlPath); + } + + private PostMethod getPostMethod(String fileName, String urlPath) { + + // Get the Diamonds XML-file which is to be exported + File input = new File(fileName); + + // Prepare HTTP post + PostMethod post = new PostMethod(urlPath); + + // Request content will be retrieved directly + // from the input stream + + RequestEntity entity = new FileRequestEntity(input, + "text/xml; charset=ISO-8859-1"); + post.setRequestEntity(entity); + return post; + } + + private int processPostMethodResult(int result) { + // Log status code + switch (result) { + case INT_SERV_ERROR: + // log.error("Internal server error"); + break; + case SERV_NOT_FOUND: + // log.error("Server not found"); + break; + case SERV_OK: + // log.info("Connection to diamonds server - OK"); + break; + default: + // log.debug("Response code: " + result); + } + return result; + } + + + /** + * + * @param fileName + * Filename to export to Diamonds + * @return diamonds build id + */ + public String getBuildId(String fileName) throws DiamondsException { + String diamondsBuildID = null; + PostMethod postMethod = null; + + // Get HTTP client + // MyHttpClient httpclient = createHttpClient(); + + // Execute post request + try { + if (!isRecordOnly) { + String strURL = getURL(); + log.debug("strURL:" + strURL); + postMethod = getPostMethod(fileName, strURL); + log.debug("postmethod:" + postMethod); + int postMethodResult = httpClient.executeMethod(postMethod); + log.debug("postmethod-result:" + postMethodResult); + + int result = processPostMethodResult(postMethodResult); + + if (result == SERV_OK) { + // Display and save response code which functions as a id for + // the build. + diamondsBuildID = postMethod.getResponseBodyAsString(); + log.debug("diamondsBuildID: " + diamondsBuildID); + } else { + isRecordOnly = true; + log.debug("Connection Failed."); + log + .info("Diamonds data not sent, because of connection failure."); + //throw new DiamondsException("Connection Failed"); + } + } + } catch (HttpException ex) { + isRecordOnly = true; + log.debug("Connection Failed", ex); + log.info("Diamonds data not sent, because of httpexception."); + // log.error("Failed: " + ex.toString()); + //throw new DiamondsException("Http Exception see the logs: " + // + ex.getMessage()); + } catch (IOException ex1) { + isRecordOnly = true; + log.debug("Connection Failed. ", ex1); + log.info("Diamonds data not sent, because of io exception."); + // log.error("Failed: " + ex.toString()); + //throw new DiamondsException("Network error, see the logs: " + // + ex1.getMessage()); + } finally { + // Release current connection to the connection pool once you are + // done + if (postMethod != null) { + postMethod.releaseConnection(); + } + } + return diamondsBuildID; + } + + public int sendData(String fileName, String urlPath) { + PostMethod postMethod = null; + int result = -1; + if (urlPath != null && !isRecordOnly) { + try { + String strURL = getURL(urlPath); + postMethod = getPostMethod(fileName, strURL); + result = processPostMethodResult(httpClient + .executeMethod(postMethod)); + } catch (Exception e) { + log.debug("DiamondsClient:sendData by Http: ", e); + log.info("The final data via http not sent because errors: ", e); + } + } + return result; + } + + public int sendDataByMail(String fileName, String smtpServer, + String ldapServer) { + log.debug("DiamondsClient:sendDataByEmail:emailID" + emailID); + EmailDataSender emailSender = new EmailDataSender(emailID, smtpServer, + ldapServer); + try { + log.debug("DiamondsClient:sendDataByEmail: " + fileName); + emailSender.sendData("diamonds", fileName, "application/xml", + "[DIAMONDS_DATA]", null); + log.debug("DiamondsClient:sendDataByEmail:succeeds"); + } catch (Exception e) { + log.debug("DiamondsClient:sendDataByEmail: ", e); + log.info("The final data via http not sent because errors: ", e); + return -1; + } + return 0; + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsConfig.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsConfig.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,252 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + +package com.nokia.helium.diamonds; + +import org.apache.tools.ant.BuildException; + +import java.util.*; +import org.dom4j.io.SAXReader; +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.Node; +import org.apache.log4j.Logger; + +/** + * Loads the configuration information from the xml file. + * + */ +public final class DiamondsConfig { + private static DiamondsProperties diamondsProperties; + + private static List stages; + + private static Logger log; + + private static Map targets; + + private static String outputDir; + + private static String templateDir; + + private static String initialiserTargetName; + + private DiamondsConfig() { + } + + /** + * Method accessed by loggers to load the diamonds specific configuration. + * + * @param configFile + * - configuration to load + * + */ + public static void parseConfiguration(String configFile) + throws DiamondsException { + if (log == null) { + log = Logger.getLogger(DiamondsConfig.class); + } + SAXReader saxReader = new SAXReader(); + Document document = null; + try { + log.debug("diamonds:DiamondsConfig:reading configuration"); + document = saxReader.read(configFile); + } catch (Exception e) { + log.debug("diamonds:DiamondsConfig:", e); + throw new DiamondsException("Diamonds configuration parsing error: " + + e.getMessage()); + } + parseConfig(document); + diamondsProperties = parseDiamondsProperties(document); + stages = parseStages(document); + targets = parseTargets(document); + } + + /** + * Parses the general configuration info. + * + * @param document + * - XML config in DOM4J document + */ + private static void parseConfig(Document document) { + log.debug("diamonds:DiamondsConfig:parsing general configuration."); + Node node = document.selectSingleNode("//output-dir"); + outputDir = node.valueOf("@path"); + node = document.selectSingleNode("//template-dir"); + templateDir = node.valueOf("@path"); + } + + /** + * Parses the server info. + * + * @param document + * - XML config in DOM4J document + */ + private static DiamondsProperties parseDiamondsProperties(Document document) { + log.debug("diamonds:DiamondsConfig:parsing diamonds properties."); + + Map propertiesMap = new HashMap(); + + loadProperty(document, propertiesMap, "host"); + loadProperty(document, propertiesMap, "port"); + loadProperty(document, propertiesMap, "path"); + loadProperty(document, propertiesMap, "tstampformat"); + loadProperty(document, propertiesMap, "mail"); + loadProperty(document, propertiesMap, "ldapserver"); + loadProperty(document, propertiesMap, "smtpserver"); + loadProperty(document, propertiesMap, "initialiser-target-name"); + loadProperty(document, propertiesMap, "category-property"); + loadProperty(document, propertiesMap, "buildid-property"); + return new DiamondsProperties(propertiesMap); + } + + /** + * Parses the Targets data from config. + * + * @param document + * - XML config in DOM4J document + * @return list of targets available in the config + */ + @SuppressWarnings("unchecked") + private static Map parseTargets(Document document) { + log.debug("diamonds:DiamondsConfig:parsing for targets"); + Map targets = new HashMap(); + List stageNodes = document.selectNodes("//target"); + + // Set initialiserTargetName according to target name defined Diamonds config file + initialiserTargetName = diamondsProperties.getProperty("initialiser-target-name"); + targets.put(initialiserTargetName, new Target(initialiserTargetName,"","","","")); + for (Element stageNode : stageNodes) { + targets.put(stageNode.valueOf("@name"), new Target(stageNode + .valueOf("@name"), stageNode.valueOf("@template-file"), + stageNode.valueOf("@logfile"), stageNode + .valueOf("@ant-properties"), stageNode + .valueOf("@defer"))); + } + return targets; + } + + /** + * Parses the stages info. + * + * @param document + * - XML config in DOM4J document + * @return list of stages in config + */ + @SuppressWarnings("unchecked") + private static List parseStages(Document document) { + List stages = new ArrayList(); + List stageNodes = document.selectNodes("//stage"); + log.debug("diamonds:DiamondsConfig:parsing for stages"); + for (Element stage : stageNodes) { + stages.add(new Stage(stage.valueOf("@name"), stage + .valueOf("@start"), stage.valueOf("@end"), stage + .valueOf("@logfile"))); + } + return stages; + } + + /** + * Helper function to get the stages + * + * @return the stages from config in memory + */ + static List getStages() { + return stages; + } + + /** + * Helper function to get the targets + * + * @return the targets from config in memory + */ + static Map getTargets() { + return targets; + } + + /** + * Returns true if stages exists in config + * + * @return the existance of stages in config + */ + public static boolean isStagesInConfig() { + return stages != null; + } + + /** + * Returns true if targets exists in config + * + * @return the targets from config in memory + */ + public static boolean isTargetsInConfig() { + return targets != null; + } + + /** + * Gets the diamonds properties loaded from config + * + * @return the targets from config in memory + */ + public static DiamondsProperties getDiamondsProperties() { + return diamondsProperties; + } + + /** + * Gets the output directory + * + * @return the output directory, loaded from config + */ + static String getOutputDir() { + return outputDir; + } + + /** + * Gets the output directory + * + * @return the output directory, loaded from config + */ + static String getTemplateDir() { + return templateDir; + } + + /** + * Gets the initialiserTargetName + * + * @return the initialiserTargetName, loaded from config + */ + public static String getInitialiserTargetName() { + return initialiserTargetName; + } + + /** + * Load diamonds property into hashmap. + * @param doc + * @param hash + * @param name + * @return + */ + public static void loadProperty(Document document, Map hash, String name) { + Node node = document.selectSingleNode("//property[@name='" + name + "']"); + if (node == null) { + throw new BuildException("diamonds: DiamondsConfig:'" + name + "' property definition is missing."); + } + hash.put(name, node.valueOf("@value")); + } + +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsException.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,37 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.diamonds; + +/** + * Exception class for Diamonds implementation + * + */ +public class DiamondsException extends Exception { + + private static final long serialVersionUID = 8743300713686555395L; + + /** + * Constructor + * + * @exception - exception to be processed. + */ + + public DiamondsException(String exception) { + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsExceptionStatusUpdate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsExceptionStatusUpdate.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,173 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: To update the build status to Diamonds with signals in case of build exceptions. +* +*/ + +package com.nokia.helium.diamonds; + +import org.apache.tools.ant.Project; +import com.nokia.helium.core.ant.HlmExceptionHandler; +import com.nokia.helium.core.PropertiesSource; +import com.nokia.helium.core.TemplateInputSource; +import com.nokia.helium.core.TemplateProcessor; +import com.nokia.helium.signal.SignalStatus; +import com.nokia.helium.signal.SignalStatusList; + +import org.apache.log4j.Logger; + +import java.util.Hashtable; +import java.util.Vector; +import java.util.List; +import java.io.File; +import java.util.ArrayList; +import java.text.SimpleDateFormat; +import java.util.Properties; + + +/** + * Class to store the builds status and check the signal is present in the deferred signal list. + * if so get the signal informations like signal name, error message and target name. + * With collected signal information and build status send the generated XML file to diamonds client class + * to update the information into diamonds + */ +public class DiamondsExceptionStatusUpdate implements HlmExceptionHandler { + private Logger log = Logger.getLogger(DiamondsExceptionStatusUpdate.class); + + /* Initiate build status to failed as this method will be invoked in case of exceptions only */ + private String buildStatus = "failed"; + + private SimpleDateFormat timeFormat; + + private TemplateProcessor templateProcessor; + + private Hashtable signalInformation = new Hashtable(); + + private String outputFile,templateFile; + + private List sourceList = new ArrayList(); + + /** + * Implements the Exception method to update build status and signal information to diamonds. + * @param project + * @param module + * @param e + */ + @SuppressWarnings("unchecked") + public void handleException(Project project, String module, Exception e) { + templateProcessor = new TemplateProcessor(); + Properties tempProperties = new Properties(); + String templateDir = DiamondsConfig.getTemplateDir(); + /* Initialize the diamond properties class to access the diamonds properties */ + DiamondsProperties diamondsProperties = DiamondsConfig.getDiamondsProperties(); + //Check, Is the diamonds listener is initialized? + if (DiamondsListenerImpl.isInitialized()) { + timeFormat = new SimpleDateFormat(DiamondsConfig.getDiamondsProperties().getProperty("tstampformat")); + /* Initialize the diamond client class required to update the information into diamonds. */ + DiamondsClient diamondsClient = new DiamondsClient(project + .getProperty(diamondsProperties.getProperty("host")), + project.getProperty(diamondsProperties + .getProperty("port")), project + .getProperty(diamondsProperties + .getProperty("path")), project + .getProperty(diamondsProperties + .getProperty("mail"))); + + /* Check is the signal is in deferred signal list? + * If so get the signal information like signal name, error message and target name + * + */ + if (SignalStatusList.getDeferredSignalList().hasSignalInList()) { + Vector signalList = SignalStatusList.getDeferredSignalList().getSignalStatusList(); + timeFormat = new SimpleDateFormat(DiamondsConfig.getDiamondsProperties().getProperty("tstampformat")); + log.debug("[DiamondsExceptionStatusUpdate] => Build Status = " + buildStatus); + int i = 0; + for (SignalStatus status : signalList) { + signalInformation.put("diamond.signal.name." + i, status.getName()); + signalInformation.put("diamond.error.message." + i, status.getMessage()); + signalInformation.put("diamond.time.stamp." + i,new String(timeFormat.format(status.getTimestamp()))); + i += 1; + } + /* Generate the signal XML file required for diamonds to update the signal information, + * using templateprocessor class + */ + templateFile = "diamonds_signal.xml.ftl"; + outputFile = DiamondsConfig.getOutputDir() + File.separator + "diamonds-signal.xml"; + sourceList.add(new PropertiesSource("diamondSignal", signalInformation)); + templateProcessor.convertTemplate(templateDir, templateFile, outputFile,sourceList); + + /* send the generated XML file for diamonds client to update the signals information into Diamonds */ + log.debug("[DiamondsExceptionStatusUpdate] => sending data to diamonds ..." + outputFile); + diamondsClient.sendData(outputFile, DiamondsConfig.getDiamondsProperties().getDiamondsBuildID()); + try { + DiamondsListenerImpl.mergeToFullResults(new File(outputFile)); + } catch (DiamondsException de) { + log.debug("[DiamondsExceptionStatusUpdate] => " + de.getMessage()); + } + } + /* Check, is the signal is in now signal list? + * If so get the signal information like signal name, error message and target name + * + */ + if (SignalStatusList.getNowSignalList().hasSignalInList()) { + Vector signalList = SignalStatusList.getNowSignalList().getSignalStatusList(); + buildStatus = "failed"; + timeFormat = new SimpleDateFormat(DiamondsConfig.getDiamondsProperties().getProperty("tstampformat")); + log.debug("[DiamondsExceptionStatusUpdate] => Build Status = " + buildStatus); + int i = 0; + for (SignalStatus status : signalList) { + signalInformation.put("diamond.signal.name." + i, status.getName()); + signalInformation.put("diamond.error.message." + i, status.getMessage()); + signalInformation.put("diamond.time.stamp." + i,new String(timeFormat.format(status.getTimestamp()))); + i += 1; + } + /* Generate the signal XML file required for diamonds to update the signal information, + * using templateprocessor class + */ + templateFile = "diamonds_signal.xml.ftl"; + outputFile = DiamondsConfig.getOutputDir() + File.separator + "diamonds-signal.xml"; + sourceList.add(new PropertiesSource("diamondSignal", signalInformation)); + templateProcessor.convertTemplate(templateDir, templateFile, outputFile,sourceList); + + /* send the generated XML file for diamonds client to update the signals information into Diamonds */ + log.debug("[DiamondsExceptionStatusUpdate] => sending data to diamonds ..." + outputFile); + diamondsClient.sendData(outputFile, DiamondsConfig.getDiamondsProperties().getDiamondsBuildID()); + try { + DiamondsListenerImpl.mergeToFullResults(new File(outputFile)); + } catch (DiamondsException de) { + log.debug("[DiamondsExceptionStatusUpdate] => " + de.getMessage()); + } + } + /* Generate the build status XML file required for diamonds to update the build status information, + * using templateprocessor class. + */ + tempProperties.put("build.status", buildStatus); + sourceList.add(new PropertiesSource("ant", project.getProperties())); + sourceList.add(new PropertiesSource("diamonds", tempProperties)); + outputFile = DiamondsConfig.getOutputDir() + File.separator + "diamonds-status.xml"; + templateFile = "diamonds_status.xml.ftl"; + templateProcessor.convertTemplate(templateDir, templateFile, outputFile, sourceList); + + /* send the generated XML file for diamonds client to update the build status into Diamonds */ + log.debug("[DiamondsExceptionStatusUpdate] => sending data to diamonds ..." + outputFile); + diamondsClient.sendData(outputFile, DiamondsConfig.getDiamondsProperties().getDiamondsBuildID()); + try { + DiamondsListenerImpl.mergeToFullResults(new File(outputFile)); + } catch (DiamondsException de) { + log.debug("[DiamondsExceptionStatusUpdate] => " + de.getMessage()); + } + } + + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsListener.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsListener.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +package com.nokia.helium.diamonds; + +import org.apache.tools.ant.BuildEvent; + +/** + * Diamonds specific Listener interface. + * + */ +public interface DiamondsListener { + /** + * Function to process logging info during beginning of target execution + * + * @param event + * of target execution. + */ + void targetBegin(BuildEvent buildEvent) throws DiamondsException; + + /** + * Function to process logging info during end of target execution + * + * @param event + * of target execution. + */ + void targetEnd(BuildEvent buildEvent) throws DiamondsException; + + /** + * Function to process logging info during beginning of build + * + * @param event + * of target execution. + */ + void buildBegin(BuildEvent buildEvent) throws DiamondsException; + + /** + * Function to process logging info during end of build + * + * @param event + * of target execution. + */ + void buildEnd(BuildEvent buildEvent) throws DiamondsException; +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsListenerImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsListenerImpl.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,287 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.diamonds; + +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.util.FileUtils; +import java.util.Date; +import java.util.List; +import java.util.HashSet; +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.ListIterator; +import org.apache.log4j.Logger; +import java.util.Properties; +import com.nokia.helium.core.PropertiesSource; +import com.nokia.helium.core.TemplateInputSource; +import com.nokia.helium.core.TemplateProcessor; + +/** + * Base diamonds logger implementation. The common implementation like + * initialization done here and used by sub classes. + */ +public class DiamondsListenerImpl implements DiamondsListener { + + private static ArrayList finalLogList = new ArrayList(); + + private static DiamondsClient diamondsClient; + + private static boolean isInitialized; + + private static ArrayList deferLogList = new ArrayList(); + + private TemplateProcessor templateProcessor; + + private Project project; + + private SimpleDateFormat timeFormat; + + private Date buildStartTime; + + private Logger log = Logger.getLogger(DiamondsListenerImpl.class); + + /** + * Default constructor + */ + public DiamondsListenerImpl() { + templateProcessor = new TemplateProcessor(); + timeFormat = new SimpleDateFormat(DiamondsConfig + .getDiamondsProperties().getProperty("tstampformat")); + } + + /** + * Function to process logging info during end of build + * + * @param event + * of target execution. + */ + public final void buildBegin(BuildEvent buildEvent) + throws DiamondsException { + project = buildEvent.getProject(); + buildStartTime = new Date(); + } + + /** + * Function to process logging info during end of build + * + * @param event + * of target execution. + */ + @SuppressWarnings("unchecked") + public final void buildEnd(BuildEvent buildEvent) throws DiamondsException { + if (isInitialized()) { + log.debug("diamonds:DiamondsListenerImpl:sending final data to diamonds."); + String output = DiamondsConfig.getOutputDir() + File.separator + + "diamonds-finish.xml"; + File outputFile = new File(output); + String finishTemplateFile = "diamonds_finish.xml.ftl"; + try { + Properties tempProperties = new Properties(); + tempProperties.put("build.end.time", timeFormat + .format(new Date())); + List sourceList = new ArrayList(); + sourceList.add(new PropertiesSource("ant", project + .getProperties())); + sourceList + .add(new PropertiesSource("diamonds", tempProperties)); + templateProcessor.convertTemplate(DiamondsConfig + .getTemplateDir(), finishTemplateFile, output, + sourceList); + } catch (Exception e) { + log.debug("diamonds:DiamondsListenerImpl:exception: ", e); + throw new DiamondsException( + "failed to convert the build finish template: " + + e.getMessage()); + } + + try { + log.info("Sending final data to diamonds."); + // String mergedFile = mergeFiles(output); + diamondsClient.sendData(output, DiamondsConfig + .getDiamondsProperties().getDiamondsBuildID()); + } catch (Exception e) { + log.debug("diamonds:DiamondsListenerImpl: exception: ", e); + throw new DiamondsException("Failed to send data to diamonds: " + + e.getMessage()); + } + mergeToFullResults(outputFile); + isInitialized = false; + DiamondsProperties props = DiamondsConfig.getDiamondsProperties(); + String smtpServer = project.getProperty(props + .getProperty("smtpserver")); + String ldapServer = project.getProperty(props + .getProperty("ldapserver")); + + try { + File first = finalLogList.remove(0); + String outputDir = DiamondsConfig.getOutputDir(); + File fullResultsFile = new File(outputDir + File.separator + + "diamonds-full-results.xml"); + FileUtils.getFileUtils().copyFile(first, fullResultsFile); + XMLMerger merger = new XMLMerger(fullResultsFile); + HashSet h = new HashSet(finalLogList); + for (File f : h) { + try { + merger.merge(f); + } catch (XMLMerger.XMLMergerException xe) { + log.debug("Error during the merge: ", xe); + } + } + diamondsClient.sendDataByMail( + fullResultsFile.getAbsolutePath(), smtpServer, + ldapServer); + } catch (Exception e) { + log.debug("Error sending diamonds final log: ", e); + } + } + } + + /** + * Function to process logging info during begining of target execution + * + * @param event + * of target execution. + */ + public void targetBegin(BuildEvent buildEvent) throws DiamondsException { + initDiamondsClient(); + } + + /** + * Function to process logging info during end of target execution + * + * @param event + * of target execution. + */ + public void targetEnd(BuildEvent buildEvent) throws DiamondsException { + } + + /** + * returns true if diamonds is already initialized for the build. + * + * @param true diamonds initialized otherwise false. + */ + public static boolean isInitialized() { + return isInitialized; + } + + public static void mergeToFullResults(File xmlFile) throws DiamondsException { + finalLogList.add(xmlFile); + } + + protected String getSourceFile(String inputName) { + return DiamondsConfig.getOutputDir() + File.separator + inputName + + ".xml"; + } + + protected DiamondsClient getDiamondsClient() { + return diamondsClient; + } + + protected TemplateProcessor getTemplateProcessor() { + return templateProcessor; + } + + protected boolean getIsInitialized() { + return isInitialized; + } + + protected SimpleDateFormat getTimeFormat() { + return timeFormat; + } + + protected ArrayList getDeferLogList() { + return deferLogList; + } + + /** + * Initializes the diamonds client and sends the initial data + */ + @SuppressWarnings("unchecked") + protected void initDiamondsClient() throws DiamondsException { + String outputDir = DiamondsConfig.getOutputDir(); + if (!isInitialized) { + String startTemplateFile = "diamonds_start.xml.ftl"; + String output = outputDir + File.separator + + "diamonds-start.log.xml"; + File outputFile = new File(output); + try { + Properties tempProperties = new Properties(); + tempProperties.put("build.start.time", timeFormat + .format(buildStartTime)); + List sourceList = new ArrayList(); + sourceList.add(new PropertiesSource("ant", project + .getProperties())); + sourceList + .add(new PropertiesSource("diamonds", tempProperties)); + DiamondsProperties diamondsProperties = DiamondsConfig + .getDiamondsProperties(); + templateProcessor.convertTemplate(DiamondsConfig + .getTemplateDir(), startTemplateFile, output, + sourceList); + mergeToFullResults(outputFile); + + // String mergedFile = mergeFiles(output); + log.info("Initializing diamonds client"); + diamondsClient = new DiamondsClient(project + .getProperty(diamondsProperties.getProperty("host")), + project.getProperty(diamondsProperties + .getProperty("port")), project + .getProperty(diamondsProperties + .getProperty("path")), project + .getProperty(diamondsProperties + .getProperty("mail"))); + String buildID = diamondsClient + .getBuildId(outputFile.getAbsolutePath()); + if (buildID != null) { + diamondsProperties.setDiamondsBuildID(buildID); + project.setProperty(diamondsProperties.getProperty("buildid-property"), + diamondsProperties.getDiamondsBuildID()); + log.info("Got build id from diamonds" + + diamondsClient.getBuildId(outputFile + .getAbsolutePath())); + } else { + diamondsProperties.setDiamondsBuildID(buildID); + project.setProperty(diamondsProperties.getProperty("buildid-property"), + "default"); + log.info("diamonds build id set to default and in record only mode"); + } + if (deferLogList.size() > 0) { + log + .debug("diamonds:DiamondsListenerImpl: sending DefferList"); + ListIterator defferList = deferLogList + .listIterator(); + while (defferList.hasNext()) { + String mergedDeferFile = defferList.next(); + mergeToFullResults(new File(mergedDeferFile)); + diamondsClient.sendData(mergedDeferFile, DiamondsConfig + .getDiamondsProperties().getDiamondsBuildID()); + } + deferLogList.clear(); + } + isInitialized = true; + } catch (Exception e) { + log.debug("diamonds:DiamondsListenerImpl: ", e); + throw new DiamondsException("failed to connect to diamonds: " + + e.getMessage()); + } + } + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsPostBuildStatusUpdate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsPostBuildStatusUpdate.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,100 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: To update the build status to Diamonds with signals in case of build exceptions. +* +*/ + +package com.nokia.helium.diamonds; + +import org.apache.tools.ant.Project; +import com.nokia.helium.core.ant.types.*; +import com.nokia.helium.core.PropertiesSource; +import com.nokia.helium.core.TemplateInputSource; +import com.nokia.helium.core.TemplateProcessor; + +import org.apache.log4j.Logger; + +import java.util.List; +import java.io.File; +import java.util.ArrayList; +import java.util.Properties; + + +/** + * Class to store the builds status and send the generated XML file to diamonds client class + * to update the build status into diamonds + */ +public class DiamondsPostBuildStatusUpdate extends HlmPostDefImpl { + private Logger log; + + /* Initiate build status to failed as this method will be invoked in case of exceptions only */ + private String buildStatus = "succeeded"; + + private TemplateProcessor templateProcessor; + + private String outputFile,templateFile; + + private List sourceList = new ArrayList(); + + public DiamondsPostBuildStatusUpdate() { + log = Logger.getLogger(DiamondsPostBuildStatusUpdate.class); + } + + /** + * Override execute method to update build status to diamonds. + * @param prj + * @param module + * @param targetNames + */ + @SuppressWarnings("unchecked") + public void execute(Project prj, String module, String[] targetNames) { + templateProcessor = new TemplateProcessor(); + Properties tempProperties = new Properties(); + + /* Intialiaze the diamond properties class to access the diamonds properties */ + DiamondsProperties diamondsProperties = DiamondsConfig.getDiamondsProperties(); + + //Check, Is the diamonds listener is initialized? + if (DiamondsListenerImpl.isInitialized()) { + /* Initialize the diamond client class required to update the information into diamonds. */ + DiamondsClient diamondsClient = new DiamondsClient(getProject() + .getProperty(diamondsProperties.getProperty("host")), + getProject().getProperty(diamondsProperties + .getProperty("port")), getProject() + .getProperty(diamondsProperties + .getProperty("path")), getProject() + .getProperty(diamondsProperties + .getProperty("mail"))); + /* Generate the build status XML file required for diamonds to update the build status information, + * using templateprocessor class. + */ + tempProperties.put("build.status", buildStatus); + sourceList.add(new PropertiesSource("ant", getProject().getProperties())); + sourceList.add(new PropertiesSource("diamonds", tempProperties)); + outputFile = DiamondsConfig.getOutputDir() + File.separator + "diamonds-status.xml"; + templateFile = "diamonds_status.xml.ftl"; + templateProcessor.convertTemplate(DiamondsConfig.getTemplateDir(), templateFile, outputFile, sourceList); + + /* send the generated XML file for diamonds client to update the build status into Diamonds */ + log.debug("[DiamondsPostBuildStatusUpdate] => sending data to diamonds ..." + outputFile); + diamondsClient.sendData(outputFile, DiamondsConfig.getDiamondsProperties().getDiamondsBuildID()); + try { + DiamondsListenerImpl.mergeToFullResults(new File(outputFile)); + } catch (DiamondsException de) { + log.debug("[DiamondsExceptionStatusUpdate] => " + de.getMessage()); + } + } + } + +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsProperties.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/DiamondsProperties.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + +package com.nokia.helium.diamonds; + +import java.util.Map; + +/** + * Helper class for Diamonds properties need to connect. + * + */ +public class DiamondsProperties { + private Map diamondsProperties; + + public DiamondsProperties(Map configroperties) { + diamondsProperties = configroperties; + } + + /** + * Gets the build id returned by Diamonds server. + * + * @return build ID + */ + public String getDiamondsBuildID() { + return diamondsProperties.get("buildid"); + } + + /** + * Sets the build id obtained from the server. + * + * @param diamondsBuildID + */ + public void setDiamondsBuildID(String diamondsBuildID) { + diamondsProperties.put("buildid", diamondsBuildID); + } + + /** + * Returns the required property obtained from config + * + * @param property + * for which the values needs to be obtained. + * @return address of server + */ + public String getProperty(String property) { + // need to validate the properties while assigning in constructor + return diamondsProperties.get(property); + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/Stage.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/Stage.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,93 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.diamonds; + +/** + * Helper class for Stage configuration of Diamonds. + * + */ +public class Stage { + private String stageName; + private String startTargetName; + private String endTargetName; + private String source; + + /** + * Constructor + * + * @param stName + * - name of the stage + * @param startTgName + * - Name of the start target + * @param endTgName + * - Name of the ending target of the stage + */ + public Stage(String stName, String startTgName, String endTgName, + String sourceFiles) { + String emptyString = ""; + if (!stName.equals(emptyString)) { + stageName = stName; + } + if (!startTgName.equals(emptyString)) { + startTargetName = startTgName; + } + if (!endTgName.equals(emptyString)) { + endTargetName = endTgName; + } + if (!sourceFiles.equals(emptyString)) { + source = sourceFiles; + } + } + + /** + * Get the stage Name of the stage. + * + * @return - name of the stage + */ + public String getStageName() { + return stageName; + } + + /** + * Get the stage Name of the stage. + * + * @return - name of the stage + */ + public String getSourceFile() { + return source; + } + + /** + * gets the start target of the stage + * + * @return - start target of the stage + */ + public String getStartTargetName() { + return startTargetName; + } + + /** + * gets the end target name of the stage. + * + * @return - end target name of the stage + */ + public String getEndTargetName() { + return endTargetName; + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +package com.nokia.helium.diamonds; + +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.Target; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.BuildException; + + + +import java.util.Date; + +import java.util.HashMap; +import java.util.List; +import java.util.Enumeration; +import java.util.Map; +import java.io.File; +import java.util.Iterator; +import java.util.Vector; +import java.util.ArrayList; +import org.apache.log4j.Logger; + +import com.nokia.helium.core.PropertiesSource; +import com.nokia.helium.core.TemplateInputSource; + + +import com.nokia.helium.core.XMLTemplateSource; + +/** + * Diamonds client used to connect to get build id and also to send the build + * results + * + */ +public class StageDiamondsListener extends DiamondsListenerImpl { + + private static final Date INVALID_DATE = new Date(-1); + + private Logger log = Logger.getLogger(StageDiamondsListener.class); + + private List> stageTargetBeginList = new ArrayList>(); + + private Map stageTargetEndMap = new HashMap(); + + private boolean isTargetMapInitialized; + + private Project project; + + private String currentStartTargetName; + + private List stages; + + private Date currentStartTargetTime; + + public StageDiamondsListener() { + stages = DiamondsConfig.getStages(); + } + + public void targetBegin(BuildEvent buildEvent) throws DiamondsException { + project = buildEvent.getProject(); + String targetName = buildEvent.getTarget().getName(); + if (!isTargetMapInitialized && stages != null) { + log + .debug("diamonds:StageDiamondsListener: initializing for all stages."); + initStageTargetsMap(); + isTargetMapInitialized = true; + } + if (currentStartTargetName == null) { + findAndSetStartTimeForTargetInStageList(targetName); + } + } + + @SuppressWarnings("unchecked") + public void targetEnd(BuildEvent buildEvent) throws DiamondsException { + if (currentStartTargetName != null) { + String targetName = buildEvent.getTarget().getName(); + Stage stage = stageTargetEndMap.get(targetName); + if (stage != null && getIsInitialized() ) { + //initDiamondsClient(); + String stageName = stage.getStageName(); + String sourceFile = stage.getSourceFile(); + log + .debug("diamonds:StageDiamondsListener: finished recording for stage: " + + stageName); + if (sourceFile == null) { + sourceFile = getSourceFile(stageName); + } + project.setProperty("logical.stage", stageName); + project.setProperty("stage.start.time", getTimeFormat() + .format(currentStartTargetTime)); + project.setProperty("stage.end.time", getTimeFormat() + .format(new Date())); + currentStartTargetName = null; + // Look for template file with stage name + String stageTemplateFileName = stageName + ".xml.ftl"; + File stageTemplateFile = new File(stageTemplateFileName); + if (stageTemplateFile.exists()) { + String output = DiamondsConfig.getOutputDir() + + File.separator + stageName + ".xml"; + try { + List sourceList = new ArrayList(); + sourceList.add(new PropertiesSource("ant", project + .getProperties())); + sourceList + .add(new XMLTemplateSource("doc", new File(sourceFile))); + getTemplateProcessor().convertTemplate(DiamondsConfig + .getTemplateDir(), stageTemplateFileName, + output, sourceList); + mergeToFullResults(new File(output)); + + // String mergedFile = mergeFiles(new File(output)); + + log.info("Sending data to diamonds for stage: " + + stageName); + getDiamondsClient().sendData(output, DiamondsConfig + .getDiamondsProperties().getDiamondsBuildID()); + } catch (com.nokia.helium.core.TemplateProcessorException e1) { + throw new DiamondsException( + "template conversion error for stage: " + + stageName + " : " + e1.getMessage()); + } + } else { + log.debug("diamonds:StageDiamondsListener:tempalte file: " + + stageTemplateFile + " does not exist"); + } + + String output = DiamondsConfig.getOutputDir() + File.separator + + stageName + "-time.xml"; + // Store the time for the current stage and send it + stageTemplateFileName = "diamonds_stage.xml.ftl"; + try { + List sourceList = new ArrayList(); + sourceList.add(new PropertiesSource("ant", project + .getProperties())); + sourceList.add(new XMLTemplateSource("doc", new File(sourceFile))); + getTemplateProcessor().convertTemplate(DiamondsConfig + .getTemplateDir(), stageTemplateFileName, output, + sourceList); + mergeToFullResults(new File(output)); + // List filesToMerge = new ArrayList(); + + // mergedFile = mergeFiles(output); + getDiamondsClient().sendData(output, DiamondsConfig + .getDiamondsProperties().getDiamondsBuildID()); + } catch (com.nokia.helium.core.TemplateProcessorException e1) { + log.debug("diamonds:StageDiamondsListener:exception: ", e1); + throw new DiamondsException( + "template conversion error while sending data for stage: " + + stageName + " : " + e1.getMessage()); + } + } + } + } + + private void findAndSetStartTimeForTargetInStageList(String targetName) + throws DiamondsException { + for (Iterator> listIter = stageTargetBeginList.iterator(); listIter + .hasNext();) { + Map stageMap = listIter.next(); + Date targetTime = stageMap.get(targetName); + if (targetTime != null && targetTime.equals(INVALID_DATE)) { + log.debug("diamonds:StageDiamondsListener: started recording for stage-target: " + + targetName); + stageMap.put(targetName, new Date()); + currentStartTargetName = targetName; + currentStartTargetTime = new Date(); + } + } + } + + @SuppressWarnings("unchecked") + private void initStageTargetsMap() { + Iterator iter = stages.iterator(); + while (iter.hasNext()) { + // stage begin process + Stage stage = iter.next(); + String startTargetName = stage.getStartTargetName(); + Map stageMap = new HashMap(); + Vector arrayList = null; + try { + arrayList = project.topoSort(startTargetName, project + .getTargets(), false); + } catch (BuildException be) { + log.debug("Diamonds target missing: ", be); + } + if (arrayList != null) { + Enumeration targetEnum = arrayList.elements(); + while (targetEnum.hasMoreElements()) { + // fast lookup + Target target = targetEnum.nextElement(); + stageMap.put(target.getName(), INVALID_DATE); + } + stageTargetBeginList.add(stageMap); + + // stage end process + String endTargetName = stage.getEndTargetName(); + // fast lookup + stageTargetEndMap.put(endTargetName, stage); + } + } + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/Target.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/Target.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,109 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.diamonds; + +/** + * Helper class for the target in diamonds config. + * + */ +public class Target { + private String targetName; + private String source; + private boolean reqAntProperties; + private boolean defer; + private String templatefile; + + /** + * Constructor + * + * @param target + * - name of the target + * @param src + * - input source location. + */ + public Target(String target, String src) { + this(target, null, src, "false", "false"); + } + + /** + * Constructor + * + * @param target + * - name of the target + * @param src + * - input source location. + * @param antProps + * - boolean to pass ant properties while conversion. + */ + public Target(String target, String tplfile, String src, String antProps, + String deferSend) { + String emptyString = ""; + if (!target.equals(emptyString)) { + targetName = target; + } + if (!src.equals(emptyString)) { + source = src; + } + if (!tplfile.equals(emptyString)) { + templatefile = tplfile; + } + if (antProps != null && antProps.equals("true")) { + reqAntProperties = true; + } + if (deferSend != null && deferSend.equals("true")) { + defer = true; + } + } + + /** + * Get the target name of the target to send data + * + * @return - target name of the target to send data + */ + public String getTargetName() { + return targetName; + } + + /** + * Get the input source used for template conversion. + * + * @return - location of the input source. + */ + public String getSource() { + return source; + } + + public boolean isDefer() { + return defer; + } + + public String getTemplateFile() { + return templatefile; + } + + /** + * returns true if ant properties required for conversion, obtained from + * configuration. + * + * @return - name of the stage + */ + public boolean isAntPropertiesRequired() { + return reqAntProperties; + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/TargetDiamondsListener.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/TargetDiamondsListener.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,199 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +package com.nokia.helium.diamonds; + +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.Target; +import org.apache.tools.ant.Project; + +import java.util.ArrayList; +import java.util.List; +import java.util.Hashtable; +import java.util.Map; +import java.io.File; +import org.apache.log4j.Logger; +import com.nokia.helium.core.PropertiesSource; +import com.nokia.helium.core.TemplateInputSource; +import com.nokia.helium.core.XMLTemplateSource; + +/** + * Listener sending data based on target configuration to diamonds. + */ +public class TargetDiamondsListener extends DiamondsListenerImpl { + + private Project project; + + private Logger log = Logger.getLogger(TargetDiamondsListener.class); + + private Map targetsMap; + + private String currentTarget; + + /** + * Default constructor + */ + public TargetDiamondsListener() { + targetsMap = DiamondsConfig.getTargets(); + } + + private boolean isTargetsToExecute(BuildEvent buildEvent) { + project = buildEvent.getProject(); + Target target = buildEvent.getTarget(); + boolean retValue = false; + com.nokia.helium.diamonds.Target currentTarget = targetsMap + .get(target.getName()); + String currentTargetName = null; + if (currentTarget != null) { + currentTargetName = currentTarget.getTargetName(); + } + if (currentTargetName != null) { + String ifCondition = target.getIf(); + String unlessCondition = target.getUnless(); + if (ifCondition == null && unlessCondition == null) { + retValue = true; + } else { + String ifProperty = project.getProperty(ifCondition); + String unlessProperty = project.getProperty(unlessCondition); + if (ifProperty != null || unlessProperty == null) { + retValue = true; + } + } + } + return retValue; + } + + /** + * Function to process logging info during beginning of target execution. + * This checks that the current target execution is in config and requires + * some data to be send it to diamonds. + * + * @param event + * of target execution. + */ + public void targetBegin(BuildEvent buildEvent) throws DiamondsException { + String targetName = buildEvent.getTarget().getName(); + if (isTargetsToExecute(buildEvent)) { + currentTarget = targetName; + com.nokia.helium.diamonds.Target target = targetsMap + .get(currentTarget); + if (!target.isDefer()) { + initDiamondsClient(); + } + } + } + + /** + * Function to process logging info during end of build. If the target in + * config, sends the data to diamonds (uses the template conversion if + * needed). + * + * @param event + * of target execution. + */ + public void targetEnd(BuildEvent buildEvent) throws DiamondsException { + String targetName = buildEvent.getTarget().getName(); + if (currentTarget != null && currentTarget.equals(targetName)) { + if (getIsInitialized()) { + log + .debug("diamonds:TargetDiamondsListener:finished recording, sending data to diamonds for target: " + + buildEvent.getTarget().getName()); + sendTargetData(buildEvent, buildEvent.getTarget().getProject()); + } + currentTarget = null; + } + } + + /** + * Sends the data to diamonds. First it looks if the template with target + * name exists, then it looks for input source file from config, if ant + * properties required from config, it uses it for template conversion. If + * no template file exists, sends the data directly. + * + * @param event + * of target execution. + */ + @SuppressWarnings("unchecked") + private void sendTargetData(BuildEvent buildEvent, Project project) + throws DiamondsException { + com.nokia.helium.diamonds.Target target = targetsMap + .get(currentTarget); + String sourceFile = target.getSource(); + if (sourceFile == null) { + sourceFile = getSourceFile(target.getTargetName()); + } + Hashtable antProperties = null; + String targetTemplateFile = target.getTemplateFile(); + if (targetTemplateFile == null) { + targetTemplateFile = target.getTargetName() + ".xml.ftl"; + } + String output = DiamondsConfig.getOutputDir() + File.separator + + target.getTargetName() + ".xml"; + File templateFile = new File(DiamondsConfig.getTemplateDir(), + targetTemplateFile); + List sourceList = new ArrayList(); + if (sourceFile == null) { + log + .debug("diamonds:TargetDiamondsListener:sourceFile not defined."); + } else { + sourceList.add(new XMLTemplateSource("doc", new File(sourceFile))); + } + // Ant? + if (target.isAntPropertiesRequired()) { + sourceList + .add(new PropertiesSource("ant", project.getProperties())); + } + try { + if (templateFile.exists()) { + if (!(antProperties == null && sourceFile == null)) { + getTemplateProcessor().convertTemplate(DiamondsConfig + .getTemplateDir(), targetTemplateFile, output, + sourceList); + } + } else { + log + .debug("diamonds:TargetDiamondsListener:sendTargetData: exists(" + + templateFile.getAbsolutePath() + ") => false"); + + } + } catch (com.nokia.helium.core.TemplateProcessorException e1) { + log.debug( + "diamonds:TargetDiamondsListener:sendTargetData:exception", + e1); + throw new DiamondsException( + "template conversion error while sending data for target:" + + target + ":" + e1.getMessage()); + } + File outputFile = new File(output); + if (outputFile.exists()) { + mergeToFullResults(outputFile); + if (!target.isDefer()) { + getDiamondsClient().sendData(outputFile.getAbsolutePath(), + DiamondsConfig.getDiamondsProperties() + .getDiamondsBuildID()); + } else { + log.debug("diamonds:TargetDiamondsListener:defer logging for: " + + outputFile); + getDeferLogList().add(output); + } + } else { + log.debug("diamonds:TargetDiamondsListener:outputfile " + + outputFile + " does not exist"); + } + } + +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/XMLMerger.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/XMLMerger.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,182 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.diamonds; + +import java.io.File; +import java.io.FileOutputStream; +import java.util.Iterator; +import java.util.List; + +import org.apache.log4j.Logger; +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.OutputFormat; +import org.dom4j.io.SAXReader; +import org.dom4j.io.XMLWriter; + +/** + * This class implements an XML file merger. All node from an external XML with + * same format (same root node name) will get added to the source root element. + */ +public class XMLMerger { + private Logger log = Logger.getLogger(getClass()); + private File merge; + private Document doc; + private Element root; + + /** + * Create an XMLMerger, the merge file will be used as input and output. + * + * @param merge + * @throws XMLMergerException + */ + public XMLMerger(File merge) throws XMLMergerException { + log.debug("Merging into: " + merge.getAbsolutePath()); + try { + this.merge = merge; + SAXReader reader = new SAXReader(); + doc = reader.read(merge); + root = doc.getRootElement(); + } catch (DocumentException e) { + throw new XMLMergerException(e.getMessage()); + } + } + + /** + * Add all sub element of data file into the merged file. If the root + * element name is different for the merged file an XMLMergerException is + * thrown. + * + * @param data + * the input file. + * @throws XMLMergerException + */ + public void merge(File data) throws XMLMergerException { + log.debug("Merging " + data.getAbsolutePath()); + try { + SAXReader reader = new SAXReader(); + Document dataDoc = reader.read(data); + Element dataRoot = dataDoc.getRootElement(); + if (!root.getName().equals(dataRoot.getName())) { + throw new XMLMergerException( + "Trying to merge incompatible xml format ('" + + root.getName() + "'!='" + dataRoot.getName() + + "')"); + } + mergeNode(root, dataRoot); + write(); + } catch (DocumentException e) { + log.debug("Error merging: " + e); + throw new XMLMergerException(e.getMessage()); + } + } + + /** + * Merging two XML elements. It only keeps difference. + * + * @param dest + * @param src + */ + @SuppressWarnings("unchecked") + protected void mergeNode(Element dest, Element src) { + for (Iterator node = src.elements().iterator(); node.hasNext();) { + Element e = node.next(); + + List ses = dest.elements(e.getName()); + boolean add = true; + for (Element se : ses) { + if (areSame(se, e)) { + log.debug("Element " + e.getName() + " already found in dest."); + add = false; + } + } + if (add) { + log.debug("Adding node " + e.getName() + " to " + dest.getName()); + dest.add(e.detach()); + } else if (ses.size() > 0) { + log.debug("Merging " + ses.get(0).getName() + " to " + e.getName()); + mergeNode(ses.get(0), e); + } + } + } + + /** + * Compare two elements name and attributes. Returns true if name and all + * attributes are matching, false otherwise. + * + * @param a + * @param b + * @return boolean + */ + @SuppressWarnings("unchecked") + protected boolean areSame(Element a, Element b) { + log.debug("areSame:" + a + " <=> " + b); + if (!a.getName().equals(b.getName())) + return false; + log.debug("same attribute list size?"); + if (a.attributes().size() != b.attributes().size()) + return false; + log.debug("same attribute list?"); + for (Iterator at = a.attributes().iterator(); at.hasNext();) { + Attribute attra = at.next(); + Attribute attrb = b.attribute(attra.getName()); + if (attrb == null || !attra.getValue().equals(attrb.getValue())) + return false; + } + if (!a.getTextTrim().equals(b.getTextTrim())) + return false; + return true; + } + + /** + * Write the XML content back the file. + * @throws XMLMergerException + */ + protected void write() throws XMLMergerException { + log.debug("Writing " + merge.getAbsolutePath()); + try { + FileOutputStream fos = new FileOutputStream(merge); + OutputFormat format = OutputFormat.createPrettyPrint(); + XMLWriter writer = new XMLWriter(fos, format); + writer.write(doc); + writer.flush(); + } catch (Exception e) { + throw new XMLMergerException(e.getMessage()); + } + } + + /** + * Exception class related to the XMLMerger. + */ + public class XMLMergerException extends Exception { + + private static final long serialVersionUID = 7624650310086957316L; + + /** + * Default constructor. + * @param msg error message + */ + public XMLMergerException(String msg) { + super(msg); + } + } + +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/ant/HeliumListener.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/ant/HeliumListener.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,259 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.helium.diamonds.ant; + +import java.io.File; +import java.util.Hashtable; +import java.util.List; +import java.util.ArrayList; +import org.apache.tools.ant.BuildListener; +import org.apache.tools.ant.BuildException; +import com.nokia.helium.diamonds.*; +import com.nokia.helium.core.PropertiesSource; +import com.nokia.helium.core.TemplateProcessor; + +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.Project; +import org.apache.log4j.Logger; + +/** + * Listener class that can connect to Ant and log information regarding to build + * times, number of errors and such. Data is sent to Diamonds server, where it + * is processed further. + * + * This class is listening all build related events. It catches the build + * start-finish, target start-finish events of Ant and gather build start-end + * time, errors/warnings and store in BuildData class. Stored data will be + * exported to XML and uploaded to Diamonds server after each specific target. + * For example after target "create-bom" this class will upload all BOM data to + * Diamonds. + * + * + */ +public class HeliumListener implements BuildListener { + + private Logger log = Logger.getLogger(HeliumListener.class); + + private List diamondsListeners; + + private Project project; + + private boolean isInitialized; + + private boolean skipDiamonds; + private boolean skipDiamondsSet; + + /** + * Default constructor. + */ + public HeliumListener() { + diamondsListeners = new ArrayList(); + } + + /** + * Ant call this function when build start. + */ + public void buildStarted(BuildEvent event) { + project = event.getProject(); + } + + /** + * Triggered when a target starts. + */ + @SuppressWarnings("unchecked") + public void targetStarted(BuildEvent event) { + String targetName = event.getTarget().getName(); + project = event.getProject(); + + String skip = project.getProperty("skip.diamonds"); + if (skip != null && skip.equals("true")) { + skipDiamonds = true; + } + try { + if (!skipDiamonds) { + if (!isInitialized) { + String configFile = project + .getProperty("diamonds.listener.configuration.file"); + parseConfig(configFile, project.getProperties()); + isInitialized = true; + } + DiamondsProperties diamondProperties = DiamondsConfig + .getDiamondsProperties(); + + /** + * Initialize Diamonds if and only if initializer-target-name has been called + */ + if (targetName.equals(DiamondsConfig.getInitialiserTargetName())) { + String categoryName = diamondProperties.getProperty("category-property"); + String category = project.getProperty(categoryName); + log.debug("category:" + category); + if (category != null && diamondsListeners.isEmpty()) { + addListeners(event); + log.info("Diamonds enabled"); + } + } + } else { + if (!skipDiamondsSet && skipDiamonds) + { + log.info("skip.diamonds set, to use diamonds don't set skip.diamonds."); + skipDiamondsSet = true; + } + } + } catch (Exception ex) { + log.debug("Diamonds error: ", ex); + String errorMessage = ex.getMessage(); + if (errorMessage == null) { + errorMessage = ""; + } + log + .info("Diamonds Error, might not be logged properly, see debug log. " + + errorMessage); + } + if (diamondsListeners != null) { + for (DiamondsListener diamondsListener : diamondsListeners) { + try { + diamondsListener.targetBegin(event); + } catch (Exception e) { + log.debug("Error:", e); + String errorMessage = e.getMessage(); + if (errorMessage == null) { + errorMessage = ""; + } + log + .info("Diamonds Error, might not be logged properly, see debug log. " + + errorMessage); + } + } + } + } + + @SuppressWarnings("unchecked") + private void parseConfig(String configFile, Hashtable antProperties) { + TemplateProcessor templateProcessor = new TemplateProcessor(); + File outputFile = null; + try { + outputFile = File.createTempFile("diamonds", "-config.xml"); + outputFile.deleteOnExit(); + log + .debug("Preprocessing the diamonds configuration: " + + configFile); + List sourceList = new ArrayList(); + sourceList.add(new PropertiesSource("ant", antProperties)); + templateProcessor.convertTemplate(configFile, + outputFile.toString(), sourceList); + } catch (Exception e) { + log.debug("Error: ", e); + throw new BuildException( + "Diamonds configuration pre-parsing error: " + + e.getMessage()); + } + try { + DiamondsConfig.parseConfiguration(outputFile.toString()); + } catch (Exception e) { + log.debug("Error: ", e); + throw new BuildException("Diamonds configuration parsing error: " + + e.getMessage()); + } + } + + private void addListeners(BuildEvent event) throws DiamondsException { + if (DiamondsConfig.isStagesInConfig()) { + StageDiamondsListener stageListener = new StageDiamondsListener(); + diamondsListeners.add(stageListener); + stageListener.buildBegin(event); + } + if (DiamondsConfig.isTargetsInConfig()) { + TargetDiamondsListener targetListener = new TargetDiamondsListener(); + diamondsListeners.add(targetListener); + targetListener.buildBegin(event); + } + } + + /** + * Triggered when a target finishes. + */ + public void targetFinished(BuildEvent event) { + if (diamondsListeners != null) { + for (DiamondsListener diamondsListener : diamondsListeners) { + try { + diamondsListener.targetEnd(event); + } catch (Exception e) { + log.debug("Error:", e); + String errorMessage = e.getMessage(); + if (errorMessage == null) { + errorMessage = ""; + } + log + .info("Diamonds Error, might not be logged properly, see debug log. " + + errorMessage); + } + + } + } + } + + /** + * Triggered when the build finishes. + */ + public void buildFinished(BuildEvent event) { + if (diamondsListeners != null) { + for (DiamondsListener diamondsListener : diamondsListeners) { + try { + diamondsListener.buildEnd(event); + } catch (Exception e) { + log.debug("Error: ", e); + log.info("Failed to log in diamonds: " + e); + } + + } + } + project = event.getProject(); + cleanup(); + } + + /** + * See if build needs a final cleanup target to be called. + */ + private void cleanup() { + String loggingoutputfile = project.getProperty("logging.output.file"); + if (loggingoutputfile != null) { + File f = new File(loggingoutputfile); + if (f.exists()) + f.delete(); + } + } + + /** + * Triggered when a task starts. + */ + public void taskStarted(BuildEvent event) { + } + + /** + * Triggered when a task finishes. + */ + public void taskFinished(BuildEvent event) { + } + + /** + * Triggered when a build message is logged. + */ + public void messageLogged(BuildEvent event) { + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/helium.antlib.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/src/com/nokia/helium/diamonds/helium.antlib.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,35 @@ + + + + + Ant task definition declarations. + + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/bld.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/bld.sh Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,24 @@ +#!/bin/csh + +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + + + +setenv COMPUTERNAME fasbs01 +module load java/1.6.0 +setenv ANT_ARGS "-lib ../lib -lib ../../lib -lib ../../core/lib -lib ../../bin/helium-core.jar -lib ../../bin/helium-diamonds.jar -lib ../../antlibs" +ant -Dant.executor.class="com.nokia.helium.core.ant.HeliumExecutor" $* diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/build.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/build.bat Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,27 @@ +@echo off + +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of the License "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: +rem + +setlocal +if not defined JAVA_6_HOME ( +set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02 +) ELSE set TESTED_JAVA=%JAVA_6_HOME% +if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%) +set ANT_ARGS=-lib ..\lib -lib ..\..\lib -lib ..\..\core\lib -lib ..\..\bin\helium-core.jar -lib ..\..\bin\helium-diamonds.jar -lib ..\..\antlibs -lib ..\..\bin\helium-signaling.jar +ant -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor %* +endlocal + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/build.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/build.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,52 @@ + + + + Helium Antlib diamonds tests. + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/config/diamonds_config.xml.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/config/diamonds_config.xml.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/data/compile.log.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/data/compile.log.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,2301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/data/create-bom-log.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/data/create-bom-log.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,11 @@ + + + 10 + + + build + 2009-02-03T01:17:52 + 2009-02-03T01:17:52 + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/data/problemIndex.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/data/problemIndex.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,14859 @@ + + + + + + 118 + + + 244 + + + + + + + 61 + 113 + + + 69 + + + + + 127 + + + 291 + 388 + + + 57 + + + 61 + + + 134 + 168 + + + 135 + 166 + + + 93 + + + 106 + 109 + + + 82 + 507 + + + 96 + + + 121 + + + + + 916 + 1282 + + + 75 + + + 129 + + + 138 + 155 + + + 841 + + + + + 1607 + + + 115 + 235 + + + 210 + + + 253 + + + + + + + 23 + + + 32 + + + 30 + + + 114 + 143 + + + 78 + + + 23 + 24 + 25 + 26 + 27 + + + 24 + 25 + + + + + 88 + + + 86 + 257 + + + 87 + + + 58 + + + 107 + 452 + 481 + + + 118 + 332 + 334 + + + 47 + + + 31 + + + 52 + 71 + + + 53 + 198 + + + 57 + + + 175 + + + 69 + + + 134 + + + 45 + + + 43 + + + 57 + + + 184 + 209 + 336 + 524 + 553 + 639 + 644 + 650 + 654 + 853 + 922 + 928 + 934 + 940 + 1005 + 1076 + 1246 + 1266 + 1340 + 1376 + + + 33 + + + 63 + + + 40 + + + 93 + 302 + 340 + 404 + 434 + 467 + + + 55 + + + 70 + + + 61 + + + 66 + + + 64 + + + 320 + 322 + 586 + 673 + 757 + 859 + 931 + 1144 + 1202 + 1224 + 1226 + 1241 + 1244 + 1288 + + + 672 + 725 + 1262 + + + 411 + + + 47 + + + 48 + + + 45 + 143 + + + 87 + + + 269 + 295 + 358 + + + 58 + + + 42 + + + 60 + + + 64 + + + 33 + + + 40 + + + 81 + + + 134 + + + 57 + 195 + + + 117 + + + 54 + + + 74 + 249 + 362 + + + 43 + + + 41 + + + 55 + + + 88 + + + 76 + 169 + 244 + 307 + + + 73 + + + 50 + + + 58 + 216 + + + 71 + 87 + 102 + 164 + + + 78 + + + 175 + + + 101 + 255 + 407 + + + 31 + + + 66 + + + 73 + 162 + + + 79 + + + 94 + + + 46 + + + 48 + + + 74 + + + 55 + + + 608 + + + 66 + 130 + 171 + + + 392 + 396 + + + 58 + + + 62 + + + 147 + 176 + 386 + + + 59 + + + 51 + 370 + + + 105 + + + 41 + 113 + 128 + + + 90 + 1306 + + + 138 + + + 73 + + + 53 + + + 36 + + + 76 + 377 + + + 240 + 513 + + + 108 + + + 54 + + + 34 + + + 74 + + + 55 + + + 51 + + + 64 + + + 70 + + + 48 + + + 283 + + + 70 + + + 43 + + + 115 + + + 69 + + + 661 + 1358 + 1395 + 1486 + 1491 + + + 135 + + + 56 + + + 61 + + + + + 1331 + + + 40 + + + 38 + + + 28 + + + 25 + + + 64 + + + 23 + + + 34 + + + 52 + + + 33 + + + 34 + + + 33 + + + 48 + + + 39 + + + 34 + + + 27 + + + 38 + + + 33 + + + 33 + + + + + 51 + + + + + 51 + + + 28 + + + + + 29 + + + 43 + 52 + 70 + 114 + 122 + 129 + 138 + 148 + 160 + 167 + 174 + 183 + 191 + 198 + 205 + 212 + 219 + 226 + 233 + + + 35 + 55 + 63 + 70 + 77 + 84 + 94 + 101 + 108 + 116 + 124 + 132 + 139 + 146 + 153 + 160 + 167 + 179 + 188 + 196 + 205 + + + 38 + 51 + 76 + 91 + + + 45 + 56 + 63 + 71 + 80 + 87 + 95 + 104 + 111 + 120 + 186 + 194 + 206 + + + 35 + 45 + 62 + 72 + 83 + 98 + 111 + 125 + 139 + 155 + + + 34 + 60 + 85 + 93 + 102 + 112 + 121 + 130 + 138 + 146 + 156 + 165 + 178 + 189 + 201 + 211 + 223 + + + 310 + 330 + 355 + 376 + + + 32 + 55 + 65 + 74 + 83 + 91 + 105 + 116 + 125 + + + 42 + 68 + 84 + 100 + 108 + 119 + + + 37 + + + 176 + + + 42 + 49 + 65 + 85 + 95 + 103 + 112 + 121 + 129 + 141 + 149 + 157 + 165 + 173 + 181 + 189 + 197 + 207 + 216 + + + 31 + 50 + 60 + 77 + 85 + 104 + 112 + + + 46 + 60 + 70 + 78 + 86 + 95 + 104 + 113 + 122 + 131 + 139 + 160 + 169 + 177 + 186 + 195 + 203 + 212 + 221 + 230 + 246 + 254 + + + 36 + + + 33 + 46 + 56 + 74 + 105 + 117 + 134 + 148 + 167 + 178 + 191 + 200 + 210 + 217 + 224 + 231 + + + 44 + 55 + 63 + 71 + 78 + 88 + 95 + 102 + 109 + 116 + + + 189 + 209 + 234 + 255 + 272 + 283 + 293 + 301 + 309 + + + 30 + 52 + 62 + 72 + 81 + 90 + 98 + 112 + 120 + 128 + 138 + 150 + 159 + + + 38 + 54 + 64 + + + 28 + + + 30 + 40 + 47 + 54 + 68 + 74 + 84 + 91 + 97 + + + 34 + 66 + 95 + 106 + 115 + 126 + 150 + 158 + 167 + 176 + 184 + 192 + 206 + 214 + 222 + 230 + 241 + 250 + 261 + 270 + 280 + 288 + + + 34 + + + 40 + + + 43 + 76 + 101 + 111 + 121 + 130 + 141 + 156 + 172 + 186 + 197 + 207 + 221 + 235 + 245 + 256 + 269 + 279 + + + 46 + + + 38 + 49 + 59 + 75 + 85 + 95 + 110 + 121 + 131 + 141 + 154 + 163 + 181 + 189 + 202 + 211 + 219 + 229 + 246 + + + 49 + 72 + 83 + 111 + 116 + 132 + 144 + 153 + 162 + 171 + + + 32 + 59 + 68 + 78 + 96 + 103 + 110 + 117 + + + 56 + + + 31 + 49 + 60 + 73 + + + 63 + + + 31 + 50 + 57 + 66 + 75 + 85 + + + 35 + 43 + + + 40 + 59 + 68 + + + 36 + 55 + 63 + 71 + 79 + 87 + 95 + 104 + 116 + 127 + 135 + 144 + 153 + 161 + 169 + 178 + 186 + 194 + 202 + 211 + 219 + + + 31 + 56 + + + 42 + 51 + 65 + 85 + 94 + 102 + + + 46 + 57 + 68 + 91 + 116 + 141 + + + 31 + 52 + 61 + 71 + 80 + 93 + 101 + 115 + 123 + 131 + 139 + 147 + 157 + 167 + 179 + 188 + + + 57 + + + 40 + 58 + 69 + 80 + 91 + 103 + 113 + 126 + 137 + + + 43 + 50 + 117 + 125 + 140 + 149 + 157 + + + 29 + 53 + 63 + 74 + + + 40 + 59 + 66 + 73 + 84 + 91 + 103 + 111 + 119 + 127 + 135 + + + 32 + 42 + 50 + + + 38 + + + 45 + 103 + 116 + 136 + 163 + 184 + 200 + 220 + 243 + 252 + 262 + 281 + 303 + 330 + 348 + 364 + 375 + 391 + 404 + 417 + 433 + 454 + 474 + 486 + 496 + 511 + 526 + 536 + 545 + 553 + 563 + + + 32 + 43 + 51 + 58 + 65 + 74 + 81 + + + 31 + + + 31 + 39 + 46 + 58 + 68 + 75 + 81 + 87 + 93 + 102 + 107 + 112 + 120 + 127 + 133 + 139 + 145 + 151 + 157 + 163 + 169 + 175 + 181 + 187 + 193 + 199 + + + 41 + 51 + 64 + 83 + 92 + 101 + 108 + 115 + 123 + + + 55 + 341 + + + 38 + 66 + 74 + 84 + 95 + 112 + 124 + 132 + + + 50 + 58 + + + 33 + + + 33 + 44 + 52 + 60 + 68 + + + 36 + 43 + 73 + 81 + + + 38 + 48 + 55 + 62 + 70 + 80 + 89 + 99 + 108 + 117 + 128 + 139 + 148 + 157 + 166 + 177 + + + 37 + 66 + 73 + 82 + 94 + 108 + 122 + 136 + 158 + 166 + + + 32 + 52 + 62 + 69 + 78 + 86 + 93 + 100 + 110 + 119 + 126 + 134 + 144 + + + 37 + 52 + 60 + 76 + 89 + 98 + 107 + + + 84 + 94 + 103 + 110 + + + 34 + + + 35 + 42 + 55 + 63 + + + 52 + 74 + 82 + 91 + 125 + + + 39 + 47 + 77 + 90 + 102 + 118 + 126 + 134 + + + 34 + 63 + 74 + 86 + 97 + 107 + 116 + 130 + 157 + 169 + 180 + 190 + 205 + 213 + 221 + 230 + 238 + + + 29 + + + 34 + 59 + 67 + 75 + 90 + 101 + 110 + 120 + + + 49 + 71 + 78 + 85 + 107 + 115 + + + 41 + 62 + 72 + 85 + 95 + + + 40 + 50 + 77 + 87 + 103 + 111 + 119 + 126 + 133 + 144 + 152 + 160 + 169 + 181 + + + 36 + 43 + + + 58 + 65 + 72 + 79 + + + 80 + 201 + 209 + + + 37 + 74 + 105 + 169 + 179 + 193 + 223 + 231 + 239 + 248 + 263 + 272 + 281 + 290 + 306 + 329 + 337 + 347 + 357 + 369 + + + 32 + 43 + 50 + 58 + + + 114 + + + 41 + 62 + 69 + 76 + 85 + + + 31 + 51 + 60 + 68 + + + 40 + 57 + 65 + 75 + 83 + 90 + 105 + 111 + 129 + 141 + 152 + 158 + 165 + 176 + + + 42 + 61 + 68 + 77 + 87 + 96 + 107 + 116 + + + 32 + 44 + + + 33 + 45 + 53 + 79 + 91 + 99 + 107 + 114 + 122 + + + 29 + 53 + 62 + 72 + 82 + + + 41 + 58 + + + 33 + 48 + 56 + 65 + 75 + 82 + 90 + 98 + 105 + 113 + 121 + 130 + 138 + 161 + 171 + 181 + 190 + 199 + 208 + 217 + 237 + 245 + + + 37 + 62 + 72 + 82 + 102 + 110 + + + 29 + 55 + 62 + 71 + + + 32 + 42 + 50 + 60 + 97 + 116 + 125 + 136 + 145 + + + 35 + 44 + 61 + 72 + 80 + 90 + 100 + 112 + 119 + 126 + 133 + 141 + 148 + + + 85 + 93 + 121 + 128 + 135 + 144 + 150 + + + 56 + 66 + 105 + 113 + + + 29 + 53 + 63 + 72 + + + 58 + 65 + 83 + 93 + 100 + + + 30 + 41 + 50 + 62 + 72 + 83 + 100 + 119 + 133 + 142 + 151 + 165 + 175 + 184 + 205 + 240 + 249 + 259 + 279 + 294 + 309 + 324 + 338 + 347 + 356 + 368 + 380 + 397 + 417 + 432 + 442 + 452 + 464 + 474 + 493 + 502 + + + 31 + 42 + 53 + 60 + 71 + 81 + + + 43 + 64 + 72 + 79 + 89 + 97 + 104 + 112 + 121 + 132 + 143 + 164 + 173 + 182 + 191 + 200 + 215 + 225 + 233 + 242 + 250 + 258 + + + 35 + 53 + 68 + 76 + 89 + 96 + + + 28 + 45 + 56 + 66 + 76 + + + 32 + 56 + 68 + 79 + 103 + 111 + 120 + 129 + 140 + 148 + 156 + 172 + 187 + 195 + 203 + 216 + 225 + + + 42 + 64 + 71 + 78 + 88 + 96 + 106 + 118 + 128 + 137 + 148 + 160 + 183 + + + 35 + 53 + 61 + 70 + 78 + 86 + 94 + 102 + 110 + 118 + 126 + 136 + 149 + 158 + 166 + 180 + 194 + 203 + 211 + 223 + 231 + 239 + + + 32 + 43 + 53 + 63 + 75 + 89 + 109 + 126 + 136 + 148 + 159 + 191 + 201 + 211 + 223 + 237 + 255 + 272 + 282 + 294 + + + 37 + 47 + 56 + 68 + 94 + 102 + 112 + 120 + 136 + 152 + 161 + + + 31 + 39 + 51 + 67 + 82 + 91 + 101 + + + 112 + 162 + 173 + 188 + 198 + 206 + 218 + 228 + 242 + 346 + 371 + 401 + 410 + 419 + 429 + 438 + 449 + 468 + 484 + 493 + 504 + 515 + 525 + 535 + 547 + 566 + 584 + 599 + 617 + 628 + 646 + 656 + 664 + 672 + 680 + 692 + 704 + 713 + + + 36 + 48 + 66 + 77 + 87 + 102 + 115 + 129 + 143 + 160 + + + 38 + 49 + 57 + 65 + + + 41 + 61 + 72 + 82 + 93 + 104 + 115 + 126 + 137 + 147 + 155 + 166 + 177 + 185 + + + 31 + 50 + 58 + 67 + 77 + 89 + + + 38 + 45 + 63 + 71 + 79 + 88 + 102 + 116 + 126 + 136 + 152 + 161 + 170 + 186 + 195 + 207 + 221 + 238 + 247 + 255 + 263 + 271 + 279 + 287 + 295 + + + 28 + 39 + 48 + 69 + 77 + 84 + + + 32 + 55 + 65 + 74 + 83 + 91 + 105 + 116 + 125 + + + 30 + + + 42 + 55 + 71 + 85 + 97 + 106 + 117 + 151 + 162 + 178 + 194 + 210 + 222 + 232 + 242 + 250 + 262 + + + 34 + 44 + 60 + 70 + 79 + 88 + 97 + 106 + + + 35 + 43 + 53 + 69 + 77 + 94 + 107 + 119 + 132 + 145 + 157 + 169 + 182 + + + 39 + 64 + 80 + 88 + 98 + 108 + 116 + 125 + 133 + 141 + 149 + 157 + 166 + + + 47 + + + 84 + 94 + 103 + 110 + + + 36 + 43 + 97 + 105 + + + 41 + 58 + + + 37 + 47 + 75 + 82 + + + 34 + 55 + 63 + 72 + 82 + 91 + 99 + 107 + 121 + 134 + + + 49 + 78 + 86 + 94 + 102 + 110 + 118 + 126 + 134 + 142 + 150 + 158 + 166 + 174 + 182 + 190 + 198 + 206 + 214 + 222 + 230 + 238 + 246 + 254 + 262 + 270 + 278 + 286 + 294 + 302 + 311 + 320 + 328 + 337 + 345 + 353 + 362 + 371 + 379 + 388 + 397 + 406 + 415 + 424 + 433 + 442 + 451 + 460 + 469 + 478 + 487 + 496 + 505 + 514 + 523 + 532 + 541 + 550 + 559 + 569 + 579 + 589 + 599 + + + 40 + 90 + 101 + 109 + 117 + + + 43 + 54 + 63 + 73 + 81 + 91 + 101 + 109 + 127 + 137 + 148 + 158 + 169 + 179 + 192 + 202 + 213 + + + 55 + + + 50 + 71 + 88 + 98 + + + 46 + 69 + 80 + 94 + + + 103 + 123 + + + 36 + 68 + 78 + 93 + 120 + 128 + 136 + 145 + 160 + 168 + 177 + 189 + 198 + 208 + 221 + 231 + 239 + + + 49 + 101 + 107 + + + 47 + 62 + 69 + 77 + 86 + 93 + 102 + 111 + 118 + 127 + 135 + 157 + 166 + 174 + + + 46 + + + 31 + 42 + 52 + 59 + 66 + 76 + + + 41 + 70 + 80 + 88 + 105 + 113 + 122 + 131 + 149 + 158 + 169 + 178 + + + 48 + 55 + 64 + 75 + 83 + 92 + 109 + 118 + 128 + 136 + 144 + 152 + 165 + 175 + 190 + 203 + 213 + 223 + 231 + 238 + + + 40 + + + 29 + + + 33 + 51 + 58 + 69 + 80 + 90 + + + 32 + 40 + + + 35 + 58 + 66 + 74 + 83 + + + 32 + 54 + 63 + 76 + 94 + + + 38 + 72 + 82 + 90 + 101 + 124 + 132 + 141 + 149 + 157 + 171 + 180 + 189 + 201 + 210 + 220 + + + 33 + 40 + 54 + 62 + + + 59 + 87 + 95 + 103 + 112 + 119 + 128 + 135 + 143 + + + 36 + 62 + 86 + 94 + 102 + 110 + 118 + 126 + 135 + 145 + 156 + 166 + 175 + 183 + 191 + 201 + 211 + 226 + 238 + 248 + 260 + 273 + 285 + 294 + + + 145 + + + 35 + 42 + 70 + 78 + + + 32 + 39 + 48 + + + 35 + 45 + 71 + 81 + 99 + 107 + 115 + 122 + 129 + 140 + 148 + 157 + 168 + 180 + + + 37 + 48 + 68 + 79 + 89 + 99 + 108 + + + 31 + 61 + + + 35 + 60 + 71 + + + 33 + 50 + 57 + 65 + 76 + 84 + 92 + + + 173 + 189 + 197 + 214 + 226 + 236 + 246 + 247 + 254 + 262 + 445 + 458 + + + 33 + 43 + 51 + 64 + 85 + 92 + 100 + 113 + 121 + 129 + + + 40 + 57 + 65 + 75 + 83 + 90 + 105 + 111 + 129 + 141 + 152 + 158 + 165 + 176 + + + 37 + 63 + 71 + 83 + 94 + + + 36 + 57 + 70 + 82 + 91 + + + 31 + + + 37 + 54 + 70 + + + 38 + 53 + 63 + + + 127 + 135 + + + 35 + 45 + 71 + 81 + 99 + 107 + 115 + 122 + 129 + 138 + 146 + 155 + 166 + 178 + + + 32 + 42 + 50 + 64 + 88 + 95 + 103 + 114 + 122 + 130 + + + 37 + 55 + 64 + 73 + 81 + 92 + + + 147 + 155 + + + 37 + 56 + 76 + 98 + 111 + 128 + 138 + 149 + 164 + 177 + 191 + 206 + 222 + + + 50 + 61 + 71 + 79 + 87 + 95 + 103 + + + 48 + 68 + 76 + 85 + + + 38 + 61 + 71 + 91 + + + 37 + 46 + 59 + 70 + 79 + 90 + + + 30 + 39 + 47 + 56 + 64 + 72 + 80 + 92 + 100 + 108 + 116 + 124 + + + 40 + 49 + 55 + 62 + 68 + 75 + 82 + 91 + 98 + 105 + 115 + 122 + 128 + 134 + 141 + 147 + 154 + 160 + 167 + 174 + 181 + 188 + 196 + 205 + 213 + 221 + 228 + 235 + 242 + 255 + 264 + 270 + + + 31 + 42 + 52 + 59 + 70 + + + 34 + 46 + 56 + 64 + + + 36 + 44 + 56 + 66 + 78 + + + 33 + 43 + 51 + 59 + 71 + 92 + 99 + 107 + 120 + 128 + 136 + + + 29 + 36 + 41 + 47 + 52 + 57 + + + 34 + 44 + 57 + 68 + 80 + 90 + 101 + 108 + 115 + 126 + 137 + 148 + + + 33 + 61 + 73 + 86 + 96 + + + 33 + 44 + 54 + 61 + 70 + 79 + + + 32 + 39 + 48 + + + 35 + + + 34 + 43 + 52 + 60 + + + 91 + + + 30 + 40 + 49 + + + 49 + 56 + 65 + 90 + 112 + 121 + 129 + 137 + 145 + 153 + 161 + 169 + 177 + 184 + 192 + 200 + 208 + 215 + 225 + 243 + 256 + 272 + 280 + 288 + 296 + 304 + 312 + 320 + 328 + 336 + 345 + 355 + 368 + 378 + 387 + 399 + 409 + + + 35 + 42 + 60 + 68 + + + 31 + 60 + 79 + 97 + 115 + + + 33 + 41 + 52 + 62 + 75 + 94 + 103 + 115 + 130 + 143 + 154 + 164 + 173 + + + 35 + 43 + 53 + 69 + 77 + 94 + 107 + 119 + 132 + 145 + 157 + 169 + 182 + + + 84 + 96 + 104 + 111 + + + 33 + 51 + 60 + + + 33 + 37 + + + 38 + + + 41 + 61 + 69 + 79 + 90 + 110 + 117 + 124 + 131 + 139 + 147 + 155 + + + 36 + + + 32 + 36 + + + 10 + + + 29 + + + 38 + 49 + 59 + 69 + 79 + 89 + 105 + 121 + 133 + 150 + 170 + 188 + 204 + 220 + 232 + 243 + 254 + 265 + 278 + 295 + 303 + + + 37 + 52 + 75 + 89 + 113 + 123 + 133 + 156 + 176 + 189 + 203 + 225 + 249 + 261 + 270 + 282 + 308 + 331 + 341 + 356 + 372 + 385 + 400 + 420 + 428 + 437 + 446 + + + 36 + 44 + 68 + + + 33 + 43 + 51 + 59 + 71 + 92 + 99 + 107 + 120 + 128 + 136 + + + 30 + + + 29 + 54 + 64 + + + 52 + 99 + 109 + 119 + 132 + 142 + + + 34 + 47 + 59 + + + 90 + 99 + 107 + 115 + 127 + 138 + 145 + 153 + 162 + 255 + + + 31 + 53 + 61 + 71 + 84 + 100 + 112 + 120 + + + 39 + 54 + 63 + 73 + 85 + 95 + 105 + 116 + + + 47 + 67 + + + 36 + + + 32 + 42 + + + 35 + + + 38 + 74 + 80 + 88 + 100 + 108 + 116 + + + 37 + + + 32 + 42 + 50 + + + 32 + 57 + 68 + 80 + 96 + 110 + 125 + 141 + 157 + 174 + + + 33 + + + 94 + + + 42 + + + 59 + 69 + 78 + 87 + 101 + 111 + 121 + 133 + 146 + 155 + 168 + 191 + 205 + 216 + 226 + + + 35 + 43 + 62 + 70 + 78 + 86 + 94 + 102 + 110 + 119 + 133 + 142 + 151 + 159 + 167 + 175 + + + 37 + 45 + + + 31 + 42 + 50 + 58 + 68 + 75 + + + 37 + 58 + 71 + 90 + 99 + + + 33 + 53 + 60 + 68 + 79 + 87 + 95 + + + 39 + 78 + 86 + 94 + 102 + 110 + 118 + 129 + 139 + 147 + 155 + 163 + 171 + 179 + 187 + 197 + 205 + 213 + 223 + 233 + + + 29 + 53 + 62 + 72 + 80 + 91 + 99 + + + 152 + 167 + 242 + 267 + 276 + 294 + 305 + 316 + 328 + 342 + 357 + 372 + 386 + 396 + 408 + 422 + 436 + 451 + 461 + 477 + 490 + 499 + 511 + 521 + 531 + 540 + 549 + 559 + 568 + 577 + 586 + 595 + 604 + 613 + 622 + 631 + 640 + 649 + 658 + 667 + 676 + 685 + 694 + 703 + 712 + 721 + 730 + 739 + 748 + 757 + 766 + 776 + 784 + 792 + 800 + 812 + 821 + 831 + 839 + 847 + + + 34 + 42 + 51 + 59 + + + 97 + 108 + 141 + 150 + 159 + 168 + 178 + 188 + 201 + 216 + 230 + 244 + 257 + 277 + 311 + 320 + 329 + 341 + 355 + 371 + 386 + 402 + 420 + 442 + 462 + 476 + 504 + 515 + 526 + 541 + 555 + 570 + 599 + 610 + 622 + 632 + 644 + 656 + 665 + 674 + 683 + + + 33 + 54 + 62 + 70 + 84 + 92 + 100 + 113 + 122 + + + 34 + 46 + 68 + 76 + 85 + 93 + 101 + + + 29 + 39 + 47 + 59 + 71 + 80 + 91 + 102 + 120 + 133 + 142 + 152 + + + 29 + 54 + 64 + 74 + 96 + 104 + + + 34 + 58 + 69 + + + + + 183 + 213 + 393 + + + + + 20 + + + 24 + + + 19 + + + 20 + 202 + + + 21 + + + 20 + + + 21 + 26 + 28 + 76 + 99 + + + 20 + + + 21 + + + 20 + + + 20 + + + 26 + + + 21 + + + 20 + + + 33 + 47 + 68 + + + 20 + 25 + 27 + 58 + 73 + + + 64 + + + 28 + 33 + + + 21 + + + 26 + + + 21 + + + 20 + + + 21 + 25 + 27 + + + 21 + + + 26 + + + 26 + + + 20 + + + 20 + + + 28 + 33 + + + 20 + + + 28 + 33 + + + 20 + + + 26 + + + 26 + + + 20 + + + 21 + + + 21 + + + 20 + + + 29 + 34 + + + 20 + 25 + 27 + 58 + 73 + + + 20 + + + 19 + + + 20 + + + 19 + + + 20 + 26 + 28 + 50 + 65 + + + 21 + + + 1 + + + 20 + + + 36 + 52 + 74 + + + 21 + + + 45 + + + 33 + 49 + 71 + + + 20 + + + 21 + + + 20 + 26 + 28 + 50 + 65 + + + 22 + + + 60 + + + 104 + + + 19 + + + 20 + 25 + 27 + 58 + 73 + + + 25 + 77 + + + 22 + + + 21 + + + 43 + 51 + 62 + + + 21 + + + 20 + + + 23 + + + 19 + + + 21 + + + 20 + + + 26 + + + 20 + + + 27 + 29 + 72 + 74 + 95 + 97 + + + 19 + + + 1 + + + 24 + 30 + 56 + + + 21 + + + 20 + 105 + + + 20 + + + 21 + + + 21 + + + 51 + 59 + + + 24 + + + 26 + + + 21 + + + 21 + 25 + 45 + + + 33 + 49 + 71 + + + 33 + 47 + 68 + + + 20 + + + 23 + + + 21 + + + 36 + 52 + 74 + + + 20 + + + 21 + 25 + 31 + + + 21 + + + 22 + + + 21 + + + 20 + + + 21 + + + 25 + + + 24 + 26 + + + 21 + + + 23 + + + 21 + + + 20 + 25 + 27 + 58 + 73 + + + 20 + + + 20 + 33 + 175 + 179 + + + 24 + + + 19 + + + 20 + + + 20 + + + 29 + 35 + + + 20 + + + 19 + + + 20 + + + 20 + 26 + 28 + 50 + 65 + + + 24 + 45 + 50 + + + 20 + 25 + 27 + 58 + 73 + + + 21 + + + 33 + 49 + 71 + + + 22 + + + 21 + + + 28 + 33 + + + 23 + 29 + + + 22 + + + 25 + + + 21 + + + 22 + + + 21 + + + 25 + + + 20 + + + 26 + + + 20 + + + 33 + 47 + 68 + + + 23 + + + 19 + + + 23 + + + 22 + + + 21 + 34 + 50 + + + 25 + + + 19 + + + 21 + + + 23 + + + 19 + + + 22 + + + 26 + + + 21 + 25 + 27 + + + 23 + + + 40 + 45 + + + 21 + + + 20 + + + 21 + + + 20 + + + 1 + + + 20 + 109 + + + 23 + + + 20 + + + 20 + + + 21 + + + 21 + 25 + 27 + + + 21 + + + 19 + + + 28 + 33 + + + 28 + 33 + + + 25 + + + 25 + + + 26 + + + 21 + + + 25 + 31 + + + 19 + + + 26 + + + 28 + 33 + + + 29 + 34 + + + 28 + 33 + + + 21 + 35 + 108 + 112 + + + 24 + + + 21 + + + 22 + + + 19 + + + 23 + + + 20 + + + 20 + 124 + + + 145 + 219 + + + 20 + 40 + 189 + 193 + + + 20 + 164 + + + 267 + + + 20 + 26 + 28 + 50 + 65 + + + 23 + + + 23 + + + 24 + 30 + + + 20 + 26 + 28 + 50 + 65 + + + 20 + + + 20 + + + 26 + + + 20 + + + 21 + 25 + 45 + + + 27 + + + 21 + + + 20 + 38 + 176 + 180 + + + 26 + + + 24 + + + 26 + + + 21 + + + 28 + 33 + + + 36 + 52 + + + 22 + + + 23 + + + 23 + 93 + 221 + 251 + 516 + 528 + + + 19 + + + 22 + + + 19 + + + 23 + + + 28 + 33 + + + 20 + 27 + 29 + 51 + 66 + + + 21 + + + 28 + 33 + + + 21 + + + 19 + + + 21 + + + 20 + + + 20 + + + 23 + + + 21 + + + 23 + 29 + + + 24 + 31 + + + 20 + 26 + 28 + 52 + 67 + + + 21 + + + 21 + + + 26 + + + 21 + + + 29 + 34 + + + 23 + + + 27 + + + 23 + + + 22 + + + 23 + + + 28 + 33 + + + 29 + 34 + + + 23 + + + 20 + 27 + 29 + + + 20 + + + 19 + + + 25 + + + 20 + 26 + 28 + 50 + 65 + + + 19 + + + 20 + + + 20 + + + 20 + 26 + 40 + 59 + 84 + + + 20 + + + 21 + + + 21 + + + 21 + + + 24 + 30 + + + 34 + 50 + 72 + + + 20 + + + + + 178 + 267 + + + 415 + + + 112 + 188 + + + + + 318 + + + 102 + + + 72 + + + 192 + 195 + 197 + 199 + 201 + + + 427 + 428 + 625 + 632 + + + 867 + 872 + 875 + 1204 + 1214 + 1224 + 1234 + 1244 + + + 831 + + + 70 + 74 + 75 + 79 + 82 + 87 + 184 + 419 + 619 + 630 + 631 + 638 + 639 + 640 + 647 + 650 + 651 + 667 + 672 + 674 + 699 + + + 279 + + + 191 + + + 411 + + + 59 + 87 + + + 92 + 98 + + + 134 + + + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 58 + 59 + 60 + 61 + 62 + 63 + 79 + 80 + 81 + 82 + 83 + 84 + + + 164 + + + 63 + 409 + 428 + 434 + + + 269 + 283 + 286 + 295 + 358 + + + 190 + 193 + 196 + 201 + 204 + 214 + + + 212 + 216 + 220 + + + 65 + + + 137 + 156 + 218 + 314 + + + 61 + 75 + 91 + 105 + 117 + 121 + + + 253 + + + 165 + 166 + + + 135 + + + 175 + + + 103 + + + 146 + + + 415 + + + 153 + + + 84 + + + 41 + 44 + 47 + 50 + 53 + 56 + 59 + 62 + 65 + 68 + 71 + 96 + 99 + 124 + 127 + 130 + 133 + 136 + 139 + 142 + 145 + 148 + 151 + 154 + 180 + 183 + + + 156 + + + 199 + + + 100 + + + 90 + + + 132 + 151 + + + 370 + + + 398 + + + 316 + + + 308 + 313 + 318 + 323 + 384 + 389 + 394 + 399 + 421 + 426 + 644 + 666 + 683 + 688 + 722 + 883 + 889 + 895 + 901 + 921 + 924 + 927 + 930 + 934 + 1062 + 1068 + 1074 + 1080 + 1100 + 1103 + 1106 + 1109 + 1113 + 1138 + 1144 + 1160 + 1178 + 1179 + + + 154 + 184 + 524 + 553 + 595 + 639 + 644 + 654 + 823 + 853 + 922 + 928 + 940 + 1005 + 1076 + 1112 + 1246 + 1266 + 1376 + 1482 + 1522 + + + 287 + 291 + 297 + 302 + 363 + + + 181 + + + 365 + 367 + 370 + 372 + + + 211 + + + 241 + 372 + 475 + 506 + 521 + 553 + 617 + 639 + 709 + 764 + + + 169 + 307 + + + 322 + 371 + 440 + + + 210 + + + 128 + + + 302 + 404 + + + 106 + 131 + 190 + 207 + 224 + 240 + 255 + + + 392 + 398 + 644 + 648 + 652 + 656 + 660 + + + 1438 + + + 81 + + + 176 + 288 + 338 + + + 62 + + + 229 + 251 + + + + + 256 + + + 267 + 312 + + + 380 + + + 325 + 399 + 428 + 456 + 513 + 1170 + + + 404 + + + 287 + 334 + + + 291 + 339 + + + 148 + + + 151 + + + 148 + 203 + + + 142 + 176 + + + 219 + 331 + + + 441 + 569 + 722 + 865 + + + + + 130 + + + + + 63 + + + + + 175 + + + 1015 + + + + + 263 + + + 385 + 423 + + + 146 + 531 + + + 553 + 968 + 1278 + + + 343 + + + 158 + + + 155 + 159 + 197 + 201 + 234 + 422 + 463 + + + 95 + + + 168 + 531 + 786 + 798 + + + 113 + + + 561 + 565 + 569 + + + 186 + + + 89 + + + 347 + + + 44 + + + 116 + + + 136 + 164 + 222 + 223 + 256 + 257 + 258 + 279 + 284 + 303 + 304 + 305 + 306 + + + 114 + + + 316 + + + 165 + 182 + 352 + + + 416 + + + 93 + + + 183 + 213 + + + 171 + 188 + 200 + 212 + 236 + 260 + + + 111 + + + 59 + 60 + 61 + 170 + 184 + 306 + + + 122 + + + 88 + + + 108 + + + 108 + + + 100 + 147 + + + 66 + + + 432 + 836 + 863 + + + 153 + + + 355 + + + 182 + 411 + 552 + 771 + + + 142 + 181 + 321 + + + 373 + + + 480 + + + 104 + + + 113 + + + 94 + + + 139 + 414 + + + + + 35 + + + + + 109 + + + 161 + 168 + + + 58 + 60 + + + 167 + 168 + 1109 + 1166 + + + + + 60 + 68 + 79 + 88 + + + 70 + 74 + 94 + 99 + 127 + 138 + 176 + 180 + 191 + 233 + 259 + 304 + 315 + 331 + 346 + 354 + 362 + 367 + 377 + 403 + 408 + 417 + 426 + 435 + 443 + 454 + 471 + 480 + 495 + 498 + 516 + 525 + 596 + 609 + 622 + 642 + 680 + 682 + 691 + 702 + 712 + 783 + 791 + 792 + 811 + 821 + 827 + 847 + 868 + 879 + 889 + 899 + 936 + 947 + 950 + 961 + 991 + 1002 + 1004 + + + 108 + 133 + 153 + 186 + + + 57 + 242 + + + 41 + 52 + 54 + 63 + 65 + 75 + 78 + 81 + 90 + 93 + 97 + 108 + 112 + 117 + 124 + 169 + 184 + 194 + 198 + 209 + 216 + 232 + 240 + 251 + 256 + 267 + 271 + 278 + 287 + 292 + 297 + 308 + 311 + 323 + 334 + 337 + 340 + 350 + 353 + 356 + 366 + 369 + 372 + 382 + 385 + 388 + 399 + 402 + 405 + 414 + 417 + 419 + + + 63 + 102 + 126 + 179 + 189 + 227 + 238 + 275 + 285 + 369 + 378 + 384 + 393 + 405 + 416 + 420 + 429 + 445 + 454 + 463 + 477 + 508 + 529 + 534 + 543 + 562 + 565 + 573 + 595 + + + 58 + 64 + 71 + + + 37 + 40 + 50 + 57 + + + 51 + 71 + 75 + 82 + 86 + 96 + 103 + 111 + 118 + 123 + 129 + 136 + 138 + + + 82 + 97 + 108 + 141 + + + 86 + 201 + 206 + 223 + 229 + 301 + 313 + 321 + 328 + 348 + 356 + 389 + 402 + + + 100 + 170 + 178 + 207 + + + 80 + 91 + 100 + 110 + 118 + 128 + 134 + 141 + 147 + 166 + 175 + 190 + 199 + 204 + + + 55 + 57 + 66 + 75 + 84 + 87 + 93 + 98 + 108 + 111 + 116 + 122 + 142 + 144 + 153 + 156 + 165 + 168 + 192 + 201 + 226 + 236 + 240 + + + 39 + 52 + 54 + 63 + 65 + 74 + 82 + 124 + 126 + 135 + 137 + 146 + + + 93 + + + 61 + 123 + 148 + 176 + 186 + 201 + 215 + 237 + 246 + 261 + 269 + 279 + 338 + 357 + 361 + 371 + + + 45 + + + 43 + 67 + 101 + 109 + 218 + 227 + 238 + 247 + 268 + 275 + 282 + 289 + + + 53 + 55 + 86 + 89 + 94 + 101 + 114 + 124 + 127 + 132 + 139 + 146 + 156 + 169 + 178 + 186 + 191 + 196 + 216 + 221 + 245 + 249 + 256 + 264 + 268 + 277 + 283 + 288 + 292 + 299 + 309 + 316 + 324 + 335 + 361 + 385 + 405 + 409 + 414 + 421 + 435 + 446 + 454 + 464 + 479 + 489 + 504 + + + 42 + 67 + 81 + 93 + 152 + 165 + + + 311 + 592 + 612 + 617 + 636 + 637 + 686 + 737 + + + 40 + 53 + 55 + 64 + 66 + 75 + 109 + 124 + 141 + 144 + 153 + 155 + 164 + 167 + + + 46 + 196 + 563 + 602 + 625 + 738 + + + 55 + 56 + 84 + + + 61 + 73 + 83 + 99 + 108 + 118 + 131 + 136 + 151 + 163 + 185 + 196 + 210 + 220 + 227 + 238 + 243 + 248 + 257 + 270 + 277 + 284 + 286 + 288 + 293 + 304 + 349 + 371 + 372 + 390 + 391 + 397 + 424 + 425 + 430 + 440 + 451 + 463 + 470 + 474 + 486 + 495 + 506 + 512 + 513 + 524 + 525 + 527 + 539 + 554 + 555 + + + 82 + 97 + 108 + 141 + + + 40 + 57 + 63 + + + 43 + 50 + 59 + 60 + 71 + 85 + 95 + 103 + 114 + 120 + 127 + 131 + 149 + 150 + 161 + 166 + + + 82 + + + 78 + 86 + 94 + 105 + 120 + 130 + 137 + 140 + 152 + 156 + 166 + 170 + 173 + 175 + 180 + 188 + 192 + 199 + 203 + 216 + 227 + 239 + 243 + 256 + 260 + 266 + 281 + 288 + 291 + 293 + 304 + 308 + 326 + 337 + 349 + 355 + 364 + 367 + 378 + 382 + 387 + 390 + 396 + 397 + 407 + 408 + 419 + 423 + 428 + 431 + 437 + 438 + 445 + 451 + 453 + + + 99 + 107 + 128 + 138 + 151 + 161 + + + 74 + 89 + 100 + 133 + + + 33 + 60 + 71 + 111 + 151 + + + 69 + 73 + 77 + 81 + 85 + 89 + 95 + 99 + 103 + 107 + 111 + 115 + 119 + 123 + 135 + 139 + 143 + 147 + 160 + 164 + 168 + 179 + 183 + 187 + 191 + 195 + 199 + 203 + 207 + 211 + 215 + 219 + 223 + 227 + 231 + 235 + 239 + 243 + 247 + 251 + 255 + 259 + 263 + 267 + 271 + 275 + 279 + 283 + 287 + 291 + 295 + 299 + 303 + 307 + 311 + 315 + 319 + 323 + 327 + 331 + 335 + 339 + 343 + 347 + 351 + 355 + 359 + 363 + 367 + 371 + 375 + 379 + 383 + 387 + 391 + 395 + 399 + 403 + + + 90 + 98 + 138 + 163 + 167 + 193 + 207 + 219 + 230 + 238 + 265 + 268 + 272 + 289 + 292 + 296 + + + 88 + 109 + 118 + 129 + 135 + 143 + 149 + 159 + 168 + 184 + 193 + 246 + 255 + 279 + 289 + 352 + 365 + 385 + 405 + 413 + 423 + 424 + 443 + 466 + 499 + 532 + 542 + 546 + 563 + 588 + 598 + 622 + 643 + 646 + 655 + 657 + 658 + 759 + 768 + 892 + 902 + 904 + 911 + 943 + 1034 + 1042 + 1069 + 1103 + 1108 + 1113 + 1121 + 1213 + 1255 + 1263 + 1268 + + + 286 + + + 92 + 115 + 125 + 175 + 185 + 194 + + + 334 + + + 223 + 228 + 334 + 340 + 404 + + + 95 + + + 87 + 102 + 112 + 159 + 169 + 173 + + + 239 + + + 53 + 58 + 105 + 112 + + + 32 + 61 + 102 + 114 + 136 + + + 130 + 187 + 247 + 379 + 384 + 392 + 427 + 447 + 451 + 483 + 509 + 513 + 521 + 549 + 566 + 591 + 602 + 613 + 621 + 675 + 923 + 931 + 936 + + + 50 + + + 112 + 137 + 155 + 158 + 162 + 173 + 192 + 228 + 241 + 252 + 279 + 293 + 333 + 356 + 366 + 375 + 387 + + + 74 + + + 86 + 89 + 155 + + + 97 + 99 + 110 + 130 + 132 + 147 + 167 + 172 + 182 + 193 + 209 + 219 + 235 + 246 + 259 + 271 + 272 + 280 + 291 + 310 + + + 51 + + + 71 + + + 120 + 207 + 260 + 266 + 275 + 280 + 286 + 367 + 374 + 413 + 417 + + + 103 + 120 + 136 + 236 + 273 + 282 + 295 + 334 + 378 + 381 + 416 + 426 + 436 + + + 74 + 89 + 100 + 135 + + + 39 + 52 + 63 + + + 43 + 58 + 69 + 79 + 91 + 96 + + + 41 + 57 + 98 + 118 + 136 + 141 + 154 + 171 + 186 + 211 + 225 + 233 + 257 + 273 + 300 + 314 + 325 + + + 144 + 183 + 186 + 187 + 189 + 200 + 206 + 258 + 271 + 324 + 332 + 339 + 345 + 352 + 357 + 363 + 368 + 427 + 442 + 464 + 493 + 504 + 514 + 519 + 539 + 549 + 559 + 564 + 604 + 618 + 650 + 653 + 666 + 683 + 693 + 704 + 718 + 726 + 736 + 739 + 740 + 744 + 756 + 760 + + + 44 + 47 + 58 + 62 + 73 + 79 + 98 + 100 + 109 + 121 + 127 + 134 + 161 + 166 + 179 + 184 + 194 + 201 + + + 38 + 67 + 78 + 88 + 108 + 120 + 143 + 155 + 166 + 168 + 178 + 180 + 192 + 196 + 206 + 208 + 220 + 229 + 231 + 243 + 250 + 252 + 267 + 271 + 282 + 284 + 294 + 298 + 308 + 312 + + + 69 + 137 + + + 60 + 87 + 99 + 113 + 129 + 141 + 146 + 156 + 171 + 182 + 194 + 218 + 228 + 239 + 244 + 246 + 258 + 261 + + + 122 + 131 + 177 + 186 + 274 + 294 + 300 + 312 + 317 + 333 + 343 + 348 + 394 + 475 + + + 46 + 48 + 57 + 64 + 75 + 78 + 84 + 90 + 93 + 103 + 106 + 113 + 117 + 127 + 130 + 135 + 143 + 153 + 156 + 161 + 167 + 188 + 194 + 203 + 207 + 217 + 222 + 244 + + + 32 + 60 + 93 + 114 + 122 + + + 61 + 107 + + + 46 + 53 + 70 + 84 + 107 + 113 + 132 + 137 + 142 + 157 + 172 + 192 + 200 + 206 + 219 + + + 50 + 69 + 71 + 82 + 84 + 94 + 96 + 106 + 125 + 139 + 142 + 155 + 171 + 184 + 204 + 218 + 228 + 246 + 256 + 284 + 294 + 300 + 311 + 331 + 340 + + + 43 + 54 + 57 + 72 + 85 + 98 + 157 + 169 + 185 + 206 + 228 + 250 + 272 + 295 + 372 + 397 + + + 49 + 53 + 76 + 80 + 98 + 118 + 134 + 145 + 165 + 174 + + + 38 + 50 + 52 + 61 + 63 + 72 + 78 + 87 + 94 + 98 + 107 + 109 + 118 + + + 75 + 103 + 113 + 128 + + + 368 + 454 + 644 + + + 205 + 210 + 218 + 233 + 247 + 251 + 259 + 270 + 286 + 327 + 395 + 397 + + + 48 + 55 + 61 + 72 + 117 + + + 78 + + + 107 + 119 + 132 + + + 56 + + + 37 + 51 + 65 + 69 + 73 + 77 + 95 + 120 + 124 + 128 + 132 + 136 + 140 + 144 + 148 + 152 + 168 + 177 + 186 + 195 + 204 + 213 + 229 + 237 + 258 + 262 + 276 + 296 + 319 + 334 + 341 + 352 + 366 + 381 + + + 47 + 50 + 92 + 98 + 125 + 135 + + + 78 + + + 47 + + + 82 + 97 + 108 + 141 + + + 37 + 53 + 72 + 101 + 117 + + + 67 + 81 + 88 + 94 + 109 + 120 + 133 + 146 + 155 + 172 + 178 + + + 61 + 95 + 150 + 192 + 231 + 242 + 305 + 317 + 346 + + + 43 + 63 + 91 + 103 + 115 + 127 + 139 + 151 + 160 + + + 37 + 44 + 49 + 53 + 58 + 69 + 84 + 92 + 96 + 104 + 108 + 113 + 117 + 122 + 133 + 136 + 143 + 147 + 161 + 165 + 171 + 175 + 187 + 194 + 199 + 203 + 208 + + + 61 + 68 + 78 + 121 + 131 + 148 + 168 + + + 44 + 74 + 86 + 99 + 105 + 129 + 140 + 174 + 178 + 184 + 189 + 219 + 247 + + + 167 + 190 + + + 39 + 53 + 71 + + + 40 + 54 + 57 + 86 + 89 + 94 + 105 + 109 + 117 + 118 + 119 + 123 + 126 + 137 + 140 + 151 + 155 + 172 + 176 + 188 + 195 + 206 + 207 + 210 + 213 + + + 39 + 59 + 90 + + + 74 + 89 + 100 + 135 + + + 124 + + + 87 + + + 45 + 63 + 71 + 95 + 100 + 122 + + + 56 + 170 + 195 + 228 + 240 + 344 + 349 + 360 + + + 44 + 62 + 64 + 73 + 80 + 89 + 94 + 103 + 113 + 129 + 138 + 140 + 149 + 163 + 172 + 197 + 206 + 221 + 230 + 244 + 253 + 255 + 264 + 274 + 293 + 302 + 304 + + + 50 + 58 + 69 + 71 + 82 + 86 + 91 + 98 + 105 + 117 + 120 + 123 + 131 + 137 + 138 + 150 + 165 + 169 + 170 + 181 + 195 + 214 + 222 + 229 + 232 + 241 + 246 + 252 + 258 + 264 + 267 + 276 + 284 + 291 + 299 + 302 + 312 + 316 + 320 + 330 + 334 + 339 + 344 + 346 + 351 + 353 + 356 + 365 + 369 + 382 + 384 + 389 + 391 + 395 + + + 298 + 305 + 316 + 331 + 343 + 351 + 359 + 370 + 383 + 395 + 400 + 409 + 460 + 478 + 515 + + + 73 + 115 + 354 + + + 113 + 135 + 150 + 154 + 172 + 188 + 207 + 247 + + + 128 + 163 + 292 + + + 61 + 71 + 81 + 91 + 100 + 104 + 111 + 114 + 116 + 127 + 135 + 144 + 147 + 159 + 160 + 162 + + + 38 + 58 + 188 + 208 + 220 + 238 + 251 + + + 38 + 50 + 56 + + + 49 + 56 + 76 + + + 47 + 75 + + + 74 + 98 + 102 + 122 + 128 + 149 + 159 + + + 37 + 60 + 79 + 84 + 94 + 100 + 110 + 112 + 123 + 129 + 150 + 154 + 164 + + + 54 + 114 + 125 + 139 + 147 + 152 + + + 55 + 57 + 66 + 69 + 78 + 81 + 101 + 105 + 111 + 121 + 130 + 140 + 143 + + + 57 + 99 + 114 + 118 + 142 + 159 + 168 + 174 + 183 + 195 + 204 + 215 + 224 + 234 + 248 + 258 + 262 + 271 + 282 + 293 + 305 + 318 + 329 + 340 + 345 + 357 + 368 + + + 192 + 204 + 320 + 337 + 362 + + + 68 + 90 + 107 + + + 76 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 105 + 106 + 107 + 114 + 123 + 128 + 133 + 138 + 144 + 150 + 154 + 164 + 167 + 172 + 179 + 186 + 191 + 197 + 205 + 209 + 221 + 224 + 230 + 235 + 246 + 253 + 258 + 270 + 273 + 278 + 283 + 288 + 299 + 305 + 310 + 315 + 320 + 331 + 336 + 341 + 352 + 357 + 361 + 364 + 373 + 374 + 377 + 382 + 393 + 395 + + + 68 + 71 + 73 + 97 + 161 + 171 + 175 + 179 + + + 123 + 150 + 187 + 201 + 217 + 231 + 249 + 264 + 278 + 292 + 306 + 318 + 334 + 340 + 354 + 377 + 453 + 519 + 527 + 537 + 555 + 576 + 596 + 635 + 645 + 649 + 656 + 659 + 677 + 697 + 714 + 725 + 733 + 748 + 824 + 855 + 867 + 908 + 929 + 948 + 961 + 1007 + 1021 + 1031 + 1035 + 1052 + 1062 + 1078 + 1142 + 1153 + 1169 + 1209 + 1213 + 1224 + 1256 + 1275 + 1294 + 1304 + 1323 + 1333 + 1342 + 1352 + 1378 + 1399 + 1404 + 1419 + 1432 + 1444 + 1450 + 1518 + 1578 + + + 61 + 419 + 423 + 453 + 475 + 547 + 574 + 662 + 681 + + + 45 + 47 + 56 + 66 + 76 + 79 + 85 + 91 + 94 + 105 + 108 + 114 + 120 + 123 + 135 + 138 + 154 + 163 + 169 + 179 + 182 + 198 + 203 + 204 + 207 + 213 + 219 + 229 + 232 + 245 + 250 + 270 + 272 + 281 + 289 + 298 + 311 + 320 + 325 + 329 + 334 + 339 + 343 + 348 + 353 + 363 + 368 + 372 + 377 + 382 + 386 + 391 + 396 + 401 + 407 + 412 + 416 + 421 + 425 + 434 + 440 + 449 + 455 + 464 + 477 + 487 + 492 + 509 + 511 + + + 107 + 127 + 216 + 221 + 225 + 435 + 462 + 848 + 1065 + 1076 + 1097 + 1103 + 1147 + 1171 + 1193 + 1219 + 1261 + 1539 + 1650 + 1651 + 1652 + 1653 + 1668 + 1673 + + + 108 + 121 + 125 + 138 + 148 + 159 + 167 + 179 + 194 + + + 113 + + + 44 + + + 39 + 59 + 85 + + + 149 + 169 + 176 + + + 59 + 62 + 72 + 76 + 88 + 113 + 123 + 161 + 171 + 203 + 214 + 236 + 249 + 261 + 276 + 323 + 334 + 343 + 354 + 367 + 382 + 383 + 384 + 385 + 395 + 397 + 401 + 404 + 430 + 442 + 464 + 475 + 479 + 501 + 508 + 532 + 551 + 668 + 673 + 783 + 797 + 818 + 827 + 855 + 867 + 894 + 905 + 999 + 1011 + 1085 + 1129 + 1160 + 1210 + 1227 + 1239 + 1252 + 1253 + 1265 + 1276 + 1286 + 1294 + 1308 + 1318 + 1323 + 1344 + 1389 + 1546 + 1547 + + + 49 + 59 + 70 + 84 + 100 + 112 + 128 + 137 + 144 + + + 68 + + + 56 + + + 107 + + + 55 + 61 + 72 + 79 + 90 + 104 + 122 + 136 + 150 + 182 + 211 + 223 + 261 + 296 + 391 + 403 + 483 + 507 + 515 + 530 + 539 + 544 + 549 + 570 + 622 + 635 + 648 + + + 126 + 135 + + + 45 + 76 + 86 + 98 + + + 146 + 155 + + + 59 + 94 + 101 + + + 44 + 50 + 62 + 71 + 76 + 86 + 90 + 101 + 135 + 171 + 182 + + + 81 + 96 + 110 + 118 + 131 + 146 + 160 + 168 + 182 + 191 + 202 + 207 + + + 49 + 70 + + + 63 + 67 + 77 + 93 + 121 + 129 + 186 + 206 + 230 + 249 + 258 + + + 68 + + + 209 + 214 + 261 + 264 + 454 + 483 + + + 44 + 50 + 56 + 62 + 82 + 125 + 134 + 140 + 151 + 162 + 167 + 176 + + + 36 + 37 + 46 + 52 + 62 + 63 + 74 + 76 + 88 + 104 + 105 + 106 + 107 + 108 + 109 + 112 + 120 + 127 + 132 + 133 + 145 + 148 + 160 + 166 + 175 + 177 + 183 + 190 + 195 + 196 + 203 + 204 + 210 + 216 + 226 + 227 + 230 + 231 + 237 + + + 114 + 130 + 141 + 280 + 288 + 294 + 373 + 426 + 499 + 550 + 551 + 599 + 640 + 644 + 709 + 768 + 779 + 900 + 909 + 1095 + 1185 + 1193 + 1231 + + + 81 + 87 + 96 + 118 + 129 + 138 + 163 + 167 + 181 + 219 + 229 + 231 + 268 + 270 + 279 + 298 + 305 + 323 + 338 + 347 + 356 + 376 + 378 + 397 + 403 + 426 + + + 71 + 176 + 257 + 318 + 331 + 366 + 424 + 429 + + + 227 + 261 + 270 + 276 + 282 + 288 + 294 + 312 + 319 + 325 + 329 + 337 + 343 + + + 90 + 95 + 170 + 190 + 259 + 272 + 282 + 296 + 314 + 327 + 359 + 385 + 418 + + + 47 + 88 + + + 64 + 79 + 93 + 110 + 115 + 144 + 151 + + + 74 + + + 57 + 82 + + + 39 + 53 + 69 + + + 125 + 165 + 178 + 201 + + + 60 + 73 + 85 + 96 + 108 + 119 + 131 + + + 120 + 136 + + + 35 + 44 + 74 + 94 + 99 + 109 + 110 + 122 + 137 + 143 + 147 + + + 65 + 110 + + + 62 + 68 + 77 + 84 + 95 + 106 + 116 + 118 + 128 + 130 + 141 + 163 + 164 + 165 + 166 + 171 + 175 + 181 + 190 + 195 + 207 + 223 + 224 + + + 182 + 213 + 500 + 508 + 579 + 583 + 629 + 636 + 657 + 663 + 722 + 733 + 744 + 752 + 1015 + 1020 + + + 75 + + + 37 + 49 + 68 + 88 + 91 + + + 56 + 58 + 69 + 72 + 78 + 82 + 102 + 109 + 112 + 124 + 130 + 139 + 142 + 145 + 147 + 149 + 159 + 172 + 174 + 183 + 193 + 197 + 202 + 205 + 214 + 215 + 220 + 250 + 255 + 259 + 263 + 267 + 278 + 303 + 306 + + + 48 + 50 + 74 + 77 + 85 + 93 + 104 + 114 + 117 + 124 + 134 + 137 + 143 + 168 + 175 + 198 + 203 + 210 + 216 + 220 + 231 + 238 + 245 + 283 + + + 122 + 160 + 183 + + + 74 + + + 81 + + + 142 + 146 + 189 + 220 + + + 84 + + + 72 + 85 + 124 + 141 + 183 + 197 + 223 + 242 + 245 + 262 + 270 + 293 + 312 + 315 + 335 + 354 + 357 + 417 + 440 + 507 + 511 + 516 + 521 + 526 + 622 + 634 + 647 + 667 + + + 31 + 47 + 54 + 76 + 90 + 103 + 125 + + + 71 + + + 243 + 258 + 285 + 287 + 374 + 397 + 401 + 415 + 477 + 508 + 523 + 538 + 555 + 581 + 619 + 641 + 711 + 766 + + + 74 + 80 + + + 52 + 54 + 88 + 93 + 107 + 110 + 118 + 124 + 134 + 137 + 142 + 147 + 157 + 161 + 170 + 175 + 183 + 194 + 223 + 228 + 255 + 259 + 266 + 270 + 281 + 286 + 291 + 294 + 301 + 311 + 324 + 333 + 336 + 345 + 356 + 383 + 407 + 426 + 432 + 443 + 451 + 456 + 467 + 474 + 484 + 491 + + + 74 + 89 + 100 + 133 + + + 59 + 96 + 126 + 143 + 154 + 158 + 166 + 170 + 182 + 192 + 193 + 194 + 197 + 202 + 207 + 211 + 219 + 220 + 221 + 222 + 230 + 233 + 240 + 247 + 250 + 253 + 262 + 268 + 273 + 276 + 281 + 294 + 295 + 299 + 303 + 308 + 317 + 322 + 328 + 334 + 339 + 343 + 348 + 352 + 356 + 359 + 367 + 372 + 381 + 386 + 391 + 394 + 406 + 416 + 417 + 421 + 432 + 437 + 441 + 446 + 451 + 457 + 460 + 465 + 470 + 476 + 480 + 485 + 490 + 500 + 510 + 513 + 519 + 525 + 531 + 536 + 547 + 556 + 565 + 574 + 591 + 605 + 619 + 626 + 636 + 653 + 663 + 675 + 680 + 689 + 704 + 714 + 722 + 723 + 734 + 747 + 753 + 758 + 771 + 793 + 804 + 814 + 833 + 834 + 836 + 845 + + + 49 + 70 + 75 + 81 + + + 41 + 52 + 62 + 73 + 82 + 110 + 114 + 123 + 128 + 137 + 142 + 151 + 157 + 167 + 186 + 195 + 201 + 212 + 222 + 232 + 240 + 249 + 256 + 267 + 300 + 310 + 316 + 326 + 333 + + + 65 + 76 + 84 + 89 + 100 + 108 + 118 + 121 + 127 + 150 + 158 + 165 + 172 + 179 + 186 + 193 + 201 + 208 + 217 + 221 + 232 + + + 92 + 106 + 115 + 117 + 120 + 138 + 142 + 152 + 156 + 164 + 174 + 180 + 190 + 196 + 217 + 224 + 230 + 253 + 276 + 285 + 288 + 296 + 307 + 312 + 318 + 326 + 336 + 338 + 348 + 360 + + + 78 + + + 77 + + + 67 + 83 + + + 45 + 47 + 57 + 60 + 71 + 75 + 86 + 92 + 103 + 115 + 117 + 129 + 134 + 144 + 151 + + + 34 + 57 + + + 43 + 50 + 126 + + + 54 + 56 + 65 + 76 + 85 + 87 + 97 + 109 + 122 + 128 + 136 + 149 + 158 + 167 + 171 + 181 + 191 + 195 + 205 + 215 + 219 + 232 + 253 + 260 + 266 + 274 + 279 + 283 + 295 + 307 + 311 + 337 + 342 + 351 + 356 + 366 + 369 + 386 + 397 + 402 + 411 + 420 + 424 + 432 + 440 + 442 + 453 + 467 + 488 + 499 + 505 + 535 + 545 + 550 + 563 + + + 47 + 68 + 73 + 83 + 87 + 97 + 102 + 105 + + + 45 + 47 + 65 + 68 + 75 + 83 + 87 + 98 + 103 + 106 + 117 + 122 + 125 + 135 + 140 + 146 + 151 + 160 + 172 + 195 + 204 + 220 + 231 + 234 + 239 + 249 + 256 + 263 + 270 + 277 + 282 + 285 + 299 + 303 + 307 + 309 + + + 130 + 159 + 180 + 264 + 276 + 280 + 305 + + + 34 + 36 + 45 + 48 + 51 + 54 + 61 + 70 + 75 + 85 + 108 + 119 + 121 + 131 + 136 + 143 + 165 + 175 + 177 + 187 + 190 + 198 + 207 + 213 + 214 + 229 + 233 + 241 + 244 + 257 + 270 + 274 + 277 + 286 + 300 + 302 + 313 + 322 + 326 + 329 + 332 + 340 + 347 + 356 + 361 + 365 + 374 + 376 + 377 + 415 + 420 + 428 + 430 + 440 + 451 + 452 + 457 + 460 + 477 + 483 + 485 + 490 + 495 + 511 + + + 52 + 59 + 79 + 84 + 94 + 106 + 116 + 126 + + + 61 + 154 + 171 + 403 + + + 70 + 114 + + + 60 + 161 + 171 + 183 + 225 + 323 + 333 + 392 + + + 69 + 81 + 125 + 143 + 191 + 200 + 217 + + + 42 + 59 + 70 + 98 + 110 + 113 + 120 + 126 + 127 + 129 + 131 + 143 + 158 + 168 + 174 + 179 + 186 + 191 + 194 + 205 + 210 + 220 + 225 + 235 + 242 + 251 + 272 + 274 + 283 + 309 + 312 + 322 + 326 + 331 + 337 + 342 + 348 + 357 + 374 + 377 + 415 + 423 + 424 + 435 + 442 + 445 + 457 + 465 + 466 + 477 + 484 + 487 + 498 + 505 + 506 + 516 + 524 + 533 + 538 + 550 + 564 + 565 + 568 + 574 + 588 + 589 + 592 + 599 + 613 + 614 + 617 + 623 + 643 + 653 + 672 + 679 + 684 + 688 + 697 + 712 + 729 + 745 + 748 + + + 63 + 66 + 75 + 91 + 110 + 120 + 126 + 136 + 146 + 149 + 153 + 162 + 164 + + + 36 + 53 + 56 + 85 + 98 + 106 + 118 + 124 + 134 + 136 + 146 + 156 + 167 + 174 + + + 87 + 90 + 101 + 104 + 120 + + + 52 + 70 + 96 + 126 + 136 + 151 + 157 + 162 + 177 + 189 + 201 + 212 + 238 + 248 + 249 + 262 + 267 + 284 + 289 + 324 + 326 + 331 + 341 + 355 + 360 + 366 + 376 + 379 + 382 + 387 + 389 + 401 + 404 + 410 + 413 + 425 + 427 + 438 + 442 + 452 + 468 + 478 + 481 + 492 + 500 + 511 + 519 + 521 + 532 + 551 + 560 + 574 + + + 212 + 350 + 369 + + + 52 + 68 + 92 + 112 + 113 + + + 58 + + + 49 + 59 + 72 + 82 + 94 + 122 + 131 + 171 + 197 + 242 + 256 + 274 + 283 + 293 + 303 + 309 + 424 + 428 + 439 + 455 + 466 + 497 + 509 + 549 + 562 + 588 + 598 + 608 + + + 60 + 68 + 98 + 113 + 124 + 169 + 192 + 213 + 225 + 234 + 243 + 256 + 312 + + + 40 + 57 + 60 + 89 + 102 + 110 + 122 + 128 + 138 + 140 + 150 + 160 + 171 + 178 + + + 62 + 74 + 84 + 98 + 114 + 136 + 147 + 153 + 157 + 177 + 178 + 179 + 188 + 189 + 190 + 203 + 213 + 222 + 223 + 224 + 225 + 235 + 240 + 245 + 252 + 258 + 271 + 282 + 286 + 288 + 292 + 295 + 337 + 351 + 352 + 353 + 354 + 399 + 411 + 413 + 414 + 418 + 419 + 420 + 424 + 428 + 434 + 440 + 443 + 447 + 457 + 460 + 470 + 477 + 487 + 488 + 492 + 507 + 510 + 519 + 532 + 554 + 564 + 567 + 571 + 574 + + + 47 + 52 + 55 + 65 + 71 + + + 54 + 69 + 78 + 82 + 91 + 101 + 110 + 111 + 123 + 132 + 142 + 158 + 167 + 187 + 234 + 243 + 259 + 264 + 290 + 293 + 300 + 303 + 349 + 352 + 359 + 365 + 375 + 395 + 415 + 422 + 442 + 455 + + + 80 + 92 + 115 + 121 + 130 + 140 + 153 + 161 + 166 + 175 + 181 + 186 + 195 + 203 + 208 + 215 + 232 + 240 + 247 + 272 + 286 + 295 + 304 + 311 + 322 + 331 + 343 + 352 + 365 + 409 + 413 + 449 + 450 + 471 + + + 46 + 48 + 58 + 61 + 66 + 84 + 87 + 93 + 105 + 115 + 120 + 123 + 134 + 139 + 142 + 152 + 196 + 205 + 208 + 224 + 234 + 245 + 255 + 263 + 268 + 278 + 286 + 291 + 303 + 314 + 318 + 345 + 349 + 359 + 367 + 377 + 384 + 391 + 398 + 405 + 410 + 413 + 429 + 439 + 446 + 470 + 476 + 484 + 493 + 500 + 520 + + + 69 + 77 + 113 + 122 + 130 + 135 + 147 + 158 + 239 + 243 + 246 + 286 + 290 + 293 + 305 + 326 + 345 + 351 + 355 + 368 + 376 + 431 + 444 + 656 + 667 + 700 + + + 30 + 111 + 120 + + + 61 + 63 + 72 + 78 + 102 + 104 + 123 + 126 + 136 + 137 + 148 + 149 + + + 86 + 93 + + + 174 + 178 + 179 + 180 + 184 + 188 + 195 + 199 + 208 + 209 + 210 + 215 + 219 + 227 + 231 + 245 + 260 + 270 + 285 + 296 + 299 + 300 + 304 + 317 + 327 + 341 + 346 + 361 + 367 + 371 + 381 + 429 + 442 + 461 + 467 + 512 + 609 + 612 + 623 + 644 + 725 + 913 + 931 + 1006 + 1009 + + + 47 + 100 + 166 + 171 + + + 90 + 93 + 108 + 202 + 268 + 277 + + + 82 + + + 88 + 131 + 138 + 148 + 174 + 191 + 202 + 223 + 229 + 285 + 330 + 368 + 406 + 433 + 460 + 479 + 481 + 491 + 522 + 546 + 547 + 552 + 561 + 564 + 566 + 576 + 604 + 623 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 664 + 678 + 699 + 700 + 701 + 719 + 721 + 723 + 724 + 726 + 727 + 735 + 736 + 761 + 769 + 782 + 796 + 804 + 807 + 818 + 837 + 885 + 891 + 897 + 903 + 907 + 933 + 983 + 984 + 987 + 989 + 1003 + 1009 + 1013 + 1027 + 1033 + 1039 + 1045 + 1049 + 1064 + 1070 + 1076 + 1082 + 1086 + 1112 + 1140 + 1146 + 1150 + 1304 + 1315 + 1329 + 1332 + 1359 + + + 54 + 63 + 102 + 105 + 114 + 115 + 125 + 126 + 132 + 137 + 142 + 147 + 152 + 157 + 161 + 167 + 170 + 182 + 185 + 189 + 194 + 206 + 208 + 217 + 241 + 252 + 258 + 264 + 268 + 279 + 292 + 307 + 313 + 318 + 325 + 331 + 339 + 355 + 359 + 364 + 368 + 376 + 379 + 384 + 397 + 401 + 406 + 410 + 435 + 439 + 449 + 455 + 460 + 465 + 468 + 479 + 495 + 507 + 517 + + + 57 + 64 + 73 + 76 + 83 + 93 + 96 + 102 + 125 + 131 + 151 + 156 + 161 + 169 + 188 + 190 + + + 79 + 96 + 129 + 149 + 157 + 162 + 172 + 185 + 196 + 207 + 217 + 255 + 264 + 308 + 315 + 324 + 350 + 414 + 445 + 478 + 494 + 503 + 538 + 550 + 672 + + + 74 + 89 + 100 + 133 + + + 108 + 113 + 151 + 164 + 168 + 180 + 187 + 217 + 223 + 229 + 235 + 242 + 281 + 288 + + + 49 + 70 + 75 + 77 + 82 + + + 67 + 69 + 77 + 151 + 162 + 170 + 184 + + + 57 + 222 + 225 + 237 + 247 + 257 + 269 + 274 + 350 + 352 + 376 + 386 + 388 + 423 + 436 + + + 49 + 65 + 83 + 92 + 110 + 120 + 131 + 142 + 156 + 164 + 174 + 176 + 199 + 210 + 220 + 232 + 238 + 245 + 255 + 262 + 273 + 287 + 290 + 300 + 303 + 305 + 308 + 310 + 312 + 317 + 320 + + + 109 + 117 + 153 + 229 + + + 48 + 60 + 136 + 138 + 148 + 157 + 167 + 169 + 179 + 188 + 223 + 240 + 268 + 286 + 311 + 318 + 320 + 401 + 406 + 420 + 442 + 452 + 454 + 474 + 480 + 484 + 492 + 505 + 608 + 619 + 622 + 633 + 663 + 676 + 678 + 682 + 686 + 688 + 691 + 695 + 704 + + + 42 + 52 + 58 + 82 + 98 + 113 + 123 + 127 + 138 + 142 + 153 + 155 + 165 + 169 + 172 + 176 + 187 + 194 + 198 + 214 + 223 + 241 + 250 + 257 + 261 + 265 + 269 + 273 + 276 + 281 + 293 + 310 + 313 + 318 + 321 + 331 + 350 + 361 + 373 + 376 + 377 + 389 + 401 + 404 + 408 + 412 + 413 + 425 + 437 + 440 + 444 + 453 + 457 + 458 + 469 + 473 + 479 + 490 + 492 + 503 + 515 + 518 + 525 + 533 + 539 + 542 + 543 + 554 + 558 + 561 + 572 + 576 + 579 + 595 + 607 + + + 77 + 85 + 100 + 128 + 136 + + + 51 + 56 + 67 + 73 + 83 + 95 + 111 + 116 + 119 + 130 + 143 + 153 + 156 + 161 + 171 + 173 + 177 + 180 + 191 + 200 + 213 + 218 + 229 + 241 + 254 + 257 + 267 + 280 + 290 + 300 + 322 + 332 + 338 + 342 + 345 + 350 + 360 + 368 + 377 + 388 + 402 + 413 + 416 + 430 + 442 + 443 + 457 + 460 + + + 63 + 73 + 76 + 79 + 80 + 85 + 89 + 111 + 125 + 164 + 197 + 212 + 229 + 234 + 277 + 282 + 298 + 311 + 347 + 356 + 367 + 377 + 382 + 394 + 406 + 444 + 467 + 475 + 492 + 505 + 513 + 524 + 532 + 544 + 586 + 588 + 608 + 626 + 658 + 675 + 704 + 716 + 730 + 736 + 745 + 757 + 768 + 784 + 792 + 802 + 814 + 826 + 835 + 838 + 854 + 859 + 870 + 873 + 883 + 891 + 901 + 912 + 926 + 979 + 985 + + + 42 + 45 + 57 + 68 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 110 + 126 + 130 + 140 + 144 + 147 + 149 + 160 + 170 + 173 + 181 + 183 + 187 + 190 + 203 + 212 + 214 + 220 + 224 + 236 + 242 + 252 + 262 + 264 + 268 + 274 + 277 + 287 + 290 + 295 + 300 + 303 + 310 + 319 + 324 + 331 + 337 + 349 + 359 + 366 + 376 + + + 79 + 86 + 155 + 176 + 196 + 205 + 216 + 221 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 238 + 247 + 262 + 290 + 299 + + + 71 + + + 40 + 51 + 74 + + + 75 + 80 + 89 + 109 + 118 + 133 + 148 + 155 + 160 + 168 + 173 + 177 + 189 + 196 + 201 + 204 + 217 + 224 + 229 + 232 + 244 + 251 + 256 + 259 + 271 + 278 + 283 + 286 + 295 + 300 + 307 + 320 + 330 + 335 + 342 + 352 + 362 + 367 + 373 + 386 + 396 + 408 + 419 + 428 + 431 + 447 + 453 + 457 + 464 + 474 + 477 + 483 + 492 + 504 + 613 + 629 + 634 + 667 + 677 + 718 + 733 + 737 + 743 + 752 + 764 + 780 + 784 + 795 + 799 + 805 + 811 + 816 + 841 + 852 + 856 + 863 + 869 + 874 + 898 + 909 + 915 + 920 + 925 + 949 + 960 + 964 + 969 + 975 + 980 + 983 + 998 + 1014 + 1020 + 1031 + 1041 + 1045 + 1056 + 1059 + 1071 + 1075 + + + 79 + 89 + 125 + 158 + 173 + 182 + + + 39 + 52 + 55 + 64 + 66 + 75 + 82 + 115 + 131 + 146 + 149 + 158 + 160 + 169 + 173 + + + 77 + + + 54 + 56 + 74 + 77 + 83 + 102 + 111 + 113 + 120 + 124 + 133 + 138 + 147 + 151 + 161 + 166 + 173 + 197 + 201 + 211 + 214 + 228 + 234 + 237 + 247 + 250 + 279 + 300 + 305 + 308 + 319 + 324 + 327 + 337 + 340 + 347 + 361 + 371 + 387 + 398 + 406 + 411 + 422 + 430 + 435 + 445 + 454 + 459 + 470 + 473 + 478 + 488 + 495 + 502 + 509 + 516 + 521 + 524 + 535 + 538 + 545 + 552 + 557 + 568 + 571 + 580 + 588 + 602 + 608 + 621 + 628 + 641 + 648 + 658 + 673 + 684 + 691 + 705 + 719 + 722 + 733 + 740 + 748 + + + 37 + 43 + 48 + 53 + 63 + 65 + 82 + + + 85 + + + 44 + 54 + 59 + 71 + 73 + + + 37 + 48 + 51 + 60 + 66 + 77 + 89 + 142 + 153 + 168 + 188 + 209 + 230 + 251 + 273 + 345 + 369 + + + 38 + 49 + + + 45 + 84 + 124 + 138 + 169 + 176 + 185 + 193 + 205 + 209 + 214 + 225 + 237 + + + 64 + 80 + 90 + 102 + 112 + 114 + 124 + 128 + 139 + 146 + 156 + 161 + 163 + 184 + 188 + 191 + 195 + 196 + 201 + 205 + 211 + 215 + 233 + 235 + 246 + 254 + 266 + 281 + 285 + 294 + 304 + 307 + 319 + 321 + 324 + 335 + 338 + 348 + 359 + 369 + 373 + 378 + 379 + 380 + 384 + 385 + 386 + 391 + 396 + 400 + 410 + 437 + 438 + 441 + 454 + 464 + 469 + 481 + 483 + 496 + 497 + 499 + 509 + 511 + 515 + 518 + + + 77 + 83 + 93 + 98 + + + 31 + 38 + 45 + 52 + 62 + 68 + + + 55 + + + 215 + 223 + 232 + 254 + 275 + 290 + 301 + 319 + 325 + 330 + 335 + 340 + 345 + 349 + 354 + 359 + 364 + 369 + 374 + 406 + + + 40 + 61 + 65 + 116 + + + 81 + 91 + + + 43 + 59 + 69 + 108 + 112 + 119 + 131 + 138 + 142 + 153 + 159 + 182 + 201 + 219 + 230 + 265 + 271 + + + 58 + 74 + 80 + 87 + + + 44 + 49 + 58 + 63 + 72 + 80 + 90 + 99 + 112 + 123 + + + 174 + 184 + + + 228 + + + 54 + 60 + 84 + 89 + 98 + 104 + 116 + 125 + 134 + 171 + 183 + 198 + 207 + 211 + 220 + 244 + 254 + 292 + 301 + 329 + 338 + 348 + + + 42 + 56 + 68 + 79 + 81 + 90 + 99 + 108 + 113 + 122 + 130 + + + 106 + 162 + 201 + 256 + 292 + 298 + 309 + 314 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 330 + 338 + 349 + 360 + 361 + 407 + 440 + 451 + 472 + 478 + 485 + 513 + 518 + 531 + 554 + 567 + 578 + 625 + 653 + 662 + + + 35 + 36 + 45 + 50 + 60 + 61 + 70 + 72 + 81 + 88 + 95 + 98 + 108 + 111 + 115 + 122 + 132 + 140 + 149 + 155 + 162 + 165 + 171 + 181 + 183 + 189 + 191 + 196 + 197 + + + 33 + 38 + 54 + 65 + 74 + 77 + 82 + 86 + 97 + 106 + 116 + 123 + 126 + 128 + + + 46 + 83 + 88 + 100 + 119 + 131 + 159 + 169 + 200 + 210 + 219 + 230 + 255 + 263 + 268 + 271 + 283 + 290 + 298 + 307 + 316 + 320 + + + 39 + 52 + 62 + + + 52 + 54 + 64 + 76 + 87 + 90 + 94 + 106 + 118 + 130 + 133 + 137 + 147 + 148 + 164 + 167 + 174 + 180 + 196 + 202 + 208 + 214 + 219 + 228 + 238 + 241 + 255 + 264 + 269 + 276 + 284 + 291 + 296 + 306 + 311 + 324 + 329 + 341 + 347 + 355 + 366 + 372 + 382 + 387 + 394 + 402 + 409 + 413 + 424 + 429 + 436 + 443 + 447 + 464 + 473 + 484 + 499 + 509 + 521 + 529 + 538 + 550 + 558 + 573 + 578 + 588 + 596 + 607 + 617 + 621 + 647 + 652 + 661 + 665 + 677 + 687 + 707 + 716 + 722 + 726 + 736 + 739 + 759 + 765 + 771 + 774 + 785 + 789 + 803 + 806 + 810 + 821 + 825 + 828 + 838 + 841 + 847 + 850 + 860 + 874 + + + 94 + + + 89 + 115 + 127 + 143 + 157 + 172 + 177 + 220 + 238 + 250 + 256 + 267 + 273 + 281 + 300 + 331 + 344 + 352 + 368 + 383 + 392 + 398 + 413 + 419 + 454 + 460 + + + 80 + 100 + 129 + 135 + 141 + 167 + 171 + 187 + 210 + 214 + 235 + 239 + 256 + 261 + 272 + 279 + 299 + 306 + 334 + 364 + 396 + + + 55 + 59 + 66 + 72 + 75 + 84 + 103 + 136 + 142 + 154 + 161 + 167 + 180 + 182 + 196 + 205 + 219 + 231 + + + 38 + 41 + 52 + 54 + 64 + 67 + 70 + 80 + 82 + 92 + 146 + 166 + 168 + 178 + 184 + 194 + 200 + 210 + 211 + 217 + 227 + 231 + 241 + 243 + 253 + 289 + 292 + 296 + 309 + 319 + 329 + 331 + 337 + 348 + 358 + 360 + 365 + 367 + 382 + 395 + 405 + 411 + 424 + 436 + 442 + 444 + 455 + 458 + 463 + 465 + 475 + 482 + 484 + 494 + 498 + 503 + 505 + 515 + 528 + + + 124 + 152 + 186 + 198 + 224 + 245 + 286 + 292 + 298 + 317 + 345 + 374 + 410 + 457 + 493 + 704 + 735 + 744 + 760 + 767 + 771 + 793 + 807 + 829 + 873 + 901 + 1057 + 1114 + 1144 + + + 170 + 204 + 285 + 347 + + + 40 + 53 + 62 + + + 40 + 61 + 69 + 79 + + + 52 + 121 + 180 + + + 104 + 119 + + + 50 + 82 + 88 + + + 54 + 59 + 68 + 74 + 80 + 86 + 91 + 101 + 121 + 154 + 160 + 163 + 167 + 171 + 181 + 214 + 234 + 236 + 242 + 249 + 257 + 272 + 284 + + + 192 + 203 + 327 + 334 + 341 + 388 + 397 + 763 + 770 + 775 + 880 + 1073 + 1098 + 1121 + 1148 + + + 58 + + + 37 + 51 + 53 + 62 + 64 + 74 + 77 + 86 + 98 + 108 + 114 + 123 + 129 + 138 + + + 65 + 74 + 100 + 128 + 148 + 187 + 199 + 276 + 354 + 366 + 379 + 388 + 407 + 444 + 475 + 493 + 504 + 524 + 583 + 584 + 593 + 598 + 605 + 638 + 669 + 670 + 695 + 725 + 810 + 834 + 885 + 898 + 942 + 961 + 1014 + 1022 + 1034 + 1047 + 1073 + 1075 + 1092 + 1160 + 1201 + 1227 + 1237 + 1242 + 1254 + 1280 + 1374 + 1392 + 1404 + 1417 + 1424 + 1436 + 1443 + 1466 + 1478 + 1486 + 1494 + 1502 + 1510 + 1518 + 1542 + 1552 + + + 37 + 60 + 62 + 81 + 93 + 98 + + + 60 + 88 + 125 + 139 + 144 + 153 + 176 + 192 + 199 + 208 + 218 + 224 + 233 + 254 + 263 + 275 + 284 + 301 + 310 + 325 + 329 + 338 + 354 + 387 + 394 + + + 41 + 61 + 81 + 139 + 143 + 150 + 165 + 201 + 230 + 235 + 239 + 249 + 258 + 271 + 275 + 292 + 301 + 308 + 312 + 325 + 334 + 347 + 358 + 367 + 387 + 395 + + + 46 + 56 + 89 + 100 + 144 + 159 + 174 + 222 + 249 + 353 + 370 + 394 + 417 + 437 + 512 + 522 + 614 + + + 107 + 115 + 124 + 152 + 158 + + + 107 + 122 + 131 + 203 + 267 + + + 82 + 97 + 108 + 141 + + + 171 + 253 + 262 + 273 + 367 + 390 + 407 + 413 + 439 + 460 + 482 + 496 + 527 + 545 + 555 + 592 + 618 + 679 + 717 + 751 + + + 42 + 58 + 59 + 70 + + + 58 + 141 + 162 + + + 197 + 218 + + + 77 + + + 146 + 154 + 162 + 184 + 190 + 197 + 202 + 205 + 213 + 234 + 254 + 339 + 362 + 447 + 453 + 460 + 497 + 537 + 564 + 592 + 657 + 686 + 694 + 705 + 740 + 842 + 880 + 1052 + 1123 + 1180 + 1326 + 1401 + 1440 + 1512 + + + 71 + 103 + 152 + 203 + 253 + 257 + 275 + 296 + 325 + 344 + 361 + 378 + + + 49 + + + 82 + 172 + 177 + 182 + 187 + 193 + 207 + 216 + 219 + 233 + 239 + 245 + 251 + 263 + + + 33 + 43 + + + 47 + 55 + 78 + 87 + 106 + 115 + 121 + 130 + 144 + 153 + 162 + 172 + 178 + 185 + 203 + + + 38 + 40 + 67 + 79 + 84 + 90 + 96 + 99 + 111 + 123 + 128 + 134 + 140 + 143 + 153 + 156 + 161 + 165 + 175 + 178 + 191 + 194 + 205 + 208 + 217 + 220 + 230 + 261 + 271 + 288 + 292 + + + 40 + 42 + 51 + 57 + 78 + 83 + 89 + 96 + 100 + 119 + 122 + 134 + 138 + 142 + 145 + 157 + + + 48 + 69 + 81 + 99 + 129 + 130 + 144 + 145 + 155 + 156 + 166 + 167 + 176 + 177 + 185 + 186 + 194 + 195 + 206 + 220 + 241 + 253 + 259 + 272 + 290 + 305 + 320 + 332 + 351 + 372 + 396 + 403 + 417 + 452 + 458 + 474 + 482 + 496 + 511 + 515 + 536 + 570 + 574 + 579 + 593 + 696 + 700 + 714 + 741 + 827 + 852 + 948 + 953 + + + 34 + 39 + 45 + 48 + 58 + 62 + 68 + 71 + + + 63 + 108 + 138 + 172 + 208 + 229 + 240 + 251 + 272 + 326 + 355 + 370 + 381 + 392 + 403 + 414 + 426 + 438 + 456 + 466 + 478 + + + 85 + 108 + 152 + 166 + + + 76 + 91 + 102 + 139 + + + 56 + 177 + + + 53 + 65 + 79 + 96 + 120 + 122 + 132 + 143 + 153 + 159 + + + 75 + 90 + 101 + 110 + 143 + + + 48 + 179 + + + 42 + 58 + 97 + 118 + 125 + 135 + 140 + 150 + 155 + 165 + 180 + 204 + 216 + 230 + 255 + 261 + 270 + 283 + 322 + 334 + 338 + 347 + 352 + 382 + + + 47 + + + 35 + 46 + 59 + + + 102 + 113 + 124 + 140 + 146 + 176 + 200 + 212 + 223 + 237 + 247 + 257 + 267 + 276 + + + 71 + 108 + 112 + 141 + + + 57 + 80 + 111 + 115 + 121 + 157 + 163 + + + 38 + 49 + + + 55 + 80 + 87 + 96 + 101 + 110 + 133 + 142 + 147 + 156 + 158 + 167 + 179 + 189 + 201 + 213 + 222 + 229 + 239 + 252 + 261 + 275 + 284 + 311 + + + 82 + 97 + 108 + 141 + + + 108 + 249 + + + 45 + 47 + 56 + 66 + 77 + 80 + 86 + 92 + 95 + 106 + 109 + 115 + 121 + 124 + 134 + 137 + 148 + 153 + 163 + 166 + 171 + 176 + 177 + 190 + 200 + 203 + 208 + 214 + 235 + 241 + 250 + 256 + 265 + 270 + 274 + 279 + 284 + 288 + 293 + 298 + 303 + 309 + 314 + 318 + 323 + 327 + 336 + 361 + 370 + 383 + 393 + 415 + 417 + + + 59 + 71 + 75 + 101 + 105 + 145 + 159 + 161 + 239 + 249 + + + 77 + 104 + 144 + 148 + 165 + 184 + 205 + 246 + 253 + + + 46 + 48 + 57 + 65 + 76 + 79 + 85 + 91 + 94 + 104 + 107 + 114 + 118 + 128 + 131 + 136 + 143 + 153 + 156 + 161 + 167 + 188 + 194 + 203 + 208 + 218 + 223 + 243 + + + 55 + 158 + 198 + 215 + + + 67 + 68 + 81 + + + 41 + 46 + 113 + 121 + 132 + 142 + 151 + 166 + 172 + + + 113 + 116 + 127 + 130 + 293 + 298 + + + 77 + 81 + 125 + 143 + 169 + 182 + 192 + 200 + 207 + 214 + 226 + 235 + 259 + 292 + 299 + 302 + 334 + 377 + 388 + 391 + 394 + 400 + 403 + 406 + 409 + 413 + 425 + 428 + 431 + 439 + 445 + 473 + 483 + 560 + 573 + 585 + 596 + 608 + 619 + 630 + 641 + 652 + 664 + 672 + 686 + 696 + 707 + 711 + 719 + 729 + 732 + 742 + + + 114 + 115 + 128 + 187 + 204 + + + 77 + 86 + 93 + 105 + 115 + + + 109 + 118 + + + 51 + + + 61 + + + 79 + + + 109 + 152 + 155 + 158 + 169 + 175 + 198 + 211 + 222 + 256 + 276 + 368 + 378 + 387 + 424 + 458 + 468 + 469 + 485 + 494 + + + 67 + 89 + 106 + 117 + 160 + 190 + 205 + 223 + 242 + 252 + 266 + 273 + 290 + 301 + 312 + 331 + 346 + 357 + 380 + 406 + 425 + 445 + 458 + 517 + + + 97 + 107 + 187 + 197 + 201 + 205 + + + 42 + 56 + 67 + 79 + 82 + 101 + 112 + 117 + 126 + 129 + 133 + 140 + 151 + 169 + 181 + + + 73 + 78 + 123 + 137 + 148 + + + 75 + 93 + 101 + 108 + 118 + 155 + 163 + 178 + 186 + 193 + 201 + 215 + 223 + 235 + 243 + 262 + 270 + 277 + 285 + 294 + 312 + + + 111 + + + 111 + 144 + 156 + 161 + 165 + 179 + 197 + 228 + 248 + 276 + 293 + 308 + 312 + 314 + + + 58 + 63 + 96 + 131 + 140 + 172 + 199 + 310 + 319 + 332 + 341 + 354 + 390 + 397 + 408 + 425 + 436 + 451 + 464 + 475 + 494 + 502 + + + 66 + + + 91 + 104 + 123 + 151 + 187 + 217 + 233 + 241 + 330 + 355 + 429 + 442 + 509 + 525 + 570 + 583 + + + 108 + 133 + 192 + 209 + 226 + 242 + 257 + + + 174 + 210 + 222 + 228 + 248 + + + 82 + 90 + 106 + 116 + 153 + 204 + 219 + 247 + 259 + 301 + 348 + 395 + 428 + 443 + 452 + + + 36 + 42 + + + 43 + + + 88 + 113 + 124 + 137 + 142 + 160 + 180 + 190 + 204 + 213 + 223 + 238 + 244 + 253 + 258 + 272 + 290 + + + 52 + 78 + 89 + 99 + 110 + 119 + 140 + 151 + 177 + 195 + 221 + 234 + 249 + + + 142 + 187 + + + 40 + + + 58 + 88 + 113 + 116 + 150 + 165 + 179 + 192 + 212 + 245 + 287 + 297 + 323 + 332 + 337 + 349 + 359 + 364 + 380 + 384 + 395 + 433 + 436 + 442 + 449 + 466 + 472 + 498 + 504 + 512 + 519 + 525 + 538 + 559 + 569 + 577 + 585 + 593 + 604 + 609 + 621 + 633 + 639 + 645 + 660 + 686 + 699 + 714 + 729 + 746 + 790 + 805 + 816 + 840 + 847 + 860 + + + 59 + 99 + 151 + 188 + 210 + 219 + 236 + 263 + 288 + 303 + 311 + 321 + 332 + 342 + 354 + 370 + 376 + 384 + 400 + 422 + 433 + 493 + 524 + 557 + 569 + 584 + + + 49 + 70 + 75 + 81 + + + 39 + + + 49 + + + 60 + + + 67 + 80 + 117 + 128 + 138 + 151 + 162 + 175 + 191 + 246 + 255 + 267 + 275 + 287 + 299 + 302 + 311 + 329 + 341 + 368 + 431 + 432 + 459 + 493 + 504 + 511 + 520 + 579 + 612 + 631 + 638 + 647 + 650 + 683 + 690 + 701 + 702 + 730 + 737 + 821 + 861 + 863 + 875 + 879 + 892 + 912 + + + 78 + + + 46 + 50 + 82 + 87 + 96 + 102 + + + 57 + 69 + 80 + 93 + 98 + 109 + 126 + 141 + 145 + 152 + 157 + 166 + 171 + 178 + 188 + 191 + 226 + 228 + 240 + 261 + 269 + 298 + 309 + 324 + 358 + 363 + 374 + 380 + + + 62 + 78 + 82 + 92 + 104 + 114 + 132 + 143 + 146 + 155 + 159 + 170 + 184 + 185 + 186 + 211 + 226 + 227 + 228 + 246 + 247 + 248 + 265 + 266 + 267 + 283 + 284 + 285 + 311 + 312 + 313 + 326 + 330 + 340 + 347 + 357 + 358 + 359 + 361 + 367 + 368 + 378 + 384 + 390 + 395 + 401 + 411 + 418 + 426 + 432 + 440 + 455 + 471 + 472 + 473 + 489 + 490 + 491 + 503 + 521 + 533 + 535 + 546 + 548 + 554 + 569 + 573 + 574 + 589 + 597 + 599 + 603 + 606 + 619 + 630 + 633 + 662 + 674 + 680 + 682 + 683 + 689 + 694 + 699 + 708 + + + 45 + 56 + 62 + 73 + 97 + 102 + 113 + 114 + 143 + 154 + 163 + 198 + 215 + 226 + + + 39 + 44 + 56 + 67 + 78 + 88 + 91 + 94 + 99 + 104 + 109 + 114 + 118 + 120 + 129 + + + 74 + 89 + 100 + 133 + + + 36 + 49 + 61 + 62 + 261 + 275 + 277 + 281 + 283 + 288 + 304 + 318 + 324 + 333 + 340 + 345 + 364 + 367 + 373 + 414 + 419 + 465 + 468 + 517 + 521 + 524 + + + 76 + 90 + 103 + 111 + 118 + 126 + 128 + 136 + 143 + 152 + 162 + 164 + + + 52 + 54 + 76 + 80 + 86 + 97 + 103 + 113 + 116 + 124 + 149 + 155 + 177 + 181 + 191 + 202 + 207 + 212 + 222 + 228 + 237 + 241 + 250 + + + 93 + 116 + 126 + 175 + 185 + 194 + + + 193 + 197 + 202 + 211 + 226 + 233 + 240 + 252 + 263 + 280 + + + 82 + 112 + 126 + 137 + 145 + 156 + 164 + 175 + 185 + 193 + + + 39 + 48 + 60 + 81 + 85 + + + 454 + 469 + 556 + 570 + 574 + 579 + 583 + 604 + 650 + 727 + 782 + 861 + 891 + 922 + 954 + 984 + 1020 + 1073 + 1110 + 1139 + 1163 + 1182 + 1202 + 1228 + 1252 + 1271 + 1294 + 1310 + 1335 + 1367 + 1408 + 1450 + 1472 + 1493 + 1514 + 1535 + 1557 + 1613 + + + 132 + 156 + 173 + 181 + 184 + + + 45 + 47 + 71 + 74 + 78 + 88 + 91 + 95 + 106 + 109 + 119 + 130 + 133 + 143 + 146 + 152 + 156 + 166 + 169 + 176 + 186 + 190 + 200 + 218 + 231 + 241 + 242 + 265 + 271 + 294 + 297 + 303 + 318 + 322 + 332 + 340 + 344 + 355 + 396 + 406 + 410 + 415 + 417 + + + 64 + 70 + 82 + 91 + 96 + 107 + 112 + 124 + 141 + 151 + 162 + 182 + 213 + 241 + 251 + 263 + 274 + 302 + 312 + 329 + 345 + 358 + 408 + 415 + 426 + 456 + 494 + 526 + + + 82 + + + 34 + 39 + 50 + 55 + 66 + 71 + 82 + 84 + 131 + 136 + 309 + 319 + + + 52 + 57 + 87 + 92 + + + 106 + 132 + 150 + 153 + 158 + 169 + 190 + 196 + 215 + 237 + 250 + 264 + 265 + 329 + 365 + 375 + 384 + 404 + + + 58 + 60 + 92 + 96 + 126 + 129 + 138 + 146 + 155 + 158 + 164 + 191 + 198 + 231 + 239 + 254 + 257 + 267 + 270 + 276 + 283 + 297 + 302 + 310 + 319 + 334 + 342 + 360 + 371 + 379 + 388 + 400 + 419 + 421 + 431 + 434 + + + 56 + 66 + 74 + 83 + 101 + 128 + 134 + 137 + 171 + 176 + 180 + 182 + 194 + 207 + 219 + + + 65 + 83 + 87 + 104 + 132 + 156 + 203 + 208 + + + 191 + 201 + 288 + 295 + 323 + 344 + 352 + 380 + 395 + 483 + 492 + 504 + 513 + 528 + 537 + 665 + + + 95 + 109 + + + 50 + 58 + 93 + 97 + 102 + 115 + 119 + 130 + 155 + 160 + 171 + 185 + 191 + 199 + 207 + 212 + 227 + 231 + 245 + 249 + 254 + 263 + 267 + + + 171 + 197 + 203 + 217 + 278 + 304 + 311 + 356 + 402 + + + + + 239 + 407 + 459 + 468 + 477 + + + 30 + + + 32 + + + 50 + + + 32 + 38 + + + 73 + + + 79 + + + 37 + + + 239 + 407 + 459 + 468 + 477 + + + 126 + + + 44 + + + 48 + 82 + + + 37 + + + 89 + 95 + 102 + + + 46 + 55 + 63 + + + 46 + 55 + 63 + + + 177 + 218 + 310 + 321 + + + 44 + 56 + + + 35 + 43 + 74 + + + + + 414 + + + 40 + + + + + 251 + + + 1110 + + + 123 + + + 272 + 330 + + + + + 82 + + + 479 + + + 166 + 185 + + + 381 + + + 188 + + + 84 + + + 412 + 414 + 428 + + + 88 + + + 72 + + + 335 + + + 1468 + + + 743 + + + 557 + + + 144 + 145 + 241 + 242 + 243 + + + 58 + + + 103 + + + 116 + + + 172 + 173 + 209 + 210 + + + 1035 + + + 953 + + + 144 + 258 + 299 + 341 + + + 252 + + + 257 + 273 + 300 + + + 424 + + + 838 + + + 72 + + + 156 + 263 + + + 138 + + + 150 + + + 78 + 185 + + + 532 + 568 + + + 141 + 282 + 320 + 327 + + + 221 + + + 218 + + + 265 + 301 + + + 298 + 309 + 324 + 339 + 340 + 347 + 363 + 364 + 365 + + + 150 + + + 274 + + + 304 + + + 139 + 271 + 305 + 359 + + + 172 + + + 192 + 224 + 362 + 385 + 432 + 434 + + + 122 + 281 + 336 + 337 + + + 513 + 574 + 600 + 700 + 860 + 1372 + 1386 + 1389 + + + 431 + + + 263 + 294 + + + 804 + + + 208 + 209 + + + 198 + 219 + 220 + + + 110 + 116 + 198 + 199 + + + 65 + + + 202 + + + 103 + 110 + + + 176 + 177 + 182 + 250 + 251 + 252 + + + 340 + 348 + 354 + 355 + 462 + + + 245 + 296 + 333 + 366 + 403 + 519 + 531 + 532 + + + 206 + + + 276 + + + 218 + 219 + 220 + + + 150 + + + + + + + 171 + 200 + 212 + 404 + + + 487 + 530 + 782 + 784 + 786 + 788 + 849 + 1083 + 1085 + 1087 + 1088 + 1306 + + + 176 + 206 + 344 + 367 + + + 132 + + + 884 + 952 + 963 + 1004 + 1027 + 1314 + + + 156 + + + 147 + + + + + 114 + 135 + 247 + + + 188 + 199 + 219 + 231 + + + 313 + 482 + 736 + + + 675 + + + 270 + 296 + + + 1246 + + + 148 + 446 + + + 118 + 119 + 120 + 123 + 125 + 127 + 128 + 129 + 130 + 138 + 139 + 140 + 142 + 144 + 145 + 151 + 152 + 153 + 155 + 156 + 163 + 164 + 165 + 166 + 167 + 172 + 173 + 175 + 176 + 177 + 182 + 183 + 184 + 185 + 186 + 191 + 192 + 193 + 194 + 195 + 199 + 200 + 234 + 310 + 316 + 345 + 349 + 351 + 352 + 355 + 360 + 361 + 362 + 370 + 371 + 372 + 373 + 374 + 380 + 381 + 382 + 388 + 389 + 390 + + + 167 + 192 + 227 + 245 + 295 + 297 + + + 562 + 566 + 580 + + + 349 + 377 + + + 138 + 155 + 284 + 285 + 307 + 331 + 616 + 680 + 1183 + + + 231 + + + 584 + + + 287 + + + 131 + 132 + 133 + 134 + + + 130 + + + 163 + + + 83 + 107 + + + 96 + 260 + 272 + + + 190 + + + 166 + 244 + 256 + 268 + 292 + 303 + 318 + 363 + 369 + 436 + + + 161 + + + 134 + + + 542 + + + 747 + + + 542 + + + 600 + 877 + 967 + + + 368 + + + 267 + + + 264 + 271 + 277 + 283 + 288 + + + 99 + 112 + 276 + 329 + 357 + 385 + 409 + 720 + + + 259 + 260 + + + 540 + 560 + 562 + 563 + 565 + 587 + 589 + 602 + 604 + 605 + 614 + 616 + 618 + + + 106 + 133 + 149 + 301 + 483 + 513 + 544 + 560 + 702 + 706 + + + 189 + 191 + 268 + + + 422 + 439 + 455 + 556 + 567 + 568 + 569 + + + 394 + 395 + 417 + 418 + 419 + 420 + 421 + 422 + + + 423 + 432 + 458 + + + 131 + 142 + 152 + 166 + 181 + 192 + 213 + 241 + 313 + 325 + + + 139 + 148 + + + 228 + 230 + + + 251 + + + 139 + + + 374 + + + + + 78 + + + 337 + + + 384 + + + 176 + + + 284 + + + 89 + + + 1514 + + + 54 + + + 116 + + + 85 + + + 70 + + + 71 + + + 83 + + + + + 160 + + + 163 + + + 117 + + + 79 + + + 132 + + + 1373 + + + 173 + + + 95 + + + + + 66 + + + 119 + + + 104 + + + 100 + + + 39 + + + 106 + + + 154 + 158 + + + + + 241 + 289 + 326 + + + 174 + 220 + + + 304 + + + 248 + 1005 + + + 486 + + + 256 + 263 + + + 99 + + + 103 + + + 1092 + + + 94 + 144 + + + 156 + + + 214 + 243 + 276 + + + 150 + + + 119 + + + 119 + + + 67 + + + 647 + 1145 + 1262 + 1287 + + + 186 + 750 + 786 + 1207 + + + 86 + 656 + + + 127 + + + 63 + + + 392 + + + 407 + + + 163 + + + 100 + 199 + + + 146 + + + + + 174 + + + 29 + + + 53 + 81 + 87 + 92 + + + 40 + + + 342 + + + 59 + + + 29 + + + 44 + + + 79 + 86 + + + 123 + + + 113 + 114 + 115 + 116 + 117 + + + 43 + + + 116 + + + 50 + 622 + 839 + 840 + 841 + 1238 + 1366 + + + 188 + + + 188 + + + 162 + 165 + + + 205 + + + 30 + + + 214 + 215 + 216 + 224 + 320 + 321 + 326 + + + 112 + + + 70 + 72 + + + 149 + + + 34 + + + 161 + + + 360 + + + 123 + 206 + 221 + 240 + 297 + + + 376 + + + 31 + + + 148 + + + 111 + 117 + 123 + + + 68 + + + 324 + + + 229 + + + 75 + 110 + 121 + 132 + 154 + + + 1067 + + + 224 + 320 + 321 + 332 + 342 + + + 97 + + + 34 + + + 662 + + + 226 + + + 133 + + + 33 + 1277 + + + 33 + + + 282 + 283 + + + 68 + + + 352 + 380 + 404 + + + 65 + 74 + + + 152 + + + 189 + 314 + + + 65 + + + 125 + 874 + + + 648 + + + 344 + + + 187 + + + 184 + + + 52 + 60 + 183 + + + 402 + + + 25 + + + 127 + + + 362 + 365 + + + + + 173 + + + 161 + + + 107 + + + 758 + + + 136 + + + 187 + + + 120 + + + + + 49 + + + 36 + + + 48 + + + 31 + + + 65 + + + 72 + + + + + 46 + + + 214 + 219 + + + 392 + 722 + 730 + 738 + 745 + 752 + 759 + 774 + 785 + 794 + 803 + 812 + + + 154 + 181 + 185 + + + 1057 + + + 235 + + + 257 + + + 270 + + + 1027 + + + 109 + + + + + 200 + + + 82 + + + 101 + + + 41 + 42 + 43 + + + 32 + 95 + 131 + 158 + 171 + 197 + 223 + 267 + + + 376 + 377 + + + 156 + + + 87 + + + 166 + + + 108 + 124 + 143 + 162 + 175 + + + 98 + 99 + 100 + 101 + + + 36 + + + 206 + + + 32 + 95 + 131 + 158 + 171 + 197 + 223 + 267 + + + + + 74 + + + 89 + 136 + 149 + + + 1040 + + + 540 + 954 + + + 402 + 868 + + + 164 + + + 1158 + + + 169 + + + 187 + 419 + 624 + 685 + 739 + 848 + 889 + 920 + 952 + 1292 + 1333 + + + 31 + + + 481 + + + 227 + 291 + + + 139 + + + 59 + + + 408 + + + 28 + + + 339 + 518 + 859 + + + 65 + + + 130 + + + 378 + 404 + 423 + + + 214 + + + 74 + + + 81 + + + 233 + + + 659 + 818 + + + 136 + + + 114 + 668 + 689 + 1331 + 1458 + 1512 + + + 483 + 495 + + + 578 + 1020 + 1044 + 1371 + + + 702 + + + 227 + + + 292 + + + 438 + + + 119 + 800 + + + 473 + + + 185 + 202 + + + 257 + 264 + + + 134 + + + 440 + + + 76 + + + 655 + + + 379 + + + 302 + + + + + 55 + + + 141 + + + 96 + 107 + + + 81 + + + 351 + + + 46 + + + 76 + + + 452 + + + 104 + + + 84 + 165 + 397 + + + 71 + 78 + 84 + + + 57 + + + 77 + + + 44 + 173 + + + 59 + + + 100 + 121 + + + 140 + 234 + + + 89 + + + 61 + 476 + + + 28 + + + 507 + 564 + 1330 + 1340 + + + 127 + + + 118 + 130 + + + 193 + + + 214 + + + 296 + 307 + 318 + + + 74 + + + 43 + 51 + + + 76 + 136 + + + 46 + + + 186 + + + 153 + + + 79 + + + 333 + + + 103 + + + 91 + + + 708 + + + 224 + + + 267 + + + 268 + + + 103 + 132 + + + 39 + 78 + + + 149 + + + 88 + 117 + + + 76 + + + 83 + 122 + 129 + 260 + + + 147 + + + 154 + + + 257 + + + 49 + + + 53 + + + 42 + 75 + + + 121 + + + 44 + 59 + 137 + + + 48 + 91 + + + 81 + 197 + + + 140 + 184 + + + 209 + + + 77 + + + 82 + + + 78 + + + 319 + + + 65 + + + 131 + + + 95 + 111 + 125 + 291 + 306 + 323 + 331 + 339 + + + 72 + + + 103 + + + 88 + + + 99 + + + 181 + + + 53 + + + 66 + 84 + + + 56 + 62 + 71 + 81 + 87 + 96 + 102 + 112 + 117 + + + 756 + 779 + + + 124 + + + 96 + 402 + + + 131 + + + 133 + + + 84 + 145 + + + 44 + 176 + + + 63 + + + 219 + + + 336 + + + 93 + 440 + + + 55 + + + 87 + 264 + 404 + 515 + + + 62 + 175 + + + 83 + + + 82 + 97 + 107 + 157 + + + 203 + + + 136 + + + 124 + + + 86 + + + 161 + + + 375 + + + 79 + 382 + + + 241 + + + 86 + 101 + + + 473 + + + 62 + + + 64 + + + 70 + + + 50 + + + 61 + + + 195 + + + 44 + + + 381 + 411 + + + 87 + + + 126 + + + 128 + 562 + + + 397 + 1326 + + + 64 + + + 94 + + + 57 + 107 + + + 99 + + + 217 + + + 56 + + + 43 + + + 45 + + + 38 + 64 + 69 + 74 + + + 205 + + + 839 + 862 + + + 329 + + + 113 + + + 483 + 495 + + + 90 + + + 41 + + + 154 + + + 229 + + + 138 + + + 56 + + + 166 + + + 63 + 79 + + + 58 + + + 133 + + + 102 + + + 37 + + + 75 + 98 + + + 100 + + + 121 + + + 310 + 547 + + + 130 + 188 + + + 85 + + + 78 + 110 + + + 160 + 231 + 915 + + + 147 + + + 101 + + + 66 + 88 + + + 222 + + + 237 + 763 + 835 + + + 184 + + + 305 + + + 354 + + + 252 + + + 494 + + + 124 + 307 + + + 69 + 90 + 116 + + + 43 + 93 + 111 + 141 + 194 + 224 + + + 50 + 83 + 109 + + + 68 + 75 + 79 + + + 44 + 146 + 159 + + + 155 + 1169 + + + 401 + + + 46 + 53 + + + 200 + + + 46 + 53 + + + 255 + + + 79 + 89 + 99 + 127 + 137 + 147 + 366 + 384 + + + 61 + 73 + + + 110 + + + 66 + + + 29 + 38 + + + 144 + + + 266 + 295 + + + 353 + + + 209 + + + 123 + + + 365 + + + 311 + + + 41 + 70 + + + 184 + + + 155 + + + 40 + 51 + 81 + 86 + 91 + 96 + + + 69 + 425 + + + 55 + + + 59 + + + 68 + + + 77 + 105 + + + 168 + + + 85 + + + 90 + 392 + + + 130 + 165 + + + 59 + + + 130 + + + 56 + 86 + + + 73 + 134 + + + 369 + + + 205 + + + 68 + 85 + 99 + 178 + 186 + 203 + 211 + 219 + + + 120 + + + 93 + + + 189 + + + 87 + + + 509 + + + 128 + + + 61 + + + 228 + 337 + + + 228 + + + 110 + 122 + 228 + + + 194 + + + 86 + 118 + 197 + + + 596 + + + 121 + 195 + + + + + 87 + 105 + 110 + 333 + + + 34 + + + 183 + 213 + + + 300 + + + 1109 + 1166 + + + 158 + + + 32 + + + 92 + + + 135 + + + + + 3 + 5 + + + + + 550 + 617 + 685 + 714 + 958 + + + 153 + + + 358 + + + 413 + 497 + 583 + 872 + + + 416 + 447 + 484 + + + 203 + + + 381 + + + 703 + 726 + + + 277 + + + + + 19 + + + + + 38 + 100 + 285 + + + 41 + 42 + 63 + + + 35 + + + 43 + + + 45 + + + 36 + 37 + + + 69 + 87 + 104 + 121 + 141 + + + 38 + 39 + 40 + 54 + 61 + 68 + + + 123 + 126 + 129 + 132 + + + 38 + 39 + 48 + 49 + 50 + 58 + 59 + 60 + 67 + 68 + 69 + + + 35 + + + 46 + 60 + 61 + + + 41 + 43 + 50 + 67 + 68 + + + 43 + 44 + + + 29 + + + 45 + + + 40 + + + 36 + + + 53 + 61 + 69 + 77 + + + 39 + 40 + 41 + + + 29 + + + 44 + + + 43 + + + 43 + 44 + + + 35 + 36 + + + 33 + 264 + 291 + 318 + 1331 + + + 39 + 40 + + + 29 + + + 41 + 42 + 63 + + + 42 + + + 43 + 44 + + + 19 + + + 43 + 44 + + + 30 + + + 35 + 41 + 47 + 53 + 59 + 65 + 71 + 77 + 83 + 89 + 95 + 101 + 107 + 113 + 119 + 125 + 131 + 137 + 143 + + + 41 + 43 + 44 + 54 + 55 + 56 + + + 38 + 39 + 40 + + + 43 + + + 40 + 112 + 124 + 231 + 262 + 263 + + + 157 + 187 + 1031 + 1032 + 1033 + 1034 + 1037 + 1039 + 1042 + 1043 + 1059 + + + 36 + 37 + 38 + 44 + 45 + 46 + + + 35 + + + 43 + 44 + 53 + 54 + 63 + 64 + + + 35 + + + 37 + + + 36 + + + 41 + + + 45 + + + 23 + 24 + 25 + + + 338 + 488 + 489 + 490 + 491 + + + 44 + 52 + 60 + 68 + + + 42 + 43 + + + 37 + 38 + + + 39 + 56 + + + 45 + + + + + 37 + + + 101 + + + + + 27 + + + 26 + + + 23 + + + + + 115 + 443 + + + 1093 + 1128 + + + 176 + + + 178 + + + 60 + + + 203 + + + 565 + 596 + + + 136 + + + 96 + + + 207 + 847 + 860 + + + 289 + + + 72 + + + 349 + + + 716 + + + 65 + + + 465 + 671 + 705 + 914 + + + 82 + + + 56 + + + 302 + 310 + + + 64 + + + + + 69 + 95 + + + 71 + 97 + + + 217 + + + 220 + + + 28 + 94 + 100 + 137 + 164 + 201 + + + 90 + 184 + 238 + 259 + 311 + 340 + + + 34 + 90 + 123 + 134 + 144 + 154 + 168 + 180 + 194 + 209 + 225 + 236 + 249 + 270 + + + 280 + + + 28 + 30 + 32 + 141 + 293 + 304 + 315 + 331 + 370 + + + 75 + 110 + 121 + 132 + 154 + + + 71 + 97 + + + 354 + 358 + + + 229 + 1067 + 1202 + + + 525 + + + 69 + 95 + + + 69 + 95 + + + 61 + + + 208 + + + 94 + + + 69 + 95 + 276 + 296 + + + 69 + 95 + 261 + + + 82 + + + 51 + 58 + 88 + 94 + + + 44 + + + 1154 + + + 186 + 204 + 221 + 232 + 250 + 268 + 286 + 355 + 368 + 384 + + + 70 + 96 + + + 108 + + + 29 + 30 + + + 211 + + + 94 + 119 + 136 + + + 117 + + + 82 + 151 + + + 481 + + + 41 + 47 + 77 + 83 + 101 + 107 + 113 + 187 + 193 + + + 191 + 252 + + + 501 + + + 97 + + + 206 + 221 + + + 27 + + + 33 + 34 + 315 + + + 320 + 408 + 421 + 473 + 504 + 521 + 594 + 626 + 655 + 715 + 785 + 811 + 851 + 926 + 975 + 988 + 1065 + 1226 + + + 32 + 33 + + + 125 + + + 26 + + + 115 + 148 + 209 + 217 + 219 + 221 + 249 + + + 69 + 95 + + + 73 + 76 + + + 31 + + + 185 + + + 33 + + + 86 + + + 69 + 95 + + + 70 + + + 104 + 116 + 127 + 139 + 151 + 163 + 174 + 285 + + + 71 + 97 + + + 352 + 359 + + + 134 + + + 447 + 646 + + + 158 + 376 + 380 + + + 360 + 376 + + + 70 + 96 + + + 69 + 95 + + + 151 + 173 + + + 64 + + + 21 + 25 + 84 + 143 + 156 + + + 69 + 95 + 195 + + + 172 + + + 140 + + + 153 + + + 438 + + + 33 + + + 69 + 95 + 155 + + + 396 + 892 + 1320 + + + 380 + + + 29 + + + 50 + + + 25 + 33 + 34 + 83 + 84 + 126 + + + 121 + 123 + + + 70 + 96 + 156 + 169 + 176 + 304 + + + 259 + + + 90 + 183 + 198 + 230 + 268 + 291 + 309 + 327 + 354 + 377 + 398 + 419 + 445 + 466 + 488 + 532 + 550 + 586 + 593 + + + 69 + 95 + + + 216 + 416 + + + 33 + + + 1431 + + + 100 + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/src/com/nokia/helium/diamonds/tests/TestXMLMerger.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/src/com/nokia/helium/diamonds/tests/TestXMLMerger.java Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,191 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +package com.nokia.helium.diamonds.tests; + +import java.io.File; +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.FileReader; +import java.io.Reader; +import java.io.BufferedReader; +import java.io.IOException; +import com.nokia.helium.diamonds.XMLMerger; + +import org.junit.*; +import static org.junit.Assert.*; +import org.custommonkey.xmlunit.*; + +public class TestXMLMerger { + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + + private File createTextFile(String content) throws IOException { + File temp = File.createTempFile("merge", ".xml"); + temp.deleteOnExit(); + BufferedWriter output = new BufferedWriter(new FileWriter(temp)); + output.write(content); + output.close(); + return temp; + } + + /** + * Simple merge with empty source. + * The result should be the same as the merged content. + * @throws Exception + */ + @Test + public void test_simpleMergeNode() throws Exception { + File merge = createTextFile("\n"); + File toBeMerged = createTextFile("\n\n" + + "\n" + + "\n"+ + "text\n"+ + ""); + XMLMerger merger = new XMLMerger(merge); + merger.merge(toBeMerged); + DifferenceListener differenceListener = new IgnoreTextAndAttributeValuesDifferenceListener(); + Diff diff = new Diff(new ReaderNoSpaces(new FileReader(merge)), new ReaderNoSpaces(new FileReader(toBeMerged))); + diff.overrideDifferenceListener(differenceListener); + assertTrue("Test that 2 simple XML merge correctly " + diff, diff.similar()); + } + + /** + * Test the merging of twice the same content. + * Result should be similar to the source. + * @throws Exception + */ + @Test + public void test_mergeSameNode() throws Exception { + File merge = createTextFile("\n\n" + + "
    \n" + + "1\n" + + "
    \n" + + "
    "); + File toBeMerged = createTextFile("\n\n" + + "
    \n" + + "1\n" + + "
    \n" + + "
    "); + XMLMerger merger = new XMLMerger(merge); + merger.merge(toBeMerged); + DifferenceListener differenceListener = new IgnoreTextAndAttributeValuesDifferenceListener(); + Diff diff = new Diff(new ReaderNoSpaces(new FileReader(merge)), new ReaderNoSpaces(new FileReader(toBeMerged))); + diff.overrideDifferenceListener(differenceListener); + assertTrue("Test that identity " + diff, diff.similar()); + } + + /** + * Testing the merge of several files. + * @throws Exception + */ + @Test + public void test_mergeWithSubNodeAndAttribute() throws Exception { + File merge = createTextFile("\n"); + File toBeMerged1 = createTextFile("\n\n" + + "
    \n" + + "1\n" + + "
    \n" + + "
    "); + File toBeMerged2 = createTextFile("\n\n" + + "
    \n" + + "2\n" + + "
    \n" + + "
    "); + File toBeMerged3 = createTextFile("\n\n" + + "
    \n" + + "3\n" + + "
    \n" + + "
    "); + File toBeMerged4 = createTextFile("\n\n" + + "
    \n" + + "1\n" + + "
    \n" + + "
    "); + File expected = createTextFile("\n\n" + + "
    \n" + + "1\n" + + "2\n" + + "3\n" + + "1\n" + + "
    \n" + + "
    "); + XMLMerger merger = new XMLMerger(merge); + merger.merge(toBeMerged1); + merger.merge(toBeMerged2); + merger.merge(toBeMerged3); + merger.merge(toBeMerged4); + Diff diff = new Diff(new ReaderNoSpaces(new FileReader(merge)), new ReaderNoSpaces(new FileReader(expected))); + //System.out.println(readTextFile(merge.getAbsolutePath())); + assertTrue("test XML matches control skeleton XML " + diff, diff.similar()); + } + + /** + * Load file content into a string. + * @param fullPathFilename + * @return the file content as a string + * @throws IOException + */ + public static String readTextFile(String fullPathFilename) throws IOException { + StringBuffer sb = new StringBuffer(1024); + BufferedReader reader = new BufferedReader(new FileReader(fullPathFilename)); + + char[] chars = new char[1024]; + int numRead = 0; + while ( (numRead = reader.read(chars)) > -1) { + sb.append(String.valueOf(chars)); + } + + reader.close(); + + return sb.toString(); + } + + public class ReaderNoSpaces extends BufferedReader { + + private boolean skip = true; + public ReaderNoSpaces(Reader in) throws Exception { + super(in); + } + + public int read(char[] cbuf, int off, int len) throws IOException { + int rlen = super.read(cbuf, off, len); + if (rlen < 0) + return rlen; + int w = off; + for (int i = off ; i < off + rlen ; i++) { + char c = cbuf[i]; + if (c == '<') + skip = false; + if (c == '>') + skip = true; + if (!(skip && (c == '\n' || c == '\t'|| c == ' '))) { + cbuf[w++] = c; + } + } + return w - off; + } + + } +} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/apimetrics.xml.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/apimetrics.xml.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,50 @@ +<#-- +============================================================================ +Name : diamonds-api-metrics.xml.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> + <#if (doc)??> + + <@totalNoOfRelease type="sdk"/> + <@totalNoOfRelease type="domain"/> + <@totalNoOfRelease type="internal"/> + <@totalNoOfRelease type="private"/> + + <#list doc.api_dataset.api as illegal> + <#if illegal.release.@category == 'private'> + ${illegal.buildfiles.file.path} + + <#if illegal.release.@category == 'internal'> + ${illegal.buildfiles.file.path} + + + + + + +<#if (doc)?? > +<#macro totalNoOfRelease type> + <#assign count = 0> +<#list doc.api_dataset.api as apinode> + <#if apinode.release.@category == '${type}'> + <#assign count = count + 1> + + +${count} + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/build.xml.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/build.xml.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,32 @@ +<#-- +============================================================================ +Name : diamonds-build.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> + + ${ant["build.family"]} + ${ant["id"]} + <#if ant?keys?seq_contains("diamonds.start.time")>${ant["diamonds.start.time"]} + <#if ant?keys?seq_contains("diamonds.end.time")>${ant["diamonds.end.time"]} + ${ant["env.USERNAME"]} + ${ant["env.COMPUTERNAME"]} + ${ant["name"]} + ${ant["build.system"]} + <#if ant?keys?seq_contains("env.NUMBER_OF_PROCESSORS")>${ant["env.NUMBER_OF_PROCESSORS"]} + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/codescanner.xml.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/codescanner.xml.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,42 @@ + <#-- +============================================================================ +Name : diamonds-faults.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "header.ftl"> + + <#if (doc)?? > + <#--<@totalNoOfSeverity type="error"/>--> + <@totalNoOfSeverity type="high"/> + + +<#include "footer.ftl"> + +<#macro totalNoOfSeverity type> + <#assign count = 0> +<#if (doc)?? > +<#list doc["problemIndex/category/problem[@severity='${type}']/file"] as problem> + <#list problem?split("\n") as lineNo> + <#if lineNo?matches(".*[0-9].*")> + <#assign count = count + 1> + + + + +${count} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_finish.xml.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_finish.xml.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,26 @@ +<#-- +============================================================================ +Name : finish.xml.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "header.ftl"> + + <#if ant?keys?seq_contains("diamonds.end.time")>${ant["diamonds.end.time"]} + +<#include "footer.ftl"> \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_signal.xml.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_signal.xml.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,43 @@ +<#-- +============================================================================ +Name : finish.xml.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "header.ftl"> + + <#assign diamondsignalname = ""/> + <#assign diamondkeys = diamondSignal?keys> + <#list diamondkeys as diamondkey> + <#if diamondkey?contains("diamond.signal.name")> + <#list diamondSignal[diamondkey]?split(".") as signalname> + <#assign diamondsignalname = signalname/> + + + <#list diamondkeys as diamondkey> + <#if diamondkey?contains("${diamondsignalname}")> + <#if diamondkey?contains("diamond.signal.name.${diamondsignalname}")>${diamondSignal[diamondkey]} + <#if diamondkey?contains("diamond.error.message.${diamondsignalname}")>${diamondSignal[diamondkey]} + <#if diamondkey?contains("diamond.time.stamp.${diamondsignalname}")>${diamondSignal[diamondkey]} + + + + + + +<#include "footer.ftl"> \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_stage.xml.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_stage.xml.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ +<#-- +============================================================================ +Name : stage.xml.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "header.ftl"> + + + ${ant["logical.stage"]} + <#if ant?keys?seq_contains("stage.start.time")>${ant["stage.start.time"]} + <#if ant?keys?seq_contains("stage.end.time")>${ant["stage.end.time"]} + + +<#include "footer.ftl"> \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_start.xml.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_start.xml.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,25 @@ +<#-- +============================================================================ +Name : start.xml.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "header.ftl"> +<#include "build.xml.ftl"> +<#include "locations.ftl"> +<#include "footer.ftl"> diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_status.xml.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/diamonds_status.xml.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,26 @@ +<#-- +============================================================================ +Name : finish.xml.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "header.ftl"> + + <#if diamonds?keys?seq_contains("build.status")>${diamonds["build.status"]} + +<#include "footer.ftl"> \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/faults.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/faults.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,26 @@ +<#-- +============================================================================ +Name : faults.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "macro.ftl"> + <#if doc?? > + <@printall type='error'/> + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/footer.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/footer.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,22 @@ +<#-- +============================================================================ +Name : footer.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/header.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/header.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,25 @@ +<#-- +============================================================================ +Name : header.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "macro.ftl"> + + + ${schema_version} \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/locations.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/locations.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,45 @@ +<#-- +============================================================================ +Name : diamonds-locations.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> + + <#if ant?keys?seq_contains("release.grace.dir") && !(ant["release.grace.dir"]?contains("${"))> + + ${ant["release.grace.dir"]} + GRACE server + + + <#if ant?keys?seq_contains("publish.dir.list")> + <#list ant["publish.dir.list"]?split(",") as path> + <#if !path?contains("${")> + + ${path} + Shared drive + + + + + <#if (ant?keys?seq_contains("publish.dir") && !ant["publish.dir"]?contains("${"))> + + ${ant["publish.dir"]} + Shared drive + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/macro.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/macro.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,94 @@ +<#-- +============================================================================ +Name : diamonds-macro.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#macro numberof regex type> + <#assign count = 0> +<#if doc?? > + <#list doc.logSummary.log as lognode> + <#if lognode.@filename[0]?matches(regex)> + <#assign count = count + lognode.build[".//message[@priority='${type}']"]?size> + + + +${count} +<#macro printfaults regex type> + + +<#macro printcomponents regex> + +<#macro printall type> + <#if doc?? > + <#assign componentname=""> + <#assign components=""> + <#assign componenterrors = 0> + <#assign totalerrors = 0> + <#assign totalwarnings = 0> + <#assign componentwarnings = 0> + <#assign ls=doc.logSummary["//task/task/@name"]?sort> + + + <#list ls as task> + <#assign currenttask=task?parent> + <#assign parenttask=currenttask?parent> + <#assign currentcomponentname="${task}"> + <#if componentname == ""> + <#assign componentname="${task?parent.@name}"> + <#assign components="${componentname}"> + + <#if componentname != currentcomponentname> + + ${componentname} + ${componenterrors} + ${componentwarnings} + + <#assign componentname=currentcomponentname> + <#assign components= components + ",${componentname}"> + <#assign totalerrors = totalerrors + componenterrors> + <#assign totalwarnings = totalwarnings + componentwarnings> + <#assign componenterrors = 0> + <#assign componentwarnings = 0> + + <#assign componenterrors = componenterrors + currenttask[".//message[@priority='error']"]?size> + <#assign componentwarnings = componentwarnings + currenttask[".//message[@priority='warning']"]?size> + + + ${componentname} + ${componenterrors} + ${componentwarnings} + + + <#assign totalerrors = totalerrors + componenterrors> + <#assign totalwarnings = totalwarnings + componentwarnings> + ${totalerrors} + ${totalwarnings} + ${totalerrors} + + ${totalwarnings} + + + + <#list components?split(",") as component > + ${component} + + + + +<#assign schema_version=13/> \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/tool.xml.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/tool.xml.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,30 @@ +<#-- +============================================================================ +Name : diamonds-tool.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "header.ftl"> + + + SymSEE + ${ant["symsee.version"]} + + +<#include "footer.ftl"> + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/templates/validate-policy-log.xml.ftl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/templates/validate-policy-log.xml.ftl Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,32 @@ +<#-- +============================================================================ +Name : validate-policy-log.xml.ftl +Part of : Helium + +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. +This component and the accompanying materials are made available +under the terms of the License "Eclipse Public License v1.0" +which accompanies this distribution, and is available +at the URL "http://www.eclipse.org/legal/epl-v10.html". + +Initial Contributors: +Nokia Corporation - initial contribution. + +Contributors: + +Description: + +============================================================================ +--> +<#include "macro.ftl"> +<#include "header.ftl"> +${schema_version} + +<#if (doc)??!""?keys?seq_contains('validatePolicy')> +<#list doc['validatePolicy'].policyvalidation.error as error> + + + + +<#include "footer.ftl"> \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/diamonds/tests/test_diamonds.ant.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/diamonds/tests/test_diamonds.ant.xml Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,136 @@ + + + + Helium Antlib diamonds unittests. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${diamonds.build.id} + + + + + + + + + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/antdoclet/html/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/index.html Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,21 @@ + + + + + + Ant Tasks Documentation + + + + + + + + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/antdoclet/html/libindex.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/libindex.vm Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,38 @@ + + +## +## This is an Velocity template for generating an HTML index +## of the Ant "categories" (antlibs) +## +## Objects expected in context: +## +## $title - Project title (of type String) +## $antroot - (of type AntRoot) +## + + + $title Ant Libraries + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/antdoclet/html/main.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/main.vm Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,37 @@ +## +## This template is the entry point for calling other templates. +## The output of this template goes to stdout. +## +## Objects available in context: +## +## $velocity - Helper object for processing other templates (of type VelocityFacade) +## $antroot - Contains all the Ant tasks/types (of type AntRoot) +## $title - Project title (of type String) +## + +AntDoclet - Running project $title + +- Generating Task and Types documentation... +## +#foreach( $taskDoc in $antroot.getAll() ) ## + #if ( ! $taskDoc.isIgnored() ) + +- Processing $taskDoc.antName ## + $velocity.eval( "html/task.vm", "${taskDoc.getFullClassName()}.html" ) ## + #else ## +- Ignoring $taskDoc.fullClassName()## + #end ## +#end ## + + +- Generating Navigation indexes... +## Now, generate an "index" file for the categories, and one for each category +$velocity.eval( "html/libindex.vm", "libindex.html" ) +$velocity.eval( "html/overview.vm", "overview.html" ) +#foreach( $category in $antroot.getCategories() ) + $velocity.eval( "html/taskindex.vm", "index.${category}.html" ) +#end +#set($category = "all") +$velocity.eval( "html/taskindex.vm", "index.${category}.html" ) + +- Done diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/antdoclet/html/overview.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/overview.vm Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,19 @@ + + + + + $title + + + + + +

    $title - Ant Tasks Documentation

    + +

    This document is the Ant Tasks specification for the Helium build toolkit.

    + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/antdoclet/html/style.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/style.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,87 @@ + + +body { + font-family: verdana, arial,helvetica,sanserif; + font-size: 90%; +} + +h2 { + font-size: 110%; + text-align: left; +} + +div#navigation h2 { + text-align: left; + background-color: #CCCCFF; + font-variant: small-caps; + margin-bottom: 0; + padding-left: 5%; +} + +h3 { + font-size: 100%; + text-align: left; + background-color: #CCCCFF; + margin-bottom: 0; +} + +h4 { + font-size: 90%; + margin-top: 5%; +} + +div#navigation { + float: left; +} + +#navigation div.description { + margin-left: 5%; + font-size: small; +} + +div.description { + margin: 5%; + font-size: medium; +} + +pre { + border: solid 1px black; + background-color: #FFFFCC; + font-size: smaller; + font-family: monospace; +} + +code { + font-size: smaller; + font-family: monospace; +} + +table { + font-family: arial,helvetica,sanserif; + font-size: 80%; + margin: 5%; + padding: 0px; + +// border: solid 1px black; + border-spacing: 0px; + border-collapse: collapse; +} + +tr:first-child { + background-color: #DDDDFF; +} + +td { + margin: 0px; + padding: 2px; + border: solid 1px black; + border-spacing: 0px; + border-collapse: collapse; +} + + +.copyright { + color: #999999; + font-size: 60%; + text-align: center; +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/antdoclet/html/task.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/task.vm Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,144 @@ + + +## +## This is a Velocity template for generating an HTML +## document describing an Ant Task/Type +## +## Objects expected in context: +## +## $taskDoc - Describes an Ant Task/Type (of type AntDoc) +## +## + + + <$taskDoc.getAntName()> + + + + + +

    <$!taskDoc.getAntCategory() : $taskDoc.getAntName()>

    + +

    Description

    +
    + $taskDoc.getComment() +
    + +

    Parameters

    + + + + + + + + + +#foreach ($attr in $taskDoc.attributes ) + + + + + + + + + + +#end +
    AttributeDescriptionTypeRequired?
    $attr + $taskDoc.getAttributeComment($attr) + + $taskDoc.getAttributeType($attr) + + + #if( $taskDoc.getAttributeRequired($attr) ) + Yes $taskDoc.getAttributeRequired($attr) + #elseif ( $taskDoc.getAttributeNotRequired($attr) ) + No $taskDoc.getAttributeNotRequired($attr) + #else ? + #end +
    + +

    Parameters accepted as nested elements

    + +
    +#if ($taskDoc.isTaskContainer()) +

    This Task is a Container (it accepts nested Tasks).

    +#end + +#if ($taskDoc.supportsCharacters()) +

    This Task accepts text in its element body.

    +#end + +#foreach ($element in $taskDoc.getNestedElements()) + + #set($elementDoc = $taskDoc.getElementDoc($element)) + +

    + #### + #### Put a link for those types that are in this javadoc run + #### and have nested elements (since nested-nested elements + #### is the only info we are not showing for each nested element) + #### + #if( $elementDoc.sourceIncluded() && ($elementDoc.getNestedElements().hasMoreElements() || $elementDoc.isTagged())) + + <$element> ... + + #else + <$element> + + #if ( ! $elementDoc.sourceIncluded() ) + (Of type ${elementDoc.getAntName()} ) + #end + #end +

    + + #if($elementDoc.getComment()) + $elementDoc.getComment() + #end + + + + + + + + + + #foreach ($elementAttr in $elementDoc.getAttributes()) + + + + + + + + + + #end +
    AttributeDescriptionTypeRequired
    $elementAttr +### #if($elementDoc.getAttributeComment($elementAttr)) + $!elementDoc.getAttributeComment($elementAttr) +### #end + + $elementDoc.getAttributeType($elementAttr) + + + #if($elementDoc.getAttributeRequired($elementAttr)) + Yes $elementDoc.getAttributeRequired($elementAttr) + #elseif ( $elementDoc.getAttributeNotRequired($elementAttr) ) + No $elementDoc.getAttributeNotRequired($elementAttr) + #else ? + #end + +
    +#end +
    +
    +
    + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/antdoclet/html/taskindex.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/antdoclet/html/taskindex.vm Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,65 @@ + + +## +## This is an Velocity template for generating an HTML index +## of the Ant Task/Types +## +## Objects expected in context: +## +## $title - Project title (of type String) +## $antroot - (of type AntRoot) +## + + + $title Ant Tasks + + + + + + + + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/src/build.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/src/build.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,102 @@ +====================== +Building Helium Antlib +====================== + +Prerequisite +------------ + +Before using bld commands please make sure your *JAVA_HOME* environment variable is pointing to the required JDK. + + +Building +-------- + +Simply run the following command on the route of your delivery: + +:: + + > bld build + Buildfile: build.xml + + build: + + compile: + [echo] Compiling helium-core + [mkdir] Created dir: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\core\classes + [javac] Compiling 25 source files to C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\core\classes + [javac] Note: Some input files use unchecked or unsafe operations. + [javac] Note: Recompile with -Xlint:unchecked for details. + + ... + + build: + [echo] helium-signaling is built. + + BUILD SUCCESSFUL + Total time: 6 seconds + +Cleaning +-------- + +To cleanup the generated files just run: + +:: + + > bld clean + Buildfile: build.xml + + clean: + + clean: + [echo] Cleaning helium-core + [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\core\classes + [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-core.jar + + clean: + [echo] Cleaning helium-diamonds + [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\diamonds\classes + [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-diamonds.jar + + clean: + [echo] Cleaning helium-metadata + [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\metadata\classes + [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-metadata.jar + + clean: + [echo] Cleaning helium-quality + [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\quality\classes + [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-quality.jar + + clean: + [echo] Cleaning helium-scm + [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\scm\classes + [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-scm.jar + + clean: + [echo] Cleaning helium-signaling + [delete] Deleting directory C:\development\workspace\helium-antlib-dragonfly-trunk\sf\build\signaling\classes + [delete] Deleting: C:\development\workspace\helium-antlib-dragonfly-trunk\sf\bin\helium-signaling.jar + + BUILD SUCCESSFUL + Total time: 1 second + +Testing +------- + +To run all the testing (junit + antunit): + +:: + + > bld test + + +JUnit testing: +:: + + > bld junit + +AntUnit testing: +:: + + > bld unittest + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/src/conf.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/src/conf.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +#============================================================================ +#Name : ant.py +#Part of : Helium Antlib + +#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +#All rights reserved. +#This component and the accompanying materials are made available +#under the terms of the License "Eclipse Public License v1.0" +#which accompanies this distribution, and is available +#at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +#Initial Contributors: +#Nokia Corporation - initial contribution. +# +#Contributors: +# +#Description: +#=============================================================================== +# +# Helium Documentation documentation build configuration file, created by +# sphinx-quickstart on Fri May 09 09:49:44 2008. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# The contents of this file are pickled, so don't put values in the namespace +# that aren't pickleable (module imports are okay, they're removed automatically). +# +# All configuration values have a default value; values that are commented out +# serve to show the default value. + +import sys, os + +# If your extensions are in another directory, add it here. If the directory +# is relative to the documentation root, use os.path.abspath to make it +# absolute, like shown here. +#sys.path.append(os.path.abspath('some/directory')) + +# General configuration +# --------------------- + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +#extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['.templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General substitutions. +project = 'Helium Antlib' +copyright = '2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html' + +# The default replacements for |version| and |release|, also used in various +# other places throughout the built documents. +# +# The short X.Y version. +version = '0.23' +# The full version, including alpha/beta/rc tags. +release = '0.23' + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +today_fmt = '%B %d, %Y' + +# List of documents that shouldn't be included in the build. +#unused_docs = [] + +# List of directories, relative to source directories, that shouldn't be searched +# for source files. +#exclude_dirs = [] + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + + +# Options for HTML output +# ----------------------- + +# The style sheet to use for HTML and HTML Help pages. A file of that name +# must exist either in Sphinx' static/ path, or in one of the custom paths +# given in html_static_path. +html_style = 'default.css' + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# The name of an image file (within the static path) to place at the top of +# the sidebar. +html_logo = 'images/helium_logo_small.jpg' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['.static', 'images'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +html_use_modindex = False + +# If true, the reST sources are included in the HTML build as _sources/. +#html_copy_source = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = '' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Helium Antlib doc' + + +# Options for LaTeX output +# ------------------------ + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, document class [howto/manual]). +latex_documents = [ + ('index', 'Helium.tex', 'Helium Antlib Documentation', 'The Helium Team', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_use_modindex = True diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/src/images/helium_logo_large.jpg Binary file buildframework/helium/external/helium-antlib/doc/src/images/helium_logo_large.jpg has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/src/images/helium_logo_small.jpg Binary file buildframework/helium/external/helium-antlib/doc/src/images/helium_logo_small.jpg has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/src/index.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/src/index.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,20 @@ +============= +Helium Antlib +============= +.. _Helium Antlib Java API: api/javadoc/index.html +.. _Helium Antlib AntDoclet: api/doclet/index.html + +Developer Documentation +======================= +.. toctree:: + :maxdepth: 1 + + structure + build + + +Documentation +============= + * `Helium Antlib AntDoclet`_ + * `Helium Antlib Java API`_ + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/src/structure.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/src/structure.rst Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,146 @@ +============================== +Project Development guidelines +============================== + + +Helium Antlib is a standalone project which is completely independent from Helium. Its only main requirements are: + * Ant 1.7.0 + * JDK 1.6 or newer + +The project is split in several sub-modules which cover specific features. + +Anatomy of the project +====================== + +:: + + - build.xml + - bld.bat + - bld.sh + + antlibs + Ant specific dependencies needed to execute ant properly + e.g: Java checkstyle, Code coverage tools + The jar in that folder will not be used as compilation dependencies + + lib + Common dependencies between modules. + e.g: common logging, ... + + doc + General documentation of the project + + module1 + + module1 + + modulen... + + +Anatomy of a module +=================== + +A module contains a set of Ant feature related to a specific domain (e.g: Diamonds, SCM). The following diagram shows +the physical structure of a module. + +:: + + + + - build.xml + - bld.bat + - bld.sh + + lib + module specific jar dependencies + + src + + com + + nokia + + helium + + + + ant + + taskdefs + source of the Ant tasks + + types + source of the Ant DataType + + listener + source of the Ant Listener + + condition + source of the Ant Conditions + + tests + - build.xml + - bld.bat + - bld.sh + - test_xxx.ant.xml* - Unittest implemented using AntUnit + + data + data used for the the unittests. + + src + + com + + nokia + + helium + + + + tests + source of junit unittests. + + + +General guidelines +================== + +Distribution policy +------------------- + +Each directory of the Antlib project must have a Distribution.policy.S60 file with the policy value 7 (see S60 guidelines). + + + +External dependencies +--------------------- + +External dependencies added to the project must be in compliance with Nokia process and rules. + + +Source code license +------------------- +Each file added to the project should include the following license header. +:: + + /* + * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the License "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +Documentation +------------- + +All classes and methods must be documented. Ant facade classes (like Task or DataType) +must be Antdoclet documented (preferably with usage example). + +You can find more information on how to document Ant task using the Antdoclet plugin on http://antdoclet.neuroning.com/. + +Logging +------- + +Developer must use standard Ant logging for any user log output. +Internal debug logging must be implemented using Log4J framework. + +This is an example on how to use logging: +:: + + import org.apache.log4j.Logger; + + class MyClass extends Task { + private static Logger log = Logger.getLogger(MyClass.class); + + public void execute() { + log("Executing..."); + log.debug("some useful debug information."); + } + } + + +Please find more information on Log4J from the online manual: http://logging.apache.org/log4j/1.2/manual.html. diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Jinja-1.2-py2.5-win32.egg Binary file buildframework/helium/external/helium-antlib/doc/tools/Jinja-1.2-py2.5-win32.egg has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Pygments-0.10-py2.5.egg Binary file buildframework/helium/external/helium-antlib/doc/tools/Pygments-0.10-py2.5.egg has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/PKG-INFO --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/PKG-INFO Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,45 @@ +Metadata-Version: 1.0 +Name: Sphinx +Version: 0.5.1 +Summary: Python documentation generator +Home-page: http://sphinx.pocoo.org/ +Author: Georg Brandl +Author-email: georg@python.org +License: BSD +Download-URL: http://pypi.python.org/pypi/Sphinx +Description: + Sphinx is a tool that makes it easy to create intelligent and beautiful + documentation for Python projects (or other documents consisting of + multiple reStructuredText sources), written by Georg Brandl. + It was originally created to translate the new Python documentation, + but has now been cleaned up in the hope that it will be useful to many + other projects. + + Sphinx uses reStructuredText as its markup language, and many of its strengths + come from the power and straightforwardness of reStructuredText and its + parsing and translating suite, the Docutils. + + Although it is still under constant development, the following features + are already present, work fine and can be seen "in action" in the Python docs: + + * Output formats: HTML (including Windows HTML Help), plain text and LaTeX, + for printable PDF versions + * Extensive cross-references: semantic markup and automatic links + for functions, classes, glossary terms and similar pieces of information + * Hierarchical structure: easy definition of a document tree, with automatic + links to siblings, parents and children + * Automatic indices: general index as well as a module index + * Code handling: automatic highlighting using the Pygments highlighter + * Various extensions are available, e.g. for automatic testing of snippets + and inclusion of appropriately formatted docstrings. + +Platform: any +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Console +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Documentation +Classifier: Topic :: Utilities diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/SOURCES.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/SOURCES.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,216 @@ +AUTHORS +CHANGES +EXAMPLES +LICENSE +MANIFEST.in +Makefile +README +TODO +babel.cfg +ez_setup.py +setup.cfg +setup.py +sphinx-build.py +sphinx-quickstart.py +Sphinx.egg-info/PKG-INFO +Sphinx.egg-info/SOURCES.txt +Sphinx.egg-info/dependency_links.txt +Sphinx.egg-info/entry_points.txt +Sphinx.egg-info/not-zip-safe +Sphinx.egg-info/requires.txt +Sphinx.egg-info/top_level.txt +doc/Makefile +doc/builders.rst +doc/changes.rst +doc/concepts.rst +doc/conf.py +doc/config.rst +doc/contents.rst +doc/examples.rst +doc/extensions.rst +doc/glossary.rst +doc/intro.rst +doc/rest.rst +doc/templating.rst +doc/_static/sphinx.png +doc/_templates/index.html +doc/_templates/indexsidebar.html +doc/_templates/layout.html +doc/ext/appapi.rst +doc/ext/autodoc.rst +doc/ext/builderapi.rst +doc/ext/coverage.rst +doc/ext/doctest.rst +doc/ext/ifconfig.rst +doc/ext/intersphinx.rst +doc/ext/math.rst +doc/ext/refcounting.rst +doc/ext/todo.rst +doc/markup/code.rst +doc/markup/desc.rst +doc/markup/index.rst +doc/markup/inline.rst +doc/markup/misc.rst +doc/markup/para.rst +sphinx/__init__.py +sphinx/_jinja.py +sphinx/addnodes.py +sphinx/application.py +sphinx/builder.py +sphinx/cmdline.py +sphinx/config.py +sphinx/environment.py +sphinx/highlighting.py +sphinx/htmlhelp.py +sphinx/htmlwriter.py +sphinx/latexwriter.py +sphinx/linkcheck.py +sphinx/quickstart.py +sphinx/roles.py +sphinx/search.py +sphinx/setup_command.py +sphinx/textwriter.py +sphinx/directives/__init__.py +sphinx/directives/code.py +sphinx/directives/desc.py +sphinx/directives/other.py +sphinx/ext/__init__.py +sphinx/ext/autodoc.py +sphinx/ext/coverage.py +sphinx/ext/doctest.py +sphinx/ext/ifconfig.py +sphinx/ext/intersphinx.py +sphinx/ext/jsmath.py +sphinx/ext/mathbase.py +sphinx/ext/pngmath.py +sphinx/ext/refcounting.py +sphinx/ext/todo.py +sphinx/locale/__init__.py +sphinx/locale/__init__.pyc +sphinx/locale/sphinx.pot +sphinx/locale/cs/LC_MESSAGES/sphinx.js +sphinx/locale/cs/LC_MESSAGES/sphinx.mo +sphinx/locale/cs/LC_MESSAGES/sphinx.po +sphinx/locale/de/LC_MESSAGES/sphinx.js +sphinx/locale/de/LC_MESSAGES/sphinx.mo +sphinx/locale/de/LC_MESSAGES/sphinx.po +sphinx/locale/es/LC_MESSAGES/sphinx.js +sphinx/locale/es/LC_MESSAGES/sphinx.mo +sphinx/locale/es/LC_MESSAGES/sphinx.po +sphinx/locale/fr/LC_MESSAGES/sphinx.js +sphinx/locale/fr/LC_MESSAGES/sphinx.mo +sphinx/locale/fr/LC_MESSAGES/sphinx.po +sphinx/locale/ja/LC_MESSAGES/sphinx.js +sphinx/locale/ja/LC_MESSAGES/sphinx.mo +sphinx/locale/ja/LC_MESSAGES/sphinx.po +sphinx/locale/nl/LC_MESSAGES/sphinx.js +sphinx/locale/nl/LC_MESSAGES/sphinx.mo +sphinx/locale/nl/LC_MESSAGES/sphinx.po +sphinx/locale/pl/LC_MESSAGES/sphinx.js +sphinx/locale/pl/LC_MESSAGES/sphinx.mo +sphinx/locale/pl/LC_MESSAGES/sphinx.po +sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js +sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +sphinx/locale/sl/LC_MESSAGES/sphinx.js +sphinx/locale/sl/LC_MESSAGES/sphinx.mo +sphinx/locale/sl/LC_MESSAGES/sphinx.po +sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js +sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +sphinx/static/contents.png +sphinx/static/default.css +sphinx/static/doctools.js +sphinx/static/file.png +sphinx/static/jquery.js +sphinx/static/minus.png +sphinx/static/navigation.png +sphinx/static/plus.png +sphinx/static/rightsidebar.css +sphinx/static/searchtools.js +sphinx/static/sphinxdoc.css +sphinx/static/stickysidebar.css +sphinx/static/traditional.css +sphinx/templates/defindex.html +sphinx/templates/genindex-single.html +sphinx/templates/genindex-split.html +sphinx/templates/genindex.html +sphinx/templates/layout.html +sphinx/templates/modindex.html +sphinx/templates/opensearch.xml +sphinx/templates/page.html +sphinx/templates/search.html +sphinx/templates/changes/frameset.html +sphinx/templates/changes/rstsource.html +sphinx/templates/changes/versionchanges.html +sphinx/texinputs/Makefile +sphinx/texinputs/fncychap.sty +sphinx/texinputs/howto.cls +sphinx/texinputs/manual.cls +sphinx/texinputs/python.ist +sphinx/texinputs/sphinx.sty +sphinx/texinputs/tabulary.sty +sphinx/util/__init__.py +sphinx/util/compat.py +sphinx/util/console.py +sphinx/util/jsdump.py +sphinx/util/png.py +sphinx/util/smartypants.py +sphinx/util/stemmer.py +sphinx/util/texescape.py +tests/path.py +tests/path.pyc +tests/run.py +tests/test_application.py +tests/test_application.pyc +tests/test_autodoc.py +tests/test_autodoc.pyc +tests/test_build.py +tests/test_build.pyc +tests/test_config.py +tests/test_config.pyc +tests/test_coverage.py +tests/test_coverage.pyc +tests/test_env.py +tests/test_env.pyc +tests/test_i18n.py +tests/test_i18n.pyc +tests/test_markup.py +tests/test_markup.pyc +tests/test_quickstart.py +tests/test_quickstart.pyc +tests/util.py +tests/util.pyc +tests/etree13/ElementPath.py +tests/etree13/ElementPath.pyc +tests/etree13/ElementTree.py +tests/etree13/ElementTree.pyc +tests/etree13/HTMLTreeBuilder.py +tests/etree13/__init__.py +tests/etree13/__init__.pyc +tests/root/Makefile +tests/root/autodoc.txt +tests/root/conf.py +tests/root/contents.txt +tests/root/desc.txt +tests/root/ext.py +tests/root/ext.pyc +tests/root/images.txt +tests/root/img.gif +tests/root/img.pdf +tests/root/img.png +tests/root/includes.txt +tests/root/literal.inc +tests/root/markup.txt +tests/root/math.txt +tests/root/wrongenc.inc +tests/root/_static/README +tests/root/_templates/layout.html +tests/root/special/api.h +tests/root/subdir/images.txt +tests/root/subdir/img.png +tests/root/subdir/include.inc +tests/root/subdir/simg.png +utils/check_sources.py +utils/pylintrc +utils/reindent.py \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/dependency_links.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/dependency_links.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1 @@ + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/entry_points.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/entry_points.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,7 @@ +[console_scripts] +sphinx-build = sphinx:main +sphinx-quickstart = sphinx.quickstart:main + +[distutils.commands] +build_sphinx = sphinx.setup_command:BuildDoc + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/not-zip-safe --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/not-zip-safe Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1 @@ + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/requires.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/requires.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,3 @@ +Pygments>=0.8 +Jinja>=1.1 +docutils>=0.4 \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/top_level.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/EGG-INFO/top_level.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1 @@ +sphinx diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/__init__.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +""" + Sphinx + ~~~~~~ + + The Sphinx documentation toolchain. + + :copyright: 2007-2008 by Georg Brandl. + :license: BSD. +""" + +import sys + +__revision__ = '$Revision$' +__version__ = '0.5.1' +__released__ = '0.5.1' + + +def main(argv=sys.argv): + if sys.version_info[:3] < (2, 4, 0): + print >>sys.stderr, \ + 'Error: Sphinx requires at least Python 2.4 to run.' + return 1 + + try: + from sphinx import cmdline + except ImportError, err: + errstr = str(err) + if errstr.lower().startswith('no module named'): + whichmod = errstr[16:] + if whichmod.startswith('docutils'): + whichmod = 'Docutils library' + elif whichmod.startswith('jinja'): + whichmod = 'Jinja library' + elif whichmod == 'roman': + whichmod = 'roman module (which is distributed with Docutils)' + else: + whichmod += ' module' + print >>sys.stderr, \ + 'Error: The %s cannot be found. Did you install Sphinx '\ + 'and its dependencies correctly?' % whichmod + return 1 + raise + return cmdline.main(argv) + + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/_jinja.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/_jinja.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +""" + sphinx._jinja + ~~~~~~~~~~~~~ + + Jinja glue. + + :copyright: 2007-2008 by Georg Brandl, Horst Gutmann. + :license: BSD. +""" + +import codecs +from os import path + +from sphinx.util import mtimes_of_files +from sphinx.application import TemplateBridge + +from jinja import Environment +from jinja.loaders import BaseLoader +from jinja.exceptions import TemplateNotFound + + +def babel_extract(fileobj, keywords, comment_tags, options): + """ + Simple extractor to get some basic Babel support. + """ + env = Environment() + for lineno, sg, pl in env.get_translations_for_string(fileobj.read()): + yield lineno, None, (sg, pl), '' + + +class SphinxFileSystemLoader(BaseLoader): + """ + A loader that loads templates either relative to one of a list of given + paths, or from an absolute path. + """ + + def __init__(self, basepath, extpaths): + self.basepath = path.abspath(basepath) + self.extpaths = map(path.abspath, extpaths) + self.searchpaths = self.extpaths + [self.basepath] + + def get_source(self, environment, name, parent): + name = name.replace('/', path.sep) + if name.startswith('!'): + name = name[1:] + if not path.exists(path.join(self.basepath, name)): + raise TemplateNotFound(name) + filename = path.join(self.basepath, name) + elif path.isabs(name): + if not path.exists(name): + raise TemplateNotFound(name) + filename = name + else: + for searchpath in self.searchpaths: + if path.exists(path.join(searchpath, name)): + filename = path.join(searchpath, name) + break + else: + raise TemplateNotFound(name) + f = codecs.open(filename, 'r', environment.template_charset) + try: + return f.read() + finally: + f.close() + + +class TranslatorEnvironment(Environment): + class _Translator(object): + def __init__(self, translator): + self.trans = translator + + def gettext(self, string): + return self.trans.ugettext(string) + + def ngettext(self, singular, plural, n): + return self.trans.ungettext(singular, plural, n) + + def __init__(self, *args, **kwargs): + self.translator = kwargs['translator'] + del kwargs['translator'] + super(TranslatorEnvironment, self).__init__(*args, **kwargs) + + def get_translator(self, context): + return TranslatorEnvironment._Translator(self.translator) + + +class BuiltinTemplates(TemplateBridge): + def init(self, builder): + self.templates = {} + base_templates_path = path.join(path.dirname(__file__), 'templates') + ext_templates_path = [path.join(builder.confdir, dir) + for dir in builder.config.templates_path] + self.templates_path = [base_templates_path] + ext_templates_path + loader = SphinxFileSystemLoader(base_templates_path, ext_templates_path) + if builder.translator is not None: + self.jinja_env = TranslatorEnvironment(loader=loader, + friendly_traceback=False, translator=builder.translator) + else: + self.jinja_env = Environment(loader=loader, + # disable traceback, more likely that something + # in the application is broken than in the templates + friendly_traceback=False) + + def newest_template_mtime(self): + return max(mtimes_of_files(self.templates_path, '.html')) + + def render(self, template, context): + if template in self.templates: + return self.templates[template].render(context) + templateobj = self.templates[template] = \ + self.jinja_env.get_template(template) + return templateobj.render(context) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/addnodes.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/addnodes.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +""" + sphinx.addnodes + ~~~~~~~~~~~~~~~ + + Additional docutils nodes. + + :copyright: 2007-2008 by Georg Brandl. + :license: BSD. +""" + +from docutils import nodes + +# index markup +class index(nodes.Invisible, nodes.Inline, nodes.TextElement): pass + +# description units (classdesc, funcdesc etc.) + +# parent node for signature and content +class desc(nodes.Admonition, nodes.Element): pass + +# additional name parts (module name, class name) +class desc_addname(nodes.Part, nodes.Inline, nodes.TextElement): pass +# compatibility alias +desc_classname = desc_addname +# return type (C); object type, e.g. -> annotation (Python) +class desc_type(nodes.Part, nodes.Inline, nodes.TextElement): pass +# main name of object +class desc_name(nodes.Part, nodes.Inline, nodes.TextElement): pass +# argument list +class desc_signature(nodes.Part, nodes.Inline, nodes.TextElement): pass +class desc_parameterlist(nodes.Part, nodes.Inline, nodes.TextElement): + child_text_separator = ', ' +class desc_parameter(nodes.Part, nodes.Inline, nodes.TextElement): pass +class desc_optional(nodes.Part, nodes.Inline, nodes.TextElement): + child_text_separator = ', ' + def astext(self): + return '[' + nodes.TextElement.astext(self) + ']' +# annotation (not Python 3-style annotations) +class desc_annotation(nodes.Part, nodes.Inline, nodes.TextElement): pass + +# node for content +class desc_content(nodes.General, nodes.Element): pass + +# \versionadded, \versionchanged, \deprecated +class versionmodified(nodes.Admonition, nodes.TextElement): pass + +# seealso +class seealso(nodes.Admonition, nodes.Element): pass + +# productionlist +class productionlist(nodes.Admonition, nodes.Element): pass +class production(nodes.Part, nodes.Inline, nodes.TextElement): pass + +# toc tree +class toctree(nodes.General, nodes.Element): pass + +# centered +class centered(nodes.Part, nodes.Element): pass + +# pending xref +class pending_xref(nodes.Element): pass + +# compact paragraph -- never makes a

    +class compact_paragraph(nodes.paragraph): pass + +# for the ACKS list +class acks(nodes.Element): pass + +# sets the highlighting language for literal blocks +class highlightlang(nodes.Element): pass + +# like emphasis, but doesn't apply further text processors, e.g. smartypants +class literal_emphasis(nodes.emphasis): pass + +# glossary +class glossary(nodes.Element): pass + +# module declaration +class module(nodes.Element): pass + +# start of a file, used in the LaTeX builder only +class start_of_file(nodes.Element): pass + +# tabular column specification, used for the LaTeX writer +class tabular_col_spec(nodes.Element): pass + +# meta directive -- same as docutils' standard meta node, but pickleable +class meta(nodes.Special, nodes.PreBibliographic, nodes.Element): pass + +# make them known to docutils. this is needed, because the HTML writer +# will choke at some point if these are not added +nodes._add_node_class_names("""index desc desc_content desc_signature desc_type + desc_addname desc_name desc_parameterlist desc_parameter desc_optional + centered versionmodified seealso productionlist production toctree + pending_xref compact_paragraph highlightlang literal_emphasis + glossary acks module start_of_file tabular_col_spec meta""".split()) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/application.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/application.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,325 @@ +# -*- coding: utf-8 -*- +""" + sphinx.application + ~~~~~~~~~~~~~~~~~~ + + Sphinx application object. + + Gracefully adapted from the TextPress system by Armin. + + + :copyright: 2008 by Georg Brandl, Armin Ronacher. + :license: BSD. +""" + +import sys +import posixpath +from cStringIO import StringIO + +from docutils import nodes +from docutils.parsers.rst import directives, roles + +import sphinx +from sphinx.roles import xfileref_role, innernodetypes +from sphinx.config import Config +from sphinx.builder import builtin_builders, StandaloneHTMLBuilder +from sphinx.directives import desc_directive, target_directive, additional_xref_types +from sphinx.environment import SphinxStandaloneReader +from sphinx.util.console import bold + + +class SphinxError(Exception): + """ + Base class for Sphinx errors that are shown to the user in a nicer + way than normal exceptions. + """ + category = 'Sphinx error' + +class ExtensionError(SphinxError): + """Raised if something's wrong with the configuration.""" + category = 'Extension error' + + def __init__(self, message, orig_exc=None): + super(ExtensionError, self).__init__(message) + self.orig_exc = orig_exc + + def __repr__(self): + if self.orig_exc: + return '%s(%r, %r)' % (self.__class__.__name__, + self.message, self.orig_exc) + return '%s(%r)' % (self.__class__.__name__, self.message) + + def __str__(self): + parent_str = super(ExtensionError, self).__str__() + if self.orig_exc: + return '%s (exception: %s)' % (parent_str, self.orig_exc) + return parent_str + + +# List of all known core events. Maps name to arguments description. +events = { + 'builder-inited': '', + 'env-purge-doc': 'env, docname', + 'source-read': 'docname, source text', + 'doctree-read': 'the doctree before being pickled', + 'missing-reference': 'env, node, contnode', + 'doctree-resolved': 'doctree, docname', + 'env-updated': 'env', + 'html-page-context': 'pagename, context, doctree or None', + 'build-finished': 'exception', +} + +CONFIG_FILENAME = 'conf.py' + +class Sphinx(object): + + def __init__(self, srcdir, confdir, outdir, doctreedir, buildername, + confoverrides, status, warning=sys.stderr, freshenv=False): + self.next_listener_id = 0 + self._listeners = {} + self.builderclasses = builtin_builders.copy() + self.builder = None + + self.srcdir = srcdir + self.confdir = confdir + self.outdir = outdir + self.doctreedir = doctreedir + + if status is None: + self._status = StringIO() + self.quiet = True + else: + self._status = status + self.quiet = False + if warning is None: + self._warning = StringIO() + else: + self._warning = warning + self._warncount = 0 + + self._events = events.copy() + + # status code for command-line application + self.statuscode = 0 + + # read config + self.config = Config(confdir, CONFIG_FILENAME, confoverrides) + + # load all extension modules + for extension in self.config.extensions: + self.setup_extension(extension) + # the config file itself can be an extension + if self.config.setup: + self.config.setup(self) + + # now that we know all config values, collect them from conf.py + self.config.init_values() + + if buildername is None: + print >>status, 'No builder selected, using default: html' + buildername = 'html' + if buildername not in self.builderclasses: + raise SphinxError('Builder name %s not registered' % buildername) + + self.info(bold('Sphinx v%s, building %s' % (sphinx.__released__, + buildername))) + + builderclass = self.builderclasses[buildername] + self.builder = builderclass(self, freshenv=freshenv) + self.emit('builder-inited') + + def build(self, all_files, filenames): + try: + if all_files: + self.builder.build_all() + elif filenames: + self.builder.build_specific(filenames) + else: + self.builder.build_update() + except Exception, err: + self.emit('build-finished', err) + raise + else: + self.emit('build-finished', None) + + def warn(self, message): + self._warncount += 1 + try: + self._warning.write('WARNING: %s\n' % message) + except UnicodeEncodeError: + encoding = getattr(self._warning, 'encoding', 'ascii') + self._warning.write(('WARNING: %s\n' % message).encode(encoding, 'replace')) + + def info(self, message='', nonl=False): + try: + self._status.write(message) + except UnicodeEncodeError: + encoding = getattr(self._status, 'encoding', 'ascii') + self._status.write(message.encode(encoding, 'replace')) + if not nonl: + self._status.write('\n') + self._status.flush() + + # general extensibility interface + + def setup_extension(self, extension): + """Import and setup a Sphinx extension module.""" + try: + mod = __import__(extension, None, None, ['setup']) + except ImportError, err: + raise ExtensionError('Could not import extension %s' % extension, err) + if hasattr(mod, 'setup'): + mod.setup(self) + + def import_object(self, objname, source=None): + """Import an object from a 'module.name' string.""" + try: + module, name = objname.rsplit('.', 1) + except ValueError, err: + raise ExtensionError('Invalid full object name %s' % objname + + (source and ' (needed for %s)' % source or ''), err) + try: + return getattr(__import__(module, None, None, [name]), name) + except ImportError, err: + raise ExtensionError('Could not import %s' % module + + (source and ' (needed for %s)' % source or ''), err) + except AttributeError, err: + raise ExtensionError('Could not find %s' % objname + + (source and ' (needed for %s)' % source or ''), err) + + # event interface + + def _validate_event(self, event): + event = intern(event) + if event not in self._events: + raise ExtensionError('Unknown event name: %s' % event) + + def connect(self, event, callback): + self._validate_event(event) + listener_id = self.next_listener_id + if event not in self._listeners: + self._listeners[event] = {listener_id: callback} + else: + self._listeners[event][listener_id] = callback + self.next_listener_id += 1 + return listener_id + + def disconnect(self, listener_id): + for event in self._listeners.itervalues(): + event.pop(listener_id, None) + + def emit(self, event, *args): + result = [] + if event in self._listeners: + for _, callback in self._listeners[event].iteritems(): + result.append(callback(self, *args)) + return result + + def emit_firstresult(self, event, *args): + for result in self.emit(event, *args): + if result is not None: + return result + return None + + # registering addon parts + + def add_builder(self, builder): + if not hasattr(builder, 'name'): + raise ExtensionError('Builder class %s has no "name" attribute' % builder) + if builder.name in self.builderclasses: + raise ExtensionError('Builder %r already exists (in module %s)' % ( + builder.name, self.builderclasses[builder.name].__module__)) + self.builderclasses[builder.name] = builder + + def add_config_value(self, name, default, rebuild_env): + if name in self.config.values: + raise ExtensionError('Config value %r already present' % name) + self.config.values[name] = (default, rebuild_env) + + def add_event(self, name): + if name in self._events: + raise ExtensionError('Event %r already present' % name) + self._events[name] = '' + + def add_node(self, node, **kwds): + nodes._add_node_class_names([node.__name__]) + for key, val in kwds.iteritems(): + try: + visit, depart = val + except ValueError: + raise ExtensionError('Value for key %r must be a (visit, depart) ' + 'function tuple' % key) + if key == 'html': + from sphinx.htmlwriter import HTMLTranslator as translator + elif key == 'latex': + from sphinx.latexwriter import LaTeXTranslator as translator + elif key == 'text': + from sphinx.textwriter import TextTranslator as translator + else: + # ignore invalid keys for compatibility + continue + setattr(translator, 'visit_'+node.__name__, visit) + if depart: + setattr(translator, 'depart_'+node.__name__, depart) + + def add_directive(self, name, func, content, arguments, **options): + func.content = content + func.arguments = arguments + func.options = options + directives.register_directive(name, func) + + def add_role(self, name, role): + roles.register_canonical_role(name, role) + + def add_description_unit(self, directivename, rolename, indextemplate='', + parse_node=None, ref_nodeclass=None): + additional_xref_types[directivename] = (rolename, indextemplate, parse_node) + directives.register_directive(directivename, desc_directive) + roles.register_canonical_role(rolename, xfileref_role) + if ref_nodeclass is not None: + innernodetypes[rolename] = ref_nodeclass + + def add_crossref_type(self, directivename, rolename, indextemplate='', + ref_nodeclass=None): + additional_xref_types[directivename] = (rolename, indextemplate, None) + directives.register_directive(directivename, target_directive) + roles.register_canonical_role(rolename, xfileref_role) + if ref_nodeclass is not None: + innernodetypes[rolename] = ref_nodeclass + + def add_transform(self, transform): + SphinxStandaloneReader.transforms.append(transform) + + def add_javascript(self, filename): + StandaloneHTMLBuilder.script_files.append( + posixpath.join('_static', filename)) + + +class TemplateBridge(object): + """ + This class defines the interface for a "template bridge", that is, a class + that renders templates given a template name and a context. + """ + + def init(self, builder): + """ + Called by the builder to initialize the template system. *builder* + is the builder object; you'll probably want to look at the value of + ``builder.config.templates_path``. + """ + raise NotImplementedError('must be implemented in subclasses') + + def newest_template_mtime(self): + """ + Called by the builder to determine if output files are outdated + because of template changes. Return the mtime of the newest template + file that was changed. The default implementation returns ``0``. + """ + return 0 + + def render(self, template, context): + """ + Called by the builder to render a *template* with a specified + context (a Python dictionary). + """ + raise NotImplementedError('must be implemented in subclasses') diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/builder.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/builder.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1272 @@ +# -*- coding: utf-8 -*- +""" + sphinx.builder + ~~~~~~~~~~~~~~ + + Builder classes for different output formats. + + :copyright: 2007-2008 by Georg Brandl, Sebastian Wiesner, Horst Gutmann. + :license: BSD. +""" + +import os +import time +import codecs +import shutil +import gettext +import cPickle as pickle +from os import path +from cgi import escape + +from docutils import nodes +from docutils.io import StringOutput, FileOutput, DocTreeInput +from docutils.core import publish_parts +from docutils.utils import new_document +from docutils.frontend import OptionParser +from docutils.readers.doctree import Reader as DoctreeReader + +from sphinx import addnodes, locale, __version__ +from sphinx.util import ensuredir, relative_uri, SEP, os_path, texescape, ustrftime +from sphinx.htmlhelp import build_hhx +from sphinx.htmlwriter import HTMLWriter, HTMLTranslator, SmartyPantsHTMLTranslator +from sphinx.textwriter import TextWriter +from sphinx.latexwriter import LaTeXWriter +from sphinx.environment import BuildEnvironment, NoUri +from sphinx.highlighting import PygmentsBridge +from sphinx.util.console import bold, purple, darkgreen +from sphinx.search import js_index + +try: + import json +except ImportError: + try: + import simplejson as json + except ImportError: + json = None + +# side effect: registers roles and directives +from sphinx import roles +from sphinx import directives + +ENV_PICKLE_FILENAME = 'environment.pickle' +LAST_BUILD_FILENAME = 'last_build' +INVENTORY_FILENAME = 'objects.inv' + + +class Builder(object): + """ + Builds target formats from the reST sources. + """ + + # builder's name, for the -b command line options + name = '' + + def __init__(self, app, env=None, freshenv=False): + self.srcdir = app.srcdir + self.confdir = app.confdir + self.outdir = app.outdir + self.doctreedir = app.doctreedir + if not path.isdir(self.doctreedir): + os.makedirs(self.doctreedir) + + self.app = app + self.warn = app.warn + self.info = app.info + self.config = app.config + + self.load_i18n() + + # images that need to be copied over (source -> dest) + self.images = {} + + # if None, this is set in load_env() + self.env = env + self.freshenv = freshenv + + self.init() + self.load_env() + + # helper methods + + def init(self): + """Load necessary templates and perform initialization.""" + raise NotImplementedError + + def init_templates(self): + # Call this from init() if you need templates. + if self.config.template_bridge: + self.templates = self.app.import_object( + self.config.template_bridge, 'template_bridge setting')() + else: + from sphinx._jinja import BuiltinTemplates + self.templates = BuiltinTemplates() + self.templates.init(self) + + def get_target_uri(self, docname, typ=None): + """ + Return the target URI for a document name (typ can be used to qualify + the link characteristic for individual builders). + """ + raise NotImplementedError + + def get_relative_uri(self, from_, to, typ=None): + """ + Return a relative URI between two source filenames. May raise environment.NoUri + if there's no way to return a sensible URI. + """ + return relative_uri(self.get_target_uri(from_), + self.get_target_uri(to, typ)) + + def get_outdated_docs(self): + """ + Return an iterable of output files that are outdated, or a string describing + what an update build will build. + """ + raise NotImplementedError + + def status_iterator(self, iterable, summary, colorfunc=darkgreen): + l = -1 + for item in iterable: + if l == -1: + self.info(bold(summary), nonl=1) + l = 0 + self.info(colorfunc(item) + ' ', nonl=1) + yield item + if l == 0: + self.info() + + supported_image_types = [] + + def post_process_images(self, doctree): + """ + Pick the best candidate for all image URIs. + """ + for node in doctree.traverse(nodes.image): + if '?' in node['candidates']: + # don't rewrite nonlocal image URIs + continue + if '*' not in node['candidates']: + for imgtype in self.supported_image_types: + candidate = node['candidates'].get(imgtype, None) + if candidate: + break + else: + self.warn('%s:%s: no matching candidate for image URI %r' % + (node.source, getattr(node, 'lineno', ''), node['uri'])) + continue + node['uri'] = candidate + else: + candidate = node['uri'] + if candidate not in self.env.images: + # non-existing URI; let it alone + continue + self.images[candidate] = self.env.images[candidate][1] + + # build methods + + def load_i18n(self): + """ + Load translated strings from the configured localedirs if + enabled in the configuration. + """ + self.translator = None + if self.config.language is not None: + self.info(bold('loading translations [%s]... ' % self.config.language), + nonl=True) + locale_dirs = [path.join(path.dirname(__file__), 'locale')] + \ + [path.join(self.srcdir, x) for x in self.config.locale_dirs] + for dir_ in locale_dirs: + try: + trans = gettext.translation('sphinx', localedir=dir_, + languages=[self.config.language]) + if self.translator is None: + self.translator = trans + else: + self.translator._catalog.update(trans.catalog) + except Exception: + # Language couldn't be found in the specified path + pass + if self.translator is not None: + self.info('done') + else: + self.info('locale not available') + if self.translator is None: + self.translator = gettext.NullTranslations() + self.translator.install(unicode=True) + locale.init() # translate common labels + + def load_env(self): + """Set up the build environment.""" + if self.env: + return + if not self.freshenv: + try: + self.info(bold('loading pickled environment... '), nonl=True) + self.env = BuildEnvironment.frompickle(self.config, + path.join(self.doctreedir, ENV_PICKLE_FILENAME)) + self.info('done') + except Exception, err: + if type(err) is IOError and err.errno == 2: + self.info('not found') + else: + self.info('failed: %s' % err) + self.env = BuildEnvironment(self.srcdir, self.doctreedir, self.config) + self.env.find_files(self.config) + else: + self.env = BuildEnvironment(self.srcdir, self.doctreedir, self.config) + self.env.find_files(self.config) + self.env.set_warnfunc(self.warn) + + def build_all(self): + """Build all source files.""" + self.build(None, summary='all source files', method='all') + + def build_specific(self, filenames): + """Only rebuild as much as needed for changes in the source_filenames.""" + # bring the filenames to the canonical format, that is, + # relative to the source directory and without source_suffix. + dirlen = len(self.srcdir) + 1 + to_write = [] + suffix = self.config.source_suffix + for filename in filenames: + filename = path.abspath(filename)[dirlen:] + if filename.endswith(suffix): + filename = filename[:-len(suffix)] + filename = filename.replace(os.path.sep, SEP) + to_write.append(filename) + self.build(to_write, method='specific', + summary='%d source files given on command ' + 'line' % len(to_write)) + + def build_update(self): + """Only rebuild files changed or added since last build.""" + to_build = self.get_outdated_docs() + if isinstance(to_build, str): + self.build(['__all__'], to_build) + else: + to_build = list(to_build) + self.build(to_build, + summary='targets for %d source files that are ' + 'out of date' % len(to_build)) + + def build(self, docnames, summary=None, method='update'): + if summary: + self.info(bold('building [%s]: ' % self.name), nonl=1) + self.info(summary) + + updated_docnames = [] + # while reading, collect all warnings from docutils + warnings = [] + self.env.set_warnfunc(warnings.append) + self.info(bold('updating environment: '), nonl=1) + iterator = self.env.update(self.config, self.srcdir, self.doctreedir, self.app) + # the first item in the iterator is a summary message + self.info(iterator.next()) + for docname in self.status_iterator(iterator, 'reading sources... ', purple): + updated_docnames.append(docname) + # nothing further to do, the environment has already done the reading + for warning in warnings: + if warning.strip(): + self.warn(warning) + self.env.set_warnfunc(self.warn) + + if updated_docnames: + # save the environment + self.info(bold('pickling environment... '), nonl=True) + self.env.topickle(path.join(self.doctreedir, ENV_PICKLE_FILENAME)) + self.info('done') + + # global actions + self.info(bold('checking consistency... '), nonl=True) + self.env.check_consistency() + self.info('done') + else: + if method == 'update' and not docnames: + self.info(bold('no targets are out of date.')) + return + + # another indirection to support methods which don't build files + # individually + self.write(docnames, updated_docnames, method) + + # finish (write static files etc.) + self.finish() + status = self.app.statuscode == 0 and 'succeeded' or 'finished with problems' + if self.app._warncount: + self.info(bold('build %s, %s warning%s.' % + (status, self.app._warncount, + self.app._warncount != 1 and 's' or ''))) + else: + self.info(bold('build %s.' % status)) + + def write(self, build_docnames, updated_docnames, method='update'): + if build_docnames is None or build_docnames == ['__all__']: + # build_all + build_docnames = self.env.found_docs + if method == 'update': + # build updated ones as well + docnames = set(build_docnames) | set(updated_docnames) + else: + docnames = set(build_docnames) + + # add all toctree-containing files that may have changed + for docname in list(docnames): + for tocdocname in self.env.files_to_rebuild.get(docname, []): + docnames.add(tocdocname) + docnames.add(self.config.master_doc) + + self.info(bold('preparing documents... '), nonl=True) + self.prepare_writing(docnames) + self.info('done') + + # write target files + warnings = [] + self.env.set_warnfunc(warnings.append) + for docname in self.status_iterator(sorted(docnames), + 'writing output... ', darkgreen): + doctree = self.env.get_and_resolve_doctree(docname, self) + self.write_doc(docname, doctree) + for warning in warnings: + if warning.strip(): + self.warn(warning) + self.env.set_warnfunc(self.warn) + + def prepare_writing(self, docnames): + raise NotImplementedError + + def write_doc(self, docname, doctree): + raise NotImplementedError + + def finish(self): + raise NotImplementedError + + +class StandaloneHTMLBuilder(Builder): + """ + Builds standalone HTML docs. + """ + name = 'html' + copysource = True + out_suffix = '.html' + indexer_format = js_index + supported_image_types = ['image/svg+xml', 'image/png', 'image/gif', + 'image/jpeg'] + searchindex_filename = 'searchindex.js' + add_header_links = True + add_definition_links = True + + # This is a class attribute because it is mutated by Sphinx.add_javascript. + script_files = ['_static/jquery.js', '_static/doctools.js'] + + def init(self): + """Load templates.""" + self.init_templates() + self.init_translator_class() + if self.config.html_file_suffix: + self.out_suffix = self.config.html_file_suffix + + if self.config.language is not None: + jsfile = path.join(path.dirname(__file__), 'locale', self.config.language, + 'LC_MESSAGES', 'sphinx.js') + if path.isfile(jsfile): + self.script_files.append('_static/translations.js') + + def init_translator_class(self): + if self.config.html_translator_class: + self.translator_class = self.app.import_object( + self.config.html_translator_class, 'html_translator_class setting') + elif self.config.html_use_smartypants: + self.translator_class = SmartyPantsHTMLTranslator + else: + self.translator_class = HTMLTranslator + + def render_partial(self, node): + """Utility: Render a lone doctree node.""" + doc = new_document('') + doc.append(node) + return publish_parts( + doc, + source_class=DocTreeInput, + reader=DoctreeReader(), + writer=HTMLWriter(self), + settings_overrides={'output_encoding': 'unicode'} + ) + + def prepare_writing(self, docnames): + from sphinx.search import IndexBuilder + + self.indexer = IndexBuilder(self.env) + self.load_indexer(docnames) + self.docwriter = HTMLWriter(self) + self.docsettings = OptionParser( + defaults=self.env.settings, + components=(self.docwriter,)).get_default_values() + + # format the "last updated on" string, only once is enough since it + # typically doesn't include the time of day + lufmt = self.config.html_last_updated_fmt + if lufmt is not None: + self.last_updated = ustrftime(lufmt or _('%b %d, %Y')) + else: + self.last_updated = None + + logo = self.config.html_logo and \ + path.basename(self.config.html_logo) or '' + + favicon = self.config.html_favicon and \ + path.basename(self.config.html_favicon) or '' + if favicon and os.path.splitext(favicon)[1] != '.ico': + self.warn('html_favicon is not an .ico file') + + if not isinstance(self.config.html_use_opensearch, basestring): + self.warn('html_use_opensearch config value must now be a string') + + self.relations = self.env.collect_relations() + + rellinks = [] + if self.config.html_use_index: + rellinks.append(('genindex', _('General Index'), 'I', _('index'))) + if self.config.html_use_modindex and self.env.modules: + rellinks.append(('modindex', _('Global Module Index'), 'M', _('modules'))) + + self.globalcontext = dict( + project = self.config.project, + release = self.config.release, + version = self.config.version, + last_updated = self.last_updated, + copyright = self.config.copyright, + master_doc = self.config.master_doc, + style = self.config.html_style, + use_opensearch = self.config.html_use_opensearch, + docstitle = self.config.html_title, + shorttitle = self.config.html_short_title, + show_sphinx = self.config.html_show_sphinx, + has_source = self.config.html_copy_source, + file_suffix = self.out_suffix, + script_files = self.script_files, + sphinx_version = __version__, + rellinks = rellinks, + builder = self.name, + parents = [], + logo = logo, + favicon = favicon, + ) + self.globalcontext.update(self.config.html_context) + + def get_doc_context(self, docname, body, metatags): + """Collect items for the template context of a page.""" + # find out relations + prev = next = None + parents = [] + rellinks = self.globalcontext['rellinks'][:] + related = self.relations.get(docname) + titles = self.env.titles + if related and related[2]: + try: + next = {'link': self.get_relative_uri(docname, related[2]), + 'title': self.render_partial(titles[related[2]])['title']} + rellinks.append((related[2], next['title'], 'N', _('next'))) + except KeyError: + next = None + if related and related[1]: + try: + prev = {'link': self.get_relative_uri(docname, related[1]), + 'title': self.render_partial(titles[related[1]])['title']} + rellinks.append((related[1], prev['title'], 'P', _('previous'))) + except KeyError: + # the relation is (somehow) not in the TOC tree, handle that gracefully + prev = None + while related and related[0]: + try: + parents.append( + {'link': self.get_relative_uri(docname, related[0]), + 'title': self.render_partial(titles[related[0]])['title']}) + except KeyError: + pass + related = self.relations.get(related[0]) + if parents: + parents.pop() # remove link to the master file; we have a generic + # "back to index" link already + parents.reverse() + + # title rendered as HTML + title = titles.get(docname) + title = title and self.render_partial(title)['title'] or '' + # the name for the copied source + sourcename = self.config.html_copy_source and docname + '.txt' or '' + + # metadata for the document + meta = self.env.metadata.get(docname) + + return dict( + parents = parents, + prev = prev, + next = next, + title = title, + meta = meta, + body = body, + metatags = metatags, + rellinks = rellinks, + sourcename = sourcename, + toc = self.render_partial(self.env.get_toc_for(docname))['fragment'], + # only display a TOC if there's more than one item to show + display_toc = (self.env.toc_num_entries[docname] > 1), + ) + + def write_doc(self, docname, doctree): + self.post_process_images(doctree) + destination = StringOutput(encoding='utf-8') + doctree.settings = self.docsettings + + self.imgpath = relative_uri(self.get_target_uri(docname), '_images') + self.docwriter.write(doctree, destination) + self.docwriter.assemble_parts() + body = self.docwriter.parts['fragment'] + metatags = self.docwriter.clean_meta + + ctx = self.get_doc_context(docname, body, metatags) + self.index_page(docname, doctree, ctx.get('title', '')) + self.handle_page(docname, ctx, event_arg=doctree) + + def finish(self): + self.info(bold('writing additional files...'), nonl=1) + + # the global general index + + if self.config.html_use_index: + # the total count of lines for each index letter, used to distribute + # the entries into two columns + genindex = self.env.create_index(self) + indexcounts = [] + for _, entries in genindex: + indexcounts.append(sum(1 + len(subitems) + for _, (_, subitems) in entries)) + + genindexcontext = dict( + genindexentries = genindex, + genindexcounts = indexcounts, + split_index = self.config.html_split_index, + ) + self.info(' genindex', nonl=1) + + if self.config.html_split_index: + self.handle_page('genindex', genindexcontext, 'genindex-split.html') + self.handle_page('genindex-all', genindexcontext, 'genindex.html') + for (key, entries), count in zip(genindex, indexcounts): + ctx = {'key': key, 'entries': entries, 'count': count, + 'genindexentries': genindex} + self.handle_page('genindex-' + key, ctx, 'genindex-single.html') + else: + self.handle_page('genindex', genindexcontext, 'genindex.html') + + # the global module index + + if self.config.html_use_modindex and self.env.modules: + # the sorted list of all modules, for the global module index + modules = sorted(((mn, (self.get_relative_uri('modindex', fn) + + '#module-' + mn, sy, pl, dep)) + for (mn, (fn, sy, pl, dep)) in + self.env.modules.iteritems()), + key=lambda x: x[0].lower()) + # collect all platforms + platforms = set() + # sort out collapsable modules + modindexentries = [] + letters = [] + pmn = '' + num_toplevels = 0 + num_collapsables = 0 + cg = 0 # collapse group + fl = '' # first letter + for mn, (fn, sy, pl, dep) in modules: + pl = pl and pl.split(', ') or [] + platforms.update(pl) + if fl != mn[0].lower() and mn[0] != '_': + # heading + modindexentries.append(['', False, 0, False, + mn[0].upper(), '', [], False]) + letters.append(mn[0].upper()) + tn = mn.split('.')[0] + if tn != mn: + # submodule + if pmn == tn: + # first submodule - make parent collapsable + modindexentries[-1][1] = True + num_collapsables += 1 + elif not pmn.startswith(tn): + # submodule without parent in list, add dummy entry + cg += 1 + modindexentries.append([tn, True, cg, False, '', '', [], False]) + else: + num_toplevels += 1 + cg += 1 + modindexentries.append([mn, False, cg, (tn != mn), fn, sy, pl, dep]) + pmn = mn + fl = mn[0].lower() + platforms = sorted(platforms) + + # apply heuristics when to collapse modindex at page load: + # only collapse if number of toplevel modules is larger than + # number of submodules + collapse = len(modules) - num_toplevels < num_toplevels + + modindexcontext = dict( + modindexentries = modindexentries, + platforms = platforms, + letters = letters, + collapse_modindex = collapse, + ) + self.info(' modindex', nonl=1) + self.handle_page('modindex', modindexcontext, 'modindex.html') + + # the search page + if self.name != 'htmlhelp': + self.info(' search', nonl=1) + self.handle_page('search', {}, 'search.html') + + # additional pages from conf.py + for pagename, template in self.config.html_additional_pages.items(): + self.info(' '+pagename, nonl=1) + self.handle_page(pagename, {}, template) + + if self.config.html_use_opensearch and self.name != 'htmlhelp': + self.info(' opensearch', nonl=1) + fn = path.join(self.outdir, '_static', 'opensearch.xml') + self.handle_page('opensearch', {}, 'opensearch.xml', outfilename=fn) + + self.info() + + # copy image files + if self.images: + self.info(bold('copying images...'), nonl=True) + ensuredir(path.join(self.outdir, '_images')) + for src, dest in self.images.iteritems(): + self.info(' '+src, nonl=1) + shutil.copyfile(path.join(self.srcdir, src), + path.join(self.outdir, '_images', dest)) + self.info() + + # copy static files + self.info(bold('copying static files... '), nonl=True) + ensuredir(path.join(self.outdir, '_static')) + # first, create pygments style file + f = open(path.join(self.outdir, '_static', 'pygments.css'), 'w') + f.write(PygmentsBridge('html', self.config.pygments_style).get_stylesheet()) + f.close() + # then, copy translations JavaScript file + if self.config.language is not None: + jsfile = path.join(path.dirname(__file__), 'locale', self.config.language, + 'LC_MESSAGES', 'sphinx.js') + if path.isfile(jsfile): + shutil.copyfile(jsfile, path.join(self.outdir, '_static', + 'translations.js')) + # then, copy over all user-supplied static files + staticdirnames = [path.join(path.dirname(__file__), 'static')] + \ + [path.join(self.confdir, spath) + for spath in self.config.html_static_path] + for staticdirname in staticdirnames: + for filename in os.listdir(staticdirname): + if filename.startswith('.'): + continue + fullname = path.join(staticdirname, filename) + targetname = path.join(self.outdir, '_static', filename) + if path.isfile(fullname): + shutil.copyfile(fullname, targetname) + elif path.isdir(fullname): + if filename in self.config.exclude_dirnames: + continue + if path.exists(targetname): + shutil.rmtree(targetname) + shutil.copytree(fullname, targetname) + # last, copy logo file (handled differently) + if self.config.html_logo: + logobase = path.basename(self.config.html_logo) + shutil.copyfile(path.join(self.confdir, self.config.html_logo), + path.join(self.outdir, '_static', logobase)) + self.info('done') + + # dump the search index + self.handle_finish() + + def get_outdated_docs(self): + if self.templates: + template_mtime = self.templates.newest_template_mtime() + else: + template_mtime = 0 + for docname in self.env.found_docs: + if docname not in self.env.all_docs: + yield docname + continue + targetname = self.env.doc2path(docname, self.outdir, self.out_suffix) + try: + targetmtime = path.getmtime(targetname) + except Exception: + targetmtime = 0 + try: + srcmtime = max(path.getmtime(self.env.doc2path(docname)), + template_mtime) + if srcmtime > targetmtime: + yield docname + except EnvironmentError: + # source doesn't exist anymore + pass + + def load_indexer(self, docnames): + keep = set(self.env.all_docs) - set(docnames) + try: + f = open(path.join(self.outdir, self.searchindex_filename), 'rb') + try: + self.indexer.load(f, self.indexer_format) + finally: + f.close() + except (IOError, OSError, ValueError): + if keep: + self.warn("search index couldn't be loaded, but not all documents " + "will be built: the index will be incomplete.") + # delete all entries for files that will be rebuilt + self.indexer.prune(keep) + + def index_page(self, pagename, doctree, title): + # only index pages with title + if self.indexer is not None and title: + self.indexer.feed(pagename, title, doctree) + + # --------- these are overwritten by the serialization builder + + def get_target_uri(self, docname, typ=None): + return docname + self.out_suffix + + def handle_page(self, pagename, addctx, templatename='page.html', + outfilename=None, event_arg=None): + ctx = self.globalcontext.copy() + # current_page_name is backwards compatibility + ctx['pagename'] = ctx['current_page_name'] = pagename + + def pathto(otheruri, resource=False, + baseuri=self.get_target_uri(pagename)): + if not resource: + otheruri = self.get_target_uri(otheruri) + return relative_uri(baseuri, otheruri) + ctx['pathto'] = pathto + ctx['hasdoc'] = lambda name: name in self.env.all_docs + ctx['customsidebar'] = self.config.html_sidebars.get(pagename) + ctx.update(addctx) + + self.app.emit('html-page-context', pagename, templatename, ctx, event_arg) + + output = self.templates.render(templatename, ctx) + if not outfilename: + outfilename = path.join(self.outdir, os_path(pagename) + self.out_suffix) + ensuredir(path.dirname(outfilename)) # normally different from self.outdir + try: + f = codecs.open(outfilename, 'w', 'utf-8') + try: + f.write(output) + finally: + f.close() + except (IOError, OSError), err: + self.warn("Error writing file %s: %s" % (outfilename, err)) + if self.copysource and ctx.get('sourcename'): + # copy the source file for the "show source" link + source_name = path.join(self.outdir, '_sources', os_path(ctx['sourcename'])) + ensuredir(path.dirname(source_name)) + shutil.copyfile(self.env.doc2path(pagename), source_name) + + def handle_finish(self): + self.info(bold('dumping search index... '), nonl=True) + self.indexer.prune(self.env.all_docs) + f = open(path.join(self.outdir, self.searchindex_filename), 'wb') + try: + self.indexer.dump(f, self.indexer_format) + finally: + f.close() + self.info('done') + + self.info(bold('dumping object inventory... '), nonl=True) + f = open(path.join(self.outdir, INVENTORY_FILENAME), 'w') + try: + f.write('# Sphinx inventory version 1\n') + f.write('# Project: %s\n' % self.config.project.encode('utf-8')) + f.write('# Version: %s\n' % self.config.version) + for modname, info in self.env.modules.iteritems(): + f.write('%s mod %s\n' % (modname, self.get_target_uri(info[0]))) + for refname, (docname, desctype) in self.env.descrefs.iteritems(): + f.write('%s %s %s\n' % (refname, desctype, self.get_target_uri(docname))) + finally: + f.close() + self.info('done') + + +class SerializingHTMLBuilder(StandaloneHTMLBuilder): + """ + An abstract builder that serializes the HTML generated. + """ + #: the serializing implementation to use. Set this to a module that + #: implements a `dump`, `load`, `dumps` and `loads` functions + #: (pickle, simplejson etc.) + implementation = None + + #: the filename for the global context file + globalcontext_filename = None + + supported_image_types = ('image/svg+xml', 'image/png', 'image/gif', + 'image/jpeg') + + def init(self): + self.init_translator_class() + self.templates = None # no template bridge necessary + + def get_target_uri(self, docname, typ=None): + if docname == 'index': + return '' + if docname.endswith(SEP + 'index'): + return docname[:-5] # up to sep + return docname + SEP + + def handle_page(self, pagename, ctx, templatename='page.html', + outfilename=None, event_arg=None): + ctx['current_page_name'] = pagename + sidebarfile = self.config.html_sidebars.get(pagename) + if sidebarfile: + ctx['customsidebar'] = sidebarfile + + if not outfilename: + outfilename = path.join(self.outdir, os_path(pagename) + self.out_suffix) + + self.app.emit('html-page-context', pagename, templatename, ctx, event_arg) + + ensuredir(path.dirname(outfilename)) + f = open(outfilename, 'wb') + try: + self.implementation.dump(ctx, f, 2) + finally: + f.close() + + # if there is a source file, copy the source file for the + # "show source" link + if ctx.get('sourcename'): + source_name = path.join(self.outdir, '_sources', + os_path(ctx['sourcename'])) + ensuredir(path.dirname(source_name)) + shutil.copyfile(self.env.doc2path(pagename), source_name) + + def handle_finish(self): + # dump the global context + outfilename = path.join(self.outdir, self.globalcontext_filename) + f = open(outfilename, 'wb') + try: + self.implementation.dump(self.globalcontext, f, 2) + finally: + f.close() + + # super here to dump the search index + StandaloneHTMLBuilder.handle_finish(self) + + # copy the environment file from the doctree dir to the output dir + # as needed by the web app + shutil.copyfile(path.join(self.doctreedir, ENV_PICKLE_FILENAME), + path.join(self.outdir, ENV_PICKLE_FILENAME)) + + # touch 'last build' file, used by the web application to determine + # when to reload its environment and clear the cache + open(path.join(self.outdir, LAST_BUILD_FILENAME), 'w').close() + + +class PickleHTMLBuilder(SerializingHTMLBuilder): + """ + A Builder that dumps the generated HTML into pickle files. + """ + implementation = pickle + indexer_format = pickle + name = 'pickle' + out_suffix = '.fpickle' + globalcontext_filename = 'globalcontext.pickle' + searchindex_filename = 'searchindex.pickle' + + +class JSONHTMLBuilder(SerializingHTMLBuilder): + """ + A builder that dumps the generated HTML into JSON files. + """ + implementation = json + indexer_format = json + name = 'json' + out_suffix = '.fjson' + globalcontext_filename = 'globalcontext.json' + searchindex_filename = 'searchindex.json' + + def init(self): + if json is None: + from sphinx.application import SphinxError + raise SphinxError('The module simplejson (or json in Python >= 2.6) ' + 'is not available. The JSONHTMLBuilder builder ' + 'will not work.') + SerializingHTMLBuilder.init(self) + + +class HTMLHelpBuilder(StandaloneHTMLBuilder): + """ + Builder that also outputs Windows HTML help project, contents and index files. + Adapted from the original Doc/tools/prechm.py. + """ + name = 'htmlhelp' + + # don't copy the reST source + copysource = False + supported_image_types = ['image/png', 'image/gif', 'image/jpeg'] + + # don't add links + add_header_links = False + add_definition_links = False + + def init(self): + StandaloneHTMLBuilder.init(self) + # the output files for HTML help must be .html only + self.out_suffix = '.html' + + def handle_finish(self): + build_hhx(self, self.outdir, self.config.htmlhelp_basename) + + +class LaTeXBuilder(Builder): + """ + Builds LaTeX output to create PDF. + """ + name = 'latex' + supported_image_types = ['application/pdf', 'image/png', 'image/gif', + 'image/jpeg'] + + def init(self): + self.docnames = [] + self.document_data = [] + texescape.init() + + def get_outdated_docs(self): + return 'all documents' # for now + + def get_target_uri(self, docname, typ=None): + if typ == 'token': + # token references are always inside production lists and must be + # replaced by \token{} in LaTeX + return '@token' + if docname not in self.docnames: + raise NoUri + else: + return '' + + def init_document_data(self): + preliminary_document_data = map(list, self.config.latex_documents) + if not preliminary_document_data: + self.warn('No "latex_documents" config value found; no documents ' + 'will be written.') + return + # assign subdirs to titles + self.titles = [] + for entry in preliminary_document_data: + docname = entry[0] + if docname not in self.env.all_docs: + self.warn('"latex_documents" config value references unknown ' + 'document %s' % docname) + continue + self.document_data.append(entry) + if docname.endswith(SEP+'index'): + docname = docname[:-5] + self.titles.append((docname, entry[2])) + + def write(self, *ignored): + # first, assemble the "appendix" docs that are in every PDF + appendices = [] + for fname in self.config.latex_appendices: + appendices.append(self.env.get_doctree(fname)) + + docwriter = LaTeXWriter(self) + docsettings = OptionParser( + defaults=self.env.settings, + components=(docwriter,)).get_default_values() + + self.init_document_data() + + for entry in self.document_data: + docname, targetname, title, author, docclass = entry[:5] + toctree_only = False + if len(entry) > 5: + toctree_only = entry[5] + destination = FileOutput( + destination_path=path.join(self.outdir, targetname), + encoding='utf-8') + self.info("processing " + targetname + "... ", nonl=1) + doctree = self.assemble_doctree(docname, toctree_only, + appendices=(docclass == 'manual') and appendices or []) + self.post_process_images(doctree) + self.info("writing... ", nonl=1) + doctree.settings = docsettings + doctree.settings.author = author + doctree.settings.title = title + doctree.settings.docname = docname + doctree.settings.docclass = docclass + docwriter.write(doctree, destination) + self.info("done") + + def assemble_doctree(self, indexfile, toctree_only, appendices): + self.docnames = set([indexfile] + appendices) + self.info(darkgreen(indexfile) + " ", nonl=1) + def process_tree(docname, tree): + tree = tree.deepcopy() + for toctreenode in tree.traverse(addnodes.toctree): + newnodes = [] + includefiles = map(str, toctreenode['includefiles']) + for includefile in includefiles: + try: + self.info(darkgreen(includefile) + " ", nonl=1) + subtree = process_tree(includefile, + self.env.get_doctree(includefile)) + self.docnames.add(includefile) + except Exception: + self.warn('%s: toctree contains ref to nonexisting file %r' % + (docname, includefile)) + else: + sof = addnodes.start_of_file() + sof.children = subtree.children + newnodes.append(sof) + toctreenode.parent.replace(toctreenode, newnodes) + return tree + tree = self.env.get_doctree(indexfile) + if toctree_only: + # extract toctree nodes from the tree and put them in a fresh document + new_tree = new_document('') + new_sect = nodes.section() + new_sect += nodes.title(u'', u'') + new_tree += new_sect + for node in tree.traverse(addnodes.toctree): + new_sect += node + tree = new_tree + largetree = process_tree(indexfile, tree) + largetree.extend(appendices) + self.info() + self.info("resolving references...") + self.env.resolve_references(largetree, indexfile, self) + # resolve :ref:s to distant tex files -- we can't add a cross-reference, + # but append the document name + for pendingnode in largetree.traverse(addnodes.pending_xref): + docname = pendingnode['refdocname'] + sectname = pendingnode['refsectname'] + newnodes = [nodes.emphasis(sectname, sectname)] + for subdir, title in self.titles: + if docname.startswith(subdir): + newnodes.append(nodes.Text(_(' (in '), _(' (in '))) + newnodes.append(nodes.emphasis(title, title)) + newnodes.append(nodes.Text(')', ')')) + break + else: + pass + pendingnode.replace_self(newnodes) + return largetree + + def finish(self): + # copy image files + if self.images: + self.info(bold('copying images...'), nonl=1) + for src, dest in self.images.iteritems(): + self.info(' '+src, nonl=1) + shutil.copyfile(path.join(self.srcdir, src), + path.join(self.outdir, dest)) + self.info() + + # the logo is handled differently + if self.config.latex_logo: + logobase = path.basename(self.config.latex_logo) + shutil.copyfile(path.join(self.confdir, self.config.latex_logo), + path.join(self.outdir, logobase)) + + self.info(bold('copying TeX support files... '), nonl=True) + staticdirname = path.join(path.dirname(__file__), 'texinputs') + for filename in os.listdir(staticdirname): + if not filename.startswith('.'): + shutil.copyfile(path.join(staticdirname, filename), + path.join(self.outdir, filename)) + self.info('done') + + +class ChangesBuilder(Builder): + """ + Write a summary with all versionadded/changed directives. + """ + name = 'changes' + + def init(self): + self.init_templates() + + def get_outdated_docs(self): + return self.outdir + + typemap = { + 'versionadded': 'added', + 'versionchanged': 'changed', + 'deprecated': 'deprecated', + } + + def write(self, *ignored): + version = self.config.version + libchanges = {} + apichanges = [] + otherchanges = {} + if version not in self.env.versionchanges: + self.info(bold('no changes in this version.')) + return + self.info(bold('writing summary file...')) + for type, docname, lineno, module, descname, content in \ + self.env.versionchanges[version]: + ttext = self.typemap[type] + context = content.replace('\n', ' ') + if descname and docname.startswith('c-api'): + if not descname: + continue + if context: + entry = '%s: %s: %s' % (descname, ttext, context) + else: + entry = '%s: %s.' % (descname, ttext) + apichanges.append((entry, docname, lineno)) + elif descname or module: + if not module: + module = _('Builtins') + if not descname: + descname = _('Module level') + if context: + entry = '%s: %s: %s' % (descname, ttext, context) + else: + entry = '%s: %s.' % (descname, ttext) + libchanges.setdefault(module, []).append((entry, docname, lineno)) + else: + if not context: + continue + entry = '%s: %s' % (ttext.capitalize(), context) + title = self.env.titles[docname].astext() + otherchanges.setdefault((docname, title), []).append( + (entry, docname, lineno)) + + ctx = { + 'project': self.config.project, + 'version': version, + 'docstitle': self.config.html_title, + 'shorttitle': self.config.html_short_title, + 'libchanges': sorted(libchanges.iteritems()), + 'apichanges': sorted(apichanges), + 'otherchanges': sorted(otherchanges.iteritems()), + 'show_sphinx': self.config.html_show_sphinx, + } + f = open(path.join(self.outdir, 'index.html'), 'w') + try: + f.write(self.templates.render('changes/frameset.html', ctx)) + finally: + f.close() + f = open(path.join(self.outdir, 'changes.html'), 'w') + try: + f.write(self.templates.render('changes/versionchanges.html', ctx)) + finally: + f.close() + + hltext = ['.. versionadded:: %s' % version, + '.. versionchanged:: %s' % version, + '.. deprecated:: %s' % version] + + def hl(no, line): + line = ' ' % no + escape(line) + for x in hltext: + if x in line: + line = '%s' % line + break + return line + + self.info(bold('copying source files...')) + for docname in self.env.all_docs: + f = open(self.env.doc2path(docname)) + lines = f.readlines() + targetfn = path.join(self.outdir, 'rst', os_path(docname)) + '.html' + ensuredir(path.dirname(targetfn)) + f = codecs.open(targetfn, 'w', 'utf8') + try: + text = ''.join(hl(i+1, line) for (i, line) in enumerate(lines)) + ctx = {'filename': self.env.doc2path(docname, None), 'text': text} + f.write(self.templates.render('changes/rstsource.html', ctx)) + finally: + f.close() + shutil.copyfile(path.join(path.dirname(__file__), 'static', 'default.css'), + path.join(self.outdir, 'default.css')) + + def hl(self, text, version): + text = escape(text) + for directive in ['versionchanged', 'versionadded', 'deprecated']: + text = text.replace('.. %s:: %s' % (directive, version), + '.. %s:: %s' % (directive, version)) + return text + + def finish(self): + pass + + +class TextBuilder(Builder): + name = 'text' + out_suffix = '.txt' + + def init(self): + pass + + def get_outdated_docs(self): + for docname in self.env.found_docs: + if docname not in self.env.all_docs: + yield docname + continue + targetname = self.env.doc2path(docname, self.outdir, self.out_suffix) + try: + targetmtime = path.getmtime(targetname) + except Exception: + targetmtime = 0 + try: + srcmtime = path.getmtime(self.env.doc2path(docname)) + if srcmtime > targetmtime: + yield docname + except EnvironmentError: + # source doesn't exist anymore + pass + + def get_target_uri(self, docname, typ=None): + return '' + + def prepare_writing(self, docnames): + self.writer = TextWriter(self) + + def write_doc(self, docname, doctree): + destination = StringOutput(encoding='utf-8') + self.writer.write(doctree, destination) + outfilename = path.join(self.outdir, os_path(docname) + self.out_suffix) + ensuredir(path.dirname(outfilename)) # normally different from self.outdir + try: + f = codecs.open(outfilename, 'w', 'utf-8') + try: + f.write(self.writer.output) + finally: + f.close() + except (IOError, OSError), err: + self.warn("Error writing file %s: %s" % (outfilename, err)) + + def finish(self): + pass + + +# compatibility alias +WebHTMLBuilder = PickleHTMLBuilder + + +from sphinx.linkcheck import CheckExternalLinksBuilder + +builtin_builders = { + 'html': StandaloneHTMLBuilder, + 'pickle': PickleHTMLBuilder, + 'json': JSONHTMLBuilder, + 'web': PickleHTMLBuilder, + 'htmlhelp': HTMLHelpBuilder, + 'latex': LaTeXBuilder, + 'text': TextBuilder, + 'changes': ChangesBuilder, + 'linkcheck': CheckExternalLinksBuilder, +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/cmdline.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/cmdline.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +""" + sphinx.cmdline + ~~~~~~~~~~~~~~ + + sphinx-build command-line handling. + + :copyright: 2008 by Georg Brandl. + :license: BSD. +""" + +import os +import sys +import getopt +import traceback +from os import path + +from docutils.utils import SystemMessage + +from sphinx import __version__ +from sphinx.application import Sphinx, SphinxError +from sphinx.util import format_exception_cut_frames, save_traceback +from sphinx.util.console import darkred, nocolor, color_terminal + + +def usage(argv, msg=None): + if msg: + print >>sys.stderr, msg + print >>sys.stderr + print >>sys.stderr, """\ +Sphinx v%s +Usage: %s [options] sourcedir outdir [filenames...] +Options: -b -- builder to use; default is html + -a -- write all files; default is to only write new and changed files + -E -- don't use a saved environment, always read all files + -d -- path for the cached environment and doctree files + (default: outdir/.doctrees) + -c -- path where configuration file (conf.py) is located + (default: same as sourcedir) + -C -- use no config file at all, only -D options + -D -- override a setting in configuration + -A -- pass a value into the templates, for HTML builder + -N -- do not do colored output + -q -- no output on stdout, just warnings on stderr + -Q -- no output at all, not even warnings + -P -- run Pdb on exception +Modi: +* without -a and without filenames, write new and changed files. +* with -a, write all files. +* with filenames, write these.""" % (__version__, argv[0]) + + +def main(argv): + if not sys.stdout.isatty() or not color_terminal(): + # Windows' poor cmd box doesn't understand ANSI sequences + nocolor() + + try: + opts, args = getopt.getopt(argv[1:], 'ab:d:c:CD:A:NEqP') + allopts = set(opt[0] for opt in opts) + srcdir = confdir = path.abspath(args[0]) + if not path.isdir(srcdir): + print >>sys.stderr, 'Error: Cannot find source directory.' + return 1 + if not path.isfile(path.join(srcdir, 'conf.py')) and \ + '-c' not in allopts and '-C' not in allopts: + print >>sys.stderr, 'Error: Source directory doesn\'t contain conf.py file.' + return 1 + outdir = path.abspath(args[1]) + if not path.isdir(outdir): + print >>sys.stderr, 'Making output directory...' + os.makedirs(outdir) + except (IndexError, getopt.error): + usage(argv) + return 1 + + filenames = args[2:] + err = 0 + for filename in filenames: + if not path.isfile(filename): + print >>sys.stderr, 'Cannot find file %r.' % filename + err = 1 + if err: + return 1 + + buildername = all_files = None + freshenv = use_pdb = False + status = sys.stdout + warning = sys.stderr + confoverrides = {} + htmlcontext = {} + doctreedir = path.join(outdir, '.doctrees') + for opt, val in opts: + if opt == '-b': + buildername = val + elif opt == '-a': + if filenames: + usage(argv, 'Cannot combine -a option and filenames.') + return 1 + all_files = True + elif opt == '-d': + doctreedir = path.abspath(val) + elif opt == '-c': + confdir = path.abspath(val) + if not path.isfile(path.join(confdir, 'conf.py')): + print >>sys.stderr, \ + 'Error: Configuration directory doesn\'t contain conf.py file.' + return 1 + elif opt == '-C': + confdir = None + elif opt == '-D': + try: + key, val = val.split('=') + except ValueError: + print >>sys.stderr, \ + 'Error: -D option argument must be in the form name=value.' + return 1 + try: + val = int(val) + except ValueError: + pass + confoverrides[key] = val + elif opt == '-A': + try: + key, val = val.split('=') + except ValueError: + print >>sys.stderr, \ + 'Error: -A option argument must be in the form name=value.' + return 1 + try: + val = int(val) + except ValueError: + pass + htmlcontext[key] = val + elif opt == '-N': + nocolor() + elif opt == '-E': + freshenv = True + elif opt == '-q': + status = None + elif opt == '-Q': + status = None + warning = None + elif opt == '-P': + use_pdb = True + confoverrides['html_context'] = htmlcontext + + try: + app = Sphinx(srcdir, confdir, outdir, doctreedir, buildername, + confoverrides, status, warning, freshenv) + app.build(all_files, filenames) + return app.statuscode + except KeyboardInterrupt: + if use_pdb: + import pdb + print >>sys.stderr, darkred('Interrupted while building, starting debugger:') + traceback.print_exc() + pdb.post_mortem(sys.exc_info()[2]) + return 1 + except Exception, err: + if use_pdb: + import pdb + print >>sys.stderr, darkred('Exception occurred while building, ' + 'starting debugger:') + traceback.print_exc() + pdb.post_mortem(sys.exc_info()[2]) + else: + if isinstance(err, SystemMessage): + print >>sys.stderr, darkred('reST markup error:') + print >>sys.stderr, err.args[0].encode('ascii', 'backslashreplace') + elif isinstance(err, SphinxError): + print >>sys.stderr, darkred('%s:' % err.category) + print >>sys.stderr, err + else: + print >>sys.stderr, darkred('Exception occurred:') + print >>sys.stderr, format_exception_cut_frames().rstrip() + tbpath = save_traceback() + print >>sys.stderr, darkred('The full traceback has been saved ' + 'in %s, if you want to report the ' + 'issue to the author.' % tbpath) + print >>sys.stderr, ('Please also report this if it was a user ' + 'error, so that a better error message ' + 'can be provided next time.') + print >>sys.stderr, ('Send reports to sphinx-dev@googlegroups.com. ' + 'Thanks!') + return 1 diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/config.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/config.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +""" + sphinx.config + ~~~~~~~~~~~~~ + + Build configuration file handling. + + :copyright: 2008 by Georg Brandl. + :license: BSD license. +""" + +import os +from os import path + + +class Config(object): + """Configuration file abstraction.""" + + # the values are: (default, needs fresh doctrees if changed) + + # If you add a value here, don't forget to include it in the + # quickstart.py file template as well as in the docs! + + config_values = dict( + # general options + project = ('Python', True), + copyright = ('', False), + version = ('', True), + release = ('', True), + today = ('', True), + today_fmt = (None, True), # the real default is locale-dependent + + language = (None, True), + locale_dirs = ([], True), + + master_doc = ('contents', True), + source_suffix = ('.rst', True), + source_encoding = ('utf-8', True), + unused_docs = ([], True), + exclude_dirs = ([], True), + exclude_trees = ([], True), + exclude_dirnames = ([], True), + default_role = (None, True), + add_function_parentheses = (True, True), + add_module_names = (True, True), + show_authors = (False, True), + pygments_style = ('sphinx', False), + highlight_language = ('python', False), + templates_path = ([], False), + template_bridge = (None, False), + keep_warnings = (False, True), + + # HTML options + html_title = (lambda self: '%s v%s documentation' % + (self.project, self.release), + False), + html_short_title = (lambda self: self.html_title, False), + html_style = ('default.css', False), + html_logo = (None, False), + html_favicon = (None, False), + html_static_path = ([], False), + html_last_updated_fmt = (None, False), # the real default is locale-dependent + html_use_smartypants = (True, False), + html_translator_class = (None, False), + html_sidebars = ({}, False), + html_additional_pages = ({}, False), + html_use_modindex = (True, False), + html_use_index = (True, False), + html_split_index = (False, False), + html_copy_source = (True, False), + html_use_opensearch = ('', False), + html_file_suffix = (None, False), + html_show_sphinx = (True, False), + html_context = ({}, False), + + # HTML help only options + htmlhelp_basename = ('pydoc', False), + + # LaTeX options + latex_documents = ([], False), + latex_logo = (None, False), + latex_appendices = ([], False), + latex_use_parts = (False, False), + latex_use_modindex = (True, False), + # paper_size and font_size are still separate values + # so that you can give them easily on the command line + latex_paper_size = ('letter', False), + latex_font_size = ('10pt', False), + latex_elements = ({}, False), + # now deprecated - use latex_elements + latex_preamble = ('', False), + ) + + def __init__(self, dirname, filename, overrides): + self.overrides = overrides + self.values = Config.config_values.copy() + config = {} + if dirname is not None: + config['__file__'] = path.join(dirname, filename) + olddir = os.getcwd() + try: + os.chdir(dirname) + execfile(config['__file__'], config) + finally: + os.chdir(olddir) + self._raw_config = config + # these two must be preinitialized because extensions can add their + # own config values + self.setup = config.get('setup', None) + self.extensions = config.get('extensions', []) + + def init_values(self): + config = self._raw_config + config.update(self.overrides) + for name in config: + if name in self.values: + self.__dict__[name] = config[name] + del self._raw_config + + def __getattr__(self, name): + if name.startswith('_'): + raise AttributeError(name) + if name not in self.values: + raise AttributeError('No such config value: %s' % name) + default = self.values[name][0] + if callable(default): + return default(self) + return default + + def __getitem__(self, name): + return getattr(self, name) + + def __setitem__(self, name, value): + setattr(self, name, value) + + def __delitem__(self, name): + delattr(self, name) + + def __contains__(self, name): + return name in self.values diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/__init__.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +""" + sphinx.directives + ~~~~~~~~~~~~~~~~~ + + Handlers for additional ReST directives. + + :copyright: 2008 by Georg Brandl. + :license: BSD. +""" + +from sphinx.directives.desc import * +from sphinx.directives.code import * +from sphinx.directives.other import * diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/code.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/code.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- +""" + sphinx.directives.code + ~~~~~~~~~~~~~~~~~~~~~~ + + :copyright: 2007-2008 by Georg Brandl. + :license: BSD. +""" + +import sys +import codecs +from os import path + +from docutils import nodes +from docutils.parsers.rst import directives + +from sphinx import addnodes + + +# ------ highlight directive -------------------------------------------------------- + +def highlightlang_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + if 'linenothreshold' in options: + try: + linenothreshold = int(options['linenothreshold']) + except Exception: + linenothreshold = 10 + else: + linenothreshold = sys.maxint + return [addnodes.highlightlang(lang=arguments[0].strip(), + linenothreshold=linenothreshold)] + +highlightlang_directive.content = 0 +highlightlang_directive.arguments = (1, 0, 0) +highlightlang_directive.options = {'linenothreshold': directives.unchanged} +directives.register_directive('highlight', highlightlang_directive) +directives.register_directive('highlightlang', highlightlang_directive) # old name + + +# ------ code-block directive ------------------------------------------------------- + +def codeblock_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + code = u'\n'.join(content) + literal = nodes.literal_block(code, code) + literal['language'] = arguments[0] + literal['linenos'] = 'linenos' in options + return [literal] + +codeblock_directive.content = 1 +codeblock_directive.arguments = (1, 0, 0) +codeblock_directive.options = {'linenos': directives.flag} +directives.register_directive('code-block', codeblock_directive) +directives.register_directive('sourcecode', codeblock_directive) + + +# ------ literalinclude directive --------------------------------------------------- + +def literalinclude_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + """Like .. include:: :literal:, but only warns if the include file is not found.""" + if not state.document.settings.file_insertion_enabled: + return [state.document.reporter.warning('File insertion disabled', line=lineno)] + env = state.document.settings.env + rel_fn = arguments[0] + source_dir = path.dirname(path.abspath(state_machine.input_lines.source( + lineno - state_machine.input_offset - 1))) + fn = path.normpath(path.join(source_dir, rel_fn)) + + encoding = options.get('encoding', env.config.source_encoding) + try: + f = codecs.open(fn, 'r', encoding) + text = f.read() + f.close() + except (IOError, OSError): + retnode = state.document.reporter.warning( + 'Include file %r not found or reading it failed' % arguments[0], line=lineno) + except UnicodeError: + retnode = state.document.reporter.warning( + 'Encoding %r used for reading included file %r seems to ' + 'be wrong, try giving an :encoding: option' % + (encoding, arguments[0])) + else: + retnode = nodes.literal_block(text, text, source=fn) + retnode.line = 1 + if options.get('language', ''): + retnode['language'] = options['language'] + if 'linenos' in options: + retnode['linenos'] = True + state.document.settings.env.note_dependency(rel_fn) + return [retnode] + +literalinclude_directive.options = {'linenos': directives.flag, + 'language': directives.unchanged, + 'encoding': directives.encoding} +literalinclude_directive.content = 0 +literalinclude_directive.arguments = (1, 0, 0) +directives.register_directive('literalinclude', literalinclude_directive) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/desc.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/desc.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,592 @@ +# -*- coding: utf-8 -*- +""" + sphinx.directives.desc + ~~~~~~~~~~~~~~~~~~~~~~ + + :copyright: 2007-2008 by Georg Brandl. + :license: BSD. +""" + +import re +import string + +from docutils import nodes +from docutils.parsers.rst import directives + +from sphinx import addnodes +from sphinx.util import ws_re + + +# ------ information units --------------------------------------------------------- + +def desc_index_text(desctype, module, name, add_modules): + if desctype == 'function': + if not module: + return _('%s() (built-in function)') % name + return _('%s() (in module %s)') % (name, module) + elif desctype == 'data': + if not module: + return _('%s (built-in variable)') % name + return _('%s (in module %s)') % (name, module) + elif desctype == 'class': + if not module: + return _('%s (built-in class)') % name + return _('%s (class in %s)') % (name, module) + elif desctype == 'exception': + return name + elif desctype == 'method': + try: + clsname, methname = name.rsplit('.', 1) + except ValueError: + if module: + return _('%s() (in module %s)') % (name, module) + else: + return '%s()' % name + if module and add_modules: + return _('%s() (%s.%s method)') % (methname, module, clsname) + else: + return _('%s() (%s method)') % (methname, clsname) + elif desctype == 'staticmethod': + try: + clsname, methname = name.rsplit('.', 1) + except ValueError: + if module: + return _('%s() (in module %s)') % (name, module) + else: + return '%s()' % name + if module and add_modules: + return _('%s() (%s.%s static method)') % (methname, module, clsname) + else: + return _('%s() (%s static method)') % (methname, clsname) + elif desctype == 'attribute': + try: + clsname, attrname = name.rsplit('.', 1) + except ValueError: + if module: + return _('%s (in module %s)') % (name, module) + else: + return name + if module and add_modules: + return _('%s (%s.%s attribute)') % (attrname, module, clsname) + else: + return _('%s (%s attribute)') % (attrname, clsname) + elif desctype == 'cfunction': + return _('%s (C function)') % name + elif desctype == 'cmember': + return _('%s (C member)') % name + elif desctype == 'cmacro': + return _('%s (C macro)') % name + elif desctype == 'ctype': + return _('%s (C type)') % name + elif desctype == 'cvar': + return _('%s (C variable)') % name + else: + raise ValueError('unhandled descenv: %s' % desctype) + + +# ------ make field lists (like :param foo:) in desc bodies prettier + +_ = lambda x: x # make gettext extraction in constants possible + +doc_fields_with_arg = { + 'param': '%param', + 'parameter': '%param', + 'arg': '%param', + 'argument': '%param', + 'keyword': '%param', + 'kwarg': '%param', + 'kwparam': '%param', + 'type': '%type', + 'raises': _('Raises'), + 'raise': 'Raises', + 'exception': 'Raises', + 'except': 'Raises', + 'var': _('Variable'), + 'ivar': 'Variable', + 'cvar': 'Variable', + 'returns': _('Returns'), + 'return': 'Returns', +} + +doc_fields_with_linked_arg = ('raises', 'raise', 'exception', 'except') + +doc_fields_without_arg = { + 'returns': 'Returns', + 'return': 'Returns', + 'rtype': _('Return type'), +} + +del _ + + +def _is_only_paragraph(node): + # determine if the node only contains one paragraph (and system messages) + if len(node) == 0: + return False + elif len(node) > 1: + for subnode in node[1:]: + if not isinstance(subnode, nodes.system_message): + return False + if isinstance(node[0], nodes.paragraph): + return True + return False + + +def handle_doc_fields(node, env): + # don't traverse, only handle field lists that are immediate children + for child in node.children: + if not isinstance(child, nodes.field_list): + continue + params = None + param_nodes = {} + param_types = {} + new_list = nodes.field_list() + for field in child: + fname, fbody = field + try: + typ, obj = fname.astext().split(None, 1) + typdesc = _(doc_fields_with_arg[typ]) + if _is_only_paragraph(fbody): + children = fbody.children[0].children + else: + children = fbody.children + if typdesc == '%param': + if not params: + pfield = nodes.field() + pfield += nodes.field_name('', _('Parameters')) + pfield += nodes.field_body() + params = nodes.bullet_list() + pfield[1] += params + new_list += pfield + dlitem = nodes.list_item() + dlpar = nodes.paragraph() + dlpar += nodes.emphasis(obj, obj) + dlpar += nodes.Text(' -- ', ' -- ') + dlpar += children + param_nodes[obj] = dlpar + dlitem += dlpar + params += dlitem + elif typdesc == '%type': + typenodes = fbody.children + if _is_only_paragraph(fbody): + typenodes = [nodes.Text(' (')] + \ + typenodes[0].children + [nodes.Text(')')] + param_types[obj] = typenodes + else: + fieldname = typdesc + ' ' + nfield = nodes.field() + nfieldname = nodes.field_name(fieldname, fieldname) + nfield += nfieldname + node = nfieldname + if typ in doc_fields_with_linked_arg: + node = addnodes.pending_xref(obj, reftype='obj', + refcaption=False, + reftarget=obj, + modname=env.currmodule, + classname=env.currclass) + nfieldname += node + node += nodes.Text(obj, obj) + nfield += nodes.field_body() + nfield[1] += fbody.children + new_list += nfield + except (KeyError, ValueError): + fnametext = fname.astext() + try: + typ = _(doc_fields_without_arg[fnametext]) + except KeyError: + # at least capitalize the field name + typ = fnametext.capitalize() + fname[0] = nodes.Text(typ) + new_list += field + for param, type in param_types.iteritems(): + if param in param_nodes: + param_nodes[param][1:1] = type + child.replace_self(new_list) + + +# ------ functions to parse a Python or C signature and create desc_* nodes. + +py_sig_re = re.compile( + r'''^ ([\w.]*\.)? # class name(s) + (\w+) \s* # thing name + (?: \((.*)\) # optional arguments + (\s* -> \s* .*)? )? $ # optional return annotation + ''', re.VERBOSE) + +py_paramlist_re = re.compile(r'([\[\],])') # split at '[', ']' and ',' + +def parse_py_signature(signode, sig, desctype, module, env): + """ + Transform a python signature into RST nodes. + Return (fully qualified name of the thing, classname if any). + + If inside a class, the current class name is handled intelligently: + * it is stripped from the displayed name if present + * it is added to the full name (return value) if not present + """ + m = py_sig_re.match(sig) + if m is None: + raise ValueError + classname, name, arglist, retann = m.groups() + + if retann: + retann = u' \N{RIGHTWARDS ARROW} ' + retann.strip()[2:] + + if env.currclass: + add_module = False + if classname and classname.startswith(env.currclass): + fullname = classname + name + # class name is given again in the signature + classname = classname[len(env.currclass):].lstrip('.') + elif classname: + # class name is given in the signature, but different + # (shouldn't happen) + fullname = env.currclass + '.' + classname + name + else: + # class name is not given in the signature + fullname = env.currclass + '.' + name + else: + add_module = True + fullname = classname and classname + name or name + + if desctype == 'staticmethod': + signode += addnodes.desc_annotation('static ', 'static ') + + if classname: + signode += addnodes.desc_addname(classname, classname) + # exceptions are a special case, since they are documented in the + # 'exceptions' module. + elif add_module and env.config.add_module_names and \ + module and module != 'exceptions': + nodetext = module + '.' + signode += addnodes.desc_addname(nodetext, nodetext) + + signode += addnodes.desc_name(name, name) + if not arglist: + if desctype in ('function', 'method', 'staticmethod'): + # for callables, add an empty parameter list + signode += addnodes.desc_parameterlist() + if retann: + signode += addnodes.desc_type(retann, retann) + return fullname, classname + signode += addnodes.desc_parameterlist() + + stack = [signode[-1]] + for token in py_paramlist_re.split(arglist): + if token == '[': + opt = addnodes.desc_optional() + stack[-1] += opt + stack.append(opt) + elif token == ']': + try: + stack.pop() + except IndexError: + raise ValueError + elif not token or token == ',' or token.isspace(): + pass + else: + token = token.strip() + stack[-1] += addnodes.desc_parameter(token, token) + if len(stack) != 1: + raise ValueError + if retann: + signode += addnodes.desc_type(retann, retann) + return fullname, classname + + +c_sig_re = re.compile( + r'''^([^(]*?) # return type + ([\w:]+) \s* # thing name (colon allowed for C++ class names) + (?: \((.*)\) )? # optionally arguments + (\s+const)? $ # const specifier + ''', re.VERBOSE) +c_funcptr_sig_re = re.compile( + r'''^([^(]+?) # return type + (\( [^()]+ \)) \s* # name in parentheses + \( (.*) \) # arguments + (\s+const)? $ # const specifier + ''', re.VERBOSE) +c_funcptr_name_re = re.compile(r'^\(\s*\*\s*(.*?)\s*\)$') + +# RE to split at word boundaries +wsplit_re = re.compile(r'(\W+)') + +# These C types aren't described in the reference, so don't try to create +# a cross-reference to them +stopwords = set(('const', 'void', 'char', 'int', 'long', 'FILE', 'struct')) + +def parse_c_type(node, ctype): + # add cross-ref nodes for all words + for part in filter(None, wsplit_re.split(ctype)): + tnode = nodes.Text(part, part) + if part[0] in string.letters+'_' and part not in stopwords: + pnode = addnodes.pending_xref( + '', reftype='ctype', reftarget=part, modname=None, classname=None) + pnode += tnode + node += pnode + else: + node += tnode + +def parse_c_signature(signode, sig, desctype): + """Transform a C (or C++) signature into RST nodes.""" + # first try the function pointer signature regex, it's more specific + m = c_funcptr_sig_re.match(sig) + if m is None: + m = c_sig_re.match(sig) + if m is None: + raise ValueError('no match') + rettype, name, arglist, const = m.groups() + + signode += addnodes.desc_type('', '') + parse_c_type(signode[-1], rettype) + try: + classname, funcname = name.split('::', 1) + classname += '::' + signode += addnodes.desc_addname(classname, classname) + signode += addnodes.desc_name(funcname, funcname) + # name (the full name) is still both parts + except ValueError: + signode += addnodes.desc_name(name, name) + # clean up parentheses from canonical name + m = c_funcptr_name_re.match(name) + if m: + name = m.group(1) + if not arglist: + if desctype == 'cfunction': + # for functions, add an empty parameter list + signode += addnodes.desc_parameterlist() + return name + + paramlist = addnodes.desc_parameterlist() + arglist = arglist.replace('`', '').replace('\\ ', '') # remove markup + # this messes up function pointer types, but not too badly ;) + args = arglist.split(',') + for arg in args: + arg = arg.strip() + param = addnodes.desc_parameter('', '', noemph=True) + try: + ctype, argname = arg.rsplit(' ', 1) + except ValueError: + # no argument name given, only the type + parse_c_type(param, arg) + else: + parse_c_type(param, ctype) + param += nodes.emphasis(' '+argname, ' '+argname) + paramlist += param + signode += paramlist + if const: + signode += addnodes.desc_addname(const, const) + return name + + +option_desc_re = re.compile( + r'((?:/|-|--)[-_a-zA-Z0-9]+)(\s*.*?)(?=,\s+(?:/|-|--)|$)') + +def parse_option_desc(signode, sig): + """Transform an option description into RST nodes.""" + count = 0 + firstname = '' + for m in option_desc_re.finditer(sig): + optname, args = m.groups() + if count: + signode += addnodes.desc_addname(', ', ', ') + signode += addnodes.desc_name(optname, optname) + signode += addnodes.desc_addname(args, args) + if not count: + firstname = optname + count += 1 + if not firstname: + raise ValueError + return firstname + + +strip_backslash_re = re.compile(r'\\(?=[^\\])') + +def desc_directive(desctype, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + env = state.document.settings.env + inode = addnodes.index(entries=[]) + node = addnodes.desc() + node['desctype'] = desctype + + noindex = ('noindex' in options) + node['noindex'] = noindex + # remove backslashes to support (dummy) escapes; helps Vim's highlighting + signatures = map(lambda s: strip_backslash_re.sub('', s.strip()), + arguments[0].split('\n')) + names = [] + clsname = None + module = options.get('module', env.currmodule) + for i, sig in enumerate(signatures): + # add a signature node for each signature in the current unit + # and add a reference target for it + sig = sig.strip() + signode = addnodes.desc_signature(sig, '') + signode['first'] = False + node.append(signode) + try: + if desctype in ('function', 'data', 'class', 'exception', + 'method', 'staticmethod', 'attribute'): + name, clsname = parse_py_signature(signode, sig, desctype, module, env) + elif desctype in ('cfunction', 'cmember', 'cmacro', 'ctype', 'cvar'): + name = parse_c_signature(signode, sig, desctype) + elif desctype == 'cmdoption': + optname = parse_option_desc(signode, sig) + if not noindex: + targetname = optname.replace('/', '-') + if env.currprogram: + targetname = '-' + env.currprogram + targetname + targetname = 'cmdoption' + targetname + signode['ids'].append(targetname) + state.document.note_explicit_target(signode) + inode['entries'].append( + ('pair', _('%scommand line option; %s') % + ((env.currprogram and env.currprogram + ' ' or ''), sig), + targetname, targetname)) + env.note_progoption(optname, targetname) + continue + elif desctype == 'describe': + signode.clear() + signode += addnodes.desc_name(sig, sig) + continue + else: + # another registered generic x-ref directive + rolename, indextemplate, parse_node = additional_xref_types[desctype] + if parse_node: + fullname = parse_node(env, sig, signode) + else: + signode.clear() + signode += addnodes.desc_name(sig, sig) + # normalize whitespace like xfileref_role does + fullname = ws_re.sub('', sig) + if not noindex: + targetname = '%s-%s' % (rolename, fullname) + signode['ids'].append(targetname) + state.document.note_explicit_target(signode) + if indextemplate: + indexentry = _(indextemplate) % (fullname,) + indextype = 'single' + colon = indexentry.find(':') + if colon != -1: + indextype = indexentry[:colon].strip() + indexentry = indexentry[colon+1:].strip() + inode['entries'].append((indextype, indexentry, + targetname, targetname)) + env.note_reftarget(rolename, fullname, targetname) + # don't use object indexing below + continue + except ValueError, err: + # signature parsing failed + signode.clear() + signode += addnodes.desc_name(sig, sig) + continue # we don't want an index entry here + # only add target and index entry if this is the first description of the + # function name in this desc block + if not noindex and name not in names: + fullname = (module and module + '.' or '') + name + # note target + if fullname not in state.document.ids: + signode['names'].append(fullname) + signode['ids'].append(fullname) + signode['first'] = (not names) + state.document.note_explicit_target(signode) + env.note_descref(fullname, desctype, lineno) + names.append(name) + + indextext = desc_index_text(desctype, module, name, + env.config.add_module_names) + inode['entries'].append(('single', indextext, fullname, fullname)) + + subnode = addnodes.desc_content() + # needed for automatic qualification of members + clsname_set = False + if desctype in ('class', 'exception') and names: + env.currclass = names[0] + clsname_set = True + elif desctype in ('method', 'staticmethod', 'attribute') and \ + clsname and not env.currclass: + env.currclass = clsname.strip('.') + clsname_set = True + # needed for association of version{added,changed} directives + if names: + env.currdesc = names[0] + state.nested_parse(content, content_offset, subnode) + handle_doc_fields(subnode, env) + if clsname_set: + env.currclass = None + env.currdesc = None + node.append(subnode) + return [inode, node] + +desc_directive.content = 1 +desc_directive.arguments = (1, 0, 1) +desc_directive.options = {'noindex': directives.flag, + 'module': directives.unchanged} + +desctypes = [ + # the Python ones + 'function', + 'data', + 'class', + 'method', + 'staticmethod', + 'attribute', + 'exception', + # the C ones + 'cfunction', + 'cmember', + 'cmacro', + 'ctype', + 'cvar', + # for command line options + 'cmdoption', + # the generic one + 'describe', + 'envvar', +] + +for _name in desctypes: + directives.register_directive(_name, desc_directive) + +_ = lambda x: x + +# Generic cross-reference types; they can be registered in the application; +# the directives are either desc_directive or target_directive +additional_xref_types = { + # directive name: (role name, index text, function to parse the desc node) + 'envvar': ('envvar', _('environment variable; %s'), None), +} + +del _ + + +# ------ target -------------------------------------------------------------------- + +def target_directive(targettype, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + """Generic target for user-defined cross-reference types.""" + env = state.document.settings.env + rolename, indextemplate, foo = additional_xref_types[targettype] + # normalize whitespace in fullname like xfileref_role does + fullname = ws_re.sub('', arguments[0].strip()) + targetname = '%s-%s' % (rolename, fullname) + node = nodes.target('', '', ids=[targetname]) + state.document.note_explicit_target(node) + ret = [node] + if indextemplate: + indexentry = indextemplate % (fullname,) + indextype = 'single' + colon = indexentry.find(':') + if colon != -1: + indextype = indexentry[:colon].strip() + indexentry = indexentry[colon+1:].strip() + inode = addnodes.index(entries=[(indextype, indexentry, targetname, targetname)]) + ret.insert(0, inode) + env.note_reftarget(rolename, fullname, targetname) + return ret + +target_directive.content = 0 +target_directive.arguments = (1, 0, 1) + +# note, the target directive is not registered here, it is used by the application +# when registering additional xref types diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/other.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/directives/other.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,411 @@ +# -*- coding: utf-8 -*- +""" + sphinx.directives.other + ~~~~~~~~~~~~~~~~~~~~~~~ + + :copyright: 2007-2008 by Georg Brandl. + :license: BSD. +""" + +import re +import posixpath + +from docutils import nodes +from docutils.parsers.rst import directives + +from sphinx import addnodes +from sphinx.locale import pairindextypes +from sphinx.util import patfilter, ws_re, caption_ref_re +from sphinx.util.compat import make_admonition + + +# ------ the TOC tree --------------------------------------------------------------- + +def toctree_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + env = state.document.settings.env + suffix = env.config.source_suffix + dirname = posixpath.dirname(env.docname) + glob = 'glob' in options + + ret = [] + subnode = addnodes.toctree() + includefiles = [] + includetitles = {} + all_docnames = env.found_docs.copy() + # don't add the currently visited file in catch-all patterns + all_docnames.remove(env.docname) + for entry in content: + if not entry: + continue + if not glob: + # look for explicit titles and documents ("Some Title "). + m = caption_ref_re.match(entry) + if m: + docname = m.group(2) + includetitles[docname] = m.group(1) + else: + docname = entry + # remove suffixes (backwards compatibility) + if docname.endswith(suffix): + docname = docname[:-len(suffix)] + # absolutize filenames + docname = posixpath.normpath(posixpath.join(dirname, docname)) + if docname not in env.found_docs: + ret.append(state.document.reporter.warning( + 'toctree references unknown document %r' % docname, line=lineno)) + else: + includefiles.append(docname) + else: + patname = posixpath.normpath(posixpath.join(dirname, entry)) + docnames = sorted(patfilter(all_docnames, patname)) + for docname in docnames: + all_docnames.remove(docname) # don't include it again + includefiles.append(docname) + if not docnames: + ret.append(state.document.reporter.warning( + 'toctree glob pattern %r didn\'t match any documents' % entry, + line=lineno)) + subnode['includefiles'] = includefiles + subnode['includetitles'] = includetitles + subnode['maxdepth'] = options.get('maxdepth', -1) + subnode['glob'] = glob + ret.append(subnode) + return ret + +toctree_directive.content = 1 +toctree_directive.options = {'maxdepth': int, 'glob': directives.flag} +directives.register_directive('toctree', toctree_directive) + + +# ------ section metadata ---------------------------------------------------------- + +def module_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + env = state.document.settings.env + modname = arguments[0].strip() + noindex = 'noindex' in options + env.currmodule = modname + env.note_module(modname, options.get('synopsis', ''), + options.get('platform', ''), + 'deprecated' in options) + modulenode = addnodes.module() + modulenode['modname'] = modname + modulenode['synopsis'] = options.get('synopsis', '') + targetnode = nodes.target('', '', ids=['module-' + modname]) + state.document.note_explicit_target(targetnode) + ret = [modulenode, targetnode] + if 'platform' in options: + modulenode['platform'] = options['platform'] + node = nodes.paragraph() + node += nodes.emphasis('', _('Platforms: ')) + node += nodes.Text(options['platform'], options['platform']) + ret.append(node) + # the synopsis isn't printed; in fact, it is only used in the modindex currently + if not noindex: + indextext = _('%s (module)') % modname + inode = addnodes.index(entries=[('single', indextext, + 'module-' + modname, modname)]) + ret.insert(0, inode) + return ret + +module_directive.arguments = (1, 0, 0) +module_directive.options = {'platform': lambda x: x, + 'synopsis': lambda x: x, + 'noindex': directives.flag, + 'deprecated': directives.flag} +directives.register_directive('module', module_directive) + + +def currentmodule_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + # This directive is just to tell people that we're documenting + # stuff in module foo, but links to module foo won't lead here. + env = state.document.settings.env + modname = arguments[0].strip() + if modname == 'None': + env.currmodule = None + else: + env.currmodule = modname + return [] + +currentmodule_directive.arguments = (1, 0, 0) +directives.register_directive('currentmodule', currentmodule_directive) + + +def author_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + # Show authors only if the show_authors option is on + env = state.document.settings.env + if not env.config.show_authors: + return [] + para = nodes.paragraph() + emph = nodes.emphasis() + para += emph + if name == 'sectionauthor': + text = _('Section author: ') + elif name == 'moduleauthor': + text = _('Module author: ') + else: + text = _('Author: ') + emph += nodes.Text(text, text) + inodes, messages = state.inline_text(arguments[0], lineno) + emph.extend(inodes) + return [para] + messages + +author_directive.arguments = (1, 0, 1) +directives.register_directive('sectionauthor', author_directive) +directives.register_directive('moduleauthor', author_directive) + + +def program_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + env = state.document.settings.env + program = ws_re.sub('-', arguments[0].strip()) + if program == 'None': + env.currprogram = None + else: + env.currprogram = program + return [] + +program_directive.arguments = (1, 0, 1) +directives.register_directive('program', program_directive) + + +# ------ index markup -------------------------------------------------------------- + +indextypes = [ + 'single', 'pair', 'triple', +] + +def index_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + arguments = arguments[0].split('\n') + env = state.document.settings.env + targetid = 'index-%s' % env.index_num + env.index_num += 1 + targetnode = nodes.target('', '', ids=[targetid]) + state.document.note_explicit_target(targetnode) + indexnode = addnodes.index() + indexnode['entries'] = ne = [] + for entry in arguments: + entry = entry.strip() + for type in pairindextypes: + if entry.startswith(type+':'): + value = entry[len(type)+1:].strip() + value = pairindextypes[type] + '; ' + value + ne.append(('pair', value, targetid, value)) + break + else: + for type in indextypes: + if entry.startswith(type+':'): + value = entry[len(type)+1:].strip() + ne.append((type, value, targetid, value)) + break + # shorthand notation for single entries + else: + for value in entry.split(','): + value = value.strip() + if not value: + continue + ne.append(('single', value, targetid, value)) + return [indexnode, targetnode] + +index_directive.arguments = (1, 0, 1) +directives.register_directive('index', index_directive) + +# ------ versionadded/versionchanged ----------------------------------------------- + +def version_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + node = addnodes.versionmodified() + node['type'] = name + node['version'] = arguments[0] + if len(arguments) == 2: + inodes, messages = state.inline_text(arguments[1], lineno+1) + node.extend(inodes) + if content: + state.nested_parse(content, content_offset, node) + ret = [node] + messages + else: + ret = [node] + env = state.document.settings.env + env.note_versionchange(node['type'], node['version'], node, lineno) + return ret + +version_directive.arguments = (1, 1, 1) +version_directive.content = 1 + +directives.register_directive('deprecated', version_directive) +directives.register_directive('versionadded', version_directive) +directives.register_directive('versionchanged', version_directive) + + +# ------ see also ------------------------------------------------------------------ + +def seealso_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + ret = make_admonition( + addnodes.seealso, name, [_('See also')], options, content, + lineno, content_offset, block_text, state, state_machine) + if arguments: + argnodes, msgs = state.inline_text(arguments[0], lineno) + para = nodes.paragraph() + para += argnodes + para += msgs + ret[0].insert(1, para) + return ret + +seealso_directive.content = 1 +seealso_directive.arguments = (0, 1, 1) +directives.register_directive('seealso', seealso_directive) + + +# ------ production list (for the reference) --------------------------------------- + +token_re = re.compile('`([a-z_]+)`') + +def token_xrefs(text, env): + retnodes = [] + pos = 0 + for m in token_re.finditer(text): + if m.start() > pos: + txt = text[pos:m.start()] + retnodes.append(nodes.Text(txt, txt)) + refnode = addnodes.pending_xref(m.group(1)) + refnode['reftype'] = 'token' + refnode['reftarget'] = m.group(1) + refnode['modname'] = env.currmodule + refnode['classname'] = env.currclass + refnode += nodes.literal(m.group(1), m.group(1), classes=['xref']) + retnodes.append(refnode) + pos = m.end() + if pos < len(text): + retnodes.append(nodes.Text(text[pos:], text[pos:])) + return retnodes + +def productionlist_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + env = state.document.settings.env + node = addnodes.productionlist() + messages = [] + i = 0 + + for rule in arguments[0].split('\n'): + if i == 0 and ':' not in rule: + # production group + continue + i += 1 + try: + name, tokens = rule.split(':', 1) + except ValueError: + break + subnode = addnodes.production() + subnode['tokenname'] = name.strip() + if subnode['tokenname']: + idname = 'grammar-token-%s' % subnode['tokenname'] + if idname not in state.document.ids: + subnode['ids'].append(idname) + state.document.note_implicit_target(subnode, subnode) + env.note_reftarget('token', subnode['tokenname'], idname) + subnode.extend(token_xrefs(tokens, env)) + node.append(subnode) + return [node] + messages + +productionlist_directive.content = 0 +productionlist_directive.arguments = (1, 0, 1) +directives.register_directive('productionlist', productionlist_directive) + + +# ------ glossary directive --------------------------------------------------------- + +def glossary_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + """Glossary with cross-reference targets for :term: roles.""" + env = state.document.settings.env + node = addnodes.glossary() + state.nested_parse(content, content_offset, node) + + # the content should be definition lists + dls = [child for child in node if isinstance(child, nodes.definition_list)] + # now, extract definition terms to enable cross-reference creation + for dl in dls: + dl['classes'].append('glossary') + for li in dl.children: + if not li.children or not isinstance(li[0], nodes.term): + continue + termtext = li.children[0].astext() + new_id = 'term-' + nodes.make_id(termtext) + if new_id in env.gloss_entries: + new_id = 'term-' + str(len(env.gloss_entries)) + env.gloss_entries.add(new_id) + li[0]['names'].append(new_id) + li[0]['ids'].append(new_id) + state.document.settings.env.note_reftarget('term', termtext.lower(), + new_id) + # add an index entry too + indexnode = addnodes.index() + indexnode['entries'] = [('single', termtext, new_id, termtext)] + li.insert(0, indexnode) + return [node] + +glossary_directive.content = 1 +glossary_directive.arguments = (0, 0, 0) +directives.register_directive('glossary', glossary_directive) + + +# ------ miscellaneous markup ------------------------------------------------------- + +def centered_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + if not arguments: + return [] + subnode = addnodes.centered() + inodes, messages = state.inline_text(arguments[0], lineno) + subnode.extend(inodes) + return [subnode] + messages + +centered_directive.arguments = (1, 0, 1) +directives.register_directive('centered', centered_directive) + + +def acks_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + node = addnodes.acks() + state.nested_parse(content, content_offset, node) + if len(node.children) != 1 or not isinstance(node.children[0], nodes.bullet_list): + return [state.document.reporter.warning('.. acks content is not a list', + line=lineno)] + return [node] + +acks_directive.content = 1 +acks_directive.arguments = (0, 0, 0) +directives.register_directive('acks', acks_directive) + + +def tabularcolumns_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + # support giving explicit tabulary column definition to latex + node = addnodes.tabular_col_spec() + node['spec'] = arguments[0] + return [node] + +tabularcolumns_directive.content = 0 +tabularcolumns_directive.arguments = (1, 0, 1) +directives.register_directive('tabularcolumns', tabularcolumns_directive) + + +# register the standard rst class directive under a different name + +try: + # docutils 0.4 + from docutils.parsers.rst.directives.misc import class_directive + directives.register_directive('cssclass', class_directive) +except ImportError: + try: + # docutils 0.5 + from docutils.parsers.rst.directives.misc import Class + directives.register_directive('cssclass', Class) + except ImportError: + # whatever :) + pass diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/environment.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/environment.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1387 @@ +# -*- coding: utf-8 -*- +""" + sphinx.environment + ~~~~~~~~~~~~~~~~~~ + + Global creation environment. + + :copyright: 2007-2008 by Georg Brandl. + :license: BSD. +""" + +import re +import os +import time +import heapq +import types +import imghdr +import difflib +import cPickle as pickle +from os import path +from glob import glob +from string import uppercase +from itertools import izip, groupby +try: + import hashlib + md5 = hashlib.md5 +except ImportError: + # 2.4 compatibility + import md5 + md5 = md5.new + +from docutils import nodes +from docutils.io import FileInput, NullOutput +from docutils.core import Publisher +from docutils.utils import Reporter, relative_path +from docutils.readers import standalone +from docutils.parsers.rst import roles +from docutils.parsers.rst.languages import en as english +from docutils.parsers.rst.directives.html import MetaBody +from docutils.writers import UnfilteredWriter +from docutils.transforms import Transform +from docutils.transforms.parts import ContentsFilter + +from sphinx import addnodes +from sphinx.util import get_matching_docs, SEP, ustrftime +from sphinx.directives import additional_xref_types + +default_settings = { + 'embed_stylesheet': False, + 'cloak_email_addresses': True, + 'pep_base_url': 'http://www.python.org/dev/peps/', + 'rfc_base_url': 'http://rfc.net/', + 'input_encoding': 'utf-8', + 'doctitle_xform': False, + 'sectsubtitle_xform': False, +} + +# This is increased every time an environment attribute is added +# or changed to properly invalidate pickle files. +ENV_VERSION = 26 + + +default_substitutions = set([ + 'version', + 'release', + 'today', +]) + +dummy_reporter = Reporter('', 4, 4) + + +class RedirStream(object): + def __init__(self, writefunc): + self.writefunc = writefunc + def write(self, text): + if text.strip(): + self.writefunc(text) + + +class NoUri(Exception): + """Raised by get_relative_uri if there is no URI available.""" + pass + + +class DefaultSubstitutions(Transform): + """ + Replace some substitutions if they aren't defined in the document. + """ + # run before the default Substitutions + default_priority = 210 + + def apply(self): + config = self.document.settings.env.config + # only handle those not otherwise defined in the document + to_handle = default_substitutions - set(self.document.substitution_defs) + for ref in self.document.traverse(nodes.substitution_reference): + refname = ref['refname'] + if refname in to_handle: + text = config[refname] + if refname == 'today' and not text: + # special handling: can also specify a strftime format + text = ustrftime(config.today_fmt or _('%B %d, %Y')) + ref.replace_self(nodes.Text(text, text)) + + +class MoveModuleTargets(Transform): + """ + Move module targets to their nearest enclosing section title. + """ + default_priority = 210 + + def apply(self): + for node in self.document.traverse(nodes.target): + if not node['ids']: + continue + if node['ids'][0].startswith('module-') and \ + node.parent.__class__ is nodes.section: + node.parent['ids'] = node['ids'] + node.parent.remove(node) + + +class HandleCodeBlocks(Transform): + """ + Move doctest blocks out of blockquotes. + """ + default_priority = 210 + + def apply(self): + for node in self.document.traverse(nodes.block_quote): + if len(node.children) == 1 and isinstance(node.children[0], + nodes.doctest_block): + node.replace_self(node.children[0]) + +class CitationReferences(Transform): + """ + Handle citation references before the default docutils transform does. + """ + default_priority = 619 + + def apply(self): + for citnode in self.document.traverse(nodes.citation_reference): + cittext = citnode.astext() + refnode = addnodes.pending_xref(cittext, reftype='citation', + reftarget=cittext) + refnode += nodes.Text('[' + cittext + ']') + citnode.parent.replace(citnode, refnode) + + +class SphinxStandaloneReader(standalone.Reader): + """ + Add our own transforms. + """ + transforms = [CitationReferences, DefaultSubstitutions, MoveModuleTargets, + HandleCodeBlocks] + + def get_transforms(self): + return standalone.Reader.get_transforms(self) + self.transforms + + +class SphinxDummyWriter(UnfilteredWriter): + supported = ('html',) # needed to keep "meta" nodes + + def translate(self): + pass + + + +class SphinxContentsFilter(ContentsFilter): + """ + Used with BuildEnvironment.add_toc_from() to discard cross-file links + within table-of-contents link nodes. + """ + def visit_pending_xref(self, node): + text = node.astext() + self.parent.append(nodes.literal(text, text)) + raise nodes.SkipNode + + +class BuildEnvironment: + """ + The environment in which the ReST files are translated. + Stores an inventory of cross-file targets and provides doctree + transformations to resolve links to them. + """ + + # --------- ENVIRONMENT PERSISTENCE ---------------------------------------- + + @staticmethod + def frompickle(config, filename): + picklefile = open(filename, 'rb') + try: + env = pickle.load(picklefile) + finally: + picklefile.close() + env.config.values = config.values + if env.version != ENV_VERSION: + raise IOError('env version not current') + return env + + def topickle(self, filename): + # remove unpicklable attributes + warnfunc = self._warnfunc + self.set_warnfunc(None) + values = self.config.values + del self.config.values + picklefile = open(filename, 'wb') + # remove potentially pickling-problematic values from config + for key, val in vars(self.config).items(): + if key.startswith('_') or \ + isinstance(val, types.ModuleType) or \ + isinstance(val, types.FunctionType) or \ + isinstance(val, (type, types.ClassType)): + del self.config[key] + try: + pickle.dump(self, picklefile, pickle.HIGHEST_PROTOCOL) + finally: + picklefile.close() + # reset attributes + self.config.values = values + self.set_warnfunc(warnfunc) + + # --------- ENVIRONMENT INITIALIZATION ------------------------------------- + + def __init__(self, srcdir, doctreedir, config): + self.doctreedir = doctreedir + self.srcdir = srcdir + self.config = config + + # the application object; only set while update() runs + self.app = None + + # the docutils settings for building + self.settings = default_settings.copy() + self.settings['env'] = self + + # the function to write warning messages with + self._warnfunc = None + + # this is to invalidate old pickles + self.version = ENV_VERSION + + # All "docnames" here are /-separated and relative and exclude the source suffix. + + self.found_docs = set() # contains all existing docnames + self.all_docs = {} # docname -> mtime at the time of build + # contains all built docnames + self.dependencies = {} # docname -> set of dependent file names, relative to + # documentation root + + # File metadata + self.metadata = {} # docname -> dict of metadata items + + # TOC inventory + self.titles = {} # docname -> title node + self.tocs = {} # docname -> table of contents nodetree + self.toc_num_entries = {} # docname -> number of real entries + # used to determine when to show the TOC in a sidebar + # (don't show if it's only one item) + self.toctree_includes = {} # docname -> list of toctree includefiles + self.files_to_rebuild = {} # docname -> set of files (containing its TOCs) + # to rebuild too + self.glob_toctrees = set() # docnames that have :glob: toctrees + + # X-ref target inventory + self.descrefs = {} # fullname -> docname, desctype + self.filemodules = {} # docname -> [modules] + self.modules = {} # modname -> docname, synopsis, platform, deprecated + self.labels = {} # labelname -> docname, labelid, sectionname + self.anonlabels = {} # labelname -> docname, labelid + self.progoptions = {} # (program, name) -> docname, labelid + self.reftargets = {} # (type, name) -> docname, labelid + # where type is term, token, envvar, citation + + # Other inventories + self.indexentries = {} # docname -> list of + # (type, string, target, aliasname) + self.versionchanges = {} # version -> list of + # (type, docname, lineno, module, descname, content) + self.images = {} # absolute path -> (docnames, unique filename) + + # These are set while parsing a file + self.docname = None # current document name + self.currmodule = None # current module name + self.currclass = None # current class name + self.currdesc = None # current descref name + self.currprogram = None # current program name + self.index_num = 0 # autonumber for index targets + self.gloss_entries = set() # existing definition labels + + # Some magically present labels + self.labels['genindex'] = ('genindex', '', _('Index')) + self.labels['modindex'] = ('modindex', '', _('Module Index')) + self.labels['search'] = ('search', '', _('Search Page')) + + def set_warnfunc(self, func): + self._warnfunc = func + self.settings['warning_stream'] = RedirStream(func) + + def warn(self, docname, msg, lineno=None): + if docname: + if lineno is None: + lineno = '' + self._warnfunc('%s:%s: %s' % (self.doc2path(docname), lineno, msg)) + else: + self._warnfunc('GLOBAL:: ' + msg) + + def clear_doc(self, docname): + """Remove all traces of a source file in the inventory.""" + if docname in self.all_docs: + self.all_docs.pop(docname, None) + self.metadata.pop(docname, None) + self.dependencies.pop(docname, None) + self.titles.pop(docname, None) + self.tocs.pop(docname, None) + self.toc_num_entries.pop(docname, None) + self.toctree_includes.pop(docname, None) + self.filemodules.pop(docname, None) + self.indexentries.pop(docname, None) + self.glob_toctrees.discard(docname) + + for subfn, fnset in self.files_to_rebuild.items(): + fnset.discard(docname) + if not fnset: + del self.files_to_rebuild[subfn] + for fullname, (fn, _) in self.descrefs.items(): + if fn == docname: + del self.descrefs[fullname] + for modname, (fn, _, _, _) in self.modules.items(): + if fn == docname: + del self.modules[modname] + for labelname, (fn, _, _) in self.labels.items(): + if fn == docname: + del self.labels[labelname] + for key, (fn, _) in self.reftargets.items(): + if fn == docname: + del self.reftargets[key] + for key, (fn, _) in self.progoptions.items(): + if fn == docname: + del self.progoptions[key] + for version, changes in self.versionchanges.items(): + new = [change for change in changes if change[1] != docname] + changes[:] = new + for fullpath, (docs, _) in self.images.items(): + docs.discard(docname) + if not docs: + del self.images[fullpath] + + def doc2path(self, docname, base=True, suffix=None): + """ + Return the filename for the document name. + If base is True, return absolute path under self.srcdir. + If base is None, return relative path to self.srcdir. + If base is a path string, return absolute path under that. + If suffix is not None, add it instead of config.source_suffix. + """ + suffix = suffix or self.config.source_suffix + if base is True: + return path.join(self.srcdir, docname.replace(SEP, path.sep)) + suffix + elif base is None: + return docname.replace(SEP, path.sep) + suffix + else: + return path.join(base, docname.replace(SEP, path.sep)) + suffix + + def find_files(self, config): + """ + Find all source files in the source dir and put them in self.found_docs. + """ + exclude_dirs = [d.replace(SEP, path.sep) for d in config.exclude_dirs] + exclude_trees = [d.replace(SEP, path.sep) for d in config.exclude_trees] + self.found_docs = set(get_matching_docs( + self.srcdir, config.source_suffix, exclude_docs=set(config.unused_docs), + exclude_dirs=exclude_dirs, exclude_trees=exclude_trees, + exclude_dirnames=['_sources'] + config.exclude_dirnames)) + + def get_outdated_files(self, config_changed): + """ + Return (added, changed, removed) sets. + """ + # clear all files no longer present + removed = set(self.all_docs) - self.found_docs + + added = set() + changed = set() + + if config_changed: + # config values affect e.g. substitutions + added = self.found_docs + else: + for docname in self.found_docs: + if docname not in self.all_docs: + added.add(docname) + continue + # if the doctree file is not there, rebuild + if not path.isfile(self.doc2path(docname, self.doctreedir, + '.doctree')): + changed.add(docname) + continue + # check the mtime of the document + mtime = self.all_docs[docname] + newmtime = path.getmtime(self.doc2path(docname)) + if newmtime > mtime: + changed.add(docname) + continue + # finally, check the mtime of dependencies + for dep in self.dependencies.get(docname, ()): + try: + # this will do the right thing when dep is absolute too + deppath = path.join(self.srcdir, dep) + if not path.isfile(deppath): + changed.add(docname) + break + depmtime = path.getmtime(deppath) + if depmtime > mtime: + changed.add(docname) + break + except EnvironmentError: + # give it another chance + changed.add(docname) + break + + return added, changed, removed + + def update(self, config, srcdir, doctreedir, app=None): + """(Re-)read all files new or changed since last update. Yields a summary + and then docnames as it processes them. Store all environment docnames + in the canonical format (ie using SEP as a separator in place of + os.path.sep).""" + config_changed = False + if self.config is None: + msg = '[new config] ' + config_changed = True + else: + # check if a config value was changed that affects how doctrees are read + for key, descr in config.config_values.iteritems(): + if not descr[1]: + continue + if self.config[key] != config[key]: + msg = '[config changed] ' + config_changed = True + break + else: + msg = '' + # this value is not covered by the above loop because it is handled + # specially by the config class + if self.config.extensions != config.extensions: + msg = '[extensions changed] ' + config_changed = True + # the source and doctree directories may have been relocated + self.srcdir = srcdir + self.doctreedir = doctreedir + self.find_files(config) + + added, changed, removed = self.get_outdated_files(config_changed) + + # if files were added or removed, all documents with globbed toctrees + # must be reread + if added or removed: + changed.update(self.glob_toctrees) + + msg += '%s added, %s changed, %s removed' % (len(added), len(changed), + len(removed)) + yield msg + + self.config = config + self.app = app + + # clear all files no longer present + for docname in removed: + if app: + app.emit('env-purge-doc', self, docname) + self.clear_doc(docname) + + # read all new and changed files + for docname in sorted(added | changed): + yield docname + self.read_doc(docname, app=app) + + if config.master_doc not in self.all_docs: + self.warn(None, 'master file %s not found' % + self.doc2path(config.master_doc)) + + self.app = None + + # remove all non-existing images from inventory + for imgsrc in self.images.keys(): + if not os.access(path.join(self.srcdir, imgsrc), os.R_OK): + del self.images[imgsrc] + + if app: + app.emit('env-updated', self) + + + # --------- SINGLE FILE READING -------------------------------------------- + + def read_doc(self, docname, src_path=None, save_parsed=True, app=None): + """ + Parse a file and add/update inventory entries for the doctree. + If srcpath is given, read from a different source file. + """ + # remove all inventory entries for that file + if app: + app.emit('env-purge-doc', self, docname) + self.clear_doc(docname) + + if src_path is None: + src_path = self.doc2path(docname) + + if self.config.default_role: + role_fn, messages = roles.role(self.config.default_role, english, + 0, dummy_reporter) + if role_fn: + roles._roles[''] = role_fn + else: + self.warn(docname, 'default role %s not found' % + self.config.default_role) + + self.docname = docname + self.settings['input_encoding'] = self.config.source_encoding + + class SphinxSourceClass(FileInput): + def read(self): + data = FileInput.read(self) + if app: + arg = [data] + app.emit('source-read', docname, arg) + data = arg[0] + return data + + # publish manually + pub = Publisher(reader=SphinxStandaloneReader(), + writer=SphinxDummyWriter(), + source_class=SphinxSourceClass, + destination_class=NullOutput) + pub.set_components(None, 'restructuredtext', None) + pub.process_programmatic_settings(None, self.settings, None) + pub.set_source(None, src_path) + pub.set_destination(None, None) + try: + pub.publish() + doctree = pub.document + except UnicodeError, err: + from sphinx.application import SphinxError + raise SphinxError(err.message) + self.filter_messages(doctree) + self.process_dependencies(docname, doctree) + self.process_images(docname, doctree) + self.process_metadata(docname, doctree) + self.create_title_from(docname, doctree) + self.note_labels_from(docname, doctree) + self.note_indexentries_from(docname, doctree) + self.note_citations_from(docname, doctree) + self.build_toc_from(docname, doctree) + + # store time of reading, used to find outdated files + self.all_docs[docname] = time.time() + + if app: + app.emit('doctree-read', doctree) + + # make it picklable + doctree.reporter = None + doctree.transformer = None + doctree.settings.warning_stream = None + doctree.settings.env = None + doctree.settings.record_dependencies = None + for metanode in doctree.traverse(MetaBody.meta): + # docutils' meta nodes aren't picklable because the class is nested + metanode.__class__ = addnodes.meta + + # cleanup + self.docname = None + self.currmodule = None + self.currclass = None + self.gloss_entries = set() + + if save_parsed: + # save the parsed doctree + doctree_filename = self.doc2path(docname, self.doctreedir, '.doctree') + dirname = path.dirname(doctree_filename) + if not path.isdir(dirname): + os.makedirs(dirname) + f = open(doctree_filename, 'wb') + try: + pickle.dump(doctree, f, pickle.HIGHEST_PROTOCOL) + finally: + f.close() + else: + return doctree + + def filter_messages(self, doctree): + """ + Filter system messages from a doctree. + """ + filterlevel = self.config.keep_warnings and 2 or 5 + for node in doctree.traverse(nodes.system_message): + if node['level'] < filterlevel: + node.parent.remove(node) + + def process_dependencies(self, docname, doctree): + """ + Process docutils-generated dependency info. + """ + deps = doctree.settings.record_dependencies + if not deps: + return + docdir = path.dirname(self.doc2path(docname, base=None)) + for dep in deps.list: + dep = path.join(docdir, dep) + self.dependencies.setdefault(docname, set()).add(dep) + + def process_images(self, docname, doctree): + """ + Process and rewrite image URIs. + """ + existing_names = set(v[1] for v in self.images.itervalues()) + docdir = path.dirname(self.doc2path(docname, base=None)) + for node in doctree.traverse(nodes.image): + # Map the mimetype to the corresponding image. The writer may + # choose the best image from these candidates. The special key * is + # set if there is only single candiate to be used by a writer. + # The special key ? is set for nonlocal URIs. + node['candidates'] = candidates = {} + imguri = node['uri'] + if imguri.find('://') != -1: + self.warn(docname, 'Nonlocal image URI found: %s' % imguri, node.line) + candidates['?'] = imguri + continue + # imgpath is the image path *from srcdir* + imgpath = path.normpath(path.join(docdir, imguri)) + # set imgpath as default URI + node['uri'] = imgpath + if imgpath.endswith(os.extsep + '*'): + for filename in glob(path.join(self.srcdir, imgpath)): + new_imgpath = relative_path(self.srcdir, filename) + if filename.lower().endswith('.pdf'): + candidates['application/pdf'] = new_imgpath + elif filename.lower().endswith('.svg'): + candidates['image/svg+xml'] = new_imgpath + else: + try: + f = open(filename, 'rb') + try: + imgtype = imghdr.what(f) + finally: + f.close() + except (OSError, IOError): + self.warn(docname, 'Image file %s not readable' % filename) + if imgtype: + candidates['image/' + imgtype] = new_imgpath + else: + candidates['*'] = imgpath + # map image paths to unique image names (so that they can be put + # into a single directory) + for imgpath in candidates.itervalues(): + self.dependencies.setdefault(docname, set()).add(imgpath) + if not os.access(path.join(self.srcdir, imgpath), os.R_OK): + self.warn(docname, 'Image file not readable: %s' % imgpath, + node.line) + if imgpath in self.images: + self.images[imgpath][0].add(docname) + continue + uniquename = path.basename(imgpath) + base, ext = path.splitext(uniquename) + i = 0 + while uniquename in existing_names: + i += 1 + uniquename = '%s%s%s' % (base, i, ext) + self.images[imgpath] = (set([docname]), uniquename) + existing_names.add(uniquename) + + def process_metadata(self, docname, doctree): + """ + Process the docinfo part of the doctree as metadata. + """ + self.metadata[docname] = md = {} + try: + docinfo = doctree[0] + except IndexError: + # probably an empty document + return + if docinfo.__class__ is not nodes.docinfo: + # nothing to see here + return + for node in docinfo: + if node.__class__ is nodes.author: + # handled specially by docutils + md['author'] = node.astext() + elif node.__class__ is nodes.field: + name, body = node + md[name.astext()] = body.astext() + del doctree[0] + + def create_title_from(self, docname, document): + """ + Add a title node to the document (just copy the first section title), + and store that title in the environment. + """ + for node in document.traverse(nodes.section): + titlenode = nodes.title() + visitor = SphinxContentsFilter(document) + node[0].walkabout(visitor) + titlenode += visitor.get_entry_text() + self.titles[docname] = titlenode + return + + def note_labels_from(self, docname, document): + for name, explicit in document.nametypes.iteritems(): + if not explicit: + continue + labelid = document.nameids[name] + if labelid is None: + continue + node = document.ids[labelid] + if name.isdigit() or node.has_key('refuri') or \ + node.tagname.startswith('desc_'): + # ignore footnote labels, labels automatically generated from a + # link and description units + continue + if name in self.labels: + self.warn(docname, 'duplicate label %s, ' % name + + 'other instance in %s' % self.doc2path(self.labels[name][0]), + node.line) + self.anonlabels[name] = docname, labelid + if node.tagname == 'section': + sectname = node[0].astext() # node[0] == title node + elif node.tagname == 'figure': + for n in node: + if n.tagname == 'caption': + sectname = n.astext() + break + else: + continue + else: + # anonymous-only labels + continue + self.labels[name] = docname, labelid, sectname + + def note_indexentries_from(self, docname, document): + entries = self.indexentries[docname] = [] + for node in document.traverse(addnodes.index): + entries.extend(node['entries']) + + def note_citations_from(self, docname, document): + for node in document.traverse(nodes.citation): + label = node[0].astext() + if ('citation', label) in self.reftargets: + self.warn(docname, 'duplicate citation %s, ' % label + + 'other instance in %s' % self.doc2path( + self.reftargets['citation', label][0]), node.line) + self.reftargets['citation', label] = (docname, node['ids'][0]) + + def note_toctree(self, docname, toctreenode): + """Note a TOC tree directive in a document and gather information about + file relations from it.""" + if toctreenode['glob']: + self.glob_toctrees.add(docname) + includefiles = toctreenode['includefiles'] + for includefile in includefiles: + # note that if the included file is rebuilt, this one must be + # too (since the TOC of the included file could have changed) + self.files_to_rebuild.setdefault(includefile, set()).add(docname) + self.toctree_includes.setdefault(docname, []).extend(includefiles) + + def build_toc_from(self, docname, document): + """Build a TOC from the doctree and store it in the inventory.""" + numentries = [0] # nonlocal again... + + try: + maxdepth = int(self.metadata[docname].get('tocdepth', 0)) + except ValueError: + maxdepth = 0 + + def build_toc(node, depth=1): + entries = [] + for subnode in node: + if isinstance(subnode, addnodes.toctree): + # just copy the toctree node which is then resolved + # in self.get_and_resolve_doctree + item = subnode.copy() + entries.append(item) + # do the inventory stuff + self.note_toctree(docname, subnode) + continue + if not isinstance(subnode, nodes.section): + continue + title = subnode[0] + # copy the contents of the section title, but without references + # and unnecessary stuff + visitor = SphinxContentsFilter(document) + title.walkabout(visitor) + nodetext = visitor.get_entry_text() + if not numentries[0]: + # for the very first toc entry, don't add an anchor + # as it is the file's title anyway + anchorname = '' + else: + anchorname = '#' + subnode['ids'][0] + numentries[0] += 1 + reference = nodes.reference('', '', refuri=docname, + anchorname=anchorname, + *nodetext) + para = addnodes.compact_paragraph('', '', reference) + item = nodes.list_item('', para) + if maxdepth == 0 or depth < maxdepth: + item += build_toc(subnode, depth+1) + entries.append(item) + if entries: + return nodes.bullet_list('', *entries) + return [] + toc = build_toc(document) + if toc: + self.tocs[docname] = toc + else: + self.tocs[docname] = nodes.bullet_list('') + self.toc_num_entries[docname] = numentries[0] + + def get_toc_for(self, docname): + """Return a TOC nodetree -- for use on the same page only!""" + toc = self.tocs[docname].deepcopy() + for node in toc.traverse(nodes.reference): + node['refuri'] = node['anchorname'] + return toc + + # ------- + # these are called from docutils directives and therefore use self.docname + # + def note_descref(self, fullname, desctype, line): + if fullname in self.descrefs: + self.warn(self.docname, + 'duplicate canonical description name %s, ' % fullname + + 'other instance in %s' % self.doc2path(self.descrefs[fullname][0]), + line) + self.descrefs[fullname] = (self.docname, desctype) + + def note_module(self, modname, synopsis, platform, deprecated): + self.modules[modname] = (self.docname, synopsis, platform, deprecated) + self.filemodules.setdefault(self.docname, []).append(modname) + + def note_progoption(self, optname, labelid): + self.progoptions[self.currprogram, optname] = (self.docname, labelid) + + def note_reftarget(self, type, name, labelid): + self.reftargets[type, name] = (self.docname, labelid) + + def note_versionchange(self, type, version, node, lineno): + self.versionchanges.setdefault(version, []).append( + (type, self.docname, lineno, self.currmodule, self.currdesc, node.astext())) + + def note_dependency(self, filename): + basename = path.dirname(self.doc2path(self.docname, base=None)) + # this will do the right thing when filename is absolute too + filename = path.join(basename, filename) + self.dependencies.setdefault(self.docname, set()).add(filename) + # ------- + + # --------- RESOLVING REFERENCES AND TOCTREES ------------------------------ + + def get_doctree(self, docname): + """Read the doctree for a file from the pickle and return it.""" + doctree_filename = self.doc2path(docname, self.doctreedir, '.doctree') + f = open(doctree_filename, 'rb') + try: + doctree = pickle.load(f) + finally: + f.close() + doctree.settings.env = self + doctree.reporter = Reporter(self.doc2path(docname), 2, 4, + stream=RedirStream(self._warnfunc)) + return doctree + + + def get_and_resolve_doctree(self, docname, builder, doctree=None, + prune_toctrees=True): + """Read the doctree from the pickle, resolve cross-references and + toctrees and return it.""" + if doctree is None: + doctree = self.get_doctree(docname) + + # resolve all pending cross-references + self.resolve_references(doctree, docname, builder) + + # now, resolve all toctree nodes + for toctreenode in doctree.traverse(addnodes.toctree): + result = self.resolve_toctree(docname, builder, toctreenode, + prune=prune_toctrees) + if result is None: + toctreenode.replace_self([]) + else: + toctreenode.replace_self(result) + + return doctree + + def resolve_toctree(self, docname, builder, toctree, prune=True, maxdepth=0, + titles_only=False): + """ + Resolve a *toctree* node into individual bullet lists with titles + as items, returning None (if no containing titles are found) or + a new node. + + If *prune* is True, the tree is pruned to *maxdepth*, or if that is 0, + to the value of the *maxdepth* option on the *toctree* node. + If *titles_only* is True, only toplevel document titles will be in the + resulting tree. + """ + + def _walk_depth(node, depth, maxdepth, titleoverrides): + """Utility: Cut a TOC at a specified depth.""" + for subnode in node.children[:]: + if isinstance(subnode, (addnodes.compact_paragraph, nodes.list_item)): + subnode['classes'].append('toctree-l%d' % (depth-1)) + _walk_depth(subnode, depth, maxdepth, titleoverrides) + elif isinstance(subnode, nodes.bullet_list): + if maxdepth > 0 and depth > maxdepth: + subnode.parent.replace(subnode, []) + else: + _walk_depth(subnode, depth+1, maxdepth, titleoverrides) + + def _entries_from_toctree(toctreenode, separate=False): + """Return TOC entries for a toctree node.""" + includefiles = map(str, toctreenode['includefiles']) + + entries = [] + for includefile in includefiles: + try: + toc = self.tocs[includefile].deepcopy() + if not toc.children: + # empty toc means: no titles will show up in the toctree + self.warn(docname, 'toctree contains reference to document ' + '%r that doesn\'t have a title: no link will be ' + 'generated' % includefile) + except KeyError: + # this is raised if the included file does not exist + self.warn(docname, 'toctree contains reference to nonexisting ' + 'document %r' % includefile) + else: + # if titles_only is given, only keep the main title and + # sub-toctrees + if titles_only: + # delete everything but the toplevel title(s) and toctrees + for toplevel in toc: + # nodes with length 1 don't have any children anyway + if len(toplevel) > 1: + subtoctrees = toplevel.traverse(addnodes.toctree) + toplevel[1][:] = subtoctrees + # resolve all sub-toctrees + for toctreenode in toc.traverse(addnodes.toctree): + i = toctreenode.parent.index(toctreenode) + 1 + for item in _entries_from_toctree(toctreenode): + toctreenode.parent.insert(i, item) + i += 1 + toctreenode.parent.remove(toctreenode) + if separate: + entries.append(toc) + else: + entries.extend(toc.children) + return entries + + maxdepth = maxdepth or toctree.get('maxdepth', -1) + titleoverrides = toctree.get('includetitles', {}) + + tocentries = _entries_from_toctree(toctree, separate=True) + if not tocentries: + return None + + newnode = addnodes.compact_paragraph('', '', *tocentries) + newnode['toctree'] = True + # prune the tree to maxdepth and replace titles, also set level classes + _walk_depth(newnode, 1, prune and maxdepth or 0, titleoverrides) + # replace titles, if needed, and set the target paths in the + # toctrees (they are not known at TOC generation time) + for refnode in newnode.traverse(nodes.reference): + refnode['refuri'] = builder.get_relative_uri( + docname, refnode['refuri']) + refnode['anchorname'] + if titleoverrides and not refnode['anchorname'] \ + and refnode['refuri'] in titleoverrides: + newtitle = titleoverrides[refnode['refuri']] + refnode.children = [nodes.Text(newtitle)] + return newnode + + descroles = frozenset(('data', 'exc', 'func', 'class', 'const', 'attr', 'obj', + 'meth', 'cfunc', 'cmember', 'cdata', 'ctype', 'cmacro')) + + def resolve_references(self, doctree, fromdocname, builder): + reftarget_roles = set(('token', 'term', 'citation')) + # add all custom xref types too + reftarget_roles.update(i[0] for i in additional_xref_types.values()) + + for node in doctree.traverse(addnodes.pending_xref): + contnode = node[0].deepcopy() + newnode = None + + typ = node['reftype'] + target = node['reftarget'] + + try: + if typ == 'ref': + if node['refcaption']: + # reference to anonymous label; the reference uses the supplied + # link caption + docname, labelid = self.anonlabels.get(target, ('','')) + sectname = node.astext() + if not docname: + newnode = doctree.reporter.system_message( + 2, 'undefined label: %s' % target) + else: + # reference to the named label; the final node will contain the + # section name after the label + docname, labelid, sectname = self.labels.get(target, ('','','')) + if not docname: + newnode = doctree.reporter.system_message( + 2, 'undefined label: %s -- if you don\'t ' % target + + 'give a link caption the label must precede a section ' + 'header.') + if docname: + newnode = nodes.reference('', '') + innernode = nodes.emphasis(sectname, sectname) + if docname == fromdocname: + newnode['refid'] = labelid + else: + # set more info in contnode in case the get_relative_uri call + # raises NoUri, the builder will then have to resolve these + contnode = addnodes.pending_xref('') + contnode['refdocname'] = docname + contnode['refsectname'] = sectname + newnode['refuri'] = builder.get_relative_uri( + fromdocname, docname) + if labelid: + newnode['refuri'] += '#' + labelid + newnode.append(innernode) + elif typ == 'keyword': + # keywords are referenced by named labels + docname, labelid, _ = self.labels.get(target, ('','','')) + if not docname: + #self.warn(fromdocname, 'unknown keyword: %s' % target) + newnode = contnode + else: + newnode = nodes.reference('', '') + if docname == fromdocname: + newnode['refid'] = labelid + else: + newnode['refuri'] = builder.get_relative_uri( + fromdocname, docname) + '#' + labelid + newnode.append(contnode) + elif typ == 'option': + progname = node['refprogram'] + docname, labelid = self.progoptions.get((progname, target), ('', '')) + if not docname: + newnode = contnode + else: + newnode = nodes.reference('', '') + if docname == fromdocname: + newnode['refid'] = labelid + else: + newnode['refuri'] = builder.get_relative_uri( + fromdocname, docname) + '#' + labelid + newnode.append(contnode) + elif typ in reftarget_roles: + docname, labelid = self.reftargets.get((typ, target), ('', '')) + if not docname: + if typ == 'term': + self.warn(fromdocname, 'term not in glossary: %s' % target, + node.line) + elif typ == 'citation': + self.warn(fromdocname, 'citation not found: %s' % target, + node.line) + newnode = contnode + else: + newnode = nodes.reference('', '') + if docname == fromdocname: + newnode['refid'] = labelid + else: + newnode['refuri'] = builder.get_relative_uri( + fromdocname, docname, typ) + '#' + labelid + newnode.append(contnode) + elif typ == 'mod': + docname, synopsis, platform, deprecated = \ + self.modules.get(target, ('','','', '')) + if not docname: + newnode = builder.app.emit_firstresult('missing-reference', + self, node, contnode) + if not newnode: + newnode = contnode + elif docname == fromdocname: + # don't link to self + newnode = contnode + else: + newnode = nodes.reference('', '') + newnode['refuri'] = builder.get_relative_uri( + fromdocname, docname) + '#module-' + target + newnode['reftitle'] = '%s%s%s' % ( + (platform and '(%s) ' % platform), + synopsis, (deprecated and ' (deprecated)' or '')) + newnode.append(contnode) + elif typ in self.descroles: + # "descrefs" + modname = node['modname'] + clsname = node['classname'] + searchorder = node.hasattr('refspecific') and 1 or 0 + name, desc = self.find_desc(modname, clsname, + target, typ, searchorder) + if not desc: + newnode = builder.app.emit_firstresult('missing-reference', + self, node, contnode) + if not newnode: + newnode = contnode + else: + newnode = nodes.reference('', '') + if desc[0] == fromdocname: + newnode['refid'] = name + else: + newnode['refuri'] = ( + builder.get_relative_uri(fromdocname, desc[0]) + + '#' + name) + newnode['reftitle'] = name + newnode.append(contnode) + else: + raise RuntimeError('unknown xfileref node encountered: %s' % node) + except NoUri: + newnode = contnode + if newnode: + node.replace_self(newnode) + + # allow custom references to be resolved + builder.app.emit('doctree-resolved', doctree, fromdocname) + + def create_index(self, builder, _fixre=re.compile(r'(.*) ([(][^()]*[)])')): + """Create the real index from the collected index entries.""" + new = {} + + def add_entry(word, subword, dic=new): + entry = dic.get(word) + if not entry: + dic[word] = entry = [[], {}] + if subword: + add_entry(subword, '', dic=entry[1]) + else: + try: + entry[0].append(builder.get_relative_uri('genindex', fn) + + '#' + tid) + except NoUri: + pass + + for fn, entries in self.indexentries.iteritems(): + # new entry types must be listed in directives/other.py! + for type, string, tid, alias in entries: + if type == 'single': + try: + entry, subentry = string.split(';', 1) + except ValueError: + entry, subentry = string, '' + if not entry: + self.warn(fn, 'invalid index entry %r' % string) + continue + add_entry(entry.strip(), subentry.strip()) + elif type == 'pair': + try: + first, second = map(lambda x: x.strip(), + string.split(';', 1)) + if not first or not second: + raise ValueError + except ValueError: + self.warn(fn, 'invalid pair index entry %r' % string) + continue + add_entry(first, second) + add_entry(second, first) + elif type == 'triple': + try: + first, second, third = map(lambda x: x.strip(), + string.split(';', 2)) + if not first or not second or not third: + raise ValueError + except ValueError: + self.warn(fn, 'invalid triple index entry %r' % string) + continue + add_entry(first, second+' '+third) + add_entry(second, third+', '+first) + add_entry(third, first+' '+second) + else: + self.warn(fn, 'unknown index entry type %r' % type) + + newlist = new.items() + newlist.sort(key=lambda t: t[0].lower()) + + # fixup entries: transform + # func() (in module foo) + # func() (in module bar) + # into + # func() + # (in module foo) + # (in module bar) + oldkey = '' + oldsubitems = None + i = 0 + while i < len(newlist): + key, (targets, subitems) = newlist[i] + # cannot move if it hassubitems; structure gets too complex + if not subitems: + m = _fixre.match(key) + if m: + if oldkey == m.group(1): + # prefixes match: add entry as subitem of the previous entry + oldsubitems.setdefault(m.group(2), [[], {}])[0].extend(targets) + del newlist[i] + continue + oldkey = m.group(1) + else: + oldkey = key + oldsubitems = subitems + i += 1 + + # group the entries by letter + def keyfunc((k, v), ltrs=uppercase+'_'): + # hack: mutate the subitems dicts to a list in the keyfunc + v[1] = sorted((si, se) for (si, (se, void)) in v[1].iteritems()) + # now calculate the key + letter = k[0].upper() + if letter in ltrs: + return letter + else: + # get all other symbols under one heading + return 'Symbols' + return [(key, list(group)) for (key, group) in groupby(newlist, keyfunc)] + + def collect_relations(self): + relations = {} + getinc = self.toctree_includes.get + def collect(parents, docname, previous, next): + includes = getinc(docname) + # previous + if not previous: + # if no previous sibling, go to parent + previous = parents[0][0] + else: + # else, go to previous sibling, or if it has children, to + # the last of its children, or if that has children, to the + # last of those, and so forth + while 1: + previncs = getinc(previous) + if previncs: + previous = previncs[-1] + else: + break + # next + if includes: + # if it has children, go to first of them + next = includes[0] + elif next: + # else, if next sibling, go to it + pass + else: + # else, go to the next sibling of the parent, if present, + # else the grandparent's sibling, if present, and so forth + for parname, parindex in parents: + parincs = getinc(parname) + if parincs and parindex + 1 < len(parincs): + next = parincs[parindex+1] + break + # else it will stay None + # same for children + if includes: + for subindex, args in enumerate(izip(includes, [None] + includes, + includes[1:] + [None])): + collect([(docname, subindex)] + parents, *args) + relations[docname] = [parents[0][0], previous, next] + collect([(None, 0)], self.config.master_doc, None, None) + return relations + + def check_consistency(self): + """Do consistency checks.""" + + for docname in sorted(self.all_docs): + if docname not in self.files_to_rebuild: + if docname == self.config.master_doc: + # the master file is not included anywhere ;) + continue + self.warn(docname, 'document isn\'t included in any toctree') + + # --------- QUERYING ------------------------------------------------------- + + def find_desc(self, modname, classname, name, type, searchorder=0): + """Find a description node matching "name", perhaps using + the given module and/or classname.""" + # skip parens + if name[-2:] == '()': + name = name[:-2] + + if not name: + return None, None + + # don't add module and class names for C things + if type[0] == 'c' and type not in ('class', 'const'): + # skip trailing star and whitespace + name = name.rstrip(' *') + if name in self.descrefs and self.descrefs[name][1][0] == 'c': + return name, self.descrefs[name] + return None, None + + newname = None + if searchorder == 1: + if modname and classname and \ + modname + '.' + classname + '.' + name in self.descrefs: + newname = modname + '.' + classname + '.' + name + elif modname and modname + '.' + name in self.descrefs: + newname = modname + '.' + name + elif name in self.descrefs: + newname = name + else: + if name in self.descrefs: + newname = name + elif modname and modname + '.' + name in self.descrefs: + newname = modname + '.' + name + elif modname and classname and \ + modname + '.' + classname + '.' + name in self.descrefs: + newname = modname + '.' + classname + '.' + name + # special case: builtin exceptions have module "exceptions" set + elif type == 'exc' and '.' not in name and \ + 'exceptions.' + name in self.descrefs: + newname = 'exceptions.' + name + # special case: object methods + elif type in ('func', 'meth') and '.' not in name and \ + 'object.' + name in self.descrefs: + newname = 'object.' + name + if newname is None: + return None, None + return newname, self.descrefs[newname] + + def find_keyword(self, keyword, avoid_fuzzy=False, cutoff=0.6, n=20): + """ + Find keyword matches for a keyword. If there's an exact match, just return + it, else return a list of fuzzy matches if avoid_fuzzy isn't True. + + Keywords searched are: first modules, then descrefs. + + Returns: None if nothing found + (type, docname, anchorname) if exact match found + list of (quality, type, docname, anchorname, description) if fuzzy + """ + + if keyword in self.modules: + docname, title, system, deprecated = self.modules[keyword] + return 'module', docname, 'module-' + keyword + if keyword in self.descrefs: + docname, ref_type = self.descrefs[keyword] + return ref_type, docname, keyword + # special cases + if '.' not in keyword: + # exceptions are documented in the exceptions module + if 'exceptions.'+keyword in self.descrefs: + docname, ref_type = self.descrefs['exceptions.'+keyword] + return ref_type, docname, 'exceptions.'+keyword + # special methods are documented as object methods + if 'object.'+keyword in self.descrefs: + docname, ref_type = self.descrefs['object.'+keyword] + return ref_type, docname, 'object.'+keyword + + if avoid_fuzzy: + return + + # find fuzzy matches + s = difflib.SequenceMatcher() + s.set_seq2(keyword.lower()) + + def possibilities(): + for title, (fn, desc, _, _) in self.modules.iteritems(): + yield ('module', fn, 'module-'+title, desc) + for title, (fn, desctype) in self.descrefs.iteritems(): + yield (desctype, fn, title, '') + + def dotsearch(string): + parts = string.lower().split('.') + for idx in xrange(0, len(parts)): + yield '.'.join(parts[idx:]) + + result = [] + for type, docname, title, desc in possibilities(): + best_res = 0 + for part in dotsearch(title): + s.set_seq1(part) + if s.real_quick_ratio() >= cutoff and \ + s.quick_ratio() >= cutoff and \ + s.ratio() >= cutoff and \ + s.ratio() > best_res: + best_res = s.ratio() + if best_res: + result.append((best_res, type, docname, title, desc)) + + return heapq.nlargest(n, result) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/__init__.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext + ~~~~~~~~~~ + + Contains Sphinx features not activated by default. + + :copyright: 2008 by Georg Brandl. + :license: BSD. +""" diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/autodoc.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/autodoc.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,655 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext.autodoc + ~~~~~~~~~~~~~~~~~~ + + Automatically insert docstrings for functions, classes or whole modules into + the doctree, thus avoiding duplication between docstrings and documentation + for those who like elaborate docstrings. + + :copyright: 2008 by Georg Brandl, Pauli Virtanen, Martin Hans. + :license: BSD. +""" + +import re +import sys +import types +import inspect +import linecache +from types import FunctionType, BuiltinMethodType, MethodType + +from docutils import nodes +from docutils.parsers.rst import directives +from docutils.statemachine import ViewList + +from sphinx.util import rpartition, nested_parse_with_titles +from sphinx.directives.desc import py_sig_re + +try: + base_exception = BaseException +except NameError: + base_exception = Exception + +_charset_re = re.compile(r'coding[:=]\s*([-\w.]+)') +_module_charsets = {} + + +class Options(object): + pass + + +def is_static_method(obj): + """Check if the object given is a static method.""" + if isinstance(obj, (FunctionType, classmethod)): + return True + elif isinstance(obj, BuiltinMethodType): + return obj.__self__ is not None + elif isinstance(obj, MethodType): + return obj.im_self is not None + return False + + +class AutodocReporter(object): + """ + A reporter replacement that assigns the correct source name + and line number to a system message, as recorded in a ViewList. + """ + def __init__(self, viewlist, reporter): + self.viewlist = viewlist + self.reporter = reporter + + def __getattr__(self, name): + return getattr(self.reporter, name) + + def system_message(self, level, message, *children, **kwargs): + if 'line' in kwargs: + try: + source, line = self.viewlist.items[kwargs['line']] + except IndexError: + pass + else: + kwargs['source'] = source + kwargs['line'] = line + return self.reporter.system_message(level, message, + *children, **kwargs) + + def debug(self, *args, **kwargs): + if self.reporter.debug_flag: + return self.system_message(0, *args, **kwargs) + + def info(self, *args, **kwargs): + return self.system_message(1, *args, **kwargs) + + def warning(self, *args, **kwargs): + return self.system_message(2, *args, **kwargs) + + def error(self, *args, **kwargs): + return self.system_message(3, *args, **kwargs) + + def severe(self, *args, **kwargs): + return self.system_message(4, *args, **kwargs) + + +# Some useful event listener factories for autodoc-process-docstring. + +def cut_lines(pre, post=0, what=None): + """ + Return a listener that removes the first *pre* and last *post* + lines of every docstring. If *what* is a sequence of strings, + only docstrings of a type in *what* will be processed. + + Use like this (e.g. in the ``setup()`` function of :file:`conf.py`):: + + from sphinx.ext.autodoc import cut_lines + app.connect('autodoc-process-docstring', cut_lines(4, what=['module'])) + + This can (and should) be used in place of :confval:`automodule_skip_lines`. + """ + def process(app, what_, name, obj, options, lines): + if what and what_ not in what: + return + del lines[:pre] + if post: + # remove one trailing blank line. + if lines and not lines[-1]: + lines.pop(-1) + del lines[-post:] + # make sure there is a blank line at the end + if lines and lines[-1]: + lines.append('') + return process + +def between(marker, what=None, keepempty=False): + """ + Return a listener that only keeps lines between lines that match the + *marker* regular expression. If no line matches, the resulting docstring + would be empty, so no change will be made unless *keepempty* is true. + + If *what* is a sequence of strings, only docstrings of a type in *what* will + be processed. + """ + marker_re = re.compile(marker) + def process(app, what_, name, obj, options, lines): + if what and what_ not in what: + return + deleted = 0 + delete = True + orig_lines = lines[:] + for i, line in enumerate(orig_lines): + if delete: + lines.pop(i - deleted) + deleted += 1 + if marker_re.match(line): + delete = not delete + if delete: + lines.pop(i - deleted) + deleted += 1 + if not lines and not keepempty: + lines[:] = orig_lines + # make sure there is a blank line at the end + if lines and lines[-1]: + lines.append('') + return process + + +def isdescriptor(x): + """Check if the object is some kind of descriptor.""" + for item in '__get__', '__set__', '__delete__': + if callable(getattr(x, item, None)): + return True + return False + + +def prepare_docstring(s): + """ + Convert a docstring into lines of parseable reST. Return it as a list of + lines usable for inserting into a docutils ViewList (used as argument + of nested_parse().) An empty line is added to act as a separator between + this docstring and following content. + """ + lines = s.expandtabs().splitlines() + # Find minimum indentation of any non-blank lines after first line. + margin = sys.maxint + for line in lines[1:]: + content = len(line.lstrip()) + if content: + indent = len(line) - content + margin = min(margin, indent) + # Remove indentation. + if lines: + lines[0] = lines[0].lstrip() + if margin < sys.maxint: + for i in range(1, len(lines)): lines[i] = lines[i][margin:] + # Remove any leading blank lines. + while lines and not lines[0]: + lines.pop(0) + # make sure there is an empty line at the end + if lines and lines[-1]: + lines.append('') + return lines + + +def get_module_charset(module): + """Return the charset of the given module (cached in _module_charsets).""" + if module in _module_charsets: + return _module_charsets[module] + try: + filename = __import__(module, None, None, ['foo']).__file__ + except (ImportError, AttributeError): + return None + if filename[-4:].lower() in ('.pyc', '.pyo'): + filename = filename[:-1] + for line in [linecache.getline(filename, x) for x in (1, 2)]: + match = _charset_re.search(line) + if match is not None: + charset = match.group(1) + break + else: + charset = 'ascii' + _module_charsets[module] = charset + return charset + + +class RstGenerator(object): + def __init__(self, options, document, lineno): + self.options = options + self.env = document.settings.env + self.reporter = document.reporter + self.lineno = lineno + self.filename_set = set() + self.warnings = [] + self.result = ViewList() + + def warn(self, msg): + self.warnings.append(self.reporter.warning(msg, line=self.lineno)) + + def get_doc(self, what, name, obj): + """Format and yield lines of the docstring(s) for the object.""" + docstrings = [] + if getattr(obj, '__doc__', None): + docstrings.append(obj.__doc__) + # skip some lines in module docstrings if configured + if what == 'module' and self.env.config.automodule_skip_lines and docstrings: + docstrings[0] = '\n'.join(docstrings[0].splitlines() + [self.env.config.automodule_skip_lines:]) + # for classes, what the "docstring" is can be controlled via an option + if what in ('class', 'exception'): + content = self.env.config.autoclass_content + if content in ('both', 'init'): + initdocstring = getattr(obj, '__init__', None).__doc__ + # for new-style classes, no __init__ means default __init__ + if initdocstring == object.__init__.__doc__: + initdocstring = None + if initdocstring: + if content == 'init': + docstrings = [initdocstring] + else: + docstrings.append(initdocstring) + # the default is only the class docstring + + # decode the docstrings using the module's source encoding + charset = None + module = getattr(obj, '__module__', None) + if module is not None: + charset = get_module_charset(module) + + for docstring in docstrings: + if isinstance(docstring, str): + if charset: + docstring = docstring.decode(charset) + else: + try: + # try decoding with utf-8, should only work for real UTF-8 + docstring = docstring.decode('utf-8') + except UnicodeError: + # last resort -- can't fail + docstring = docstring.decode('latin1') + docstringlines = prepare_docstring(docstring) + if self.env.app: + # let extensions preprocess docstrings + self.env.app.emit('autodoc-process-docstring', + what, name, obj, self.options, docstringlines) + for line in docstringlines: + yield line + + def resolve_name(self, what, name): + """ + Determine what module to import and what attribute to document. + + Returns a tuple of: the full name, the module name, a path of + names to get via getattr, the signature and return annotation. + """ + # first, parse the definition -- auto directives for classes and functions + # can contain a signature which is then used instead of an autogenerated one + try: + path, base, args, retann = py_sig_re.match(name).groups() + except: + self.warn('invalid signature for auto%s (%r)' % (what, name)) + return + # fullname is the fully qualified name, base the name after the last dot + fullname = (path or '') + base + + if what == 'module': + if args or retann: + self.warn('ignoring signature arguments and return annotation ' + 'for automodule %s' % fullname) + return fullname, fullname, [], None, None + + elif what in ('class', 'exception', 'function'): + if path: + mod = path.rstrip('.') + else: + mod = None + # if documenting a toplevel object without explicit module, it can + # be contained in another auto directive ... + if hasattr(self.env, 'autodoc_current_module'): + mod = self.env.autodoc_current_module + # ... or in the scope of a module directive + if not mod: + mod = self.env.currmodule + return fullname, mod, [base], args, retann + + else: + if path: + mod_cls = path.rstrip('.') + else: + mod_cls = None + # if documenting a class-level object without path, there must be a + # current class, either from a parent auto directive ... + if hasattr(self.env, 'autodoc_current_class'): + mod_cls = self.env.autodoc_current_class + # ... or from a class directive + if mod_cls is None: + mod_cls = self.env.currclass + # ... if still None, there's no way to know + if mod_cls is None: + return fullname, None, [], args, retann + mod, cls = rpartition(mod_cls, '.') + # if the module name is still missing, get it like above + if not mod and hasattr(self.env, 'autodoc_current_module'): + mod = self.env.autodoc_current_module + if not mod: + mod = self.env.currmodule + return fullname, mod, [cls, base], args, retann + + def format_signature(self, what, name, obj, args, retann): + """ + Return the signature of the object, formatted for display. + """ + if what not in ('class', 'method', 'function'): + return '' + + err = None + if args is not None: + # signature given explicitly + args = "(%s)" % args + else: + # try to introspect the signature + try: + args = None + getargs = True + if what == 'class': + # for classes, the relevant signature is the __init__ method's + obj = getattr(obj, '__init__', None) + # classes without __init__ method, default __init__ or + # __init__ written in C? + if obj is None or obj is object.__init__ or not \ + (inspect.ismethod(obj) or inspect.isfunction(obj)): + getargs = False + elif inspect.isbuiltin(obj) or inspect.ismethoddescriptor(obj): + # can never get arguments of a C function or method + getargs = False + if getargs: + argspec = inspect.getargspec(obj) + if what in ('class', 'method') and argspec[0] and \ + argspec[0][0] in ('cls', 'self'): + del argspec[0][0] + args = inspect.formatargspec(*argspec) + except Exception, e: + args = None + err = e + + result = self.env.app.emit_firstresult('autodoc-process-signature', what, + name, obj, self.options, args, retann) + if result: + args, retann = result + + if args is not None: + return '%s%s' % (args, retann or '') + elif err: + # re-raise the error for perusal of the handler in generate() + raise RuntimeError(err) + else: + return '' + + def generate(self, what, name, members, add_content, indent=u'', check_module=False): + """ + Generate reST for the object in self.result. + """ + fullname, mod, objpath, args, retann = self.resolve_name(what, name) + if not mod: + # need a module to import + self.warn('don\'t know which module to import for autodocumenting %r ' + '(try placing a "module" or "currentmodule" directive in the ' + 'document, or giving an explicit module name)' % fullname) + return + + # the name to put into the generated directive -- doesn't contain the module + name_in_directive = '.'.join(objpath) or mod + + # now, import the module and get object to document + try: + todoc = module = __import__(mod, None, None, ['foo']) + if hasattr(module, '__file__') and module.__file__: + modfile = module.__file__ + if modfile[-4:].lower() in ('.pyc', '.pyo'): + modfile = modfile[:-1] + self.filename_set.add(modfile) + else: + modfile = None # e.g. for builtin and C modules + for part in objpath: + todoc = getattr(todoc, part) + except (ImportError, AttributeError), err: + self.warn('autodoc can\'t import/find %s %r, it reported error: "%s", ' + 'please check your spelling and sys.path' % + (what, str(fullname), err)) + return + + # check __module__ of object if wanted (for members not given explicitly) + if check_module: + if hasattr(todoc, '__module__'): + if todoc.__module__ != mod: + return + + # format the object's signature, if any + try: + sig = self.format_signature(what, name, todoc, args, retann) + except Exception, err: + self.warn('error while formatting signature for %s: %s' % + (fullname, err)) + sig = '' + + # make sure that the result starts with an empty line. This is + # necessary for some situations where another directive preprocesses + # reST and no starting newline is present + self.result.append(u'', '') + + # now, create the directive header + directive = (what == 'method' and is_static_method(todoc)) \ + and 'staticmethod' or what + self.result.append(indent + u'.. %s:: %s%s' % + (directive, name_in_directive, sig), '') + if what == 'module': + # Add some module-specific options + if self.options.synopsis: + self.result.append(indent + u' :synopsis: ' + self.options.synopsis, + '') + if self.options.platform: + self.result.append(indent + u' :platform: ' + self.options.platform, + '') + if self.options.deprecated: + self.result.append(indent + u' :deprecated:', '') + else: + # Be explicit about the module, this is necessary since .. class:: doesn't + # support a prepended module name + self.result.append(indent + u' :module: %s' % mod, '') + if self.options.noindex: + self.result.append(indent + u' :noindex:', '') + self.result.append(u'', '') + + if self.options.show_inheritance and what in ('class', 'exception'): + if len(todoc.__bases__): + bases = [b.__module__ == '__builtin__' and + u':class:`%s`' % b.__name__ or + u':class:`%s.%s`' % (b.__module__, b.__name__) + for b in todoc.__bases__] + self.result.append(indent + u' Bases: %s' % ', '.join(bases), + '') + self.result.append(u'', '') + + # the module directive doesn't have content + if what != 'module': + indent += u' ' + + if modfile: + sourcename = '%s:docstring of %s' % (modfile, fullname) + else: + sourcename = 'docstring of %s' % fullname + + # add content from docstrings + for i, line in enumerate(self.get_doc(what, fullname, todoc)): + self.result.append(indent + line, sourcename, i) + + # add source content, if present + if add_content: + for line, src in zip(add_content.data, add_content.items): + self.result.append(indent + line, src[0], src[1]) + + # document members? + if not members or what in ('function', 'method', 'attribute'): + return + + # set current namespace for finding members + self.env.autodoc_current_module = mod + if objpath: + self.env.autodoc_current_class = objpath[0] + + # add members, if possible + _all = members == ['__all__'] + members_check_module = False + if _all: + # unqualified :members: given + if what == 'module': + if hasattr(todoc, '__all__'): + members_check_module = False + all_members = [] + for mname in todoc.__all__: + try: + all_members.append((mname, getattr(todoc, mname))) + except AttributeError: + self.warn('missing attribute mentioned in __all__: ' + 'module %s, attribute %s' % + (todoc.__name__, mname)) + else: + # for implicit module members, check __module__ to avoid + # documenting imported objects + members_check_module = True + all_members = inspect.getmembers(todoc) + else: + if self.options.inherited_members: + # getmembers() uses dir() which pulls in members from all + # base classes + all_members = inspect.getmembers(todoc) + else: + # __dict__ contains only the members directly defined in the class + all_members = sorted(todoc.__dict__.iteritems()) + else: + all_members = [(mname, getattr(todoc, mname)) for mname in members] + for (membername, member) in all_members: + # ignore members whose name starts with _ by default + if _all and membername.startswith('_'): + continue + + # ignore undocumented members if :undoc-members: is not given + doc = getattr(member, '__doc__', None) + skip = not self.options.undoc_members and not doc + # give the user a chance to decide whether this member should be skipped + if self.env.app: + # let extensions preprocess docstrings + skip_user = self.env.app.emit_firstresult( + 'autodoc-skip-member', what, membername, member, skip, self.options) + if skip_user is not None: + skip = skip_user + if skip: + continue + + if what == 'module': + if isinstance(member, (types.FunctionType, + types.BuiltinFunctionType)): + memberwhat = 'function' + elif isinstance(member, types.ClassType) or \ + isinstance(member, type): + if issubclass(member, base_exception): + memberwhat = 'exception' + else: + memberwhat = 'class' + else: + # XXX: todo -- attribute docs + continue + else: + if callable(member): + memberwhat = 'method' + elif isdescriptor(member): + memberwhat = 'attribute' + else: + # XXX: todo -- attribute docs + continue + full_membername = fullname + '.' + membername + self.generate(memberwhat, full_membername, ['__all__'], None, indent, + check_module=members_check_module) + + self.env.autodoc_current_module = None + self.env.autodoc_current_class = None + + +def _auto_directive(dirname, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + what = dirname[4:] # strip "auto" + name = arguments[0] + genopt = Options() + members = options.get('members', []) + genopt.inherited_members = 'inherited-members' in options + if genopt.inherited_members and not members: + # :inherited-members: implies :members: + members = ['__all__'] + genopt.undoc_members = 'undoc-members' in options + genopt.show_inheritance = 'show-inheritance' in options + genopt.noindex = 'noindex' in options + genopt.synopsis = options.get('synopsis', '') + genopt.platform = options.get('platform', '') + genopt.deprecated = 'deprecated' in options + + generator = RstGenerator(genopt, state.document, lineno) + generator.generate(what, name, members, content) + if not generator.result: + return generator.warnings + + # record all filenames as dependencies -- this will at least partially make + # automatic invalidation possible + for fn in generator.filename_set: + state.document.settings.env.note_dependency(fn) + + # use a custom reporter that correctly assigns lines to source and lineno + old_reporter = state.memo.reporter + state.memo.reporter = AutodocReporter(generator.result, state.memo.reporter) + if dirname == 'automodule': + node = nodes.section() + nested_parse_with_titles(state, generator.result, node) + else: + node = nodes.paragraph() + state.nested_parse(generator.result, 0, node) + state.memo.reporter = old_reporter + return generator.warnings + node.children + +def auto_directive(*args, **kwds): + return _auto_directive(*args, **kwds) + +def automodule_directive(*args, **kwds): + return _auto_directive(*args, **kwds) + +def autoclass_directive(*args, **kwds): + return _auto_directive(*args, **kwds) + + +def members_option(arg): + if arg is None: + return ['__all__'] + return [x.strip() for x in arg.split(',')] + + +def setup(app): + mod_options = {'members': members_option, 'undoc-members': directives.flag, + 'noindex': directives.flag, 'inherited-members': directives.flag, + 'show-inheritance': directives.flag, 'synopsis': lambda x: x, + 'platform': lambda x: x, 'deprecated': directives.flag} + cls_options = {'members': members_option, 'undoc-members': directives.flag, + 'noindex': directives.flag, 'inherited-members': directives.flag, + 'show-inheritance': directives.flag} + app.add_directive('automodule', automodule_directive, + 1, (1, 0, 1), **mod_options) + app.add_directive('autoclass', autoclass_directive, + 1, (1, 0, 1), **cls_options) + app.add_directive('autoexception', autoclass_directive, + 1, (1, 0, 1), **cls_options) + app.add_directive('autofunction', auto_directive, 1, (1, 0, 1), + noindex=directives.flag) + app.add_directive('automethod', auto_directive, 1, (1, 0, 1), + noindex=directives.flag) + app.add_directive('autoattribute', auto_directive, 1, (1, 0, 1), + noindex=directives.flag) + # deprecated: remove in some future version. + app.add_config_value('automodule_skip_lines', 0, True) + app.add_config_value('autoclass_content', 'class', True) + app.add_event('autodoc-process-docstring') + app.add_event('autodoc-process-signature') + app.add_event('autodoc-skip-member') diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/coverage.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/coverage.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,241 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext.coverage + ~~~~~~~~~~~~~~~~~~~ + + Check Python modules and C API for coverage. Mostly written by Josip + Dzolonga for the Google Highly Open Participation contest. + + :copyright: 2008 by Josip Dzolonga, Georg Brandl. + :license: BSD. +""" + +import re +import glob +import inspect +import cPickle as pickle +from os import path + +from sphinx.builder import Builder + + +# utility +def write_header(f, text, char='-'): + f.write(text + '\n') + f.write(char * len(text) + '\n') + +def compile_regex_list(name, exps, warnfunc): + lst = [] + for exp in exps: + try: + lst.append(re.compile(exp)) + except Exception: + warnfunc('invalid regex %r in %s' % (exp, name)) + return lst + + +class CoverageBuilder(Builder): + + name = 'coverage' + + def init(self): + self.c_sourcefiles = [] + for pattern in self.config.coverage_c_path: + pattern = path.join(self.srcdir, pattern) + self.c_sourcefiles.extend(glob.glob(pattern)) + + self.c_regexes = [] + for (name, exp) in self.config.coverage_c_regexes.items(): + try: + self.c_regexes.append((name, re.compile(exp))) + except Exception: + self.warn('invalid regex %r in coverage_c_regexes' % exp) + + self.c_ignorexps = {} + for (name, exps) in self.config.coverage_ignore_c_items.iteritems(): + self.c_ignorexps[name] = compile_regex_list('coverage_ignore_c_items', + exps, self.warn) + self.mod_ignorexps = compile_regex_list('coverage_ignore_modules', + self.config.coverage_ignore_modules, + self.warn) + self.cls_ignorexps = compile_regex_list('coverage_ignore_classes', + self.config.coverage_ignore_classes, + self.warn) + self.fun_ignorexps = compile_regex_list('coverage_ignore_functions', + self.config.coverage_ignore_functions, + self.warn) + + def get_outdated_docs(self): + return 'coverage overview' + + def write(self, *ignored): + self.py_undoc = {} + self.build_py_coverage() + self.write_py_coverage() + + self.c_undoc = {} + self.build_c_coverage() + self.write_c_coverage() + + def build_c_coverage(self): + # Fetch all the info from the header files + for filename in self.c_sourcefiles: + undoc = [] + f = open(filename, 'r') + try: + for line in f: + for key, regex in self.c_regexes: + match = regex.match(line) + if match: + name = match.groups()[0] + if name not in self.env.descrefs: + for exp in self.c_ignorexps.get(key, ()): + if exp.match(name): + break + else: + undoc.append((key, name)) + continue + finally: + f.close() + if undoc: + self.c_undoc[filename] = undoc + + def write_c_coverage(self): + output_file = path.join(self.outdir, 'c.txt') + op = open(output_file, 'w') + try: + write_header(op, 'Undocumented C API elements', '=') + op.write('\n') + + for filename, undoc in self.c_undoc.iteritems(): + write_header(op, filename) + for typ, name in undoc: + op.write(' * %-50s [%9s]\n' % (name, typ)) + op.write('\n') + finally: + op.close() + + def build_py_coverage(self): + for mod_name in self.env.modules: + ignore = False + for exp in self.mod_ignorexps: + if exp.match(mod_name): + ignore = True + break + if ignore: + continue + + try: + mod = __import__(mod_name, fromlist=['foo']) + except ImportError, err: + self.warn('module %s could not be imported: %s' % (mod_name, err)) + self.py_undoc[mod_name] = {'error': err} + continue + + funcs = [] + classes = {} + + for name, obj in inspect.getmembers(mod): + # diverse module attributes are ignored: + if name[0] == '_': + # begins in an underscore + continue + if not hasattr(obj, '__module__'): + # cannot be attributed to a module + continue + if obj.__module__ != mod_name: + # is not defined in this module + continue + + full_name = '%s.%s' % (mod_name, name) + + if inspect.isfunction(obj): + if full_name not in self.env.descrefs: + for exp in self.fun_ignorexps: + if exp.match(name): + break + else: + funcs.append(name) + elif inspect.isclass(obj): + for exp in self.cls_ignorexps: + if exp.match(name): + break + else: + if full_name not in self.env.descrefs: + # not documented at all + classes[name] = [] + continue + + attrs = [] + + for attr_name, attr in inspect.getmembers(obj, inspect.ismethod): + if attr_name[0] == '_': + # starts with an underscore, ignore it + continue + + full_attr_name = '%s.%s' % (full_name, attr_name) + if full_attr_name not in self.env.descrefs: + attrs.append(attr_name) + + if attrs: + # some attributes are undocumented + classes[name] = attrs + + self.py_undoc[mod_name] = {'funcs': funcs, 'classes': classes} + + def write_py_coverage(self): + output_file = path.join(self.outdir, 'python.txt') + op = open(output_file, 'w') + failed = [] + try: + write_header(op, 'Undocumented Python objects', '=') + + keys = self.py_undoc.keys() + keys.sort() + for name in keys: + undoc = self.py_undoc[name] + if 'error' in undoc: + failed.append((name, undoc['error'])) + else: + if not undoc['classes'] and not undoc['funcs']: + continue + + write_header(op, name) + if undoc['funcs']: + op.write('Functions:\n') + op.writelines(' * %s\n' % x for x in undoc['funcs']) + op.write('\n') + if undoc['classes']: + op.write('Classes:\n') + for name, methods in undoc['classes'].iteritems(): + if not methods: + op.write(' * %s\n' % name) + else: + op.write(' * %s -- missing methods:\n' % name) + op.writelines(' - %s\n' % x for x in methods) + op.write('\n') + + if failed: + write_header(op, 'Modules that failed to import') + op.writelines(' * %s -- %s\n' % x for x in failed) + finally: + op.close() + + def finish(self): + # dump the coverage data to a pickle file too + picklepath = path.join(self.outdir, 'undoc.pickle') + dumpfile = open(picklepath, 'wb') + try: + pickle.dump((self.py_undoc, self.c_undoc), dumpfile) + finally: + dumpfile.close() + + +def setup(app): + app.add_builder(CoverageBuilder) + app.add_config_value('coverage_ignore_modules', [], False) + app.add_config_value('coverage_ignore_functions', [], False) + app.add_config_value('coverage_ignore_classes', [], False) + app.add_config_value('coverage_c_path', [], False) + app.add_config_value('coverage_c_regexes', {}, False) + app.add_config_value('coverage_ignore_c_items', {}, False) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/doctest.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/doctest.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,337 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext.doctest + ~~~~~~~~~~~~~~~~~~ + + Mimic doctest by automatically executing code snippets and checking + their results. + + :copyright: 2008 by Georg Brandl. + :license: BSD. +""" + +import re +import sys +import time +import codecs +import StringIO +from os import path +# circumvent relative import +doctest = __import__('doctest') + +from docutils import nodes +from docutils.parsers.rst import directives + +from sphinx.builder import Builder +from sphinx.util.console import bold + +blankline_re = re.compile(r'^\s*', re.MULTILINE) +doctestopt_re = re.compile(r'#\s*doctest:.+$', re.MULTILINE) + +# set up the necessary directives + +def test_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + # use ordinary docutils nodes for test code: they get special attributes + # so that our builder recognizes them, and the other builders are happy. + code = '\n'.join(content) + test = None + if name == 'doctest': + if '' in code: + # convert s to ordinary blank lines for presentation + test = code + code = blankline_re.sub('', code) + if doctestopt_re.search(code): + if not test: + test = code + code = doctestopt_re.sub('', code) + nodetype = nodes.literal_block + if name == 'testsetup' or 'hide' in options: + nodetype = nodes.comment + if arguments: + groups = [x.strip() for x in arguments[0].split(',')] + else: + groups = ['default'] + node = nodetype(code, code, testnodetype=name, groups=groups) + node.line = lineno + if test is not None: + # only save if it differs from code + node['test'] = test + if name == 'testoutput': + # don't try to highlight output + node['language'] = 'none' + node['options'] = {} + if name in ('doctest', 'testoutput') and 'options' in options: + # parse doctest-like output comparison flags + option_strings = options['options'].replace(',', ' ').split() + for option in option_strings: + if (option[0] not in '+-' or option[1:] not in + doctest.OPTIONFLAGS_BY_NAME): + # XXX warn? + continue + flag = doctest.OPTIONFLAGS_BY_NAME[option[1:]] + node['options'][flag] = (option[0] == '+') + return [node] + +# need to have individual functions for each directive due to different +# options they accept + +def testsetup_directive(*args): + return test_directive(*args) + +def doctest_directive(*args): + return test_directive(*args) + +def testcode_directive(*args): + return test_directive(*args) + +def testoutput_directive(*args): + return test_directive(*args) + + +parser = doctest.DocTestParser() + +# helper classes + +class TestGroup(object): + def __init__(self, name): + self.name = name + self.setup = [] + self.tests = [] + + def add_code(self, code): + if code.type == 'testsetup': + self.setup.append(code) + elif code.type == 'doctest': + self.tests.append([code]) + elif code.type == 'testcode': + self.tests.append([code, None]) + elif code.type == 'testoutput': + if self.tests and len(self.tests[-1]) == 2: + self.tests[-1][1] = code + else: + raise RuntimeError('invalid TestCode type') + + def __repr__(self): + return 'TestGroup(name=%r, setup=%r, tests=%r)' % ( + self.name, self.setup, self.tests) + + +class TestCode(object): + def __init__(self, code, type, lineno, options=None): + self.code = code + self.type = type + self.lineno = lineno + self.options = options or {} + + def __repr__(self): + return 'TestCode(%r, %r, %r, options=%r)' % ( + self.code, self.type, self.lineno, self.options) + + +class SphinxDocTestRunner(doctest.DocTestRunner): + def summarize(self, out, verbose=None): + io = StringIO.StringIO() + old_stdout = sys.stdout + sys.stdout = io + try: + res = doctest.DocTestRunner.summarize(self, verbose) + finally: + sys.stdout = old_stdout + out(io.getvalue()) + return res + +# the new builder -- use sphinx-build.py -b doctest to run + +class DocTestBuilder(Builder): + """ + Runs test snippets in the documentation. + """ + name = 'doctest' + + def init(self): + # default options + self.opt = doctest.DONT_ACCEPT_TRUE_FOR_1 | doctest.ELLIPSIS | \ + doctest.IGNORE_EXCEPTION_DETAIL + + # HACK HACK HACK + # doctest compiles its snippets with type 'single'. That is nice + # for doctest examples but unusable for multi-statement code such + # as setup code -- to be able to use doctest error reporting with + # that code nevertheless, we monkey-patch the "compile" it uses. + doctest.compile = self.compile + + self.type = 'single' + + self.total_failures = 0 + self.total_tries = 0 + self.setup_failures = 0 + self.setup_tries = 0 + + date = time.strftime('%Y-%m-%d %H:%M:%S') + + self.outfile = codecs.open(path.join(self.outdir, 'output.txt'), + 'w', encoding='utf-8') + self.outfile.write('''\ +Results of doctest builder run on %s +==================================%s +''' % (date, '='*len(date))) + + def _out(self, text): + self.info(text, nonl=True) + self.outfile.write(text) + + def _warn_out(self, text): + self.info(text, nonl=True) + if self.app.quiet: + self.warn(text) + self.outfile.write(text) + + def get_target_uri(self, docname, typ=None): + return '' + + def get_outdated_docs(self): + return self.env.found_docs + + def finish(self): + # write executive summary + def s(v): + return v != 1 and 's' or '' + self._out(''' +Doctest summary +=============== +%5d test%s +%5d failure%s in tests +%5d failure%s in setup code +''' % (self.total_tries, s(self.total_tries), + self.total_failures, s(self.total_failures), + self.setup_failures, s(self.setup_failures))) + self.outfile.close() + + if self.total_failures or self.setup_failures: + self.app.statuscode = 1 + + sys.path[0:0] = self.config.doctest_path + + def write(self, build_docnames, updated_docnames, method='update'): + if build_docnames is None: + build_docnames = sorted(self.env.all_docs) + + self.info(bold('running tests...')) + for docname in build_docnames: + # no need to resolve the doctree + doctree = self.env.get_doctree(docname) + self.test_doc(docname, doctree) + + def test_doc(self, docname, doctree): + groups = {} + add_to_all_groups = [] + self.setup_runner = SphinxDocTestRunner(verbose=False, + optionflags=self.opt) + self.test_runner = SphinxDocTestRunner(verbose=False, + optionflags=self.opt) + if self.config.doctest_test_doctest_blocks: + def condition(node): + return (isinstance(node, (nodes.literal_block, nodes.comment)) + and node.has_key('testnodetype')) or \ + isinstance(node, nodes.doctest_block) + else: + def condition(node): + return isinstance(node, (nodes.literal_block, nodes.comment)) \ + and node.has_key('testnodetype') + for node in doctree.traverse(condition): + source = node.has_key('test') and node['test'] or node.astext() + if not source: + self.warn('no code/output in %s block at %s:%s' % + (node.get('testnodetype', 'doctest'), + self.env.doc2path(docname), node.line)) + code = TestCode(source, type=node.get('testnodetype', 'doctest'), + lineno=node.line, options=node.get('options')) + node_groups = node.get('groups', ['default']) + if '*' in node_groups: + add_to_all_groups.append(code) + continue + for groupname in node_groups: + if groupname not in groups: + groups[groupname] = TestGroup(groupname) + groups[groupname].add_code(code) + for code in add_to_all_groups: + for group in groups.itervalues(): + group.add_code(code) + if not groups: + return + + self._out('\nDocument: %s\n----------%s\n' % (docname, '-'*len(docname))) + for group in groups.itervalues(): + self.test_group(group, self.env.doc2path(docname, base=None)) + # Separately count results from setup code + res_f, res_t = self.setup_runner.summarize(self._out, verbose=False) + self.setup_failures += res_f + self.setup_tries += res_t + if self.test_runner.tries: + res_f, res_t = self.test_runner.summarize(self._out, verbose=True) + self.total_failures += res_f + self.total_tries += res_t + + def compile(self, code, name, type, flags, dont_inherit): + return compile(code, name, self.type, flags, dont_inherit) + + def test_group(self, group, filename): + ns = {} + examples = [] + for setup in group.setup: + examples.append(doctest.Example(setup.code, '', lineno=setup.lineno)) + if examples: + # simulate a doctest with the setup code + setup_doctest = doctest.DocTest(examples, {}, + '%s (setup code)' % group.name, + filename, 0, None) + setup_doctest.globs = ns + old_f = self.setup_runner.failures + self.type = 'exec' # the snippet may contain multiple statements + self.setup_runner.run(setup_doctest, out=self._warn_out, + clear_globs=False) + if self.setup_runner.failures > old_f: + # don't run the group + return + for code in group.tests: + if len(code) == 1: + test = parser.get_doctest(code[0].code, {}, + group.name, filename, code[0].lineno) + if not test.examples: + continue + for example in test.examples: + # apply directive's comparison options + new_opt = code[0].options.copy() + new_opt.update(example.options) + example.options = new_opt + self.type = 'single' # ordinary doctests + else: + output = code[1] and code[1].code or '' + options = code[1] and code[1].options or {} + # disable processing as it is not needed + options[doctest.DONT_ACCEPT_BLANKLINE] = True + example = doctest.Example(code[0].code, output, + lineno=code[0].lineno, + options=options) + test = doctest.DocTest([example], {}, group.name, + filename, code[0].lineno, None) + self.type = 'exec' # multiple statements again + # DocTest.__init__ copies the globs namespace, which we don't want + test.globs = ns + # also don't clear the globs namespace after running the doctest + self.test_runner.run(test, out=self._warn_out, clear_globs=False) + + +def setup(app): + app.add_directive('testsetup', testsetup_directive, 1, (0, 1, 1)) + app.add_directive('doctest', doctest_directive, 1, (0, 1, 1), + hide=directives.flag, options=directives.unchanged) + app.add_directive('testcode', testcode_directive, 1, (0, 1, 1), + hide=directives.flag) + app.add_directive('testoutput', testoutput_directive, 1, (0, 1, 1), + hide=directives.flag, options=directives.unchanged) + app.add_builder(DocTestBuilder) + # this config value adds to sys.path + app.add_config_value('doctest_path', [], False) + app.add_config_value('doctest_test_doctest_blocks', 'default', False) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/ifconfig.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/ifconfig.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext.ifconfig + ~~~~~~~~~~~~~~~~~~~ + + Provides the ``ifconfig`` directive that allows to write documentation + that is included depending on configuration variables. + + Usage:: + + .. ifconfig:: releaselevel in ('alpha', 'beta', 'rc') + + This stuff is only included in the built docs for unstable versions. + + The argument for ``ifconfig`` is a plain Python expression, evaluated in the + namespace of the project configuration (that is, all variables from ``conf.py`` + are available.) + + :copyright: 2008 by Georg Brandl. + :license: BSD. +""" + +from docutils import nodes + + +class ifconfig(nodes.Element): pass + + +def ifconfig_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + node = ifconfig() + node.line = lineno + node['expr'] = arguments[0] + state.nested_parse(content, content_offset, node) + return [node] + + +def process_ifconfig_nodes(app, doctree, docname): + ns = app.config.__dict__.copy() + ns['builder'] = app.builder.name + for node in doctree.traverse(ifconfig): + try: + res = eval(node['expr'], ns) + except Exception, err: + # handle exceptions in a clean fashion + from traceback import format_exception_only + msg = ''.join(format_exception_only(err.__class__, err)) + newnode = doctree.reporter.error('Exception occured in ' + 'ifconfig expression: \n%s' % + msg, base_node=node) + node.replace_self(newnode) + else: + if not res: + node.replace_self([]) + else: + node.replace_self(node.children) + + +def setup(app): + app.add_node(ifconfig) + app.add_directive('ifconfig', ifconfig_directive, 1, (1, 0, 1)) + app.connect('doctree-resolved', process_ifconfig_nodes) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/intersphinx.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/intersphinx.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext.intersphinx + ~~~~~~~~~~~~~~~~~~~~~~ + + Insert links to Python objects documented in remote Sphinx documentation. + + This works as follows: + + * Each Sphinx HTML build creates a file named "objects.inv" that contains + a mapping from Python identifiers to URIs relative to the HTML set's root. + + * Projects using the Intersphinx extension can specify links to such mapping + files in the `intersphinx_mapping` config value. The mapping will then be + used to resolve otherwise missing references to Python objects into links + to the other documentation. + + * By default, the mapping file is assumed to be at the same location as the + rest of the documentation; however, the location of the mapping file can + also be specified individually, e.g. if the docs should be buildable + without Internet access. + + :copyright: 2008 by Georg Brandl. + :license: BSD. +""" + +import time +import urllib +import posixpath +from os import path + +from docutils import nodes + +from sphinx.builder import INVENTORY_FILENAME + + +def fetch_inventory(app, uri, inv): + """Fetch, parse and return an intersphinx inventory file.""" + invdata = {} + # both *uri* (base URI of the links to generate) and *inv* (actual + # location of the inventory file) can be local or remote URIs + localuri = uri.find('://') == -1 + try: + if inv.find('://') != -1: + f = urllib.urlopen(inv) + else: + f = open(path.join(app.srcdir, inv)) + except Exception, err: + app.warn('intersphinx inventory %r not fetchable due to ' + '%s: %s' % (inv, err.__class__, err)) + return + try: + line = f.next() + if line.rstrip() != '# Sphinx inventory version 1': + raise ValueError('unknown or unsupported inventory version') + line = f.next() + projname = line.rstrip()[11:].decode('utf-8') + line = f.next() + version = line.rstrip()[11:] + for line in f: + name, type, location = line.rstrip().split(None, 2) + if localuri: + location = path.join(uri, location) + else: + location = posixpath.join(uri, location) + invdata[name] = (type, projname, version, location) + f.close() + except Exception, err: + app.warn('intersphinx inventory %r not readable due to ' + '%s: %s' % (inv, err.__class__, err)) + else: + return invdata + + +def load_mappings(app): + """Load all intersphinx mappings into the environment.""" + now = int(time.time()) + cache_time = now - app.config.intersphinx_cache_limit * 86400 + env = app.builder.env + if not hasattr(env, 'intersphinx_cache'): + env.intersphinx_cache = {} + cache = env.intersphinx_cache + update = False + for uri, inv in app.config.intersphinx_mapping.iteritems(): + # we can safely assume that the uri<->inv mapping is not changed + # during partial rebuilds since a changed intersphinx_mapping + # setting will cause a full environment reread + if not inv: + inv = posixpath.join(uri, INVENTORY_FILENAME) + # decide whether the inventory must be read: always read local + # files; remote ones only if the cache time is expired + if '://' not in inv or uri not in cache \ + or cache[uri][0] < cache_time: + invdata = fetch_inventory(app, uri, inv) + cache[uri] = (now, invdata) + update = True + if update: + env.intersphinx_inventory = {} + for _, invdata in cache.itervalues(): + if invdata: + env.intersphinx_inventory.update(invdata) + + +def missing_reference(app, env, node, contnode): + """Attempt to resolve a missing reference via intersphinx references.""" + type = node['reftype'] + target = node['reftarget'] + if type == 'mod': + type, proj, version, uri = env.intersphinx_inventory.get(target, + ('','','','')) + if type != 'mod': + return None + target = 'module-' + target # for link anchor + else: + if target[-2:] == '()': + target = target[:-2] + target = target.rstrip(' *') + # special case: exceptions and object methods + if type == 'exc' and '.' not in target and \ + 'exceptions.' + target in env.intersphinx_inventory: + target = 'exceptions.' + target + elif type in ('func', 'meth') and '.' not in target and \ + 'object.' + target in env.intersphinx_inventory: + target = 'object.' + target + if target not in env.intersphinx_inventory: + return None + type, proj, version, uri = env.intersphinx_inventory[target] + print "Intersphinx hit:", target, uri + newnode = nodes.reference('', '') + newnode['refuri'] = uri + '#' + target + newnode['reftitle'] = '(in %s v%s)' % (proj, version) + newnode['class'] = 'external-xref' + newnode.append(contnode) + return newnode + + +def setup(app): + app.add_config_value('intersphinx_mapping', {}, True) + app.add_config_value('intersphinx_cache_limit', 5, False) + app.connect('missing-reference', missing_reference) + app.connect('builder-inited', load_mappings) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/jsmath.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/jsmath.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext.jsmath + ~~~~~~~~~~~~~~~~~ + + Set up everything for use of JSMath to display math in HTML + via JavaScript. + + :copyright: 2008 by Georg Brandl. + :license: BSD. +""" + +from docutils import nodes + +from sphinx.application import ExtensionError +from sphinx.ext.mathbase import setup as mathbase_setup + + +def html_visit_math(self, node): + self.body.append(self.starttag(node, 'span', '', CLASS='math')) + self.body.append(self.encode(node['latex']) + '') + raise nodes.SkipNode + +def html_visit_displaymath(self, node): + if node['nowrap']: + self.body.append(self.starttag(node, 'div', CLASS='math')) + self.body.append(node['latex']) + self.body.append('') + raise nodes.SkipNode + for i, part in enumerate(node['latex'].split('\n\n')): + part = self.encode(part) + if i == 0: + # necessary to e.g. set the id property correctly + if node['number']: + self.body.append('(%s)' % node['number']) + self.body.append(self.starttag(node, 'div', CLASS='math')) + else: + # but only once! + self.body.append('

    ') + if '&' in part or '\\\\' in part: + self.body.append('\\begin{split}' + part + '\\end{split}') + else: + self.body.append(part) + self.body.append('
    \n') + raise nodes.SkipNode + +def builder_inited(app): + if not app.config.jsmath_path: + raise ExtensionError('jsmath_path config value must be set for the ' + 'jsmath extension to work') + app.add_javascript(app.config.jsmath_path) + + +def setup(app): + mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None)) + app.add_config_value('jsmath_path', '', False) + app.connect('builder-inited', builder_inited) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/mathbase.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/mathbase.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,139 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext.mathbase + ~~~~~~~~~~~~~~~~~~~ + + Set up math support in source files and LaTeX/text output. + + :copyright: 2008 by Georg Brandl. + :license: BSD. +""" + +from docutils import nodes, utils +from docutils.parsers.rst import directives + + +class math(nodes.Inline, nodes.TextElement): + pass + +class displaymath(nodes.Part, nodes.Element): + pass + +class eqref(nodes.Inline, nodes.TextElement): + pass + + +def wrap_displaymath(math, label): + parts = math.split('\n\n') + ret = [] + for i, part in enumerate(parts): + if label is not None and i == 0: + ret.append('\\begin{split}%s\\end{split}' % part + + (label and '\\label{'+label+'}' or '')) + else: + ret.append('\\begin{split}%s\\end{split}\\notag' % part) + return '\\begin{gather}\n' + '\\\\'.join(ret) + '\n\\end{gather}' + + +def math_role(role, rawtext, text, lineno, inliner, options={}, content=[]): + latex = utils.unescape(text, restore_backslashes=True) + return [math(latex=latex)], [] + +def eq_role(role, rawtext, text, lineno, inliner, options={}, content=[]): + text = utils.unescape(text) + node = eqref('(?)', '(?)', target=text) + node['docname'] = inliner.document.settings.env.docname + return [node], [] + +def math_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + latex = '\n'.join(content) + if arguments and arguments[0]: + latex = arguments[0] + '\n\n' + latex + node = displaymath() + node['latex'] = latex + node['label'] = options.get('label', None) + node['nowrap'] = 'nowrap' in options + node['docname'] = state.document.settings.env.docname + ret = [node] + if node['label']: + tnode = nodes.target('', '', ids=['equation-' + node['label']]) + state.document.note_explicit_target(tnode) + ret.insert(0, tnode) + return ret + + +def latex_visit_math(self, node): + self.body.append('$' + node['latex'] + '$') + raise nodes.SkipNode + +def latex_visit_displaymath(self, node): + if node['nowrap']: + self.body.append(node['latex']) + else: + label = node['label'] and node['docname'] + '-' + node['label'] or None + self.body.append(wrap_displaymath(node['latex'], label)) + raise nodes.SkipNode + +def latex_visit_eqref(self, node): + self.body.append('\\eqref{%s-%s}' % (node['docname'], node['target'])) + raise nodes.SkipNode + + +def text_visit_math(self, node): + self.add_text(node['latex']) + raise nodes.SkipNode + +def text_visit_displaymath(self, node): + self.new_state() + self.add_text(node['latex']) + self.end_state() + raise nodes.SkipNode + +def text_visit_eqref(self, node): + self.add_text(node['target']) + raise nodes.SkipNode + + +def html_visit_eqref(self, node): + self.body.append('' % node['target']) + +def html_depart_eqref(self, node): + self.body.append('') + + +def number_equations(app, doctree, docname): + num = 0 + numbers = {} + for node in doctree.traverse(displaymath): + if node['label'] is not None: + num += 1 + node['number'] = num + numbers[node['label']] = num + else: + node['number'] = None + for node in doctree.traverse(eqref): + if node['target'] not in numbers: + continue + num = '(%d)' % numbers[node['target']] + node[0] = nodes.Text(num, num) + + +def setup(app, htmlinlinevisitors, htmldisplayvisitors): + app.add_node(math, + latex=(latex_visit_math, None), + text=(text_visit_math, None), + html=htmlinlinevisitors) + app.add_node(displaymath, + latex=(latex_visit_displaymath, None), + text=(text_visit_displaymath, None), + html=htmldisplayvisitors) + app.add_node(eqref, + latex=(latex_visit_eqref, None), + text=(text_visit_eqref, None), + html=(html_visit_eqref, html_depart_eqref)) + app.add_role('math', math_role) + app.add_role('eq', eq_role) + app.add_directive('math', math_directive, 1, (0, 1, 1), + label=directives.unchanged, nowrap=directives.flag) + app.connect('doctree-resolved', number_equations) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/pngmath.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/pngmath.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,224 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext.pngmath + ~~~~~~~~~~~~~~~~~~ + + Render math in HTML via dvipng. + + :copyright: 2008 by Georg Brandl. + :license: BSD. +""" + +import re +import shutil +import tempfile +import posixpath +from os import path, getcwd, chdir +from subprocess import Popen, PIPE +try: + from hashlib import sha1 as sha +except ImportError: + from sha import sha + +from docutils import nodes + +from sphinx.util import ensuredir +from sphinx.util.png import read_png_depth, write_png_depth +from sphinx.application import SphinxError +from sphinx.ext.mathbase import setup as mathbase_setup, wrap_displaymath + +class MathExtError(SphinxError): + category = 'Math extension error' + + +DOC_HEAD = r''' +\documentclass[12pt]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amsthm} +\usepackage{amssymb} +\usepackage{amsfonts} +\usepackage{bm} +\pagestyle{empty} +''' + +DOC_BODY = r''' +\begin{document} +%s +\end{document} +''' + +DOC_BODY_PREVIEW = r''' +\usepackage[active]{preview} +\begin{document} +\begin{preview} +%s +\end{preview} +\end{document} +''' + +depth_re = re.compile(r'\[\d+ depth=(-?\d+)\]') + +def render_math(self, math): + """ + Render the LaTeX math expression *math* using latex and dvipng. + + Return the filename relative to the built document and the "depth", + that is, the distance of image bottom and baseline in pixels, if the + option to use preview_latex is switched on. + + Error handling may seem strange, but follows a pattern: if LaTeX or + dvipng aren't available, only a warning is generated (since that enables + people on machines without these programs to at least build the rest + of the docs successfully). If the programs are there, however, they + may not fail since that indicates a problem in the math source. + """ + use_preview = self.builder.config.pngmath_use_preview + + shasum = "%s.png" % sha(math.encode('utf-8')).hexdigest() + relfn = posixpath.join(self.builder.imgpath, 'math', shasum) + outfn = path.join(self.builder.outdir, '_images', 'math', shasum) + if path.isfile(outfn): + depth = read_png_depth(outfn) + return relfn, depth + + latex = DOC_HEAD + self.builder.config.pngmath_latex_preamble + latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % math + if isinstance(latex, unicode): + latex = latex.encode('utf-8') + + # use only one tempdir per build -- the use of a directory is cleaner + # than using temporary files, since we can clean up everything at once + # just removing the whole directory (see cleanup_tempdir) + if not hasattr(self.builder, '_mathpng_tempdir'): + tempdir = self.builder._mathpng_tempdir = tempfile.mkdtemp() + else: + tempdir = self.builder._mathpng_tempdir + + tf = open(path.join(tempdir, 'math.tex'), 'w') + tf.write(latex) + tf.close() + + # build latex command; old versions of latex don't have the + # --output-directory option, so we have to manually chdir to the + # temp dir to run it. + ltx_args = [self.builder.config.pngmath_latex, '--interaction=nonstopmode'] + # add custom args from the config file + ltx_args.extend(self.builder.config.pngmath_latex_args) + ltx_args.append('math.tex') + + curdir = getcwd() + chdir(tempdir) + + try: + try: + p = Popen(ltx_args, stdout=PIPE, stderr=PIPE) + except OSError, err: + if err.errno != 2: # No such file or directory + raise + if not hasattr(self.builder, '_mathpng_warned_latex'): + self.builder.warn('LaTeX command %r cannot be run (needed for math ' + 'display), check the pngmath_latex setting' % + self.builder.config.pngmath_latex) + self.builder._mathpng_warned_latex = True + return relfn, None + finally: + chdir(curdir) + + stdout, stderr = p.communicate() + if p.returncode != 0: + raise MathExtError('latex exited with error:\n[stderr]\n%s\n[stdout]\n%s' + % (stderr, stdout)) + + ensuredir(path.dirname(outfn)) + # use some standard dvipng arguments + dvipng_args = [self.builder.config.pngmath_dvipng] + dvipng_args += ['-o', outfn, '-T', 'tight', '-z9'] + # add custom ones from config value + dvipng_args.extend(self.builder.config.pngmath_dvipng_args) + if use_preview: + dvipng_args.append('--depth') + # last, the input file name + dvipng_args.append(path.join(tempdir, 'math.dvi')) + try: + p = Popen(dvipng_args, stdout=PIPE, stderr=PIPE) + except OSError, err: + if err.errno != 2: # No such file or directory + raise + if not hasattr(self.builder, '_mathpng_warned_dvipng'): + self.builder.warn('dvipng command %r cannot be run (needed for math ' + 'display), check the pngmath_dvipng setting' % + self.builder.config.pngmath_dvipng) + self.builder._mathpng_warned_dvipng = True + return relfn, None + stdout, stderr = p.communicate() + if p.returncode != 0: + raise MathExtError('dvipng exited with error:\n[stderr]\n%s\n[stdout]\n%s' + % (stderr, stdout)) + depth = None + if use_preview: + for line in stdout.splitlines(): + m = depth_re.match(line) + if m: + depth = int(m.group(1)) + write_png_depth(outfn, depth) + break + + return relfn, depth + +def cleanup_tempdir(app, exc): + if exc: + return + if not hasattr(app.builder, '_mathpng_tempdir'): + return + try: + shutil.rmtree(app.builder._mathpng_tempdir) + except Exception: + pass + +def html_visit_math(self, node): + try: + fname, depth = render_math(self, '$'+node['latex']+'$') + except MathExtError, exc: + sm = nodes.system_message(str(exc), type='WARNING', level=2, + backrefs=[], source=node['latex']) + sm.walkabout(self) + self.builder.warn('display latex %r: ' % node['latex'] + str(exc)) + raise nodes.SkipNode + self.body.append('%s' % + (fname, self.encode(node['latex']).strip(), + depth and 'style="vertical-align: %dpx" ' % (-depth) or '')) + raise nodes.SkipNode + +def html_visit_displaymath(self, node): + if node['nowrap']: + latex = node['latex'] + else: + latex = wrap_displaymath(node['latex'], None) + try: + fname, depth = render_math(self, latex) + except MathExtError, exc: + sm = nodes.system_message(str(exc), type='WARNING', level=2, + backrefs=[], source=node['latex']) + sm.walkabout(self) + self.builder.warn('inline latex %r: ' % node['latex'] + str(exc)) + raise nodes.SkipNode + self.body.append(self.starttag(node, 'div', CLASS='math')) + self.body.append('

    ') + if node['number']: + self.body.append('(%s)' % node['number']) + self.body.append('%s\n' % + (fname, self.encode(node['latex']).strip())) + self.body.append('

    ') + raise nodes.SkipNode + + +def setup(app): + mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None)) + app.add_config_value('pngmath_dvipng', 'dvipng', False) + app.add_config_value('pngmath_latex', 'latex', False) + app.add_config_value('pngmath_use_preview', False, False) + app.add_config_value('pngmath_dvipng_args', ['-gamma 1.5', '-D 110'], False) + app.add_config_value('pngmath_latex_args', [], False) + app.add_config_value('pngmath_latex_preamble', '', False) + app.connect('build-finished', cleanup_tempdir) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/refcounting.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/refcounting.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext.refcounting + ~~~~~~~~~~~~~~~~~~~~~~ + + Supports reference count annotations for C API functions. Based on + refcount.py and anno-api.py in the old Python documentation tools. + + Usage: Set the `refcount_file` config value to the path to the reference + count data file. + + :copyright: 2008 by Georg Brandl. + :license: BSD. +""" + +from os import path +from docutils import nodes + +from sphinx import addnodes + + +# refcount annotation +class refcount(nodes.emphasis): pass + + +class RCEntry: + def __init__(self, name): + self.name = name + self.args = [] + self.result_type = '' + self.result_refs = None + + +class Refcounts(dict): + @classmethod + def fromfile(cls, filename): + d = cls() + fp = open(filename, 'r') + try: + for line in fp: + line = line.strip() + if line[:1] in ("", "#"): + # blank lines and comments + continue + parts = line.split(":", 4) + if len(parts) != 5: + raise ValueError("Wrong field count in %r" % line) + function, type, arg, refcount, comment = parts + # Get the entry, creating it if needed: + try: + entry = d[function] + except KeyError: + entry = d[function] = RCEntry(function) + if not refcount or refcount == "null": + refcount = None + else: + refcount = int(refcount) + # Update the entry with the new parameter or the result information. + if arg: + entry.args.append((arg, type, refcount)) + else: + entry.result_type = type + entry.result_refs = refcount + finally: + fp.close() + return d + + def add_refcount_annotations(self, app, doctree): + for node in doctree.traverse(addnodes.desc_content): + par = node.parent + if par['desctype'] != 'cfunction': + continue + if not par[0].has_key('names') or not par[0]['names']: + continue + entry = self.get(par[0]['names'][0]) + if not entry: + continue + elif entry.result_type not in ("PyObject*", "PyVarObject*"): + continue + rc = 'Return value: ' + if entry.result_refs is None: + rc += "Always NULL." + else: + rc += (entry.result_refs and "New" or "Borrowed") + " reference." + node.insert(0, refcount(rc, rc)) + + +def init_refcounts(app): + if app.config.refcount_file: + refcounts = Refcounts.fromfile( + path.join(app.srcdir, app.config.refcount_file)) + app.connect('doctree-read', refcounts.add_refcount_annotations) + + +def setup(app): + app.add_node(refcount) + app.add_config_value('refcount_file', '', True) + app.connect('builder-inited', init_refcounts) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/todo.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/ext/todo.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext.todo + ~~~~~~~~~~~~~~~ + + Allow todos to be inserted into your documentation. Inclusion of todos can + be switched of by a configuration variable. The todolist directive collects + all todos of your project and lists them along with a backlink to the + original location. + + :copyright: 2008 Daniel Bültmann. + :license: BSD. +""" + +from docutils import nodes + +from sphinx.util.compat import make_admonition + +class todo_node(nodes.Admonition, nodes.Element): pass +class todolist(nodes.General, nodes.Element): pass + + +def todo_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + env = state.document.settings.env + + targetid = "todo-%s" % env.index_num + env.index_num += 1 + targetnode = nodes.target('', '', ids=[targetid]) + + ad = make_admonition(todo_node, name, [_('Todo')], options, content, lineno, + content_offset, block_text, state, state_machine) + + # Attach a list of all todos to the environment, + # the todolist works with the collected todo nodes + if not hasattr(env, 'todo_all_todos'): + env.todo_all_todos = [] + env.todo_all_todos.append({ + 'docname': env.docname, + 'lineno': lineno, + 'todo': ad[0].deepcopy(), + 'target': targetnode, + }) + + return [targetnode] + ad + + +def todolist_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + # Simply insert an empty todolist node which will be replaced later + # when process_todo_nodes is called + return [todolist('')] + + +def process_todo_nodes(app, doctree, fromdocname): + if not app.config['todo_include_todos']: + for node in doctree.traverse(todo_node): + node.parent.remove(node) + + # Replace all todolist nodes with a list of the collected todos. + # Augment each todo with a backlink to the original location. + env = app.builder.env + + for node in doctree.traverse(todolist): + if not app.config['todo_include_todos']: + node.replace_self([]) + continue + + content = [] + + for todo_info in env.todo_all_todos: + para = nodes.paragraph() + filename = env.doc2path(todo_info['docname'], base=None) + description = ( + _('(The original entry is located in %s, line %d and can be found ') % + (filename, todo_info['lineno'])) + para += nodes.Text(description, description) + + # Create a reference + newnode = nodes.reference('', '') + innernode = nodes.emphasis(_('here'), _('here')) + newnode['refdocname'] = todo_info['docname'] + newnode['refuri'] = app.builder.get_relative_uri( + fromdocname, todo_info['docname']) + newnode['refuri'] += '#' + todo_info['target']['refid'] + newnode.append(innernode) + para += newnode + para += nodes.Text('.)', '.)') + + # Insert into the todolist + content.append(todo_info['todo']) + content.append(para) + + node.replace_self(content) + + +def purge_todos(app, env, docname): + if not hasattr(env, 'todo_all_todos'): + return + env.todo_all_todos = [todo for todo in env.todo_all_todos + if todo['docname'] != docname] + + +def visit_todo_node(self, node): + self.visit_admonition(node) + +def depart_todo_node(self, node): + self.depart_admonition(node) + +def setup(app): + app.add_config_value('todo_include_todos', False, False) + + app.add_node(todolist) + app.add_node(todo_node, + html=(visit_todo_node, depart_todo_node), + latex=(visit_todo_node, depart_todo_node), + text=(visit_todo_node, depart_todo_node)) + + app.add_directive('todo', todo_directive, 1, (0, 0, 1)) + app.add_directive('todolist', todolist_directive, 0, (0, 0, 0)) + app.connect('doctree-resolved', process_todo_nodes) + app.connect('env-purge-doc', purge_todos) + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/highlighting.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/highlighting.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,195 @@ +# -*- coding: utf-8 -*- +""" + sphinx.highlighting + ~~~~~~~~~~~~~~~~~~~ + + Highlight code blocks using Pygments. + + :copyright: 2007-2008 by Georg Brandl. + :license: BSD. +""" + +import sys +import cgi +import re +import parser + +from sphinx.util.texescape import tex_hl_escape_map + +try: + import pygments + from pygments import highlight + from pygments.lexers import PythonLexer, PythonConsoleLexer, CLexer, \ + TextLexer, RstLexer + from pygments.lexers import get_lexer_by_name, guess_lexer + from pygments.formatters import HtmlFormatter, LatexFormatter + from pygments.filters import ErrorToken + from pygments.style import Style + from pygments.styles import get_style_by_name + from pygments.styles.friendly import FriendlyStyle + from pygments.token import Generic, Comment, Number +except ImportError: + pygments = None +else: + class SphinxStyle(Style): + """ + Like friendly, but a bit darker to enhance contrast on the green + background. + """ + + background_color = '#eeffcc' + default_style = '' + + styles = FriendlyStyle.styles + styles.update({ + Generic.Output: '#333', + Comment: 'italic #408090', + Number: '#208050', + }) + + lexers = dict( + none = TextLexer(), + python = PythonLexer(), + pycon = PythonConsoleLexer(), + # the python3 option exists as of Pygments 0.12, but it doesn't + # do any harm in previous versions + pycon3 = PythonConsoleLexer(python3=True), + rest = RstLexer(), + c = CLexer(), + ) + for _lexer in lexers.values(): + _lexer.add_filter('raiseonerror') + + +escape_hl_chars = {ord(u'@'): u'@PYGZat[]', + ord(u'['): u'@PYGZlb[]', + ord(u']'): u'@PYGZrb[]'} + +# used if Pygments is not available +_LATEX_STYLES = r''' +\newcommand\PYGZat{@} +\newcommand\PYGZlb{[} +\newcommand\PYGZrb{]} +''' + + +parsing_exceptions = (SyntaxError, UnicodeEncodeError) +if sys.version_info < (2, 5): + # Python <= 2.4 raises MemoryError when parsing an + # invalid encoding cookie + parsing_exceptions += MemoryError, + + +class PygmentsBridge(object): + def __init__(self, dest='html', stylename='sphinx'): + self.dest = dest + if not pygments: + return + if stylename == 'sphinx': + style = SphinxStyle + elif '.' in stylename: + module, stylename = stylename.rsplit('.', 1) + style = getattr(__import__(module, None, None, ['']), stylename) + else: + style = get_style_by_name(stylename) + self.hfmter = {False: HtmlFormatter(style=style), + True: HtmlFormatter(style=style, linenos=True)} + self.lfmter = {False: LatexFormatter(style=style, commandprefix='PYG'), + True: LatexFormatter(style=style, linenos=True, + commandprefix='PYG')} + + def unhighlighted(self, source): + if self.dest == 'html': + return '
    ' + cgi.escape(source) + '
    \n' + else: + # first, escape highlighting characters like Pygments does + source = source.translate(escape_hl_chars) + # then, escape all characters nonrepresentable in LaTeX + source = source.translate(tex_hl_escape_map) + return '\\begin{Verbatim}[commandchars=@\\[\\]]\n' + \ + source + '\\end{Verbatim}\n' + + def try_parse(self, src): + # Make sure it ends in a newline + src += '\n' + + # Replace "..." by a mark which is also a valid python expression + # (Note, the highlighter gets the original source, this is only done + # to allow "..." in code and still highlight it as Python code.) + mark = "__highlighting__ellipsis__" + src = src.replace("...", mark) + + # lines beginning with "..." are probably placeholders for suite + src = re.sub(r"(?m)^(\s*)" + mark + "(.)", r"\1"+ mark + r"# \2", src) + + # if we're using 2.5, use the with statement + if sys.version_info >= (2, 5): + src = 'from __future__ import with_statement\n' + src + + if isinstance(src, unicode): + # Non-ASCII chars will only occur in string literals + # and comments. If we wanted to give them to the parser + # correctly, we'd have to find out the correct source + # encoding. Since it may not even be given in a snippet, + # just replace all non-ASCII characters. + src = src.encode('ascii', 'replace') + + try: + parser.suite(src) + except parsing_exceptions: + return False + else: + return True + + def highlight_block(self, source, lang, linenos=False): + if not pygments: + return self.unhighlighted(source) + if lang in ('py', 'python'): + if source.startswith('>>>'): + # interactive session + lexer = lexers['pycon'] + else: + # maybe Python -- try parsing it + if self.try_parse(source): + lexer = lexers['python'] + else: + return self.unhighlighted(source) + elif lang in ('python3', 'py3') and source.startswith('>>>'): + # for py3, recognize interactive sessions, but do not try parsing... + lexer = lexers['pycon3'] + elif lang == 'guess': + try: + lexer = guess_lexer(source) + except Exception: + return self.unhighlighted(source) + else: + if lang in lexers: + lexer = lexers[lang] + else: + lexer = lexers[lang] = get_lexer_by_name(lang) + lexer.add_filter('raiseonerror') + try: + if self.dest == 'html': + return highlight(source, lexer, self.hfmter[bool(linenos)]) + else: + hlsource = highlight(source, lexer, self.lfmter[bool(linenos)]) + return hlsource.translate(tex_hl_escape_map) + except ErrorToken: + # this is most probably not the selected language, + # so let it pass unhighlighted + return self.unhighlighted(source) + + def get_stylesheet(self): + if not pygments: + if self.dest == 'latex': + return _LATEX_STYLES + # no HTML styles needed + return '' + if self.dest == 'html': + return self.hfmter[0].get_style_defs() + else: + styledefs = self.lfmter[0].get_style_defs() + # workaround for Pygments < 0.12 + if styledefs.startswith('\\newcommand\\at{@}'): + styledefs += _LATEX_STYLES + return styledefs diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/htmlhelp.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/htmlhelp.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,220 @@ +# -*- coding: utf-8 -*- +""" + sphinx.htmlhelp + ~~~~~~~~~~~~~~~ + + Build HTML help support files. + Adapted from the original Doc/tools/prechm.py. + + :copyright: 2007-2008 by Georg Brandl. + :license: BSD. +""" + +import os +import cgi +from os import path + +from docutils import nodes + +from sphinx import addnodes + +# Project file (*.hhp) template. 'outname' is the file basename (like +# the pythlp in pythlp.hhp); 'version' is the doc version number (like +# the 2.2 in Python 2.2). +# The magical numbers in the long line under [WINDOWS] set most of the +# user-visible features (visible buttons, tabs, etc). +# About 0x10384e: This defines the buttons in the help viewer. The +# following defns are taken from htmlhelp.h. Not all possibilities +# actually work, and not all those that work are available from the Help +# Workshop GUI. In particular, the Zoom/Font button works and is not +# available from the GUI. The ones we're using are marked with 'x': +# +# 0x000002 Hide/Show x +# 0x000004 Back x +# 0x000008 Forward x +# 0x000010 Stop +# 0x000020 Refresh +# 0x000040 Home x +# 0x000080 Forward +# 0x000100 Back +# 0x000200 Notes +# 0x000400 Contents +# 0x000800 Locate x +# 0x001000 Options x +# 0x002000 Print x +# 0x004000 Index +# 0x008000 Search +# 0x010000 History +# 0x020000 Favorites +# 0x040000 Jump 1 +# 0x080000 Jump 2 +# 0x100000 Zoom/Font x +# 0x200000 TOC Next +# 0x400000 TOC Prev + +project_template = '''\ +[OPTIONS] +Binary TOC=Yes +Binary Index=No +Compiled file=%(outname)s.chm +Contents file=%(outname)s.hhc +Default Window=%(outname)s +Default topic=index.html +Display compile progress=No +Full text search stop list file=%(outname)s.stp +Full-text search=Yes +Index file=%(outname)s.hhk +Language=0x409 +Title=%(title)s + +[WINDOWS] +%(outname)s="%(title)s","%(outname)s.hhc","%(outname)s.hhk",\ +"index.html","index.html",,,,,0x63520,220,0x10384e,[0,0,1024,768],,,,,,,0 + +[FILES] +''' + +contents_header = '''\ + + + + + + + + + + +
      +''' + +contents_footer = '''\ +
    +''' + +object_sitemap = '''\ + + + + +''' + +# List of words the full text search facility shouldn't index. This +# becomes file outname.stp. Note that this list must be pretty small! +# Different versions of the MS docs claim the file has a maximum size of +# 256 or 512 bytes (including \r\n at the end of each line). +# Note that "and", "or", "not" and "near" are operators in the search +# language, so no point indexing them even if we wanted to. +stopwords = """ +a and are as at +be but by +for +if in into is it +near no not +of on or +such +that the their then there these they this to +was will with +""".split() + + +def build_hhx(builder, outdir, outname): + builder.info('dumping stopword list...') + f = open(path.join(outdir, outname+'.stp'), 'w') + try: + for word in sorted(stopwords): + print >>f, word + finally: + f.close() + + builder.info('writing project file...') + f = open(path.join(outdir, outname+'.hhp'), 'w') + try: + f.write(project_template % {'outname': outname, + 'title': builder.config.html_title, + 'version': builder.config.version, + 'project': builder.config.project}) + if not outdir.endswith(os.sep): + outdir += os.sep + olen = len(outdir) + for root, dirs, files in os.walk(outdir): + staticdir = (root == path.join(outdir, '_static')) + for fn in files: + if (staticdir and not fn.endswith('.js')) or fn.endswith('.html'): + print >>f, path.join(root, fn)[olen:].replace(os.sep, '\\') + finally: + f.close() + + builder.info('writing TOC file...') + f = open(path.join(outdir, outname+'.hhc'), 'w') + try: + f.write(contents_header) + # special books + f.write('
  • ' + object_sitemap % (builder.config.html_short_title, + 'index.html')) + if builder.config.html_use_modindex: + f.write('
  • ' + object_sitemap % (_('Global Module Index'), + 'modindex.html')) + # the TOC + tocdoc = builder.env.get_and_resolve_doctree(builder.config.master_doc, builder, + prune_toctrees=False) + def write_toc(node, ullevel=0): + if isinstance(node, nodes.list_item): + f.write('
  • ') + for subnode in node: + write_toc(subnode, ullevel) + elif isinstance(node, nodes.reference): + link = node['refuri'] + title = cgi.escape(node.astext()).replace('"','"') + item = object_sitemap % (title, link) + f.write(item.encode('ascii', 'xmlcharrefreplace')) + elif isinstance(node, nodes.bullet_list): + if ullevel != 0: + f.write('
      \n') + for subnode in node: + write_toc(subnode, ullevel+1) + if ullevel != 0: + f.write('
    \n') + elif isinstance(node, addnodes.compact_paragraph): + for subnode in node: + write_toc(subnode, ullevel) + istoctree = lambda node: isinstance(node, addnodes.compact_paragraph) and \ + node.has_key('toctree') + for node in tocdoc.traverse(istoctree): + write_toc(node) + f.write(contents_footer) + finally: + f.close() + + builder.info('writing index file...') + index = builder.env.create_index(builder) + f = open(path.join(outdir, outname+'.hhk'), 'w') + try: + f.write('
      \n') + def write_index(title, refs, subitems): + def write_param(name, value): + item = ' \n' % (name, value) + f.write(item.encode('ascii', 'xmlcharrefreplace')) + title = cgi.escape(title) + f.write('
    • \n') + write_param('Keyword', title) + if len(refs) == 0: + write_param('See Also', title) + elif len(refs) == 1: + write_param('Local', refs[0]) + else: + for i, ref in enumerate(refs): + write_param('Name', '[%d] %s' % (i, ref)) # XXX: better title? + write_param('Local', ref) + f.write('\n') + if subitems: + f.write('
        ') + for subitem in subitems: + write_index(subitem[0], subitem[1], []) + f.write('
      ') + for (key, group) in index: + for title, (refs, subitems) in group: + write_index(title, refs, subitems) + f.write('
    \n') + finally: + f.close() diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/htmlwriter.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/htmlwriter.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,457 @@ +# -*- coding: utf-8 -*- +""" + sphinx.htmlwriter + ~~~~~~~~~~~~~~~~~ + + docutils writers handling Sphinx' custom nodes. + + :copyright: 2007-2008 by Georg Brandl. + :license: BSD. +""" + +import sys +import posixpath +import os + +from docutils import nodes +from docutils.writers.html4css1 import Writer, HTMLTranslator as BaseTranslator + +from sphinx.locale import admonitionlabels, versionlabels +from sphinx.highlighting import PygmentsBridge +from sphinx.util.smartypants import sphinx_smarty_pants + +try: + import Image # check for the Python Imaging Library +except ImportError: + Image = None + +class HTMLWriter(Writer): + def __init__(self, builder): + Writer.__init__(self) + self.builder = builder + + def translate(self): + # sadly, this is mostly copied from parent class + self.visitor = visitor = self.builder.translator_class(self.builder, + self.document) + self.document.walkabout(visitor) + self.output = visitor.astext() + for attr in ('head_prefix', 'stylesheet', 'head', 'body_prefix', + 'body_pre_docinfo', 'docinfo', 'body', 'fragment', + 'body_suffix', 'meta', 'title', 'subtitle', 'header', + 'footer', 'html_prolog', 'html_head', 'html_title', + 'html_subtitle', 'html_body', ): + setattr(self, attr, getattr(visitor, attr, None)) + self.clean_meta = ''.join(visitor.meta[2:]) + + +class HTMLTranslator(BaseTranslator): + """ + Our custom HTML translator. + """ + + def __init__(self, builder, *args, **kwds): + BaseTranslator.__init__(self, *args, **kwds) + self.highlighter = PygmentsBridge('html', builder.config.pygments_style) + self.no_smarty = 0 + self.builder = builder + self.highlightlang = builder.config.highlight_language + self.highlightlinenothreshold = sys.maxint + self.protect_literal_text = 0 + + def visit_desc(self, node): + self.body.append(self.starttag(node, 'dl', CLASS=node['desctype'])) + def depart_desc(self, node): + self.body.append('\n\n') + + def visit_desc_signature(self, node): + # the id is set automatically + self.body.append(self.starttag(node, 'dt')) + # anchor for per-desc interactive data + if node.parent['desctype'] != 'describe' and node['ids'] and node['first']: + self.body.append('' % node['ids'][0]) + if node.parent['desctype'] in ('class', 'exception'): + self.body.append('%s ' % node.parent['desctype']) + def depart_desc_signature(self, node): + if node['ids'] and self.builder.add_definition_links: + self.body.append(u'\u00B6' % + _('Permalink to this definition')) + self.body.append('\n') + + def visit_desc_addname(self, node): + self.body.append(self.starttag(node, 'tt', '', CLASS='descclassname')) + def depart_desc_addname(self, node): + self.body.append('') + + def visit_desc_type(self, node): + pass + def depart_desc_type(self, node): + pass + + def visit_desc_name(self, node): + self.body.append(self.starttag(node, 'tt', '', CLASS='descname')) + def depart_desc_name(self, node): + self.body.append('') + + def visit_desc_parameterlist(self, node): + self.body.append('(') + self.first_param = 1 + def depart_desc_parameterlist(self, node): + self.body.append(')') + + def visit_desc_parameter(self, node): + if not self.first_param: + self.body.append(', ') + else: + self.first_param = 0 + if not node.hasattr('noemph'): + self.body.append('') + def depart_desc_parameter(self, node): + if not node.hasattr('noemph'): + self.body.append('') + + def visit_desc_optional(self, node): + self.body.append('[') + def depart_desc_optional(self, node): + self.body.append(']') + + def visit_desc_annotation(self, node): + self.body.append(self.starttag(node, 'em', CLASS='property')) + def depart_desc_annotation(self, node): + self.body.append('') + + def visit_desc_content(self, node): + self.body.append(self.starttag(node, 'dd', '')) + def depart_desc_content(self, node): + self.body.append('') + + def visit_refcount(self, node): + self.body.append(self.starttag(node, 'em', '', CLASS='refcount')) + def depart_refcount(self, node): + self.body.append('') + + def visit_versionmodified(self, node): + self.body.append(self.starttag(node, 'p')) + text = versionlabels[node['type']] % node['version'] + if len(node): + text += ': ' + else: + text += '.' + self.body.append('%s' % text) + def depart_versionmodified(self, node): + self.body.append('

    \n') + + # overwritten + def visit_reference(self, node): + BaseTranslator.visit_reference(self, node) + if node.hasattr('reftitle'): + # ugly hack to add a title attribute + starttag = self.body[-1] + if not starttag.startswith(' tag + self.section_level += 1 + self.body.append(self.starttag(node, 'div', CLASS='section')) + + def visit_title(self, node): + # don't move the id attribute inside the tag + BaseTranslator.visit_title(self, node, move_ids=0) + + # overwritten + def visit_literal_block(self, node): + if node.rawsource != node.astext(): + # most probably a parsed-literal block -- don't highlight + return BaseTranslator.visit_literal_block(self, node) + lang = self.highlightlang + linenos = node.rawsource.count('\n') >= self.highlightlinenothreshold - 1 + if node.has_key('language'): + # code-block directives + lang = node['language'] + if node.has_key('linenos'): + linenos = node['linenos'] + highlighted = self.highlighter.highlight_block(node.rawsource, lang, linenos) + starttag = self.starttag(node, 'div', suffix='', CLASS='highlight-%s' % lang) + self.body.append(starttag + highlighted + '\n') + raise nodes.SkipNode + + def visit_doctest_block(self, node): + self.visit_literal_block(node) + + # overwritten + def visit_literal(self, node): + if len(node.children) == 1 and \ + node.children[0] in ('None', 'True', 'False'): + node['classes'].append('xref') + self.body.append(self.starttag(node, 'tt', '', CLASS='docutils literal')) + self.protect_literal_text += 1 + def depart_literal(self, node): + self.protect_literal_text -= 1 + self.body.append('') + + def visit_productionlist(self, node): + self.body.append(self.starttag(node, 'pre')) + names = [] + for production in node: + names.append(production['tokenname']) + maxlen = max(len(name) for name in names) + for production in node: + if production['tokenname']: + lastname = production['tokenname'].ljust(maxlen) + self.body.append(self.starttag(production, 'strong', '')) + self.body.append(lastname + ' ::= ') + else: + self.body.append('%s ' % (' '*len(lastname))) + production.walkabout(self) + self.body.append('\n') + self.body.append('\n') + raise nodes.SkipNode + def depart_productionlist(self, node): + pass + + def visit_production(self, node): + pass + def depart_production(self, node): + pass + + def visit_centered(self, node): + self.body.append(self.starttag(node, 'p', CLASS="centered") + '') + def depart_centered(self, node): + self.body.append('

    ') + + def visit_compact_paragraph(self, node): + pass + def depart_compact_paragraph(self, node): + pass + + def visit_highlightlang(self, node): + self.highlightlang = node['lang'] + self.highlightlinenothreshold = node['linenothreshold'] + def depart_highlightlang(self, node): + pass + + # overwritten + def visit_image(self, node): + olduri = node['uri'] + # rewrite the URI if the environment knows about it + if olduri in self.builder.images: + node['uri'] = posixpath.join(self.builder.imgpath, + self.builder.images[olduri]) + + if node.has_key('scale'): + if Image and not (node.has_key('width') + and node.has_key('height')): + try: + im = Image.open(os.path.join(self.builder.srcdir, + olduri)) + except (IOError, # Source image can't be found or opened + UnicodeError): # PIL doesn't like Unicode paths. + print olduri + pass + else: + if not node.has_key('width'): + node['width'] = str(im.size[0]) + if not node.has_key('height'): + node['height'] = str(im.size[1]) + del im + BaseTranslator.visit_image(self, node) + + def visit_toctree(self, node): + # this only happens when formatting a toc from env.tocs -- in this + # case we don't want to include the subtree + raise nodes.SkipNode + + def visit_index(self, node): + raise nodes.SkipNode + + def visit_tabular_col_spec(self, node): + raise nodes.SkipNode + + def visit_glossary(self, node): + pass + def depart_glossary(self, node): + pass + + def visit_acks(self, node): + pass + def depart_acks(self, node): + pass + + def visit_module(self, node): + pass + def depart_module(self, node): + pass + + def bulk_text_processor(self, text): + return text + + # overwritten + def visit_Text(self, node): + text = node.astext() + encoded = self.encode(text) + if self.protect_literal_text: + # moved here from base class's visit_literal to support + # more formatting in literal nodes + for token in self.words_and_spaces.findall(encoded): + if token.strip(): + # protect literal text from line wrapping + self.body.append('%s' % token) + elif token in ' \n': + # allow breaks at whitespace + self.body.append(token) + else: + # protect runs of multiple spaces; the last one can wrap + self.body.append(' ' * (len(token)-1) + ' ') + else: + if self.in_mailto and self.settings.cloak_email_addresses: + encoded = self.cloak_email(encoded) + else: + encoded = self.bulk_text_processor(encoded) + self.body.append(encoded) + + # these are all for docutils 0.5 compatibility + + def visit_note(self, node): + self.visit_admonition(node, 'note') + def depart_note(self, node): + self.depart_admonition(node) + + def visit_warning(self, node): + self.visit_admonition(node, 'warning') + def depart_warning(self, node): + self.depart_admonition(node) + + def visit_attention(self, node): + self.visit_admonition(node, 'attention') + + def depart_attention(self, node): + self.depart_admonition() + + def visit_caution(self, node): + self.visit_admonition(node, 'caution') + def depart_caution(self, node): + self.depart_admonition() + + def visit_danger(self, node): + self.visit_admonition(node, 'danger') + def depart_danger(self, node): + self.depart_admonition() + + def visit_error(self, node): + self.visit_admonition(node, 'error') + def depart_error(self, node): + self.depart_admonition() + + def visit_hint(self, node): + self.visit_admonition(node, 'hint') + def depart_hint(self, node): + self.depart_admonition() + + def visit_important(self, node): + self.visit_admonition(node, 'important') + def depart_important(self, node): + self.depart_admonition() + + def visit_tip(self, node): + self.visit_admonition(node, 'tip') + def depart_tip(self, node): + self.depart_admonition() + + # these are only handled specially in the SmartyPantsHTMLTranslator + def visit_literal_emphasis(self, node): + return self.visit_emphasis(node) + def depart_literal_emphasis(self, node): + return self.depart_emphasis(node) + + def depart_title(self, node): + close_tag = self.context[-1] + if self.builder.add_header_links and \ + (close_tag.startswith('\u00B6
    ' % + _('Permalink to this headline')) + BaseTranslator.depart_title(self, node) + + def unknown_visit(self, node): + raise NotImplementedError('Unknown node: ' + node.__class__.__name__) + + +class SmartyPantsHTMLTranslator(HTMLTranslator): + """ + Handle ordinary text via smartypants, converting quotes and dashes + to the correct entities. + """ + + def __init__(self, *args, **kwds): + self.no_smarty = 0 + HTMLTranslator.__init__(self, *args, **kwds) + + def visit_literal(self, node): + self.no_smarty += 1 + try: + # this raises SkipNode + HTMLTranslator.visit_literal(self, node) + finally: + self.no_smarty -= 1 + + def visit_literal_emphasis(self, node): + self.no_smarty += 1 + self.visit_emphasis(node) + + def depart_literal_emphasis(self, node): + self.depart_emphasis(node) + self.no_smarty -= 1 + + def visit_desc_signature(self, node): + self.no_smarty += 1 + HTMLTranslator.visit_desc_signature(self, node) + + def depart_desc_signature(self, node): + self.no_smarty -= 1 + HTMLTranslator.depart_desc_signature(self, node) + + def visit_productionlist(self, node): + self.no_smarty += 1 + try: + HTMLTranslator.visit_productionlist(self, node) + finally: + self.no_smarty -= 1 + + def visit_option(self, node): + self.no_smarty += 1 + HTMLTranslator.visit_option(self, node) + def depart_option(self, node): + self.no_smarty -= 1 + HTMLTranslator.depart_option(self, node) + + def bulk_text_processor(self, text): + if self.no_smarty <= 0: + return sphinx_smarty_pants(text) + return text diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/latexwriter.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/latexwriter.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1192 @@ +# -*- coding: utf-8 -*- +""" + sphinx.latexwriter + ~~~~~~~~~~~~~~~~~~ + + Custom docutils writer for LaTeX. + + Much of this code is adapted from Dave Kuhlman's "docpy" writer from his + docutils sandbox. + + :copyright: 2007-2008 by Georg Brandl, Dave Kuhlman. + :license: BSD. +""" + +import re +import sys +from os import path + +from docutils import nodes, writers +from docutils.writers.latex2e import Babel + +from sphinx import addnodes +from sphinx import highlighting +from sphinx.locale import admonitionlabels, versionlabels +from sphinx.util import ustrftime +from sphinx.util.texescape import tex_escape_map +from sphinx.util.smartypants import educateQuotesLatex + +HEADER = r'''%% Generated by Sphinx. +\documentclass[%(papersize)s,%(pointsize)s%(classoptions)s]{%(docclass)s} +%(inputenc)s +%(fontenc)s +%(babel)s +%(fontpkg)s +%(fncychap)s +\usepackage{sphinx} +%(preamble)s + +\title{%(title)s} +\date{%(date)s} +\release{%(release)s} +\author{%(author)s} +\newcommand{\sphinxlogo}{%(logo)s} +\renewcommand{\releasename}{%(releasename)s} +%(makeindex)s +%(makemodindex)s +''' + +BEGIN_DOC = r''' +\begin{document} +%(shorthandoff)s +%(maketitle)s +%(tableofcontents)s +''' + +FOOTER = r''' +%(footer)s +\renewcommand{\indexname}{%(modindexname)s} +%(printmodindex)s +\renewcommand{\indexname}{%(indexname)s} +%(printindex)s +\end{document} +''' + + +class LaTeXWriter(writers.Writer): + + supported = ('sphinxlatex',) + + settings_spec = ('LaTeX writer options', '', ( + ('Document name', ['--docname'], {'default': ''}), + ('Document class', ['--docclass'], {'default': 'manual'}), + ('Author', ['--author'], {'default': ''}), + )) + settings_defaults = {} + + output = None + + def __init__(self, builder): + writers.Writer.__init__(self) + self.builder = builder + + def translate(self): + visitor = LaTeXTranslator(self.document, self.builder) + self.document.walkabout(visitor) + self.output = visitor.astext() + + +# Helper classes + +class ExtBabel(Babel): + def get_shorthandoff(self): + shortlang = self.language.split('_')[0] + if shortlang in ('de', 'sl', 'pt', 'es', 'nl', 'pl'): + return '\\shorthandoff{"}' + return '' + + _ISO639_TO_BABEL = Babel._ISO639_TO_BABEL.copy() + _ISO639_TO_BABEL['sl'] = 'slovene' + + +class Table(object): + def __init__(self): + self.col = 0 + self.colcount = 0 + self.colspec = None + self.had_head = False + self.has_verbatim = False + self.caption = None + + +class Desc(object): + def __init__(self, node): + self.env = LaTeXTranslator.desc_map.get(node['desctype'], 'describe') + self.type = self.cls = self.name = self.params = self.annotation = '' + self.count = 0 + + +class LaTeXTranslator(nodes.NodeVisitor): + sectionnames = ["part", "chapter", "section", "subsection", + "subsubsection", "paragraph", "subparagraph"] + + ignore_missing_images = False + + default_elements = { + 'docclass': 'manual', + 'papersize': 'letterpaper', + 'pointsize': '10pt', + 'classoptions': '', + 'inputenc': '\\usepackage[utf8]{inputenc}', + 'fontenc': '\\usepackage[T1]{fontenc}', + 'babel': '\\usepackage{babel}', + 'fontpkg': '\\usepackage{times}', + 'fncychap': '\\usepackage[Bjarne]{fncychap}', + 'preamble': '', + 'title': '', + 'date': '', + 'release': '', + 'author': '', + 'logo': '', + 'releasename': 'Release', + 'makeindex': '\\makeindex', + 'makemodindex': '\\makemodindex', + 'shorthandoff': '', + 'maketitle': '\\maketitle', + 'tableofcontents': '\\tableofcontents', + 'footer': '', + 'printmodindex': '\\printmodindex', + 'printindex': '\\printindex', + } + + def __init__(self, document, builder): + nodes.NodeVisitor.__init__(self, document) + self.builder = builder + self.body = [] + + # sort out some elements + papersize = builder.config.latex_paper_size + 'paper' + if papersize == 'paper': # e.g. command line "-D latex_paper_size=" + papersize = 'letterpaper' + + self.elements = self.default_elements.copy() + self.elements.update({ + 'docclass': document.settings.docclass, + 'papersize': papersize, + 'pointsize': builder.config.latex_font_size, + # if empty, the title is set to the first section title + 'title': document.settings.title, + 'date': ustrftime(builder.config.today_fmt or _('%B %d, %Y')), + 'release': builder.config.release, + 'author': document.settings.author, + 'releasename': _('Release'), + 'preamble': builder.config.latex_preamble, + 'modindexname': _('Module Index'), + 'indexname': _('Index'), + }) + if builder.config.latex_logo: + self.elements['logo'] = '\\includegraphics{%s}\\par' % \ + path.basename(builder.config.latex_logo) + if builder.config.language: + babel = ExtBabel(builder.config.language) + lang = babel.get_language() + if lang: + self.elements['classoptions'] += ',' + babel.get_language() + else: + self.builder.warn('no Babel option known for language %r' % + builder.config.language) + self.elements['shorthandoff'] = babel.get_shorthandoff() + self.elements['fncychap'] = '\\usepackage[Sonny]{fncychap}' + else: + self.elements['classoptions'] += ',english' + if not builder.config.latex_use_modindex: + self.elements['makemodindex'] = '' + self.elements['printmodindex'] = '' + # allow the user to override them all + self.elements.update(builder.config.latex_elements) + + self.highlighter = highlighting.PygmentsBridge( + 'latex', builder.config.pygments_style) + self.context = [] + self.descstack = [] + self.bibitems = [] + self.table = None + self.next_table_colspec = None + self.highlightlang = builder.config.highlight_language + self.highlightlinenothreshold = sys.maxint + self.written_ids = set() + self.footnotestack = [] + if self.elements['docclass'] == 'manual': + if builder.config.latex_use_parts: + self.top_sectionlevel = 0 + else: + self.top_sectionlevel = 1 + else: + self.top_sectionlevel = 2 + self.next_section_target = None + # flags + self.verbatim = None + self.in_title = 0 + self.in_production_list = 0 + self.first_document = 1 + self.this_is_the_title = 1 + self.literal_whitespace = 0 + self.no_contractions = 0 + + def astext(self): + return (HEADER % self.elements + self.highlighter.get_stylesheet() + + u''.join(self.body) + FOOTER % self.elements) + + def visit_document(self, node): + self.footnotestack.append(self.collect_footnotes(node)) + if self.first_document == 1: + # the first document is all the regular content ... + self.body.append(BEGIN_DOC % self.elements) + self.first_document = 0 + elif self.first_document == 0: + # ... and all others are the appendices + self.body.append('\n\\appendix\n') + self.first_document = -1 + # "- 1" because the level is increased before the title is visited + self.sectionlevel = self.top_sectionlevel - 1 + def depart_document(self, node): + if self.bibitems: + widest_label = "" + for bi in self.bibitems: + if len(widest_label) < len(bi[0]): + widest_label = bi[0] + self.body.append('\n\\begin{thebibliography}{%s}\n' % widest_label) + for bi in self.bibitems: + # cite_key: underscores must not be escaped + cite_key = bi[0].replace(r"\_", "_") + self.body.append('\\bibitem[%s]{%s}{%s}\n' % (bi[0], cite_key, bi[1])) + self.body.append('\\end{thebibliography}\n') + self.bibitems = [] + + def visit_start_of_file(self, node): + # This marks the begin of a new file; therefore the current module and + # class must be reset + self.body.append('\n\\resetcurrentobjects\n') + # and also, new footnotes + self.footnotestack.append(self.collect_footnotes(node)) + + def collect_footnotes(self, node): + fnotes = {} + def footnotes_under(n): + if isinstance(n, nodes.footnote): + yield n + else: + for c in n.children: + if isinstance(c, addnodes.start_of_file): + continue + for k in footnotes_under(c): + yield k + for fn in footnotes_under(node): + num = fn.children[0].astext().strip() + fnotes[num] = fn + fn.parent.remove(fn) + return fnotes + + def depart_start_of_file(self, node): + self.footnotestack.pop() + + def visit_highlightlang(self, node): + self.highlightlang = node['lang'] + self.highlightlinenothreshold = node['linenothreshold'] + raise nodes.SkipNode + + def visit_section(self, node): + if not self.this_is_the_title: + self.sectionlevel += 1 + self.body.append('\n\n') + if self.next_section_target: + self.body.append(r'\hypertarget{%s}{}' % self.next_section_target) + self.next_section_target = None + #if node.get('ids'): + # for id in node['ids']: + # if id not in self.written_ids: + # self.body.append(r'\hypertarget{%s}{}' % id) + # self.written_ids.add(id) + def depart_section(self, node): + self.sectionlevel = max(self.sectionlevel - 1, self.top_sectionlevel - 1) + + def visit_problematic(self, node): + self.body.append(r'{\color{red}\bfseries{}') + def depart_problematic(self, node): + self.body.append('}') + + def visit_topic(self, node): + self.body.append('\\setbox0\\vbox{\n' + '\\begin{minipage}{0.95\\textwidth}\n') + def depart_topic(self, node): + self.body.append('\\end{minipage}}\n' + '\\begin{center}\\setlength{\\fboxsep}{5pt}' + '\\shadowbox{\\box0}\\end{center}\n') + visit_sidebar = visit_topic + depart_sidebar = depart_topic + + def visit_glossary(self, node): + pass + def depart_glossary(self, node): + pass + + def visit_productionlist(self, node): + self.body.append('\n\n\\begin{productionlist}\n') + self.in_production_list = 1 + def depart_productionlist(self, node): + self.body.append('\\end{productionlist}\n\n') + self.in_production_list = 0 + + def visit_production(self, node): + if node['tokenname']: + self.body.append('\\production{%s}{' % self.encode(node['tokenname'])) + else: + self.body.append('\\productioncont{') + def depart_production(self, node): + self.body.append('}\n') + + def visit_transition(self, node): + self.body.append('\n\n\\bigskip\\hrule{}\\bigskip\n\n') + def depart_transition(self, node): + pass + + def visit_title(self, node): + parent = node.parent + if isinstance(parent, addnodes.seealso): + # the environment already handles this + raise nodes.SkipNode + elif self.this_is_the_title: + if len(node.children) != 1 and not isinstance(node.children[0], nodes.Text): + self.builder.warn('document title is not a single Text node') + if not self.elements['title']: + # text needs to be escaped since it is inserted into + # the output literally + self.elements['title'] = node.astext().translate(tex_escape_map) + self.this_is_the_title = 0 + raise nodes.SkipNode + elif isinstance(parent, nodes.section): + try: + self.body.append(r'\%s{' % self.sectionnames[self.sectionlevel]) + except IndexError: + from sphinx.application import SphinxError + raise SphinxError('too many nesting section levels for LaTeX, ' + 'at heading: %s' % node.astext()) + self.context.append('}\n') + elif isinstance(parent, (nodes.topic, nodes.sidebar)): + self.body.append(r'\textbf{') + self.context.append('}\n\n\medskip\n\n') + elif isinstance(parent, nodes.Admonition): + self.body.append('{') + self.context.append('}\n') + elif isinstance(parent, nodes.table): + self.table.caption = self.encode(node.astext()) + raise nodes.SkipNode + else: + self.builder.warn('encountered title node not in section, topic, ' + 'table, admonition or sidebar') + self.body.append('\\textbf{') + self.context.append('}\n') + self.in_title = 1 + def depart_title(self, node): + self.in_title = 0 + self.body.append(self.context.pop()) + + def visit_subtitle(self, node): + if isinstance(node.parent, nodes.sidebar): + self.body.append('~\\\\\n\\textbf{') + self.context.append('}\n\\smallskip\n') + else: + self.context.append('') + def depart_subtitle(self, node): + self.body.append(self.context.pop()) + + desc_map = { + 'function' : 'funcdesc', + 'class': 'classdesc', + 'method': 'methoddesc', + 'staticmethod': 'staticmethoddesc', + 'exception': 'excdesc', + 'data': 'datadesc', + 'attribute': 'memberdesc', + 'opcode': 'opcodedesc', + + 'cfunction': 'cfuncdesc', + 'cmember': 'cmemberdesc', + 'cmacro': 'csimplemacrodesc', + 'ctype': 'ctypedesc', + 'cvar': 'cvardesc', + + 'describe': 'describe', + # and all others are 'describe' too + } + + def visit_desc(self, node): + self.descstack.append(Desc(node)) + def depart_desc(self, node): + d = self.descstack.pop() + self.body.append("\\end{%s}\n" % d.env) + + def visit_desc_signature(self, node): + d = self.descstack[-1] + # reset these for every signature + d.type = d.cls = d.name = d.params = '' + def depart_desc_signature(self, node): + d = self.descstack[-1] + d.cls = d.cls.rstrip('.') + if node.parent['desctype'] != 'describe' and node['ids']: + hyper = '\\hypertarget{%s}{}' % node['ids'][0] + else: + hyper = '' + if d.count == 0: + t1 = "\n\n%s\\begin{%s}" % (hyper, d.env) + else: + t1 = "\n%s\\%sline" % (hyper, d.env[:-4]) + d.count += 1 + if d.env in ('funcdesc', 'classdesc', 'excclassdesc'): + t2 = "{%s}{%s}" % (d.name, d.params) + elif d.env in ('datadesc', 'excdesc', 'csimplemacrodesc'): + t2 = "{%s}" % (d.name) + elif d.env in ('methoddesc', 'staticmethoddesc'): + if d.cls: + t2 = "[%s]{%s}{%s}" % (d.cls, d.name, d.params) + else: + t2 = "{%s}{%s}" % (d.name, d.params) + elif d.env == 'memberdesc': + if d.cls: + t2 = "[%s]{%s}" % (d.cls, d.name) + else: + t2 = "{%s}" % d.name + elif d.env == 'cfuncdesc': + if d.cls: + # C++ class names + d.name = '%s::%s' % (d.cls, d.name) + t2 = "{%s}{%s}{%s}" % (d.type, d.name, d.params) + elif d.env == 'cmemberdesc': + try: + type, container = d.type.rsplit(' ', 1) + container = container.rstrip('.') + except ValueError: + container = '' + type = d.type + t2 = "{%s}{%s}{%s}" % (container, type, d.name) + elif d.env == 'cvardesc': + t2 = "{%s}{%s}" % (d.type, d.name) + elif d.env == 'ctypedesc': + t2 = "{%s}" % (d.name) + elif d.env == 'opcodedesc': + t2 = "{%s}{%s}" % (d.name, d.params) + elif d.env == 'describe': + t2 = "{%s}" % d.name + self.body.append(t1 + t2) + + def visit_desc_type(self, node): + d = self.descstack[-1] + if d.env == 'describe': + d.name += self.encode(node.astext()) + else: + self.descstack[-1].type = self.encode(node.astext().strip()) + raise nodes.SkipNode + + def visit_desc_name(self, node): + d = self.descstack[-1] + if d.env == 'describe': + d.name += self.encode(node.astext()) + else: + self.descstack[-1].name = self.encode(node.astext().strip()) + raise nodes.SkipNode + + def visit_desc_addname(self, node): + d = self.descstack[-1] + if d.env == 'describe': + d.name += self.encode(node.astext()) + else: + self.descstack[-1].cls = self.encode(node.astext().strip()) + raise nodes.SkipNode + + def visit_desc_parameterlist(self, node): + d = self.descstack[-1] + if d.env == 'describe': + d.name += self.encode(node.astext()) + else: + self.descstack[-1].params = self.encode(node.astext().strip()) + raise nodes.SkipNode + + def visit_desc_annotation(self, node): + d = self.descstack[-1] + if d.env == 'describe': + d.name += self.encode(node.astext()) + else: + self.descstack[-1].annotation = self.encode(node.astext().strip()) + raise nodes.SkipNode + + def visit_refcount(self, node): + self.body.append("\\emph{") + def depart_refcount(self, node): + self.body.append("}\\\\") + + def visit_desc_content(self, node): + if node.children and not isinstance(node.children[0], nodes.paragraph): + # avoid empty desc environment which causes a formatting bug + self.body.append('~') + def depart_desc_content(self, node): + pass + + def visit_seealso(self, node): + self.body.append("\n\n\\strong{%s:}\n\n" % admonitionlabels['seealso']) + def depart_seealso(self, node): + self.body.append("\n\n") + + def visit_rubric(self, node): + if len(node.children) == 1 and node.children[0].astext() == 'Footnotes': + raise nodes.SkipNode + self.body.append('\\paragraph{') + self.context.append('}\n') + def depart_rubric(self, node): + self.body.append(self.context.pop()) + + def visit_footnote(self, node): + pass + def depart_footnote(self, node): + pass + + def visit_label(self, node): + if isinstance(node.parent, nodes.citation): + self.bibitems[-1][0] = node.astext() + raise nodes.SkipNode + + def visit_tabular_col_spec(self, node): + self.next_table_colspec = node['spec'] + raise nodes.SkipNode + + def visit_table(self, node): + if self.table: + raise NotImplementedError('Nested tables are not supported.') + self.table = Table() + self.tablebody = [] + # Redirect body output until table is finished. + self._body = self.body + self.body = self.tablebody + def depart_table(self, node): + self.body = self._body + if self.table.caption is not None: + self.body.append('\n\\begin{threeparttable}\n' + '\\caption{%s}\n' % self.table.caption) + if self.table.has_verbatim: + self.body.append('\n\\begin{tabular}') + else: + self.body.append('\n\\begin{tabulary}{\\textwidth}') + if self.table.colspec: + self.body.append(self.table.colspec) + else: + if self.table.has_verbatim: + colwidth = 0.95 / self.table.colcount + colspec = ('p{%.3f\\textwidth}|' % colwidth) * self.table.colcount + self.body.append('{|' + colspec + '}\n') + else: + self.body.append('{|' + ('L|' * self.table.colcount) + '}\n') + self.body.extend(self.tablebody) + if self.table.has_verbatim: + self.body.append('\\end{tabular}\n\n') + else: + self.body.append('\\end{tabulary}\n\n') + if self.table.caption is not None: + self.body.append('\\end{threeparttable}\n\n') + self.table = None + self.tablebody = None + + def visit_colspec(self, node): + self.table.colcount += 1 + def depart_colspec(self, node): + pass + + def visit_tgroup(self, node): + pass + def depart_tgroup(self, node): + pass + + def visit_thead(self, node): + if self.next_table_colspec: + self.table.colspec = '{%s}\n' % self.next_table_colspec + self.next_table_colspec = None + self.body.append('\\hline\n') + self.table.had_head = True + def depart_thead(self, node): + self.body.append('\\hline\n') + + def visit_tbody(self, node): + if not self.table.had_head: + self.visit_thead(node) + def depart_tbody(self, node): + self.body.append('\\hline\n') + + def visit_row(self, node): + self.table.col = 0 + def depart_row(self, node): + self.body.append('\\\\\n') + + def visit_entry(self, node): + if node.has_key('morerows') or node.has_key('morecols'): + raise NotImplementedError('Column or row spanning cells are ' + 'not implemented.') + if self.table.col > 0: + self.body.append(' & ') + self.table.col += 1 + if isinstance(node.parent.parent, nodes.thead): + self.body.append('\\textbf{') + self.context.append('}') + else: + self.context.append('') + def depart_entry(self, node): + self.body.append(self.context.pop()) # header + + def visit_acks(self, node): + # this is a list in the source, but should be rendered as a + # comma-separated list here + self.body.append('\n\n') + self.body.append(', '.join(n.astext() for n in node.children[0].children) + '.') + self.body.append('\n\n') + raise nodes.SkipNode + + def visit_bullet_list(self, node): + self.body.append('\\begin{itemize}\n' ) + def depart_bullet_list(self, node): + self.body.append('\\end{itemize}\n' ) + + def visit_enumerated_list(self, node): + self.body.append('\\begin{enumerate}\n' ) + def depart_enumerated_list(self, node): + self.body.append('\\end{enumerate}\n' ) + + def visit_list_item(self, node): + # Append "{}" in case the next character is "[", which would break + # LaTeX's list environment (no numbering and the "[" is not printed). + self.body.append(r'\item {} ') + def depart_list_item(self, node): + self.body.append('\n') + + def visit_definition_list(self, node): + self.body.append('\\begin{description}\n') + def depart_definition_list(self, node): + self.body.append('\\end{description}\n') + + def visit_definition_list_item(self, node): + pass + def depart_definition_list_item(self, node): + pass + + def visit_term(self, node): + ctx = ']' + if node.has_key('ids') and node['ids']: + ctx += '\\hypertarget{%s}{}' % node['ids'][0] + self.body.append('\\item[') + self.context.append(ctx) + def depart_term(self, node): + self.body.append(self.context.pop()) + + def visit_classifier(self, node): + self.body.append('{[}') + def depart_classifier(self, node): + self.body.append('{]}') + + def visit_definition(self, node): + pass + def depart_definition(self, node): + self.body.append('\n') + + def visit_field_list(self, node): + self.body.append('\\begin{quote}\\begin{description}\n') + def depart_field_list(self, node): + self.body.append('\\end{description}\\end{quote}\n') + + def visit_field(self, node): + pass + def depart_field(self, node): + pass + + visit_field_name = visit_term + depart_field_name = depart_term + + visit_field_body = visit_definition + depart_field_body = depart_definition + + def visit_paragraph(self, node): + self.body.append('\n') + def depart_paragraph(self, node): + self.body.append('\n') + + def visit_centered(self, node): + self.body.append('\n\\begin{centering}') + def depart_centered(self, node): + self.body.append('\n\\end{centering}') + + def visit_module(self, node): + modname = node['modname'] + self.body.append('\n\\declaremodule[%s]{}{%s}' % (modname.replace('_', ''), + self.encode(modname))) + self.body.append('\n\\modulesynopsis{%s}' % self.encode(node['synopsis'])) + if node.has_key('platform'): + self.body.append('\\platform{%s}' % self.encode(node['platform'])) + def depart_module(self, node): + pass + + def latex_image_length(self, width_str): + match = re.match('(\d*\.?\d*)\s*(\S*)', width_str) + if not match: + # fallback + return width_str + res = width_str + amount, unit = match.groups()[:2] + if not unit or unit == "px": + # pixels: let LaTeX alone + return None + elif unit == "%": + res = "%.3f\\linewidth" % (float(amount) / 100.0) + return res + + def visit_image(self, node): + attrs = node.attributes + pre = [] # in reverse order + post = [] + include_graphics_options = [] + inline = isinstance(node.parent, nodes.TextElement) + if attrs.has_key('scale'): + # Could also be done with ``scale`` option to + # ``\includegraphics``; doing it this way for consistency. + pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,)) + post.append('}') + if attrs.has_key('width'): + w = self.latex_image_length(attrs['width']) + if w: + include_graphics_options.append('width=%s' % w) + if attrs.has_key('height'): + h = self.latex_image_length(attrs['height']) + if h: + include_graphics_options.append('height=%s' % h) + if attrs.has_key('align'): + align_prepost = { + # By default latex aligns the top of an image. + (1, 'top'): ('', ''), + (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'), + (1, 'bottom'): ('\\raisebox{-\\height}{', '}'), + (0, 'center'): ('{\\hfill', '\\hfill}'), + # These 2 don't exactly do the right thing. The image should + # be floated alongside the paragraph. See + # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG + (0, 'left'): ('{', '\\hfill}'), + (0, 'right'): ('{\\hfill', '}'),} + try: + pre.append(align_prepost[inline, attrs['align']][0]) + post.append(align_prepost[inline, attrs['align']][1]) + except KeyError: + pass # XXX complain here? + if not inline: + pre.append('\n') + post.append('\n') + pre.reverse() + if node['uri'] in self.builder.images: + uri = self.builder.images[node['uri']] + else: + # missing image! + if self.ignore_missing_images: + return + uri = node['uri'] + if uri.find('://') != -1: + # ignore remote images + return + self.body.extend(pre) + options = '' + if include_graphics_options: + options = '[%s]' % ','.join(include_graphics_options) + self.body.append('\\includegraphics%s{%s}' % (options, uri)) + self.body.extend(post) + def depart_image(self, node): + pass + + def visit_figure(self, node): + if (not node.attributes.has_key('align') or + node.attributes['align'] == 'center'): + # centering does not add vertical space like center. + align = '\n\\centering' + align_end = '' + else: + # TODO non vertical space for other alignments. + align = '\\begin{flush%s}' % node.attributes['align'] + align_end = '\\end{flush%s}' % node.attributes['align'] + self.body.append('\\begin{figure}[htbp]%s\n' % align) + self.context.append('%s\\end{figure}\n' % align_end) + def depart_figure(self, node): + self.body.append(self.context.pop()) + + def visit_caption(self, node): + self.body.append('\\caption{') + def depart_caption(self, node): + self.body.append('}') + + def visit_legend(self, node): + self.body.append('{\\small ') + def depart_legend(self, node): + self.body.append('}') + + def visit_admonition(self, node): + self.body.append('\n\\begin{notice}{note}') + def depart_admonition(self, node): + self.body.append('\\end{notice}\n') + + def _make_visit_admonition(name): + def visit_admonition(self, node): + self.body.append('\n\\begin{notice}{%s}{%s:}' % + (name, admonitionlabels[name])) + return visit_admonition + def _depart_named_admonition(self, node): + self.body.append('\\end{notice}\n') + + visit_attention = _make_visit_admonition('attention') + depart_attention = _depart_named_admonition + visit_caution = _make_visit_admonition('caution') + depart_caution = _depart_named_admonition + visit_danger = _make_visit_admonition('danger') + depart_danger = _depart_named_admonition + visit_error = _make_visit_admonition('error') + depart_error = _depart_named_admonition + visit_hint = _make_visit_admonition('hint') + depart_hint = _depart_named_admonition + visit_important = _make_visit_admonition('important') + depart_important = _depart_named_admonition + visit_note = _make_visit_admonition('note') + depart_note = _depart_named_admonition + visit_tip = _make_visit_admonition('tip') + depart_tip = _depart_named_admonition + visit_warning = _make_visit_admonition('warning') + depart_warning = _depart_named_admonition + + def visit_versionmodified(self, node): + intro = versionlabels[node['type']] % node['version'] + if node.children: + intro += ': ' + else: + intro += '.' + self.body.append(intro) + def depart_versionmodified(self, node): + pass + + def visit_target(self, node): + def add_target(id): + # indexing uses standard LaTeX index markup, so the targets + # will be generated differently + if not id.startswith('index-'): + self.body.append(r'\hypertarget{%s}{}' % id) + + if node.has_key('refid') and node['refid'] not in self.written_ids: + parindex = node.parent.index(node) + try: + next = node.parent[parindex+1] + if isinstance(next, nodes.section): + self.next_section_target = node['refid'] + return + except IndexError: + pass + add_target(node['refid']) + self.written_ids.add(node['refid']) + def depart_target(self, node): + pass + + def visit_attribution(self, node): + self.body.append('\n\\begin{flushright}\n') + self.body.append('---') + def depart_attribution(self, node): + self.body.append('\n\\end{flushright}\n') + + def visit_index(self, node, scre=re.compile(r';\s*')): + entries = node['entries'] + for type, string, tid, _ in entries: + if type == 'single': + self.body.append(r'\index{%s}' % scre.sub('!', self.encode(string))) + elif type == 'pair': + parts = tuple(self.encode(x.strip()) for x in string.split(';', 1)) + try: + self.body.append(r'\indexii{%s}{%s}' % parts) + except TypeError: + self.builder.warn('invalid pair index entry %r' % string) + elif type == 'triple': + parts = tuple(self.encode(x.strip()) for x in string.split(';', 2)) + try: + self.body.append(r'\indexiii{%s}{%s}{%s}' % parts) + except TypeError: + self.builder.warn('invalid triple index entry %r' % string) + else: + self.builder.warn('unknown index entry type %s found' % type) + raise nodes.SkipNode + + def visit_raw(self, node): + if 'latex' in node.get('format', '').split(): + self.body.append(node.astext()) + raise nodes.SkipNode + + def visit_reference(self, node): + uri = node.get('refuri', '') + if self.in_title or not uri: + self.context.append('') + elif uri.startswith('mailto:') or uri.startswith('http:') or \ + uri.startswith('https:') or uri.startswith('ftp:'): + self.body.append('\\href{%s}{' % self.encode(uri)) + self.context.append('}') + elif uri.startswith('#'): + self.body.append('\\hyperlink{%s}{' % uri[1:]) + self.context.append('}') + elif uri.startswith('@token'): + if self.in_production_list: + self.body.append('\\token{') + else: + self.body.append('\\grammartoken{') + self.context.append('}') + else: + self.builder.warn('unusable reference target found: %s' % uri) + self.context.append('') + def depart_reference(self, node): + self.body.append(self.context.pop()) + + def visit_pending_xref(self, node): + pass + def depart_pending_xref(self, node): + pass + + def visit_emphasis(self, node): + self.body.append(r'\emph{') + def depart_emphasis(self, node): + self.body.append('}') + + def visit_literal_emphasis(self, node): + self.body.append(r'\emph{\texttt{') + self.no_contractions += 1 + def depart_literal_emphasis(self, node): + self.body.append('}}') + self.no_contractions -= 1 + + def visit_strong(self, node): + self.body.append(r'\textbf{') + def depart_strong(self, node): + self.body.append('}') + + def visit_title_reference(self, node): + self.body.append(r'\emph{') + def depart_title_reference(self, node): + self.body.append('}') + + def visit_citation(self, node): + # TODO maybe use cite bibitems + self.bibitems.append(['', '']) + self.context.append(len(self.body)) + def depart_citation(self, node): + size = self.context.pop() + text = ''.join(self.body[size:]) + del self.body[size:] + self.bibitems[-1][1] = text + + def visit_citation_reference(self, node): + citeid = node.astext() + self.body.append('\\cite{%s}' % citeid) + raise nodes.SkipNode + + def visit_literal(self, node): + content = self.encode(node.astext().strip()) + if self.in_title: + self.body.append(r'\texttt{%s}' % content) + elif node.has_key('role') and node['role'] == 'samp': + self.body.append(r'\samp{%s}' % content) + else: + self.body.append(r'\code{%s}' % content) + raise nodes.SkipNode + + def visit_footnote_reference(self, node): + num = node.astext().strip() + try: + fn = self.footnotestack[-1][num] + except (KeyError, IndexError): + raise nodes.SkipNode + self.body.append('\\footnote{') + fn.walkabout(self) + raise nodes.SkipChildren + def depart_footnote_reference(self, node): + self.body.append('}') + + def visit_literal_block(self, node): + self.verbatim = '' + def depart_literal_block(self, node): + code = self.verbatim.rstrip('\n') + lang = self.highlightlang + linenos = code.count('\n') >= self.highlightlinenothreshold - 1 + if node.has_key('language'): + # code-block directives + lang = node['language'] + if node.has_key('linenos'): + linenos = node['linenos'] + hlcode = self.highlighter.highlight_block(code, lang, linenos) + # workaround for Unicode issue + hlcode = hlcode.replace(u'€', u'@texteuro[]') + # must use original Verbatim environment and "tabular" environment + if self.table: + hlcode = hlcode.replace('\\begin{Verbatim}', + '\\begin{OriginalVerbatim}') + self.table.has_verbatim = True + # get consistent trailer + hlcode = hlcode.rstrip()[:-14] # strip \end{Verbatim} + hlcode = hlcode.rstrip() + '\n' + self.body.append('\n' + hlcode + '\\end{%sVerbatim}\n' % + (self.table and 'Original' or '')) + self.verbatim = None + visit_doctest_block = visit_literal_block + depart_doctest_block = depart_literal_block + + def visit_line_block(self, node): + """line-block: + * whitespace (including linebreaks) is significant + * inline markup is supported. + * serif typeface + """ + self.body.append('{\\raggedright{}') + self.literal_whitespace = 1 + def depart_line_block(self, node): + self.literal_whitespace = 0 + # remove the last \\ + del self.body[-1] + self.body.append('}\n') + + def visit_line(self, node): + self._line_start = len(self.body) + def depart_line(self, node): + if self._line_start == len(self.body): + # no output in this line -- add a nonbreaking space, else the + # \\ command will give an error + self.body.append('~') + if self.table is not None: + self.body.append('\\newline\n') + else: + self.body.append('\\\\\n') + + def visit_block_quote(self, node): + # If the block quote contains a single object and that object + # is a list, then generate a list not a block quote. + # This lets us indent lists. + done = 0 + if len(node.children) == 1: + child = node.children[0] + if isinstance(child, nodes.bullet_list) or \ + isinstance(child, nodes.enumerated_list): + done = 1 + if not done: + self.body.append('\\begin{quote}\n') + def depart_block_quote(self, node): + done = 0 + if len(node.children) == 1: + child = node.children[0] + if isinstance(child, nodes.bullet_list) or \ + isinstance(child, nodes.enumerated_list): + done = 1 + if not done: + self.body.append('\\end{quote}\n') + + # option node handling copied from docutils' latex writer + + def visit_option(self, node): + if self.context[-1]: + # this is not the first option + self.body.append(', ') + def depart_option(self, node): + # flag that the first option is done. + self.context[-1] += 1 + + def visit_option_argument(self, node): + """The delimiter betweeen an option and its argument.""" + self.body.append(node.get('delimiter', ' ')) + def depart_option_argument(self, node): + pass + + def visit_option_group(self, node): + self.body.append('\\item [') + # flag for first option + self.context.append(0) + def depart_option_group(self, node): + self.context.pop() # the flag + self.body.append('] ') + + def visit_option_list(self, node): + self.body.append('\\begin{optionlist}{3cm}\n') + def depart_option_list(self, node): + self.body.append('\\end{optionlist}\n') + + def visit_option_list_item(self, node): + pass + def depart_option_list_item(self, node): + pass + + def visit_option_string(self, node): + ostring = node.astext() + self.body.append(self.encode(ostring.replace('--', u'-{-}'))) + raise nodes.SkipNode + + def visit_description(self, node): + self.body.append( ' ' ) + def depart_description(self, node): + pass + + def visit_superscript(self, node): + self.body.append('$^{\\text{') + def depart_superscript(self, node): + self.body.append('}}$') + + def visit_subscript(self, node): + self.body.append('$_{\\text{') + def depart_subscript(self, node): + self.body.append('}}$') + + def visit_substitution_definition(self, node): + raise nodes.SkipNode + + def visit_substitution_reference(self, node): + raise nodes.SkipNode + + def visit_generated(self, node): + pass + def depart_generated(self, node): + pass + + def visit_compound(self, node): + pass + def depart_compound(self, node): + pass + + def visit_container(self, node): + pass + def depart_container(self, node): + pass + + def visit_decoration(self, node): + pass + def depart_decoration(self, node): + pass + + # text handling + + def encode(self, text): + text = unicode(text).translate(tex_escape_map) + if self.literal_whitespace: + # Insert a blank before the newline, to avoid + # ! LaTeX Error: There's no line here to end. + text = text.replace(u'\n', u'~\\\\\n').replace(u' ', u'~') + if self.no_contractions: + text = text.replace('--', u'-{-}') + return text + + def visit_Text(self, node): + if self.verbatim is not None: + self.verbatim += node.astext() + else: + text = self.encode(node.astext()) + self.body.append(educateQuotesLatex(text)) + def depart_Text(self, node): + pass + + def visit_comment(self, node): + raise nodes.SkipNode + + def visit_meta(self, node): + # only valid for HTML + raise nodes.SkipNode + + def visit_system_message(self, node): + pass + def depart_system_message(self, node): + self.body.append('\n') + + def unknown_visit(self, node): + raise NotImplementedError('Unknown node: ' + node.__class__.__name__) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/linkcheck.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/linkcheck.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- +""" + sphinx.linkcheck + ~~~~~~~~~~~~~~~~ + + The CheckExternalLinksBuilder class. + + :copyright: 2008 by Georg Brandl, Thomas Lamb. + :license: BSD. +""" + +import socket +from os import path +from urllib2 import build_opener, HTTPError + +from docutils import nodes + +from sphinx.builder import Builder +from sphinx.util.console import purple, red, darkgreen + +# create an opener that will simulate a browser user-agent +opener = build_opener() +opener.addheaders = [('User-agent', 'Mozilla/5.0')] + + +class CheckExternalLinksBuilder(Builder): + """ + Checks for broken external links. + """ + name = 'linkcheck' + + def init(self): + self.good = set() + self.broken = {} + self.redirected = {} + # set a timeout for non-responding servers + socket.setdefaulttimeout(5.0) + # create output file + open(path.join(self.outdir, 'output.txt'), 'w').close() + + def get_target_uri(self, docname, typ=None): + return '' + + def get_outdated_docs(self): + return self.env.found_docs + + def prepare_writing(self, docnames): + return + + def write_doc(self, docname, doctree): + self.info() + for node in doctree.traverse(nodes.reference): + try: + self.check(node, docname) + except KeyError: + continue + + def check(self, node, docname): + uri = node['refuri'] + + if '#' in uri: + uri = uri.split('#')[0] + + if uri in self.good: + return + + lineno = None + while lineno is None and node: + node = node.parent + lineno = node.line + + if uri[0:5] == 'http:' or uri[0:6] == 'https:': + self.info(uri, nonl=1) + + if uri in self.broken: + (r, s) = self.broken[uri] + elif uri in self.redirected: + (r, s) = self.redirected[uri] + else: + (r, s) = self.resolve(uri) + + if r == 0: + self.info(' - ' + darkgreen('working')) + self.good.add(uri) + elif r == 2: + self.info(' - ' + red('broken: ') + s) + self.write_entry('broken', docname, lineno, uri + ': ' + s) + self.broken[uri] = (r, s) + if self.app.quiet: + self.warn('%s:%s: broken link: %s' % (docname, lineno, uri)) + else: + self.info(' - ' + purple('redirected') + ' to ' + s) + self.write_entry('redirected', docname, lineno, uri + ' to ' + s) + self.redirected[uri] = (r, s) + elif len(uri) == 0 or uri[0:7] == 'mailto:' or uri[0:4] == 'ftp:': + return + else: + self.warn(uri + ' - ' + red('malformed!')) + self.write_entry('malformed', docname, lineno, uri) + if self.app.quiet: + self.warn('%s:%s: malformed link: %s' % (docname, lineno, uri)) + self.app.statuscode = 1 + + if self.broken: + self.app.statuscode = 1 + + def write_entry(self, what, docname, line, uri): + output = open(path.join(self.outdir, 'output.txt'), 'a') + output.write("%s:%s: [%s] %s\n" % (self.env.doc2path(docname, None), + line, what, uri)) + output.close() + + def resolve(self, uri): + try: + f = opener.open(uri) + f.close() + except HTTPError, err: + #if err.code == 403 and uri.startswith('http://en.wikipedia.org/'): + # # Wikipedia blocks requests from urllib User-Agent + # return (0, 0) + return (2, str(err)) + except Exception, err: + return (2, str(err)) + if f.url.rstrip('/') == uri.rstrip('/'): + return (0, 0) + else: + return (1, f.url) + + def finish(self): + return diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/__init__.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +""" + sphinx.locale + ~~~~~~~~~~~~~ + + Locale utilities. + + :copyright: 2008 by Georg Brandl. + :license: BSD. +""" + +_ = lambda x: x + +admonitionlabels = { + 'attention': _('Attention'), + 'caution': _('Caution'), + 'danger': _('Danger'), + 'error': _('Error'), + 'hint': _('Hint'), + 'important': _('Important'), + 'note': _('Note'), + 'seealso': _('See Also'), + 'tip': _('Tip'), + 'warning': _('Warning'), +} + +versionlabels = { + 'versionadded': _('New in version %s'), + 'versionchanged': _('Changed in version %s'), + 'deprecated': _('Deprecated since version %s'), +} + +pairindextypes = { + 'module': _('module'), + 'keyword': _('keyword'), + 'operator': _('operator'), + 'object': _('object'), + 'exception': _('exception'), + 'statement': _('statement'), + 'builtin': _('built-in function'), +} + +del _ + +def init(): + for dct in (admonitionlabels, versionlabels, pairindextypes): + for key in dct: + dct[key] = _(dct[key]) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1 @@ +Documentation.addTranslations({"locale": "cs", "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"module, in ": "modul", "Preparing search...": "", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "", "Search finished, found %s page(s) matching the search query.": "", ", in ": "", "Permalink to this headline": "Trval\u00fd odkaz na tento nadpis", "Searching": "hledej", "Permalink to this definition": "Trval\u00fd odkaz na tuto definici", "Hide Search Matches": "", "Search Results": "V\u00fdsledky hled\u00e1n\u00ed"}}); \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.mo Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.mo has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/cs/LC_MESSAGES/sphinx.po Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,604 @@ +# Czech translations for Sphinx. +# Copyright (C) 2008 ORGANIZATION +# This file is distributed under the same license as the Sphinx project. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 0.5\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2008-08-10 11:43+0000\n" +"PO-Revision-Date: 2008-11-27 18:40+0100\n" +"Last-Translator: Pavel Kosina \n" +"Language-Team: Pavel Kosina \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: sphinx/builder.py:408 +#, python-format +msgid "%b %d, %Y" +msgstr "%d.%m.%Y" + +#: sphinx/builder.py:427 sphinx/templates/defindex.html:21 +msgid "General Index" +msgstr "Rejstřík indexů" + +#: sphinx/builder.py:427 +msgid "index" +msgstr "index" + +#: sphinx/builder.py:429 sphinx/htmlhelp.py:156 +#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2 +#: sphinx/templates/modindex.html:13 +msgid "Global Module Index" +msgstr "Rejstřík modulů" + +#: sphinx/builder.py:429 +msgid "modules" +msgstr "moduly" + +#: sphinx/builder.py:466 +msgid "next" +msgstr "další" + +#: sphinx/builder.py:473 +msgid "previous" +msgstr "pÅ™edchozí" + +#: sphinx/builder.py:1054 +msgid " (in " +msgstr "" + +#: sphinx/builder.py:1129 +msgid "Builtins" +msgstr "VestavÄ›né funkce" + +#: sphinx/builder.py:1131 +msgid "Module level" +msgstr "Úroveň modulů" + +#: sphinx/environment.py:102 sphinx/latexwriter.py:169 +#, python-format +msgid "%B %d, %Y" +msgstr "%d.%m.%Y" + +#: sphinx/environment.py:291 sphinx/latexwriter.py:175 +#: sphinx/templates/genindex-single.html:2 +#: sphinx/templates/genindex-split.html:2 +#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2 +#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48 +#: sphinx/templates/layout.html:130 +msgid "Index" +msgstr "Index" + +#: sphinx/environment.py:292 sphinx/latexwriter.py:174 +#, fuzzy +msgid "Module Index" +msgstr "Rejstřík modulů" + +#: sphinx/environment.py:293 sphinx/templates/defindex.html:16 +#, fuzzy +msgid "Search Page" +msgstr "Vyhledávací stránka" + +#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145 +msgid "Permalink to this definition" +msgstr "Trvalý odkaz na tuto definici" + +#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139 +msgid "Permalink to this headline" +msgstr "Trvalý odkaz na tento nadpis" + +#: sphinx/latexwriter.py:172 +msgid "Release" +msgstr "Vydání" + +#: sphinx/roles.py:53 sphinx/directives/desc.py:537 +#, python-format +msgid "environment variable; %s" +msgstr "prommÄ›ná prostÅ™edí, %s" + +#: sphinx/roles.py:60 +#, python-format +msgid "Python Enhancement Proposals!PEP %s" +msgstr "Python Enhancement Proposals!PEP %s" + +#: sphinx/textwriter.py:166 +#, python-format +msgid "Platform: %s" +msgstr "Platforma: %s" + +#: sphinx/textwriter.py:422 +msgid "[image]" +msgstr "[obrázek]" + +#: sphinx/directives/desc.py:25 +#, python-format +msgid "%s() (built-in function)" +msgstr "%s() (vestavÄ›ná funkce)" + +#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42 +#: sphinx/directives/desc.py:54 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (v modulu %s)" + +#: sphinx/directives/desc.py:29 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s() (vestavÄ›ná promÄ›nná)" + +#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66 +#, python-format +msgid "%s (in module %s)" +msgstr "%s() (v modulu %s)" + +#: sphinx/directives/desc.py:33 +#, fuzzy, python-format +msgid "%s (built-in class)" +msgstr "%s() (vestavÄ›ná promÄ›nná)" + +#: sphinx/directives/desc.py:34 +#, python-format +msgid "%s (class in %s)" +msgstr "%s() (třída v %s)" + +#: sphinx/directives/desc.py:46 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (metoda %s.%s)" + +#: sphinx/directives/desc.py:48 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (metoda %s)" + +#: sphinx/directives/desc.py:58 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (statická metoda %s.%s)" + +#: sphinx/directives/desc.py:60 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (statická metoda %s)" + +#: sphinx/directives/desc.py:70 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s() (atribut %s.%s)" + +#: sphinx/directives/desc.py:72 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s() (atribut %s)" + +#: sphinx/directives/desc.py:74 +#, python-format +msgid "%s (C function)" +msgstr "%s (C funkce)" + +#: sphinx/directives/desc.py:76 +#, python-format +msgid "%s (C member)" +msgstr "%s (Älen C)" + +#: sphinx/directives/desc.py:78 +#, python-format +msgid "%s (C macro)" +msgstr "%s (C makro)" + +#: sphinx/directives/desc.py:80 +#, python-format +msgid "%s (C type)" +msgstr "%s (C typ)" + +#: sphinx/directives/desc.py:82 +#, python-format +msgid "%s (C variable)" +msgstr "%s (C promÄ›nná)" + +#: sphinx/directives/desc.py:100 +msgid "Raises" +msgstr "Vyvolá" + +#: sphinx/directives/desc.py:104 +msgid "Variable" +msgstr "PromÄ›nná" + +#: sphinx/directives/desc.py:107 +msgid "Returns" +msgstr "Vrací" + +#: sphinx/directives/desc.py:116 +msgid "Return type" +msgstr "Typ navrácené hodnoty" + +#: sphinx/directives/desc.py:143 +msgid "Parameters" +msgstr "Parametry" + +#: sphinx/directives/desc.py:423 +#, fuzzy, python-format +msgid "%scommand line option; %s" +msgstr "%sparametry příkazového řádku; %s" + +#: sphinx/directives/other.py:101 +msgid "Platforms: " +msgstr "Platformy: " + +#: sphinx/directives/other.py:106 +#, python-format +msgid "%s (module)" +msgstr "%s (module)" + +#: sphinx/directives/other.py:146 +msgid "Section author: " +msgstr "Autor sekce: " + +#: sphinx/directives/other.py:148 +msgid "Module author: " +msgstr "Autor modulu: " + +#: sphinx/directives/other.py:150 +msgid "Author: " +msgstr "Autor: " + +#: sphinx/directives/other.py:246 +msgid "See also" +msgstr "Viz také" + +#: sphinx/ext/todo.py:31 +msgid "Todo" +msgstr "" + +#: sphinx/ext/todo.py:75 +#, python-format +msgid "(The original entry is located in %s, line %d and can be found " +msgstr "" + +#: sphinx/ext/todo.py:81 +msgid "here" +msgstr "" + +#: sphinx/locale/__init__.py:15 +msgid "Attention" +msgstr "Výstraha" + +#: sphinx/locale/__init__.py:16 +msgid "Caution" +msgstr "UpozornÄ›ní" + +#: sphinx/locale/__init__.py:17 +msgid "Danger" +msgstr "NebezpeÄí" + +#: sphinx/locale/__init__.py:18 +msgid "Error" +msgstr "Chyba" + +#: sphinx/locale/__init__.py:19 +msgid "Hint" +msgstr "Rada" + +#: sphinx/locale/__init__.py:20 +msgid "Important" +msgstr "Důležité" + +#: sphinx/locale/__init__.py:21 +msgid "Note" +msgstr "Poznámka" + +#: sphinx/locale/__init__.py:22 +msgid "See Also" +msgstr "Viz také" + +#: sphinx/locale/__init__.py:23 +msgid "Tip" +msgstr "Tip" + +#: sphinx/locale/__init__.py:24 +msgid "Warning" +msgstr "Varování" + +#: sphinx/locale/__init__.py:28 +#, python-format +msgid "New in version %s" +msgstr "Nové ve verzi %s" + +#: sphinx/locale/__init__.py:29 +#, python-format +msgid "Changed in version %s" +msgstr "ZmÄ›nÄ›no ve verzi %s" + +#: sphinx/locale/__init__.py:30 +#, python-format +msgid "Deprecated since version %s" +msgstr "Zastaralé od verze %s" + +#: sphinx/locale/__init__.py:34 +msgid "module" +msgstr "modul" + +#: sphinx/locale/__init__.py:35 +msgid "keyword" +msgstr "klíÄové slovo" + +#: sphinx/locale/__init__.py:36 +msgid "operator" +msgstr "operátor" + +#: sphinx/locale/__init__.py:37 +msgid "object" +msgstr "objekt" + +#: sphinx/locale/__init__.py:38 +msgid "exception" +msgstr "výjimka" + +#: sphinx/locale/__init__.py:39 +msgid "statement" +msgstr "příkaz" + +#: sphinx/locale/__init__.py:40 +msgid "built-in function" +msgstr "vestavÄ›ná funkce" + +#: sphinx/static/doctools.js:174 +msgid "Hide Search Matches" +msgstr "" + +#: sphinx/static/searchtools.js:274 +#, fuzzy +msgid "Searching" +msgstr "hledej" + +#: sphinx/static/searchtools.js:279 +msgid "Preparing search..." +msgstr "" + +#: sphinx/static/searchtools.js:338 +#, fuzzy +msgid "module, in " +msgstr "modul" + +#: sphinx/static/searchtools.js:347 +msgid ", in " +msgstr "" + +#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18 +msgid "Search Results" +msgstr "Výsledky hledání" + +#: sphinx/static/searchtools.js:449 +msgid "" +"Your search did not match any documents. Please make sure that all words " +"are spelled correctly and that you've selected enough categories." +msgstr "" + +#: sphinx/static/searchtools.js:451 +#, python-format +msgid "Search finished, found %s page(s) matching the search query." +msgstr "" + +#: sphinx/templates/defindex.html:2 +msgid "Overview" +msgstr "PÅ™ehled" + +#: sphinx/templates/defindex.html:11 +msgid "Indices and tables:" +msgstr "Rejstříky a tabulky:" + +#: sphinx/templates/defindex.html:14 +msgid "Complete Table of Contents" +msgstr "Celkový obsah" + +#: sphinx/templates/defindex.html:15 +msgid "lists all sections and subsections" +msgstr "seznam vÅ¡ech sekcí a podsekcí" + +#: sphinx/templates/defindex.html:17 +msgid "search this documentation" +msgstr "prohledej tuto dokumentaci" + +#: sphinx/templates/defindex.html:20 +msgid "quick access to all modules" +msgstr "rychlý přístup ke vÅ¡em modulům" + +#: sphinx/templates/defindex.html:22 +msgid "all functions, classes, terms" +msgstr "vÅ¡echny funkce, třídy, termíny" + +#: sphinx/templates/genindex-single.html:5 +#, python-format +msgid "Index – %(key)s" +msgstr "Index – %(key)s" + +#: sphinx/templates/genindex-single.html:44 +#: sphinx/templates/genindex-split.html:14 +#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54 +msgid "Full index on one page" +msgstr "Plný index na jedné stránce" + +#: sphinx/templates/genindex-split.html:7 +msgid "Index pages by letter" +msgstr "Index podle písmene" + +#: sphinx/templates/genindex-split.html:15 +msgid "can be huge" +msgstr "může být obrovský" + +#: sphinx/templates/layout.html:9 +msgid "Navigation" +msgstr "Navigace" + +#: sphinx/templates/layout.html:40 +msgid "Table Of Contents" +msgstr "Obsah" + +#: sphinx/templates/layout.html:46 +msgid "Previous topic" +msgstr "PÅ™echozí téma" + +#: sphinx/templates/layout.html:47 +msgid "previous chapter" +msgstr "pÅ™edchozí kapitola" + +#: sphinx/templates/layout.html:50 +msgid "Next topic" +msgstr "Další téma" + +#: sphinx/templates/layout.html:51 +msgid "next chapter" +msgstr "další kapitola" + +#: sphinx/templates/layout.html:55 +msgid "This Page" +msgstr "Tato stránka" + +#: sphinx/templates/layout.html:59 +msgid "Suggest Change" +msgstr "Návrh zmÄ›nu" + +#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62 +msgid "Show Source" +msgstr "Ukázat zdroj" + +#: sphinx/templates/layout.html:71 +msgid "Quick search" +msgstr "Rychlé vyhledávání" + +#: sphinx/templates/layout.html:71 +msgid "Keyword search" +msgstr "Hledání dle klíÄe" + +#: sphinx/templates/layout.html:73 +msgid "Go" +msgstr "hledej" + +#: sphinx/templates/layout.html:78 +msgid "Enter a module, class or function name." +msgstr "Zadej jméno modulu, třídy nebo funkce." + +#: sphinx/templates/layout.html:119 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "Hledání uvnitÅ™ %(docstitle)s" + +#: sphinx/templates/layout.html:128 +msgid "About these documents" +msgstr "O tÄ›chto dokumentech" + +#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2 +#: sphinx/templates/search.html:5 +msgid "Search" +msgstr "Hledání" + +#: sphinx/templates/layout.html:133 +msgid "Copyright" +msgstr "VeÅ¡kerá práva vyhrazena" + +#: sphinx/templates/layout.html:178 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:180 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:183 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "Naposledy aktualizováno dne %(last_updated)s." + +#: sphinx/templates/layout.html:186 +#, python-format +msgid "" +"Created using Sphinx " +"%(sphinx_version)s." +msgstr "" +"VytvoÅ™eno pomocí Sphinx " +"%(sphinx_version)s." + +#: sphinx/templates/modindex.html:15 +msgid "Most popular modules:" +msgstr "NejpopulárnÄ›jší moduly:" + +#: sphinx/templates/modindex.html:24 +msgid "Show modules only available on these platforms" +msgstr "Zobrazit moduly dostupné na této platformÄ›" + +#: sphinx/templates/modindex.html:56 +msgid "Deprecated" +msgstr "Zastaralé" + +#: sphinx/templates/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "Prohledat %(docstitle)s" + +#: sphinx/templates/page.html:8 +msgid "" +"Note: You requested an out-of-date URL from this server." +" We've tried to redirect you to the new location of this page, but it may" +" not be the right one." +msgstr "" +"Poznámka: Stránka, kterou hledáte, " +"neexistuje.
    Snažili jsme se najít nové umístÄ›ní této stránky, ale " +"nepovedlo se." + +#: sphinx/templates/search.html:7 +#, fuzzy +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" +"Toto je vyhledávací stránka. Zadejte klíÄová slova do pole níže a " +"kliknÄ›te na \"hledej\". \n" +"Prohledávání funkcí hledá automaticky vÅ¡echna slova. Stránky obsahující" +" slov ménÄ›, nebudou nalezeny." + +#: sphinx/templates/search.html:14 +msgid "search" +msgstr "hledej" + +#: sphinx/templates/search.html:20 +msgid "Your search did not match any results." +msgstr "Nic jsme nenaÅ¡li." + +#: sphinx/templates/changes/frameset.html:5 +#: sphinx/templates/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "ZmÄ›ny ve verzi %(version)s — %(docstitle)s" + +#: sphinx/templates/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "%(filename)s — %(docstitle)s" + +#: sphinx/templates/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "Automaticky generovaný seznam zmÄ›n ve verzi %(version)s" + +#: sphinx/templates/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "ZmÄ›ny v knihovnách" + +#: sphinx/templates/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "ZmÄ›ny API" + +#: sphinx/templates/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "Ostatní zmÄ›ny" + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1 @@ +Documentation.addTranslations({"locale": "de", "plural_expr": "(n != 1)", "messages": {"module, in ": "Modul, in ", "Preparing search...": "Suche wird vorbereitet...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Es wurden keine Dokumente gefunden. Haben Sie alle Suchworte richtig geschrieben und gen\u00fcgend Kategorien ausgew\u00e4hlt?", "Search finished, found %s page(s) matching the search query.": "Suche beendet, %s Seite(n) mit Ergebnissen wurden gefunden.", ", in ": "", "Permalink to this headline": "Permalink zu dieser \u00dcberschrift", "Searching": "Suchen...", "Permalink to this definition": "Permalink zu dieser Definition", "Hide Search Matches": "Suchergebnisse ausblenden", "Search Results": "Suchergebnisse"}}); \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.mo Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.mo has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/de/LC_MESSAGES/sphinx.po Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,601 @@ +# German translations for Sphinx. +# Copyright (C) 2008 Translators. +# This file is distributed under the same license as the Sphinx project. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2008-08-07 21:40+0200\n" +"PO-Revision-Date: 2008-11-27 18:40+0100\n" +"Last-Translator: Horst Gutmann \n" +"Language-Team: de \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: sphinx/builder.py:408 +#, python-format +msgid "%b %d, %Y" +msgstr "%d. %m. %Y" + +#: sphinx/builder.py:427 sphinx/templates/defindex.html:21 +msgid "General Index" +msgstr "Allgemeiner Index" + +#: sphinx/builder.py:427 +msgid "index" +msgstr "Index" + +#: sphinx/builder.py:429 sphinx/htmlhelp.py:156 +#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2 +#: sphinx/templates/modindex.html:13 +msgid "Global Module Index" +msgstr "Globaler Modulindex" + +#: sphinx/builder.py:429 +msgid "modules" +msgstr "Module" + +#: sphinx/builder.py:466 +msgid "next" +msgstr "weiter" + +#: sphinx/builder.py:473 +msgid "previous" +msgstr "zurück" + +#: sphinx/builder.py:1054 +msgid " (in " +msgstr "" + +#: sphinx/builder.py:1129 +msgid "Builtins" +msgstr "Builtins" + +#: sphinx/builder.py:1131 +msgid "Module level" +msgstr "Modulebene" + +#: sphinx/environment.py:102 sphinx/latexwriter.py:169 +#, python-format +msgid "%B %d, %Y" +msgstr "%d. %m. %Y" + +#: sphinx/environment.py:291 sphinx/latexwriter.py:175 +#: sphinx/templates/genindex-single.html:2 +#: sphinx/templates/genindex-split.html:2 +#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2 +#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48 +#: sphinx/templates/layout.html:130 +msgid "Index" +msgstr "Stichwortverzeichnis" + +#: sphinx/environment.py:292 sphinx/latexwriter.py:174 +msgid "Module Index" +msgstr "Modulindex" + +#: sphinx/environment.py:293 sphinx/templates/defindex.html:16 +msgid "Search Page" +msgstr "Suche" + +#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145 +msgid "Permalink to this definition" +msgstr "Permalink zu dieser Definition" + +#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139 +msgid "Permalink to this headline" +msgstr "Permalink zu dieser Überschrift" + +#: sphinx/latexwriter.py:172 +msgid "Release" +msgstr "Release" + +#: sphinx/roles.py:53 sphinx/directives/desc.py:537 +#, python-format +msgid "environment variable; %s" +msgstr "Umgebungsvariable; %s" + +#: sphinx/roles.py:60 +#, python-format +msgid "Python Enhancement Proposals!PEP %s" +msgstr "Python Enhancement Proposals!PEP %s" + +#: sphinx/textwriter.py:166 +#, python-format +msgid "Platform: %s" +msgstr "Plattform: %s" + +#: sphinx/textwriter.py:422 +msgid "[image]" +msgstr "[Bild]" + +#: sphinx/directives/desc.py:25 +#, python-format +msgid "%s() (built-in function)" +msgstr "%s() (eingebaute Funktion)" + +#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42 +#: sphinx/directives/desc.py:54 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (in Modul %s)" + +#: sphinx/directives/desc.py:29 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s (eingebaute Variable)" + +#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66 +#, python-format +msgid "%s (in module %s)" +msgstr "%s (in Modul %s)" + +#: sphinx/directives/desc.py:33 +#, python-format +msgid "%s (built-in class)" +msgstr "%s (eingebaute Klasse)" + +#: sphinx/directives/desc.py:34 +#, python-format +msgid "%s (class in %s)" +msgstr "%s (Klasse in %s)" + +#: sphinx/directives/desc.py:46 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (Methode von %s.%s)" + +#: sphinx/directives/desc.py:48 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (Methode von %s)" + +#: sphinx/directives/desc.py:58 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (statische Methode von %s.%s)" + +#: sphinx/directives/desc.py:60 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (statische Methode von %s)" + +#: sphinx/directives/desc.py:70 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (Attribut von %s.%s)" + +#: sphinx/directives/desc.py:72 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s (Attribut von %s)" + +#: sphinx/directives/desc.py:74 +#, python-format +msgid "%s (C function)" +msgstr "%s (C-Funktion)" + +#: sphinx/directives/desc.py:76 +#, python-format +msgid "%s (C member)" +msgstr "%s (C-Member)" + +#: sphinx/directives/desc.py:78 +#, python-format +msgid "%s (C macro)" +msgstr "%s (C-Makro)" + +#: sphinx/directives/desc.py:80 +#, python-format +msgid "%s (C type)" +msgstr "%s (C-Typ)" + +#: sphinx/directives/desc.py:82 +#, python-format +msgid "%s (C variable)" +msgstr "%s (C-Variable)" + +#: sphinx/directives/desc.py:100 +msgid "Raises" +msgstr "Verursacht:" + +#: sphinx/directives/desc.py:104 +msgid "Variable" +msgstr "Variable" + +#: sphinx/directives/desc.py:107 +msgid "Returns" +msgstr "Rückgabe" + +#: sphinx/directives/desc.py:116 +msgid "Return type" +msgstr "Rückgabetyp" + +#: sphinx/directives/desc.py:143 +msgid "Parameters" +msgstr "Parameter" + +#: sphinx/directives/desc.py:423 +#, python-format +msgid "%scommand line option; %s" +msgstr "%sKommandozeilenoption; %s" + +#: sphinx/directives/other.py:101 +msgid "Platforms: " +msgstr "Plattformen: " + +#: sphinx/directives/other.py:106 +#, python-format +msgid "%s (module)" +msgstr "%s (Modul)" + +#: sphinx/directives/other.py:146 +msgid "Section author: " +msgstr "Autor des Abschnitts: " + +#: sphinx/directives/other.py:148 +msgid "Module author: " +msgstr "Autor des Moduls: " + +#: sphinx/directives/other.py:150 +msgid "Author: " +msgstr "Autor: " + +#: sphinx/directives/other.py:246 +msgid "See also" +msgstr "Siehe auch" + +#: sphinx/ext/todo.py:31 +msgid "Todo" +msgstr "" + +#: sphinx/ext/todo.py:75 +#, python-format +msgid "(The original entry is located in %s, line %d and can be found " +msgstr "" + +#: sphinx/ext/todo.py:81 +msgid "here" +msgstr "" + +#: sphinx/locale/__init__.py:15 +msgid "Attention" +msgstr "Achtung" + +#: sphinx/locale/__init__.py:16 +msgid "Caution" +msgstr "Vorsicht" + +#: sphinx/locale/__init__.py:17 +msgid "Danger" +msgstr "Gefahr" + +#: sphinx/locale/__init__.py:18 +msgid "Error" +msgstr "Fehler" + +#: sphinx/locale/__init__.py:19 +msgid "Hint" +msgstr "Hinweis" + +#: sphinx/locale/__init__.py:20 +msgid "Important" +msgstr "Wichtig" + +#: sphinx/locale/__init__.py:21 +msgid "Note" +msgstr "Bemerkung" + +#: sphinx/locale/__init__.py:22 +msgid "See Also" +msgstr "Siehe auch" + +#: sphinx/locale/__init__.py:23 +msgid "Tip" +msgstr "Tipp" + +#: sphinx/locale/__init__.py:24 +msgid "Warning" +msgstr "Warnung" + +#: sphinx/locale/__init__.py:28 +#, python-format +msgid "New in version %s" +msgstr "Neu in Version %s" + +#: sphinx/locale/__init__.py:29 +#, python-format +msgid "Changed in version %s" +msgstr "Geändert in Version %s" + +#: sphinx/locale/__init__.py:30 +#, python-format +msgid "Deprecated since version %s" +msgstr "Veraltet ab Version %s" + +#: sphinx/locale/__init__.py:34 +msgid "module" +msgstr "Module" + +#: sphinx/locale/__init__.py:35 +msgid "keyword" +msgstr "Schlüsselwort" + +#: sphinx/locale/__init__.py:36 +msgid "operator" +msgstr "Operator" + +#: sphinx/locale/__init__.py:37 +msgid "object" +msgstr "Objekt" + +#: sphinx/locale/__init__.py:38 +msgid "exception" +msgstr "Exception" + +#: sphinx/locale/__init__.py:39 +msgid "statement" +msgstr "Statement" + +#: sphinx/locale/__init__.py:40 +msgid "built-in function" +msgstr "eingebaute Funktion" + +#: sphinx/static/doctools.js:174 +msgid "Hide Search Matches" +msgstr "Suchergebnisse ausblenden" + +#: sphinx/static/searchtools.js:274 +msgid "Searching" +msgstr "Suchen..." + +#: sphinx/static/searchtools.js:279 +msgid "Preparing search..." +msgstr "Suche wird vorbereitet..." + +#: sphinx/static/searchtools.js:338 +msgid "module, in " +msgstr "Modul, in " + +#: sphinx/static/searchtools.js:347 +msgid ", in " +msgstr "" + +#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18 +msgid "Search Results" +msgstr "Suchergebnisse" + +#: sphinx/static/searchtools.js:449 +msgid "" +"Your search did not match any documents. Please make sure that all words " +"are spelled correctly and that you've selected enough categories." +msgstr "" +"Es wurden keine Dokumente gefunden. Haben Sie alle Suchworte richtig " +"geschrieben und genügend Kategorien ausgewählt?" + +#: sphinx/static/searchtools.js:451 +#, python-format +msgid "Search finished, found %s page(s) matching the search query." +msgstr "Suche beendet, %s Seite(n) mit Ergebnissen wurden gefunden." + +#: sphinx/templates/defindex.html:2 +msgid "Overview" +msgstr "Übersicht" + +#: sphinx/templates/defindex.html:11 +msgid "Indices and tables:" +msgstr "Indizes und Tabellen:" + +#: sphinx/templates/defindex.html:14 +msgid "Complete Table of Contents" +msgstr "Vollständiges Inhaltsverzeichnis" + +#: sphinx/templates/defindex.html:15 +msgid "lists all sections and subsections" +msgstr "Liste aller Kapitel und Unterkapitel" + +#: sphinx/templates/defindex.html:17 +msgid "search this documentation" +msgstr "Durchsuche diese Dokumentation" + +#: sphinx/templates/defindex.html:20 +msgid "quick access to all modules" +msgstr "Schneller Zugriff auf alle Module" + +#: sphinx/templates/defindex.html:22 +msgid "all functions, classes, terms" +msgstr "Alle Funktionen, Klassen, Begriffe" + +#: sphinx/templates/genindex-single.html:5 +#, python-format +msgid "Index – %(key)s" +msgstr "Stichwortverzeichnis – %(key)s" + +#: sphinx/templates/genindex-single.html:44 +#: sphinx/templates/genindex-split.html:14 +#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54 +msgid "Full index on one page" +msgstr "Gesamtes Stichwortverzeichnis auf einer Seite" + +#: sphinx/templates/genindex-split.html:7 +msgid "Index pages by letter" +msgstr "Stichwortverzeichnis nach Anfangsbuchstabe" + +#: sphinx/templates/genindex-split.html:15 +msgid "can be huge" +msgstr "kann groß sein" + +#: sphinx/templates/layout.html:9 +msgid "Navigation" +msgstr "Navigation" + +#: sphinx/templates/layout.html:40 +msgid "Table Of Contents" +msgstr "Inhalt" + +#: sphinx/templates/layout.html:46 +msgid "Previous topic" +msgstr "Vorheriges Thema" + +#: sphinx/templates/layout.html:47 +msgid "previous chapter" +msgstr "vorheriges Kapitel" + +#: sphinx/templates/layout.html:50 +msgid "Next topic" +msgstr "Nächstes Thema" + +#: sphinx/templates/layout.html:51 +msgid "next chapter" +msgstr "nächstes Kapitel" + +#: sphinx/templates/layout.html:55 +msgid "This Page" +msgstr "Diese Seite" + +#: sphinx/templates/layout.html:59 +msgid "Suggest Change" +msgstr "Änderung vorschlagen" + +#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62 +msgid "Show Source" +msgstr "Quelltext anzeigen" + +#: sphinx/templates/layout.html:71 +msgid "Quick search" +msgstr "Schnellsuche" + +#: sphinx/templates/layout.html:71 +msgid "Keyword search" +msgstr "Stichwortsuche" + +#: sphinx/templates/layout.html:73 +msgid "Go" +msgstr "Los" + +#: sphinx/templates/layout.html:78 +msgid "Enter a module, class or function name." +msgstr "Gib einen Modul-, Klassen- oder Funktionsnamen an." + +#: sphinx/templates/layout.html:119 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "Suche in %(docstitle)s" + +#: sphinx/templates/layout.html:128 +msgid "About these documents" +msgstr "Über diese Dokumentation" + +#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2 +#: sphinx/templates/search.html:5 +msgid "Search" +msgstr "Suche" + +#: sphinx/templates/layout.html:133 +msgid "Copyright" +msgstr "Copyright" + +#: sphinx/templates/layout.html:178 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:180 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:183 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "Zuletzt aktualisiert am %(last_updated)s." + +#: sphinx/templates/layout.html:186 +#, python-format +msgid "" +"Created using Sphinx " +"%(sphinx_version)s." +msgstr "" +"Mit Sphinx %(sphinx_version)s " +"erstellt." + +#: sphinx/templates/modindex.html:15 +msgid "Most popular modules:" +msgstr "Beliebteste Module:" + +#: sphinx/templates/modindex.html:24 +msgid "Show modules only available on these platforms" +msgstr "Zeige nur Module, die auf diesen Plattformen verfügbar sind" + +#: sphinx/templates/modindex.html:56 +msgid "Deprecated" +msgstr "Veraltet" + +#: sphinx/templates/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "Suche in %(docstitle)s" + +#: sphinx/templates/page.html:8 +msgid "" +"Note: You requested an out-of-date URL from this server." +" We've tried to redirect you to the new location of this page, but it may" +" not be the right one." +msgstr "" +"Anmerkung: Du hast eine nicht länger gültige URL von " +"diesem Server angefragt. Wir haben versucht dich auf die neue Adresse " +"dieser Seite umzuleiten, aber dies muss nicht die richtige Seite sein." + +#: sphinx/templates/search.html:7 +#, fuzzy +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" +"Von hier aus kannst du die Dokumentation durchsuchen. Gib deine " +"Suchbegriffe in das untenstehende Feld ein und klicke auf \"suchen\". " +"Bitte beachte, dass die Suchfunktion automatisch nach all diesen Worten " +"suchen wird. Seiten, die nicht alle Worte enthalten, werden nicht in der " +"Ergebnisliste erscheinen." + +#: sphinx/templates/search.html:14 +msgid "search" +msgstr "suchen" + +#: sphinx/templates/search.html:20 +msgid "Your search did not match any results." +msgstr "Deine Suche ergab leider keine Treffer." + +#: sphinx/templates/changes/frameset.html:5 +#: sphinx/templates/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "Änderungen in Version %(version)s — %(docstitle)s" + +#: sphinx/templates/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "%(filename)s — %(docstitle)s" + +#: sphinx/templates/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "Automatisch generierte Liste der Änderungen in Version %(version)s" + +#: sphinx/templates/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "Bibliotheksänderungen" + +#: sphinx/templates/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "C API-Änderungen" + +#: sphinx/templates/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "Andere Änderungen" + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1 @@ +Documentation.addTranslations({"locale": "es", "plural_expr": "(n != 1)", "messages": {"module, in ": "m\u00f3dulo", "Preparing search...": "Preparando la b\u00fasqueda", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "La b\u00fasqueda no dio ning\u00fan resultado. Por favor aseg\u00farese que escribi\u00f3 todas las palabras correctamente y que ha seleccionado suficientes categor\u00edas", "Search finished, found %s page(s) matching the search query.": "B\u00fasqueda finalizada, se han encontrado %s p\u00e1gina(s) que concuerdan con su consulta", ", in ": "", "Permalink to this headline": "Enlazar permanentemente con este t\u00edtulo", "Searching": "Buscando", "Permalink to this definition": "Enlazar permanentemente con esta definici\u00f3n", "Hide Search Matches": "Coincidencias de la b\u00fasqueda", "Search Results": "Resultados de la b\u00fasqueda"}}); \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.mo Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.mo has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/es/LC_MESSAGES/sphinx.po Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,611 @@ +# Spanish translations for Sphinx. +# Copyright (C) 2008 ORGANIZATION +# This file is distributed under the same license as the Sphinx project. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 0.5\n" +"Report-Msgid-Bugs-To: guillem@torroja.dmt.upm.es\n" +"POT-Creation-Date: 2008-09-11 23:58+0200\n" +"PO-Revision-Date: 2008-11-27 18:40+0100\n" +"Last-Translator: Guillem Borrell \n" +"Language-Team: es \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: sphinx/builder.py:408 +#, python-format +msgid "%b %d, %Y" +msgstr "%d %b, %Y" + +#: sphinx/builder.py:427 sphinx/templates/defindex.html:21 +msgid "General Index" +msgstr "Ãndice General" + +#: sphinx/builder.py:427 +msgid "index" +msgstr "índice" + +#: sphinx/builder.py:429 sphinx/htmlhelp.py:156 +#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2 +#: sphinx/templates/modindex.html:13 +msgid "Global Module Index" +msgstr "Ãndice Global de Módulos" + +#: sphinx/builder.py:429 +msgid "modules" +msgstr "módulos" + +#: sphinx/builder.py:466 +msgid "next" +msgstr "siguiente" + +#: sphinx/builder.py:473 +msgid "previous" +msgstr "anterior" + +#: sphinx/builder.py:1054 +msgid " (in " +msgstr "" + +#: sphinx/builder.py:1129 +#, fuzzy +msgid "Builtins" +msgstr "Funciones de base" + +#: sphinx/builder.py:1131 +#, fuzzy +msgid "Module level" +msgstr "Módulos" + +#: sphinx/environment.py:102 sphinx/latexwriter.py:169 +#, fuzzy, python-format +msgid "%B %d, %Y" +msgstr "%d de %B de %Y" + +#: sphinx/environment.py:291 sphinx/latexwriter.py:175 +#: sphinx/templates/genindex-single.html:2 +#: sphinx/templates/genindex-split.html:2 +#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2 +#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48 +#: sphinx/templates/layout.html:130 +msgid "Index" +msgstr "Ãndice" + +#: sphinx/environment.py:292 sphinx/latexwriter.py:174 +msgid "Module Index" +msgstr "Ãndice de Módulos" + +#: sphinx/environment.py:293 sphinx/templates/defindex.html:16 +msgid "Search Page" +msgstr "Página de Búsqueda" + +#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145 +msgid "Permalink to this definition" +msgstr "Enlazar permanentemente con esta definición" + +#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139 +msgid "Permalink to this headline" +msgstr "Enlazar permanentemente con este título" + +#: sphinx/latexwriter.py:172 +#, fuzzy +msgid "Release" +msgstr "Versión" + +#: sphinx/roles.py:53 sphinx/directives/desc.py:537 +#, python-format +msgid "environment variable; %s" +msgstr "variables de entorno; %s" + +#: sphinx/roles.py:60 +#, python-format +msgid "Python Enhancement Proposals!PEP %s" +msgstr "Python Enhancement Proposals!PEP %s" + +#: sphinx/textwriter.py:166 +#, python-format +msgid "Platform: %s" +msgstr "Plataforma: %s" + +#: sphinx/textwriter.py:422 +msgid "[image]" +msgstr "[imagen]" + +#: sphinx/directives/desc.py:25 +#, fuzzy, python-format +msgid "%s() (built-in function)" +msgstr "%s() (función de base)" + +#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42 +#: sphinx/directives/desc.py:54 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (en el módulo %s)" + +#: sphinx/directives/desc.py:29 +#, fuzzy, python-format +msgid "%s (built-in variable)" +msgstr "%s (variable de base)" + +#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66 +#, python-format +msgid "%s (in module %s)" +msgstr "%s (en el módulo %s)" + +#: sphinx/directives/desc.py:33 +#, fuzzy, python-format +msgid "%s (built-in class)" +msgstr "%s (variable de base)" + +#: sphinx/directives/desc.py:34 +#, python-format +msgid "%s (class in %s)" +msgstr "%s (clase en %s)" + +#: sphinx/directives/desc.py:46 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (%s.%s método)" + +#: sphinx/directives/desc.py:48 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (%s método)" + +#: sphinx/directives/desc.py:58 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (%s.%s método estático)" + +#: sphinx/directives/desc.py:60 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (%s método estático)" + +#: sphinx/directives/desc.py:70 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (%s.%s atributo)" + +#: sphinx/directives/desc.py:72 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s (%s atributo)" + +#: sphinx/directives/desc.py:74 +#, python-format +msgid "%s (C function)" +msgstr "%s (función C)" + +#: sphinx/directives/desc.py:76 +#, python-format +msgid "%s (C member)" +msgstr "%s (miembro C)" + +#: sphinx/directives/desc.py:78 +#, python-format +msgid "%s (C macro)" +msgstr "%s (macro C)" + +#: sphinx/directives/desc.py:80 +#, python-format +msgid "%s (C type)" +msgstr "%s (tipo C)" + +#: sphinx/directives/desc.py:82 +#, python-format +msgid "%s (C variable)" +msgstr "%s (variable C)" + +#: sphinx/directives/desc.py:100 +msgid "Raises" +msgstr "Muestra" + +#: sphinx/directives/desc.py:104 +msgid "Variable" +msgstr "Variable" + +#: sphinx/directives/desc.py:107 +msgid "Returns" +msgstr "Devuelve" + +#: sphinx/directives/desc.py:116 +#, fuzzy +msgid "Return type" +msgstr "Tipo del argumento devuelto" + +#: sphinx/directives/desc.py:143 +msgid "Parameters" +msgstr "Parámetros" + +#: sphinx/directives/desc.py:423 +#, fuzzy, python-format +msgid "%scommand line option; %s" +msgstr "%sOpciones en línea de comandos; %s" + +#: sphinx/directives/other.py:101 +msgid "Platforms: " +msgstr "Plataformas:" + +#: sphinx/directives/other.py:106 +#, python-format +msgid "%s (module)" +msgstr "%s (módulo)" + +#: sphinx/directives/other.py:146 +msgid "Section author: " +msgstr "Autor de la sección" + +#: sphinx/directives/other.py:148 +msgid "Module author: " +msgstr "Autor del módulo" + +#: sphinx/directives/other.py:150 +msgid "Author: " +msgstr "Autor:" + +#: sphinx/directives/other.py:246 +msgid "See also" +msgstr "Ver también" + +#: sphinx/ext/todo.py:31 +msgid "Todo" +msgstr "" + +#: sphinx/ext/todo.py:75 +#, python-format +msgid "(The original entry is located in %s, line %d and can be found " +msgstr "" + +#: sphinx/ext/todo.py:81 +msgid "here" +msgstr "" + +#: sphinx/locale/__init__.py:15 +msgid "Attention" +msgstr "Atención" + +#: sphinx/locale/__init__.py:16 +msgid "Caution" +msgstr "Prudencia" + +#: sphinx/locale/__init__.py:17 +msgid "Danger" +msgstr "Peligro" + +#: sphinx/locale/__init__.py:18 +msgid "Error" +msgstr "Error" + +#: sphinx/locale/__init__.py:19 +msgid "Hint" +msgstr "Consejo" + +#: sphinx/locale/__init__.py:20 +msgid "Important" +msgstr "Importante" + +#: sphinx/locale/__init__.py:21 +msgid "Note" +msgstr "Nota" + +#: sphinx/locale/__init__.py:22 +msgid "See Also" +msgstr "Ver También" + +#: sphinx/locale/__init__.py:23 +msgid "Tip" +msgstr "Truco" + +#: sphinx/locale/__init__.py:24 +msgid "Warning" +msgstr "Advertencia" + +#: sphinx/locale/__init__.py:28 +#, python-format +msgid "New in version %s" +msgstr "Nuevo en la versión %s" + +#: sphinx/locale/__init__.py:29 +#, python-format +msgid "Changed in version %s" +msgstr "Distinto en la versión %s" + +#: sphinx/locale/__init__.py:30 +#, python-format +msgid "Deprecated since version %s" +msgstr "Obsoleto desde la versión %s" + +#: sphinx/locale/__init__.py:34 +msgid "module" +msgstr "módulo" + +#: sphinx/locale/__init__.py:35 +msgid "keyword" +msgstr "palabra clave" + +#: sphinx/locale/__init__.py:36 +msgid "operator" +msgstr "operador" + +#: sphinx/locale/__init__.py:37 +msgid "object" +msgstr "objeto" + +#: sphinx/locale/__init__.py:38 +msgid "exception" +msgstr "excepción" + +#: sphinx/locale/__init__.py:39 +msgid "statement" +msgstr "sentencia" + +#: sphinx/locale/__init__.py:40 +#, fuzzy +msgid "built-in function" +msgstr "función de base" + +#: sphinx/static/doctools.js:174 +#, fuzzy +msgid "Hide Search Matches" +msgstr "Coincidencias de la búsqueda" + +#: sphinx/static/searchtools.js:274 +msgid "Searching" +msgstr "Buscando" + +#: sphinx/static/searchtools.js:279 +msgid "Preparing search..." +msgstr "Preparando la búsqueda" + +#: sphinx/static/searchtools.js:338 +#, fuzzy +msgid "module, in " +msgstr "módulo" + +#: sphinx/static/searchtools.js:347 +msgid ", in " +msgstr "" + +#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18 +msgid "Search Results" +msgstr "Resultados de la búsqueda" + +#: sphinx/static/searchtools.js:449 +msgid "" +"Your search did not match any documents. Please make sure that all words " +"are spelled correctly and that you've selected enough categories." +msgstr "" +"La búsqueda no dio ningún resultado. Por favor asegúrese que escribió " +"todas las palabras correctamente y que ha seleccionado suficientes " +"categorías" + +#: sphinx/static/searchtools.js:451 +#, python-format +msgid "Search finished, found %s page(s) matching the search query." +msgstr "" +"Búsqueda finalizada, se han encontrado %s página(s) que concuerdan con su" +" consulta" + +#: sphinx/templates/defindex.html:2 +msgid "Overview" +msgstr "Resumen" + +#: sphinx/templates/defindex.html:11 +msgid "Indices and tables:" +msgstr "Ãndices y tablas:" + +#: sphinx/templates/defindex.html:14 +msgid "Complete Table of Contents" +msgstr "Ãndice de contenidos completo" + +#: sphinx/templates/defindex.html:15 +msgid "lists all sections and subsections" +msgstr "Muestra todas las secciones" + +#: sphinx/templates/defindex.html:17 +msgid "search this documentation" +msgstr "buscar en esta documentación" + +#: sphinx/templates/defindex.html:20 +msgid "quick access to all modules" +msgstr "acceso rápido a todos los módulos" + +#: sphinx/templates/defindex.html:22 +msgid "all functions, classes, terms" +msgstr "todas las funciones, clases, términos" + +#: sphinx/templates/genindex-single.html:5 +#, python-format +msgid "Index – %(key)s" +msgstr "Ãndice – %(key)s" + +#: sphinx/templates/genindex-single.html:44 +#: sphinx/templates/genindex-split.html:14 +#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54 +msgid "Full index on one page" +msgstr "Ãndice completo en una página" + +#: sphinx/templates/genindex-split.html:7 +msgid "Index pages by letter" +msgstr "Ãndice alfabético" + +#: sphinx/templates/genindex-split.html:15 +msgid "can be huge" +msgstr "puede ser muy grande" + +#: sphinx/templates/layout.html:9 +msgid "Navigation" +msgstr "Navegación" + +#: sphinx/templates/layout.html:40 +msgid "Table Of Contents" +msgstr "Contenidos" + +#: sphinx/templates/layout.html:46 +msgid "Previous topic" +msgstr "Tema anterior" + +#: sphinx/templates/layout.html:47 +msgid "previous chapter" +msgstr "Capítulo anterior" + +#: sphinx/templates/layout.html:50 +msgid "Next topic" +msgstr "Próximo tema" + +#: sphinx/templates/layout.html:51 +msgid "next chapter" +msgstr "Próximo capítulo" + +#: sphinx/templates/layout.html:55 +msgid "This Page" +msgstr "Esta página" + +#: sphinx/templates/layout.html:59 +msgid "Suggest Change" +msgstr "Sugerir una modificación" + +#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62 +msgid "Show Source" +msgstr "Enseñar el código" + +#: sphinx/templates/layout.html:71 +msgid "Quick search" +msgstr "Búsqueda rápida" + +#: sphinx/templates/layout.html:71 +msgid "Keyword search" +msgstr "Búsqueda por palabras clave" + +#: sphinx/templates/layout.html:73 +msgid "Go" +msgstr "Ir a" + +#: sphinx/templates/layout.html:78 +msgid "Enter a module, class or function name." +msgstr "Introducir en nombre de un módulo, clase o función" + +#: sphinx/templates/layout.html:119 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "Buscar en %(docstitle)s" + +#: sphinx/templates/layout.html:128 +msgid "About these documents" +msgstr "Sobre este documento" + +#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2 +#: sphinx/templates/search.html:5 +msgid "Search" +msgstr "Búsqueda" + +#: sphinx/templates/layout.html:133 +msgid "Copyright" +msgstr "Copyright" + +#: sphinx/templates/layout.html:178 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:180 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:183 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "Actualizado por última vez en %(last_updated)s." + +#: sphinx/templates/layout.html:186 +#, python-format +msgid "" +"Created using Sphinx " +"%(sphinx_version)s." +msgstr "" +"Creado con Sphinx " +"%(sphinx_version)s." + +#: sphinx/templates/modindex.html:15 +msgid "Most popular modules:" +msgstr "Módulos más comunes:" + +#: sphinx/templates/modindex.html:24 +msgid "Show modules only available on these platforms" +msgstr "Mostrar sólo los módulos disponibles en estas plataformas" + +#: sphinx/templates/modindex.html:56 +msgid "Deprecated" +msgstr "Obsoleto" + +#: sphinx/templates/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "Buscar en %(docstitle)s" + +#: sphinx/templates/page.html:8 +msgid "" +"Note: You requested an out-of-date URL from this server." +" We've tried to redirect you to the new location of this page, but it may" +" not be the right one." +msgstr "" +"Nota: Has solicitado una dirección desactualizada a este" +" servidor. Hemos intentado redirigirte a la nueva dirección de la misma " +"página pero puede no ser la correcta." + +#: sphinx/templates/search.html:7 +#, fuzzy +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" +"Este es el diálogo de búsqueda. Introduce los términos en el diálogo " +"siguiente y pulsa \"buscar\". El asistente buscará automáticamente todas" +" las palabras. Las páginas que contengan menos palabras no aparecerán en" +" la lista de resultados." + +#: sphinx/templates/search.html:14 +msgid "search" +msgstr "buscar" + +#: sphinx/templates/search.html:20 +msgid "Your search did not match any results." +msgstr "Tu consulta no obtuvo ningún resultado" + +#: sphinx/templates/changes/frameset.html:5 +#: sphinx/templates/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "Cambios en la versión %(version)s — %(docstitle)s" + +#: sphinx/templates/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "%(filename)s — %(docstitle)s" + +#: sphinx/templates/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "Lista de cambios generada automáticamente en la versión %(version)s" + +#: sphinx/templates/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "Cambios en la biblioteca" + +#: sphinx/templates/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "Cambios en la API C" + +#: sphinx/templates/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "Otros cambios" + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1 @@ +Documentation.addTranslations({"locale": "fr", "plural_expr": "(n > 1)", "messages": {"module, in ": "module, dans", "Preparing search...": "Pr\u00e9paration de la recherche...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Votre recherche ne correspond \u00e0 aucun document. V\u00e9rifiez l'orthographe des termes de recherche et que vous avez s\u00e9lectionn\u00e9 suffisamment de cat\u00e9gories.", "Search finished, found %s page(s) matching the search query.": "La recherche est termin\u00e9e, %s page(s) correspond(ent) \u00e0 la requ\u00eate.", ", in ": ", dans", "Permalink to this headline": "Lien permanent vers ce titre", "Searching": "En cours de recherche", "Permalink to this definition": "Lien permanent vers cette d\u00e9finition", "Hide Search Matches": "Cacher les r\u00e9sultats de la recherche", "Search Results": "R\u00e9sultats de la recherche"}}); \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.mo Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.mo has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/fr/LC_MESSAGES/sphinx.po Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,606 @@ +# French translations for Sphinx. +# Copyright (C) 2008 ORGANIZATION +# This file is distributed under the same license as the Sphinx project. +# David Larlet , 2008. +# Sebastien Douche , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 0.5\n" +"Report-Msgid-Bugs-To: larlet@gmail.com\n" +"POT-Creation-Date: 2008-08-08 12:39+0000\n" +"PO-Revision-Date: 2008-11-27 18:40+0100\n" +"Last-Translator: Sébastien Douche \n" +"Language-Team: French Translation Team \n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: sphinx/builder.py:408 +#, python-format +msgid "%b %d, %Y" +msgstr "%d %b %Y" + +#: sphinx/builder.py:427 sphinx/templates/defindex.html:21 +msgid "General Index" +msgstr "Index général" + +#: sphinx/builder.py:427 +msgid "index" +msgstr "index" + +#: sphinx/builder.py:429 sphinx/htmlhelp.py:156 +#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2 +#: sphinx/templates/modindex.html:13 +msgid "Global Module Index" +msgstr "Index général des modules" + +#: sphinx/builder.py:429 +msgid "modules" +msgstr "modules" + +#: sphinx/builder.py:466 +msgid "next" +msgstr "suivant" + +#: sphinx/builder.py:473 +msgid "previous" +msgstr "précédent" + +#: sphinx/builder.py:1054 +msgid " (in " +msgstr "(dans" + +#: sphinx/builder.py:1129 +msgid "Builtins" +msgstr "Fonctions de base" + +#: sphinx/builder.py:1131 +msgid "Module level" +msgstr "Module" + +#: sphinx/environment.py:102 sphinx/latexwriter.py:169 +#, python-format +msgid "%B %d, %Y" +msgstr "%d %B %Y" + +#: sphinx/environment.py:291 sphinx/latexwriter.py:175 +#: sphinx/templates/genindex-single.html:2 +#: sphinx/templates/genindex-split.html:2 +#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2 +#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48 +#: sphinx/templates/layout.html:130 +msgid "Index" +msgstr "Index" + +#: sphinx/environment.py:292 sphinx/latexwriter.py:174 +msgid "Module Index" +msgstr "Index du module" + +#: sphinx/environment.py:293 sphinx/templates/defindex.html:16 +msgid "Search Page" +msgstr "Page de recherche" + +#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145 +msgid "Permalink to this definition" +msgstr "Lien permanent vers cette définition" + +#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139 +msgid "Permalink to this headline" +msgstr "Lien permanent vers ce titre" + +#: sphinx/latexwriter.py:172 +msgid "Release" +msgstr "Version" + +#: sphinx/roles.py:53 sphinx/directives/desc.py:537 +#, python-format +msgid "environment variable; %s" +msgstr "variable d'environnement; %s" + +#: sphinx/roles.py:60 +#, python-format +msgid "Python Enhancement Proposals!PEP %s" +msgstr "Python Enhancement Proposals!PEP %s" + +#: sphinx/textwriter.py:166 +#, python-format +msgid "Platform: %s" +msgstr "Plateforme : %s" + +#: sphinx/textwriter.py:422 +msgid "[image]" +msgstr "[image]" + +#: sphinx/directives/desc.py:25 +#, python-format +msgid "%s() (built-in function)" +msgstr "%s() (fonction de base)" + +#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42 +#: sphinx/directives/desc.py:54 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (dans le module %s)" + +#: sphinx/directives/desc.py:29 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s (variable de base)" + +#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66 +#, python-format +msgid "%s (in module %s)" +msgstr "%s (dans le module %s)" + +#: sphinx/directives/desc.py:33 +#, python-format +msgid "%s (built-in class)" +msgstr "%s (classe de base)" + +#: sphinx/directives/desc.py:34 +#, python-format +msgid "%s (class in %s)" +msgstr "%s (classe dans %s)" + +#: sphinx/directives/desc.py:46 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (méthode %s.%s)" + +#: sphinx/directives/desc.py:48 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (méthode %s)" + +#: sphinx/directives/desc.py:58 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (méthode statique %s.%s)" + +#: sphinx/directives/desc.py:60 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (méthode statique %s)" + +#: sphinx/directives/desc.py:70 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (attribut %s.%s)" + +#: sphinx/directives/desc.py:72 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s (attribut %s)" + +#: sphinx/directives/desc.py:74 +#, python-format +msgid "%s (C function)" +msgstr "%s (fonction C)" + +#: sphinx/directives/desc.py:76 +#, python-format +msgid "%s (C member)" +msgstr "%s (membre C)" + +#: sphinx/directives/desc.py:78 +#, python-format +msgid "%s (C macro)" +msgstr "%s (macro C)" + +#: sphinx/directives/desc.py:80 +#, python-format +msgid "%s (C type)" +msgstr "%s (type C)" + +#: sphinx/directives/desc.py:82 +#, python-format +msgid "%s (C variable)" +msgstr "%s (variable C)" + +#: sphinx/directives/desc.py:100 +msgid "Raises" +msgstr "Lève" + +#: sphinx/directives/desc.py:104 +msgid "Variable" +msgstr "Variable" + +#: sphinx/directives/desc.py:107 +msgid "Returns" +msgstr "Retourne" + +#: sphinx/directives/desc.py:116 +msgid "Return type" +msgstr "Type retourné" + +#: sphinx/directives/desc.py:143 +msgid "Parameters" +msgstr "Paramètres" + +#: sphinx/directives/desc.py:423 +#, python-format +msgid "%scommand line option; %s" +msgstr "%soption de ligne de commande; %s" + +#: sphinx/directives/other.py:101 +msgid "Platforms: " +msgstr "Plateformes : " + +#: sphinx/directives/other.py:106 +#, python-format +msgid "%s (module)" +msgstr "%s (module)" + +#: sphinx/directives/other.py:146 +msgid "Section author: " +msgstr "Auteur de la section : " + +#: sphinx/directives/other.py:148 +msgid "Module author: " +msgstr "Auteur du module : " + +#: sphinx/directives/other.py:150 +msgid "Author: " +msgstr "Auteur : " + +#: sphinx/directives/other.py:246 +msgid "See also" +msgstr "Voir aussi" + +#: sphinx/ext/todo.py:31 +msgid "Todo" +msgstr "A faire" + +#: sphinx/ext/todo.py:75 +#, python-format +msgid "(The original entry is located in %s, line %d and can be found " +msgstr "(L'entrée orginale se trouve dans %s, à la ligne %d et peut être trouvé" + +#: sphinx/ext/todo.py:81 +msgid "here" +msgstr "ici" + +#: sphinx/locale/__init__.py:15 +msgid "Attention" +msgstr "Attention" + +#: sphinx/locale/__init__.py:16 +msgid "Caution" +msgstr "Prudence" + +#: sphinx/locale/__init__.py:17 +msgid "Danger" +msgstr "Danger" + +#: sphinx/locale/__init__.py:18 +msgid "Error" +msgstr "Erreur" + +#: sphinx/locale/__init__.py:19 +msgid "Hint" +msgstr "Indice" + +#: sphinx/locale/__init__.py:20 +msgid "Important" +msgstr "Important" + +#: sphinx/locale/__init__.py:21 +msgid "Note" +msgstr "Note" + +#: sphinx/locale/__init__.py:22 +msgid "See Also" +msgstr "Voir aussi" + +#: sphinx/locale/__init__.py:23 +msgid "Tip" +msgstr "Astuce" + +#: sphinx/locale/__init__.py:24 +msgid "Warning" +msgstr "Warning" + +#: sphinx/locale/__init__.py:28 +#, python-format +msgid "New in version %s" +msgstr "Introduit dans la version %s" + +#: sphinx/locale/__init__.py:29 +#, python-format +msgid "Changed in version %s" +msgstr "Modifié dans la version %s" + +#: sphinx/locale/__init__.py:30 +#, python-format +msgid "Deprecated since version %s" +msgstr "Obsolète depuis la version %s" + +#: sphinx/locale/__init__.py:34 +msgid "module" +msgstr "module" + +#: sphinx/locale/__init__.py:35 +msgid "keyword" +msgstr "mot-clé" + +#: sphinx/locale/__init__.py:36 +msgid "operator" +msgstr "opérateur" + +#: sphinx/locale/__init__.py:37 +msgid "object" +msgstr "objet" + +#: sphinx/locale/__init__.py:38 +msgid "exception" +msgstr "exception" + +#: sphinx/locale/__init__.py:39 +msgid "statement" +msgstr "état" + +#: sphinx/locale/__init__.py:40 +msgid "built-in function" +msgstr "fonction de base" + +#: sphinx/static/doctools.js:174 +msgid "Hide Search Matches" +msgstr "Cacher les résultats de la recherche" + +#: sphinx/static/searchtools.js:274 +msgid "Searching" +msgstr "En cours de recherche" + +#: sphinx/static/searchtools.js:279 +msgid "Preparing search..." +msgstr "Préparation de la recherche..." + +#: sphinx/static/searchtools.js:338 +msgid "module, in " +msgstr "module, dans" + +#: sphinx/static/searchtools.js:347 +msgid ", in " +msgstr ", dans" + +#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18 +msgid "Search Results" +msgstr "Résultats de la recherche" + +#: sphinx/static/searchtools.js:449 +msgid "" +"Your search did not match any documents. Please make sure that all words " +"are spelled correctly and that you've selected enough categories." +msgstr "" +"Votre recherche ne correspond à aucun document. Vérifiez l'orthographe " +"des termes de recherche et que vous avez sélectionné suffisamment de " +"catégories." + +#: sphinx/static/searchtools.js:451 +#, python-format +msgid "Search finished, found %s page(s) matching the search query." +msgstr "La recherche est terminée, %s page(s) correspond(ent) à la requête." + +#: sphinx/templates/defindex.html:2 +msgid "Overview" +msgstr "Résumé" + +#: sphinx/templates/defindex.html:11 +msgid "Indices and tables:" +msgstr "Indices et tables :" + +#: sphinx/templates/defindex.html:14 +msgid "Complete Table of Contents" +msgstr "Table des matières complète" + +#: sphinx/templates/defindex.html:15 +msgid "lists all sections and subsections" +msgstr "lister l'ensemble des sections et sous-sections" + +#: sphinx/templates/defindex.html:17 +msgid "search this documentation" +msgstr "rechercher dans cette documentation" + +#: sphinx/templates/defindex.html:20 +msgid "quick access to all modules" +msgstr "accès rapide à l'ensemble des modules" + +#: sphinx/templates/defindex.html:22 +msgid "all functions, classes, terms" +msgstr "toutes les fonctions, classes, termes" + +#: sphinx/templates/genindex-single.html:5 +#, python-format +msgid "Index – %(key)s" +msgstr "Index – %(key)s" + +#: sphinx/templates/genindex-single.html:44 +#: sphinx/templates/genindex-split.html:14 +#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54 +msgid "Full index on one page" +msgstr "Index complet sur une seule page" + +#: sphinx/templates/genindex-split.html:7 +msgid "Index pages by letter" +msgstr "Indexer les pages par lettre" + +#: sphinx/templates/genindex-split.html:15 +msgid "can be huge" +msgstr "peut être énorme" + +#: sphinx/templates/layout.html:9 +msgid "Navigation" +msgstr "Navigation" + +#: sphinx/templates/layout.html:40 +msgid "Table Of Contents" +msgstr "Table des matières" + +#: sphinx/templates/layout.html:46 +msgid "Previous topic" +msgstr "Sujet précédent" + +#: sphinx/templates/layout.html:47 +msgid "previous chapter" +msgstr "Chapitre précédent" + +#: sphinx/templates/layout.html:50 +msgid "Next topic" +msgstr "Sujet suivant" + +#: sphinx/templates/layout.html:51 +msgid "next chapter" +msgstr "Chapitre suivant" + +#: sphinx/templates/layout.html:55 +msgid "This Page" +msgstr "Cette page" + +#: sphinx/templates/layout.html:59 +msgid "Suggest Change" +msgstr "Suggérer une modification" + +#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62 +msgid "Show Source" +msgstr "Montrer la source" + +#: sphinx/templates/layout.html:71 +msgid "Quick search" +msgstr "Recherche rapide" + +#: sphinx/templates/layout.html:71 +msgid "Keyword search" +msgstr "Recherche par mot-clé" + +#: sphinx/templates/layout.html:73 +msgid "Go" +msgstr "Go" + +#: sphinx/templates/layout.html:78 +msgid "Enter a module, class or function name." +msgstr "Saisissez un nom de module, classe ou fonction." + +#: sphinx/templates/layout.html:119 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "Recherchez dans %(docstitle)s" + +#: sphinx/templates/layout.html:128 +msgid "About these documents" +msgstr "À propos de ces documents" + +#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2 +#: sphinx/templates/search.html:5 +msgid "Search" +msgstr "Recherche" + +#: sphinx/templates/layout.html:133 +msgid "Copyright" +msgstr "Copyright" + +#: sphinx/templates/layout.html:178 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:180 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:183 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "Mis à jour le %(last_updated)s." + +#: sphinx/templates/layout.html:186 +#, python-format +msgid "" +"Created using Sphinx " +"%(sphinx_version)s." +msgstr "" +"Créé avec Sphinx " +"%(sphinx_version)s." + +#: sphinx/templates/modindex.html:15 +msgid "Most popular modules:" +msgstr "Modules les plus utilisés :" + +#: sphinx/templates/modindex.html:24 +msgid "Show modules only available on these platforms" +msgstr "N'afficher que les modules disponibles sur ces plateformes" + +#: sphinx/templates/modindex.html:56 +msgid "Deprecated" +msgstr "Obsolète" + +#: sphinx/templates/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "Rechercher %(docstitle)s" + +#: sphinx/templates/page.html:8 +msgid "" +"Note: You requested an out-of-date URL from this server." +" We've tried to redirect you to the new location of this page, but it may" +" not be the right one." +msgstr "" +"Note : Vous tentez d'accéder à une ancienne URL de ce " +"serveur. Nous avons essayé de vous rediriger vers la nouvelle adresse de " +"cette page, mais ce n'est peut-être pas la bonne." + +#: sphinx/templates/search.html:7 +#, fuzzy +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" +"Vous pouvez effectuer une recherche au sein des documents. Saisissez les " +"termes\n" +" de votre recherche dans le champs ci-dessous et cliquez sur " +"\"rechercher\". Notez que la fonctionnalité de recherche\n" +" va automatique chercher pour tous les mots. Les pages\n" +" contenant moins de mots n'apparaîtront pas dans la liste des " +"résultats." + +#: sphinx/templates/search.html:14 +msgid "search" +msgstr "rechercher" + +#: sphinx/templates/search.html:20 +msgid "Your search did not match any results." +msgstr "Votre recherche n'a retourné aucun résultat" + +#: sphinx/templates/changes/frameset.html:5 +#: sphinx/templates/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "Modifications dans la version %(version)s — %(docstitle)s" + +#: sphinx/templates/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "%(filename)s — %(docstitle)s" + +#: sphinx/templates/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "Liste auto-générée des modifications dans la version %(version)s" + +#: sphinx/templates/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "Modifications de la bibliothèque" + +#: sphinx/templates/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "Modifications de l'API C" + +#: sphinx/templates/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "Autres modifications" + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1 @@ +Documentation.addTranslations({"locale": "ja", "plural_expr": "0", "messages": {"module, in ": "\u30e2\u30b8\u30e5\u30fc\u30eb", "Preparing search...": "\u691c\u7d22\u306e\u6e96\u5099\u4e2d...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u691c\u7d22\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u691c\u7d22\u3057\u305f\u3044\u8a00\u8449\u3092\u6b63\u3057\u3044\u3064\u3065\u308a\u3067\u5165\u529b\u3057\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u307e\u305f\u3001\u6b63\u3057\u3044\u30ab\u30c6\u30b4\u30ea\u306e\u691c\u7d22\u3092\u884c\u3063\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002", "Search finished, found %s page(s) matching the search query.": "\u691c\u7d22\u304c\u7d42\u4e86\u3057\u3001\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30da\u30fc\u30b8\u304c %s \u500b\u307f\u3064\u304b\u308a\u307e\u3057\u305f\u3002", ", in ": "", "Permalink to this headline": "\u3053\u306e\u30d8\u30c3\u30c9\u30e9\u30a4\u30f3\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Searching": "\u691c\u7d22\u4e2d", "Permalink to this definition": "\u3053\u306e\u5b9a\u7fa9\u3078\u306e\u30d1\u30fc\u30de\u30ea\u30f3\u30af", "Hide Search Matches": "\u691c\u7d22\u7d50\u679c\u3092\u96a0\u3059", "Search Results": "\u691c\u7d22\u7d50\u679c"}}); \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.mo Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.mo has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/ja/LC_MESSAGES/sphinx.po Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,595 @@ +# Japanese translations for Sphinx. +# Copyright (C) 2008 ORGANIZATION +# This file is distributed under the same license as the Sphinx project. +# Yasushi Masuda , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 0.5\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2008-09-11 23:58+0200\n" +"PO-Revision-Date: 2008-11-27 18:40+0100\n" +"Last-Translator: Yasushi MASUDA \n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: sphinx/builder.py:408 +#, python-format +msgid "%b %d, %Y" +msgstr "%Y å¹´ %m 月 %d æ—¥" + +#: sphinx/builder.py:427 sphinx/templates/defindex.html:21 +msgid "General Index" +msgstr "ç·åˆç´¢å¼•" + +#: sphinx/builder.py:427 +msgid "index" +msgstr "索引" + +#: sphinx/builder.py:429 sphinx/htmlhelp.py:156 +#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2 +#: sphinx/templates/modindex.html:13 +msgid "Global Module Index" +msgstr "モジュールç·ç´¢å¼•" + +#: sphinx/builder.py:429 +msgid "modules" +msgstr "モジュール" + +#: sphinx/builder.py:466 +msgid "next" +msgstr "次ã¸" + +#: sphinx/builder.py:473 +msgid "previous" +msgstr "å‰ã¸" + +#: sphinx/builder.py:1054 +msgid " (in " +msgstr "" + +#: sphinx/builder.py:1129 +msgid "Builtins" +msgstr "組ã¿è¾¼ã¿" + +#: sphinx/builder.py:1131 +msgid "Module level" +msgstr "モジュールレベル" + +#: sphinx/environment.py:102 sphinx/latexwriter.py:169 +#, python-format +msgid "%B %d, %Y" +msgstr "%Y å¹´ %m 月 %d æ—¥" + +#: sphinx/environment.py:291 sphinx/latexwriter.py:175 +#: sphinx/templates/genindex-single.html:2 +#: sphinx/templates/genindex-split.html:2 +#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2 +#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48 +#: sphinx/templates/layout.html:130 +msgid "Index" +msgstr "索引" + +#: sphinx/environment.py:292 sphinx/latexwriter.py:174 +msgid "Module Index" +msgstr "モジュール索引" + +#: sphinx/environment.py:293 sphinx/templates/defindex.html:16 +msgid "Search Page" +msgstr "検索ページ" + +#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145 +msgid "Permalink to this definition" +msgstr "ã“ã®å®šç¾©ã¸ã®ãƒ‘ーマリンク" + +#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139 +msgid "Permalink to this headline" +msgstr "ã“ã®ãƒ˜ãƒƒãƒ‰ãƒ©ã‚¤ãƒ³ã¸ã®ãƒ‘ーマリンク" + +#: sphinx/latexwriter.py:172 +msgid "Release" +msgstr "リリース" + +#: sphinx/roles.py:53 sphinx/directives/desc.py:537 +#, python-format +msgid "environment variable; %s" +msgstr "環境変数; %s" + +#: sphinx/roles.py:60 +#, python-format +msgid "Python Enhancement Proposals!PEP %s" +msgstr "Python Enhancement Proposals!PEP %s" + +#: sphinx/textwriter.py:166 +#, python-format +msgid "Platform: %s" +msgstr "プラットフォーム: %s" + +#: sphinx/textwriter.py:422 +msgid "[image]" +msgstr "[ç”»åƒ]" + +#: sphinx/directives/desc.py:25 +#, python-format +msgid "%s() (built-in function)" +msgstr "%s() (組ã¿è¾¼ã¿é–¢æ•°)" + +#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42 +#: sphinx/directives/desc.py:54 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (%s モジュール)" + +#: sphinx/directives/desc.py:29 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s (組ã¿è¾¼ã¿å¤‰æ•°)" + +#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66 +#, python-format +msgid "%s (in module %s)" +msgstr "%s (%s モジュール)" + +#: sphinx/directives/desc.py:33 +#, fuzzy, python-format +msgid "%s (built-in class)" +msgstr "%s (組ã¿è¾¼ã¿å¤‰æ•°)" + +#: sphinx/directives/desc.py:34 +#, python-format +msgid "%s (class in %s)" +msgstr "%s (%s ã®ã‚¯ãƒ©ã‚¹)" + +#: sphinx/directives/desc.py:46 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (%s.%s ã®ãƒ¡ã‚½ãƒƒãƒ‰)" + +#: sphinx/directives/desc.py:48 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (%s ã®ãƒ¡ã‚½ãƒƒãƒ‰)" + +#: sphinx/directives/desc.py:58 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (%s.%s ã®é™çš„メソッド)" + +#: sphinx/directives/desc.py:60 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (%s ã®é™çš„メソッド)" + +#: sphinx/directives/desc.py:70 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (%s.%s ã®å±žæ€§)" + +#: sphinx/directives/desc.py:72 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s (%s ã®å±žæ€§)" + +#: sphinx/directives/desc.py:74 +#, python-format +msgid "%s (C function)" +msgstr "%s (C ã®é–¢æ•°)" + +#: sphinx/directives/desc.py:76 +#, python-format +msgid "%s (C member)" +msgstr "%s (C ã®ãƒ¡ãƒ³ãƒå¤‰æ•°)" + +#: sphinx/directives/desc.py:78 +#, python-format +msgid "%s (C macro)" +msgstr "%s (C ã®ãƒžã‚¯ãƒ­)" + +#: sphinx/directives/desc.py:80 +#, python-format +msgid "%s (C type)" +msgstr "%s (C ã®ãƒ‡ãƒ¼ã‚¿åž‹)" + +#: sphinx/directives/desc.py:82 +#, python-format +msgid "%s (C variable)" +msgstr "%s (C ã®å¤‰æ•°)" + +#: sphinx/directives/desc.py:100 +msgid "Raises" +msgstr "例外" + +#: sphinx/directives/desc.py:104 +msgid "Variable" +msgstr "変数" + +#: sphinx/directives/desc.py:107 +msgid "Returns" +msgstr "戻り値" + +#: sphinx/directives/desc.py:116 +msgid "Return type" +msgstr "戻り値ã®åž‹" + +#: sphinx/directives/desc.py:143 +msgid "Parameters" +msgstr "パラメタ" + +#: sphinx/directives/desc.py:423 +#, fuzzy, python-format +msgid "%scommand line option; %s" +msgstr "%sコマンドラインオプション; %s" + +#: sphinx/directives/other.py:101 +msgid "Platforms: " +msgstr "プラットフォーム: " + +#: sphinx/directives/other.py:106 +#, python-format +msgid "%s (module)" +msgstr "%s (モジュール)" + +#: sphinx/directives/other.py:146 +msgid "Section author: " +msgstr "ã“ã®ç¯€ã®ä½œè€…: " + +#: sphinx/directives/other.py:148 +msgid "Module author: " +msgstr "モジュールã®ä½œè€…: " + +#: sphinx/directives/other.py:150 +msgid "Author: " +msgstr "作者: " + +#: sphinx/directives/other.py:246 +msgid "See also" +msgstr "å‚考" + +#: sphinx/ext/todo.py:31 +msgid "Todo" +msgstr "" + +#: sphinx/ext/todo.py:75 +#, python-format +msgid "(The original entry is located in %s, line %d and can be found " +msgstr "" + +#: sphinx/ext/todo.py:81 +msgid "here" +msgstr "" + +#: sphinx/locale/__init__.py:15 +msgid "Attention" +msgstr "注æ„" + +#: sphinx/locale/__init__.py:16 +msgid "Caution" +msgstr "ã”用心" + +#: sphinx/locale/__init__.py:17 +msgid "Danger" +msgstr "å±é™º" + +#: sphinx/locale/__init__.py:18 +msgid "Error" +msgstr "エラー" + +#: sphinx/locale/__init__.py:19 +msgid "Hint" +msgstr "ヒント" + +#: sphinx/locale/__init__.py:20 +msgid "Important" +msgstr "é‡è¦" + +#: sphinx/locale/__init__.py:21 +msgid "Note" +msgstr "ノート" + +#: sphinx/locale/__init__.py:22 +msgid "See Also" +msgstr "å‚考" + +#: sphinx/locale/__init__.py:23 +msgid "Tip" +msgstr "ã¡ãªã¿ã«" + +#: sphinx/locale/__init__.py:24 +msgid "Warning" +msgstr "警告" + +#: sphinx/locale/__init__.py:28 +#, python-format +msgid "New in version %s" +msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§è¿½åŠ " + +#: sphinx/locale/__init__.py:29 +#, python-format +msgid "Changed in version %s" +msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§å¤‰æ›´" + +#: sphinx/locale/__init__.py:30 +#, python-format +msgid "Deprecated since version %s" +msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§æ’¤å»ƒ" + +#: sphinx/locale/__init__.py:34 +msgid "module" +msgstr "モジュール" + +#: sphinx/locale/__init__.py:35 +msgid "keyword" +msgstr "キーワード" + +#: sphinx/locale/__init__.py:36 +msgid "operator" +msgstr "演算å­" + +#: sphinx/locale/__init__.py:37 +msgid "object" +msgstr "オブジェクト" + +#: sphinx/locale/__init__.py:38 +msgid "exception" +msgstr "例外" + +#: sphinx/locale/__init__.py:39 +msgid "statement" +msgstr "æ–‡" + +#: sphinx/locale/__init__.py:40 +msgid "built-in function" +msgstr "組ã¿è¾¼ã¿é–¢æ•°" + +#: sphinx/static/doctools.js:174 +msgid "Hide Search Matches" +msgstr "æ¤œç´¢çµæžœã‚’éš ã™" + +#: sphinx/static/searchtools.js:274 +msgid "Searching" +msgstr "検索中" + +#: sphinx/static/searchtools.js:279 +msgid "Preparing search..." +msgstr "æ¤œç´¢ã®æº–備中..." + +#: sphinx/static/searchtools.js:338 +#, fuzzy +msgid "module, in " +msgstr "モジュール" + +#: sphinx/static/searchtools.js:347 +msgid ", in " +msgstr "" + +#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18 +msgid "Search Results" +msgstr "æ¤œç´¢çµæžœ" + +#: sphinx/static/searchtools.js:449 +msgid "" +"Your search did not match any documents. Please make sure that all words " +"are spelled correctly and that you've selected enough categories." +msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚検索ã—ãŸã„言葉を正ã—ã„ã¤ã¥ã‚Šã§å…¥åŠ›ã—ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。ã¾ãŸã€æ­£ã—ã„ã‚«ãƒ†ã‚´ãƒªã®æ¤œç´¢ã‚’行ã£ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。" + +#: sphinx/static/searchtools.js:451 +#, python-format +msgid "Search finished, found %s page(s) matching the search query." +msgstr "検索ãŒçµ‚了ã—ã€æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ãƒšãƒ¼ã‚¸ãŒ %s 個ã¿ã¤ã‹ã‚Šã¾ã—ãŸã€‚" + +#: sphinx/templates/defindex.html:2 +msgid "Overview" +msgstr "概è¦" + +#: sphinx/templates/defindex.html:11 +msgid "Indices and tables:" +msgstr "索引ã¨è¡¨ä¸€è¦§:" + +#: sphinx/templates/defindex.html:14 +msgid "Complete Table of Contents" +msgstr "ç·åˆç›®æ¬¡" + +#: sphinx/templates/defindex.html:15 +msgid "lists all sections and subsections" +msgstr "ç« ï¼ç¯€ä¸€è¦§" + +#: sphinx/templates/defindex.html:17 +msgid "search this documentation" +msgstr "ドキュメントを検索" + +#: sphinx/templates/defindex.html:20 +msgid "quick access to all modules" +msgstr "全モジュール早見表" + +#: sphinx/templates/defindex.html:22 +msgid "all functions, classes, terms" +msgstr "関数ã€ã‚¯ãƒ©ã‚¹ãŠã‚ˆã³ç”¨èªžç·è¦§" + +#: sphinx/templates/genindex-single.html:5 +#, python-format +msgid "Index – %(key)s" +msgstr "索引 – %(key)s" + +#: sphinx/templates/genindex-single.html:44 +#: sphinx/templates/genindex-split.html:14 +#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54 +msgid "Full index on one page" +msgstr "ç·ç´¢å¼•" + +#: sphinx/templates/genindex-split.html:7 +msgid "Index pages by letter" +msgstr "頭文字別索引" + +#: sphinx/templates/genindex-split.html:15 +msgid "can be huge" +msgstr "大ãã„å ´åˆãŒã‚ã‚‹ã®ã§æ³¨æ„" + +#: sphinx/templates/layout.html:9 +msgid "Navigation" +msgstr "ナビゲーション" + +#: sphinx/templates/layout.html:40 +msgid "Table Of Contents" +msgstr "目次" + +#: sphinx/templates/layout.html:46 +msgid "Previous topic" +msgstr "å‰ã®ãƒˆãƒ”ックã¸" + +#: sphinx/templates/layout.html:47 +msgid "previous chapter" +msgstr "å‰ã®ç« ã¸" + +#: sphinx/templates/layout.html:50 +msgid "Next topic" +msgstr "次ã®ãƒˆãƒ”ックã¸" + +#: sphinx/templates/layout.html:51 +msgid "next chapter" +msgstr "次ã®ç« ã¸" + +#: sphinx/templates/layout.html:55 +msgid "This Page" +msgstr "ã“ã®ãƒšãƒ¼ã‚¸" + +#: sphinx/templates/layout.html:59 +msgid "Suggest Change" +msgstr "変更ã®ã‚µã‚¸ã‚§ã‚¹ãƒˆ" + +#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62 +msgid "Show Source" +msgstr "ソースコードを表示" + +#: sphinx/templates/layout.html:71 +msgid "Quick search" +msgstr "クイック検索" + +#: sphinx/templates/layout.html:71 +msgid "Keyword search" +msgstr "キーワード検索" + +#: sphinx/templates/layout.html:73 +msgid "Go" +msgstr "検索" + +#: sphinx/templates/layout.html:78 +msgid "Enter a module, class or function name." +msgstr "モジュールã€ã‚¯ãƒ©ã‚¹ã€ã¾ãŸã¯é–¢æ•°åを入力ã—ã¦ãã ã•ã„" + +#: sphinx/templates/layout.html:119 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "%(docstitle)s 内を検索" + +#: sphinx/templates/layout.html:128 +msgid "About these documents" +msgstr "ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«ã¤ã„ã¦" + +#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2 +#: sphinx/templates/search.html:5 +msgid "Search" +msgstr "検索" + +#: sphinx/templates/layout.html:133 +msgid "Copyright" +msgstr "著作権" + +#: sphinx/templates/layout.html:178 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:180 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:183 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "最終更新: %(last_updated)s" + +#: sphinx/templates/layout.html:186 +#, python-format +msgid "" +"Created using Sphinx " +"%(sphinx_version)s." +msgstr "" +"ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ Sphinx " +"%(sphinx_version)s ã§ç”Ÿæˆã—ã¾ã—ãŸã€‚" + +#: sphinx/templates/modindex.html:15 +msgid "Most popular modules:" +msgstr "よãå‚ç…§ã•れã¦ã„るモジュール:" + +#: sphinx/templates/modindex.html:24 +msgid "Show modules only available on these platforms" +msgstr "ã“ã®ãƒ—ラットフォームã§åˆ©ç”¨å¯èƒ½ãªãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã ã‘を表示ã™ã‚‹" + +#: sphinx/templates/modindex.html:56 +msgid "Deprecated" +msgstr "撤廃" + +#: sphinx/templates/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "%(docstitle)s 内を検索" + +#: sphinx/templates/page.html:8 +msgid "" +"Note: You requested an out-of-date URL from this server." +" We've tried to redirect you to the new location of this page, but it may" +" not be the right one." +msgstr "" +"注æ„: ã‚ãªãŸãŒè¡¨ç¤ºã—よã†ã¨ã—ã¦ã„ã‚‹ã®ã¯å¤ã„ URL ã§ã™ã€‚ã“ã®ãƒšãƒ¼ã‚¸ã«å¯¾å¿œã™ã‚‹æ–°ã—ã„ URL " +"ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’試ã¿ã¾ã™ãŒã€é©åˆ‡ãªãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆå…ˆã§ãªã„ã‹ã‚‚ã—れãªã„ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。" + +#: sphinx/templates/search.html:7 +#, fuzzy +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’検索ã§ãã¾ã™ã€‚キーワードを下ã®ãƒœãƒƒã‚¯ã‚¹ã«å…¥åŠ›ã—ã¦ã€ã€Œæ¤œç´¢ã€ã‚’クリックã—ã¦ãã ã•ã„。入力ã•れãŸå…¨ã¦ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’å«ã‚€ãƒšãƒ¼ã‚¸ãŒæ¤œç´¢ã•れã¾ã™ã€‚一部ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã—ã‹å«ã¾ãªã„ãƒšãƒ¼ã‚¸ã¯æ¤œç´¢çµæžœã«è¡¨ç¤ºã•れãªã„ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。" + +#: sphinx/templates/search.html:14 +msgid "search" +msgstr "検索" + +#: sphinx/templates/search.html:20 +msgid "Your search did not match any results." +msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹é …ç›®ãŒã‚りã¾ã›ã‚“ã§ã—ãŸã€‚" + +#: sphinx/templates/changes/frameset.html:5 +#: sphinx/templates/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %(version)s ã®å¤‰æ›´ç‚¹ — %(docstitle)s" + +#: sphinx/templates/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "%(filename)s — %(docstitle)s" + +#: sphinx/templates/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %(version)s ã®å¤‰æ›´ç‚¹ï¼ˆã“ã®ãƒªã‚¹ãƒˆã¯è‡ªå‹•生æˆã•れã¦ã„ã¾ã™ï¼‰" + +#: sphinx/templates/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "ライブラリã«é–¢ã™ã‚‹å¤‰æ›´" + +#: sphinx/templates/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "C API ã«é–¢ã™ã‚‹å¤‰æ›´" + +#: sphinx/templates/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "ãã®å¤šã®å¤‰æ›´" + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1 @@ +Documentation.addTranslations({"locale": "nl", "plural_expr": "(n != 1)", "messages": {"module, in ": "module", "Preparing search...": "Het zoeken wordt voorbereid", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Uw zoekopdracht leverde geen resultaten op. Controleer of alle woordencorrect gespeld zijn en dat u genoeg categori\u00ebn hebt geselecteerd.", "Search finished, found %s page(s) matching the search query.": "Zoeken voltooid, %s pagina(s) gevonden.", ", in ": "", "Permalink to this headline": "Permanente link naar deze titel", "Searching": "Zoeken", "Permalink to this definition": "Permanente link naar deze definitie", "Hide Search Matches": "Zoekresultaten verbergen", "Search Results": "Zoekresultaten"}}); \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.mo Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.mo has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/nl/LC_MESSAGES/sphinx.po Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,603 @@ +# Copyright (C) 2008 ORGANIZATION +# This file is distributed under the same license as the Sphinx project. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 0.5\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2008-09-11 23:58+0200\n" +"PO-Revision-Date: 2008-11-27 18:40+0100\n" +"Last-Translator: FULL NAME \n" +"Language-Team: nl \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: sphinx/builder.py:408 +#, python-format +msgid "%b %d, %Y" +msgstr "%d.%b.%Y" + +#: sphinx/builder.py:427 sphinx/templates/defindex.html:21 +msgid "General Index" +msgstr "Algemene index" + +#: sphinx/builder.py:427 +msgid "index" +msgstr "Index" + +#: sphinx/builder.py:429 sphinx/htmlhelp.py:156 +#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2 +#: sphinx/templates/modindex.html:13 +msgid "Global Module Index" +msgstr "Globale Module-index" + +#: sphinx/builder.py:429 +msgid "modules" +msgstr "modules" + +#: sphinx/builder.py:466 +msgid "next" +msgstr "volgende" + +#: sphinx/builder.py:473 +msgid "previous" +msgstr "vorige" + +#: sphinx/builder.py:1054 +msgid " (in " +msgstr "" + +#: sphinx/builder.py:1129 +msgid "Builtins" +msgstr "Builtins" + +#: sphinx/builder.py:1131 +msgid "Module level" +msgstr "Moduleniveau" + +#: sphinx/environment.py:102 sphinx/latexwriter.py:169 +#, python-format +msgid "%B %d, %Y" +msgstr "%d. %B %Y" + +#: sphinx/environment.py:291 sphinx/latexwriter.py:175 +#: sphinx/templates/genindex-single.html:2 +#: sphinx/templates/genindex-split.html:2 +#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2 +#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48 +#: sphinx/templates/layout.html:130 +msgid "Index" +msgstr "Index" + +#: sphinx/environment.py:292 sphinx/latexwriter.py:174 +msgid "Module Index" +msgstr "Module-index" + +#: sphinx/environment.py:293 sphinx/templates/defindex.html:16 +msgid "Search Page" +msgstr "Zoekpagina" + +#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145 +msgid "Permalink to this definition" +msgstr "Permanente link naar deze definitie" + +#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139 +msgid "Permalink to this headline" +msgstr "Permanente link naar deze titel" + +#: sphinx/latexwriter.py:172 +msgid "Release" +msgstr "Release" + +#: sphinx/roles.py:53 sphinx/directives/desc.py:537 +#, python-format +msgid "environment variable; %s" +msgstr "Omgevingsvariabele; %s" + +#: sphinx/roles.py:60 +#, python-format +msgid "Python Enhancement Proposals!PEP %s" +msgstr "Python Enhancement Proposals!PEP %s" + +#: sphinx/textwriter.py:166 +#, python-format +msgid "Platform: %s" +msgstr "Platform: %s" + +#: sphinx/textwriter.py:422 +msgid "[image]" +msgstr "[afbeelding]" + +#: sphinx/directives/desc.py:25 +#, python-format +msgid "%s() (built-in function)" +msgstr "%s() (geïntegreerde functie)" + +#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42 +#: sphinx/directives/desc.py:54 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (in module %s)" + +#: sphinx/directives/desc.py:29 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s (geïntegreerde variabele)" + +#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66 +#, python-format +msgid "%s (in module %s)" +msgstr "%s (in module %s)" + +#: sphinx/directives/desc.py:33 +#, fuzzy, python-format +msgid "%s (built-in class)" +msgstr "%s (geïntegreerde variabele)" + +#: sphinx/directives/desc.py:34 +#, python-format +msgid "%s (class in %s)" +msgstr "%s (klasse in %s)" + +#: sphinx/directives/desc.py:46 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (%s.%s methode)" + +#: sphinx/directives/desc.py:48 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (%s methode)" + +#: sphinx/directives/desc.py:58 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (%s.%s statische methode)" + +#: sphinx/directives/desc.py:60 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (%s statische methode)" + +#: sphinx/directives/desc.py:70 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (%s.%s attribuut)" + +#: sphinx/directives/desc.py:72 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s (%s attribuut)" + +#: sphinx/directives/desc.py:74 +#, python-format +msgid "%s (C function)" +msgstr "%s (C-functie)" + +#: sphinx/directives/desc.py:76 +#, python-format +msgid "%s (C member)" +msgstr "%s (C member)" + +#: sphinx/directives/desc.py:78 +#, python-format +msgid "%s (C macro)" +msgstr "%s (C-macro)" + +#: sphinx/directives/desc.py:80 +#, python-format +msgid "%s (C type)" +msgstr "%s (C type)" + +#: sphinx/directives/desc.py:82 +#, python-format +msgid "%s (C variable)" +msgstr "%s (C-variabele)" + +#: sphinx/directives/desc.py:100 +msgid "Raises" +msgstr "Veroorzaakt" + +#: sphinx/directives/desc.py:104 +msgid "Variable" +msgstr "Variabele" + +#: sphinx/directives/desc.py:107 +msgid "Returns" +msgstr "Returns" + +#: sphinx/directives/desc.py:116 +msgid "Return type" +msgstr "Return type" + +#: sphinx/directives/desc.py:143 +msgid "Parameters" +msgstr "Parameters" + +#: sphinx/directives/desc.py:423 +#, fuzzy, python-format +msgid "%scommand line option; %s" +msgstr "%scommandolijn optie; %s" + +#: sphinx/directives/other.py:101 +msgid "Platforms: " +msgstr "Platformen: " + +#: sphinx/directives/other.py:106 +#, python-format +msgid "%s (module)" +msgstr "%s (module)" + +#: sphinx/directives/other.py:146 +msgid "Section author: " +msgstr "Auteur van deze sectie: " + +#: sphinx/directives/other.py:148 +msgid "Module author: " +msgstr "Auteur van deze module: " + +#: sphinx/directives/other.py:150 +msgid "Author: " +msgstr "Auteur: " + +#: sphinx/directives/other.py:246 +msgid "See also" +msgstr "Zie ook" + +#: sphinx/ext/todo.py:31 +msgid "Todo" +msgstr "" + +#: sphinx/ext/todo.py:75 +#, python-format +msgid "(The original entry is located in %s, line %d and can be found " +msgstr "" + +#: sphinx/ext/todo.py:81 +msgid "here" +msgstr "" + +#: sphinx/locale/__init__.py:15 +msgid "Attention" +msgstr "Let op!" + +#: sphinx/locale/__init__.py:16 +msgid "Caution" +msgstr "Pas op!" + +#: sphinx/locale/__init__.py:17 +msgid "Danger" +msgstr "Gevaar" + +#: sphinx/locale/__init__.py:18 +msgid "Error" +msgstr "Fout" + +#: sphinx/locale/__init__.py:19 +msgid "Hint" +msgstr "Hint" + +#: sphinx/locale/__init__.py:20 +msgid "Important" +msgstr "Belangrijk" + +#: sphinx/locale/__init__.py:21 +msgid "Note" +msgstr "Notitie" + +#: sphinx/locale/__init__.py:22 +msgid "See Also" +msgstr "Zie Ook" + +#: sphinx/locale/__init__.py:23 +msgid "Tip" +msgstr "Tip" + +#: sphinx/locale/__init__.py:24 +msgid "Warning" +msgstr "Waarschuwing" + +#: sphinx/locale/__init__.py:28 +#, python-format +msgid "New in version %s" +msgstr "Nieuw in versie %s" + +#: sphinx/locale/__init__.py:29 +#, python-format +msgid "Changed in version %s" +msgstr "Veranderd in versie %s" + +#: sphinx/locale/__init__.py:30 +#, python-format +msgid "Deprecated since version %s" +msgstr "Verouderd sinds versie %s" + +#: sphinx/locale/__init__.py:34 +msgid "module" +msgstr "module" + +#: sphinx/locale/__init__.py:35 +msgid "keyword" +msgstr "trefwoord" + +#: sphinx/locale/__init__.py:36 +msgid "operator" +msgstr "operator" + +#: sphinx/locale/__init__.py:37 +msgid "object" +msgstr "object" + +#: sphinx/locale/__init__.py:38 +msgid "exception" +msgstr "foutmelding" + +#: sphinx/locale/__init__.py:39 +msgid "statement" +msgstr "statement" + +#: sphinx/locale/__init__.py:40 +msgid "built-in function" +msgstr "geïntegreerde functie" + +#: sphinx/static/doctools.js:174 +msgid "Hide Search Matches" +msgstr "Zoekresultaten verbergen" + +#: sphinx/static/searchtools.js:274 +msgid "Searching" +msgstr "Zoeken" + +#: sphinx/static/searchtools.js:279 +msgid "Preparing search..." +msgstr "Het zoeken wordt voorbereid" + +#: sphinx/static/searchtools.js:338 +#, fuzzy +msgid "module, in " +msgstr "module" + +#: sphinx/static/searchtools.js:347 +msgid ", in " +msgstr "" + +#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18 +msgid "Search Results" +msgstr "Zoekresultaten" + +#: sphinx/static/searchtools.js:449 +msgid "" +"Your search did not match any documents. Please make sure that all words " +"are spelled correctly and that you've selected enough categories." +msgstr "" +"Uw zoekopdracht leverde geen resultaten op. Controleer of alle " +"woordencorrect gespeld zijn en dat u genoeg categoriën hebt geselecteerd." + +#: sphinx/static/searchtools.js:451 +#, python-format +msgid "Search finished, found %s page(s) matching the search query." +msgstr "Zoeken voltooid, %s pagina(s) gevonden." + +#: sphinx/templates/defindex.html:2 +msgid "Overview" +msgstr "Overzicht" + +#: sphinx/templates/defindex.html:11 +msgid "Indices and tables:" +msgstr "Indices en tabellen:" + +#: sphinx/templates/defindex.html:14 +msgid "Complete Table of Contents" +msgstr "Volledige inhoudstafel" + +#: sphinx/templates/defindex.html:15 +msgid "lists all sections and subsections" +msgstr "geeft alle secties en subsecties weer" + +#: sphinx/templates/defindex.html:17 +msgid "search this documentation" +msgstr "zoeken in deze documentatie" + +#: sphinx/templates/defindex.html:20 +msgid "quick access to all modules" +msgstr "sneltoegang naar alle modules" + +#: sphinx/templates/defindex.html:22 +msgid "all functions, classes, terms" +msgstr "alle functies, klasses en begrippen" + +#: sphinx/templates/genindex-single.html:5 +#, python-format +msgid "Index – %(key)s" +msgstr "Index – %(key)s" + +#: sphinx/templates/genindex-single.html:44 +#: sphinx/templates/genindex-split.html:14 +#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54 +msgid "Full index on one page" +msgstr "Volledige index op een pagina" + +#: sphinx/templates/genindex-split.html:7 +msgid "Index pages by letter" +msgstr "Index pagineerd per letter" + +#: sphinx/templates/genindex-split.html:15 +msgid "can be huge" +msgstr "kan heel groot zijn" + +#: sphinx/templates/layout.html:9 +msgid "Navigation" +msgstr "Navigatie" + +#: sphinx/templates/layout.html:40 +msgid "Table Of Contents" +msgstr "Inhoudstafel" + +#: sphinx/templates/layout.html:46 +msgid "Previous topic" +msgstr "Vorig onderwerp" + +#: sphinx/templates/layout.html:47 +msgid "previous chapter" +msgstr "Vorig hoofdstuk" + +#: sphinx/templates/layout.html:50 +msgid "Next topic" +msgstr "Volgend onderwerp" + +#: sphinx/templates/layout.html:51 +msgid "next chapter" +msgstr "volgend hoofdstuk" + +#: sphinx/templates/layout.html:55 +msgid "This Page" +msgstr "Deze Pagina" + +#: sphinx/templates/layout.html:59 +msgid "Suggest Change" +msgstr "Wijziging Voorstellen" + +#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62 +msgid "Show Source" +msgstr "Broncode weergeven" + +#: sphinx/templates/layout.html:71 +msgid "Quick search" +msgstr "Snel zoeken" + +#: sphinx/templates/layout.html:71 +msgid "Keyword search" +msgstr "Trefwoord opzoeken" + +#: sphinx/templates/layout.html:73 +msgid "Go" +msgstr "Go" + +#: sphinx/templates/layout.html:78 +msgid "Enter a module, class or function name." +msgstr "Geef de naam van een module, klasse of functie." + +#: sphinx/templates/layout.html:119 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "Zoeken in %(docstitle)s" + +#: sphinx/templates/layout.html:128 +msgid "About these documents" +msgstr "Over deze documenten" + +#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2 +#: sphinx/templates/search.html:5 +msgid "Search" +msgstr "Zoeken" + +#: sphinx/templates/layout.html:133 +msgid "Copyright" +msgstr "Copyright" + +#: sphinx/templates/layout.html:178 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:180 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:183 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "Laatste aanpassing op %(last_updated)s." + +#: sphinx/templates/layout.html:186 +#, python-format +msgid "" +"Created using Sphinx " +"%(sphinx_version)s." +msgstr "" +"Aangemaakt met Sphinx " +"%(sphinx_version)s." + +#: sphinx/templates/modindex.html:15 +msgid "Most popular modules:" +msgstr "Populairste modules:" + +#: sphinx/templates/modindex.html:24 +msgid "Show modules only available on these platforms" +msgstr "Enkel modules weergeven die op deze platformen beschikbaar zijn" + +#: sphinx/templates/modindex.html:56 +msgid "Deprecated" +msgstr "Verouderd" + +#: sphinx/templates/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "Zoeken %(docstitle)s" + +#: sphinx/templates/page.html:8 +msgid "" +"Note: You requested an out-of-date URL from this server." +" We've tried to redirect you to the new location of this page, but it may" +" not be the right one." +msgstr "" +"Opgelet: U heeft een verouderde URL aangevraagd op deze " +"server. Wij hebben probeerd u door te verwijzen naar de nieuwe locatie " +"van deze pagina, maar dat is misschien niet gelukt." + +#: sphinx/templates/search.html:7 +#, fuzzy +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" +"Hier kan u de documenten doorzoeken. Geef enkele trefwoorden\n" +" in het veld hieronder en klik \"zoeken\". Merk op dat de zoekfunctie" +"\n" +" steeds naar alle woorden zoekt. Pagina's die minder woorden bevatten" +"\n" +" zullen niet tussen de resultaten verschijnen." + +#: sphinx/templates/search.html:14 +msgid "search" +msgstr "zoeken" + +#: sphinx/templates/search.html:20 +msgid "Your search did not match any results." +msgstr "Uw zoekopdracht leverde geen resultaten op." + +#: sphinx/templates/changes/frameset.html:5 +#: sphinx/templates/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "Veranderingen in versie %(version)s — %(docstitle)s" + +#: sphinx/templates/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "%(filename)s — %(docstitle)s" + +#: sphinx/templates/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "Automatisch genereerde lijst van veranderingen in versie %(version)s" + +#: sphinx/templates/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "Veranderingen in de bibliotheek" + +#: sphinx/templates/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "Veranderingen in de C-API" + +#: sphinx/templates/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "Andere veranderingen" + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1 @@ +Documentation.addTranslations({"locale": "pl", "plural_expr": "(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)", "messages": {"module, in ": "modu\u0142", "Preparing search...": "Przygotowanie wyszukiwania...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Nie znaleziono \u017cadnych pasuj\u0105cych dokument\u00f3w. Upewnij si\u0119, \u017ce wszystkie s\u0142owa s\u0105 poprawnie wpisane i \u017ce wybra\u0142e\u015b wystarczaj\u0105c\u0105liczb\u0119 kategorii.", "Search finished, found %s page(s) matching the search query.": "Przeszukiwanie zako\u0144czone, znaleziono %s pasuj\u0105cych stron.", ", in ": "", "Permalink to this headline": "Sta\u0142y odno\u015bnik do tego nag\u0142\u00f3wka", "Searching": "Wyszukiwanie", "Permalink to this definition": "Sta\u0142y odno\u015bnik do tej definicji", "Hide Search Matches": "Ukryj wyniki wyszukiwania", "Search Results": "Wyniki wyszukiwania"}}); \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.mo Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.mo has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pl/LC_MESSAGES/sphinx.po Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,600 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 0.5\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2008-08-10 11:43+0000\n" +"PO-Revision-Date: 2008-11-27 18:40+0100\n" +"Last-Translator: MichaÅ‚ Kandulski \n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && " +"(n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: sphinx/builder.py:408 +#, python-format +msgid "%b %d, %Y" +msgstr "%b %d %Y" + +#: sphinx/builder.py:427 sphinx/templates/defindex.html:21 +msgid "General Index" +msgstr "Indeks ogólny" + +#: sphinx/builder.py:427 +msgid "index" +msgstr "indeks" + +#: sphinx/builder.py:429 sphinx/htmlhelp.py:156 +#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2 +#: sphinx/templates/modindex.html:13 +msgid "Global Module Index" +msgstr "Indeks modułów" + +#: sphinx/builder.py:429 +msgid "modules" +msgstr "moduÅ‚y" + +#: sphinx/builder.py:466 +msgid "next" +msgstr "dalej" + +#: sphinx/builder.py:473 +msgid "previous" +msgstr "wstecz" + +#: sphinx/builder.py:1054 +msgid " (in " +msgstr "" + +#: sphinx/builder.py:1129 +msgid "Builtins" +msgstr "Wbudowane" + +#: sphinx/builder.py:1131 +msgid "Module level" +msgstr "Poziom moduÅ‚u" + +#: sphinx/environment.py:102 sphinx/latexwriter.py:169 +#, python-format +msgid "%B %d, %Y" +msgstr "%B %d %Y" + +#: sphinx/environment.py:291 sphinx/latexwriter.py:175 +#: sphinx/templates/genindex-single.html:2 +#: sphinx/templates/genindex-split.html:2 +#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2 +#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48 +#: sphinx/templates/layout.html:130 +msgid "Index" +msgstr "Indeks" + +#: sphinx/environment.py:292 sphinx/latexwriter.py:174 +msgid "Module Index" +msgstr "Indeks modułów" + +#: sphinx/environment.py:293 sphinx/templates/defindex.html:16 +msgid "Search Page" +msgstr "Wyszukiwanie" + +#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145 +msgid "Permalink to this definition" +msgstr "StaÅ‚y odnoÅ›nik do tej definicji" + +#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139 +msgid "Permalink to this headline" +msgstr "StaÅ‚y odnoÅ›nik do tego nagłówka" + +#: sphinx/latexwriter.py:172 +msgid "Release" +msgstr "Wydanie" + +#: sphinx/roles.py:53 sphinx/directives/desc.py:537 +#, python-format +msgid "environment variable; %s" +msgstr "zmienna Å›rodowiskowa; %s" + +#: sphinx/roles.py:60 +#, python-format +msgid "Python Enhancement Proposals!PEP %s" +msgstr "Python Enhancement Proposals!PEP %s" + +#: sphinx/textwriter.py:166 +#, python-format +msgid "Platform: %s" +msgstr "Platforma: %s" + +#: sphinx/textwriter.py:422 +msgid "[image]" +msgstr "[obrazek]" + +#: sphinx/directives/desc.py:25 +#, python-format +msgid "%s() (built-in function)" +msgstr "%s() (funkcja wbudowana)" + +#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42 +#: sphinx/directives/desc.py:54 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (w module %s)" + +#: sphinx/directives/desc.py:29 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s (zmienna wbudowana)" + +#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66 +#, python-format +msgid "%s (in module %s)" +msgstr "%s (w module %s)" + +#: sphinx/directives/desc.py:33 +#, fuzzy, python-format +msgid "%s (built-in class)" +msgstr "%s (zmienna wbudowana)" + +#: sphinx/directives/desc.py:34 +#, python-format +msgid "%s (class in %s)" +msgstr "%s (w klasie %s)" + +#: sphinx/directives/desc.py:46 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (%s.%s metoda)" + +#: sphinx/directives/desc.py:48 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (%s metoda)" + +#: sphinx/directives/desc.py:58 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (%s.%s statyczna metoda)" + +#: sphinx/directives/desc.py:60 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (%s statyczna metoda)" + +#: sphinx/directives/desc.py:70 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (%s.%s atrybut)" + +#: sphinx/directives/desc.py:72 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s (%s atrybut)" + +#: sphinx/directives/desc.py:74 +#, python-format +msgid "%s (C function)" +msgstr "%s (funkcja C)" + +#: sphinx/directives/desc.py:76 +#, python-format +msgid "%s (C member)" +msgstr "%s (pole C)" + +#: sphinx/directives/desc.py:78 +#, python-format +msgid "%s (C macro)" +msgstr "%s (makro C)" + +#: sphinx/directives/desc.py:80 +#, python-format +msgid "%s (C type)" +msgstr "%s (typ C)" + +#: sphinx/directives/desc.py:82 +#, python-format +msgid "%s (C variable)" +msgstr "%s (zmienna C)" + +#: sphinx/directives/desc.py:100 +msgid "Raises" +msgstr "Wyrzuca" + +#: sphinx/directives/desc.py:104 +msgid "Variable" +msgstr "Zmienna" + +#: sphinx/directives/desc.py:107 +msgid "Returns" +msgstr "Zwraca" + +#: sphinx/directives/desc.py:116 +msgid "Return type" +msgstr "Typ zwracany" + +#: sphinx/directives/desc.py:143 +msgid "Parameters" +msgstr "Parametry" + +#: sphinx/directives/desc.py:423 +#, fuzzy, python-format +msgid "%scommand line option; %s" +msgstr "%sopcja linii komend; %s" + +#: sphinx/directives/other.py:101 +msgid "Platforms: " +msgstr "Platformy: " + +#: sphinx/directives/other.py:106 +#, python-format +msgid "%s (module)" +msgstr "%s (moduÅ‚)" + +#: sphinx/directives/other.py:146 +msgid "Section author: " +msgstr "Autor rozdziaÅ‚u: " + +#: sphinx/directives/other.py:148 +msgid "Module author: " +msgstr "Autor moduÅ‚u: " + +#: sphinx/directives/other.py:150 +msgid "Author: " +msgstr "Autor: " + +#: sphinx/directives/other.py:246 +msgid "See also" +msgstr "Zobacz także" + +#: sphinx/ext/todo.py:31 +msgid "Todo" +msgstr "" + +#: sphinx/ext/todo.py:75 +#, python-format +msgid "(The original entry is located in %s, line %d and can be found " +msgstr "" + +#: sphinx/ext/todo.py:81 +msgid "here" +msgstr "" + +#: sphinx/locale/__init__.py:15 +msgid "Attention" +msgstr "Uwaga" + +#: sphinx/locale/__init__.py:16 +msgid "Caution" +msgstr "Ostrożnie" + +#: sphinx/locale/__init__.py:17 +msgid "Danger" +msgstr "NiebezpieczeÅ„stwo" + +#: sphinx/locale/__init__.py:18 +msgid "Error" +msgstr "Błąd" + +#: sphinx/locale/__init__.py:19 +msgid "Hint" +msgstr "Podpowiedź" + +#: sphinx/locale/__init__.py:20 +msgid "Important" +msgstr "Ważne" + +#: sphinx/locale/__init__.py:21 +msgid "Note" +msgstr "Uwaga" + +#: sphinx/locale/__init__.py:22 +msgid "See Also" +msgstr "Zobacz także" + +#: sphinx/locale/__init__.py:23 +msgid "Tip" +msgstr "Wskazówka" + +#: sphinx/locale/__init__.py:24 +msgid "Warning" +msgstr "Ostrzeżenie" + +#: sphinx/locale/__init__.py:28 +#, python-format +msgid "New in version %s" +msgstr "Nowe w wersji %s" + +#: sphinx/locale/__init__.py:29 +#, python-format +msgid "Changed in version %s" +msgstr "Zmienione w wersji %s" + +#: sphinx/locale/__init__.py:30 +#, python-format +msgid "Deprecated since version %s" +msgstr "Niezalecane od wersji %s" + +#: sphinx/locale/__init__.py:34 +msgid "module" +msgstr "moduÅ‚" + +#: sphinx/locale/__init__.py:35 +msgid "keyword" +msgstr "sÅ‚owo kluczowe" + +#: sphinx/locale/__init__.py:36 +msgid "operator" +msgstr "operator" + +#: sphinx/locale/__init__.py:37 +msgid "object" +msgstr "obiekt" + +#: sphinx/locale/__init__.py:38 +msgid "exception" +msgstr "wyjÄ…tek" + +#: sphinx/locale/__init__.py:39 +msgid "statement" +msgstr "instrukcja" + +#: sphinx/locale/__init__.py:40 +msgid "built-in function" +msgstr "funkcja wbudowana" + +#: sphinx/static/doctools.js:174 +msgid "Hide Search Matches" +msgstr "Ukryj wyniki wyszukiwania" + +#: sphinx/static/searchtools.js:274 +msgid "Searching" +msgstr "Wyszukiwanie" + +#: sphinx/static/searchtools.js:279 +msgid "Preparing search..." +msgstr "Przygotowanie wyszukiwania..." + +#: sphinx/static/searchtools.js:338 +#, fuzzy +msgid "module, in " +msgstr "moduÅ‚" + +#: sphinx/static/searchtools.js:347 +msgid ", in " +msgstr "" + +#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18 +msgid "Search Results" +msgstr "Wyniki wyszukiwania" + +#: sphinx/static/searchtools.js:449 +msgid "" +"Your search did not match any documents. Please make sure that all words " +"are spelled correctly and that you've selected enough categories." +msgstr "" +"Nie znaleziono żadnych pasujÄ…cych dokumentów. Upewnij siÄ™, że wszystkie " +"sÅ‚owa sÄ… poprawnie wpisane i że wybraÅ‚eÅ› wystarczajÄ…cÄ…liczbÄ™ kategorii." + +#: sphinx/static/searchtools.js:451 +#, python-format +msgid "Search finished, found %s page(s) matching the search query." +msgstr "Przeszukiwanie zakoÅ„czone, znaleziono %s pasujÄ…cych stron." + +#: sphinx/templates/defindex.html:2 +msgid "Overview" +msgstr "PrzeglÄ…d" + +#: sphinx/templates/defindex.html:11 +msgid "Indices and tables:" +msgstr "Indeksy i tablice:" + +#: sphinx/templates/defindex.html:14 +msgid "Complete Table of Contents" +msgstr "Kompletny spis treÅ›ci" + +#: sphinx/templates/defindex.html:15 +msgid "lists all sections and subsections" +msgstr "wymieÅ„ wszystkie rozdziaÅ‚y i podrozdziaÅ‚y" + +#: sphinx/templates/defindex.html:17 +msgid "search this documentation" +msgstr "wyszukaj w dokumentacji" + +#: sphinx/templates/defindex.html:20 +msgid "quick access to all modules" +msgstr "szybki dostÄ™p do wszystkich modułów" + +#: sphinx/templates/defindex.html:22 +msgid "all functions, classes, terms" +msgstr "wszystkie funkcje, klasy, terminy" + +#: sphinx/templates/genindex-single.html:5 +#, python-format +msgid "Index – %(key)s" +msgstr "Indeks – %(key)s" + +#: sphinx/templates/genindex-single.html:44 +#: sphinx/templates/genindex-split.html:14 +#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54 +msgid "Full index on one page" +msgstr "CaÅ‚y indeks na jednej stronie" + +#: sphinx/templates/genindex-split.html:7 +msgid "Index pages by letter" +msgstr "Strony indeksu alfabetycznie" + +#: sphinx/templates/genindex-split.html:15 +msgid "can be huge" +msgstr "może być ogromny" + +#: sphinx/templates/layout.html:9 +msgid "Navigation" +msgstr "Nawigacja" + +#: sphinx/templates/layout.html:40 +msgid "Table Of Contents" +msgstr "Spis treÅ›ci" + +#: sphinx/templates/layout.html:46 +msgid "Previous topic" +msgstr "Poprzedni temat" + +#: sphinx/templates/layout.html:47 +msgid "previous chapter" +msgstr "poprzedni rozdziaÅ‚" + +#: sphinx/templates/layout.html:50 +msgid "Next topic" +msgstr "NastÄ™pny temat" + +#: sphinx/templates/layout.html:51 +msgid "next chapter" +msgstr "nastÄ™pny rozdziaÅ‚" + +#: sphinx/templates/layout.html:55 +msgid "This Page" +msgstr "Ta strona" + +#: sphinx/templates/layout.html:59 +msgid "Suggest Change" +msgstr "Zasugeruj zmianÄ™" + +#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62 +msgid "Show Source" +msgstr "Pokaż źródÅ‚o" + +#: sphinx/templates/layout.html:71 +msgid "Quick search" +msgstr "Szybkie wyszukiwanie" + +#: sphinx/templates/layout.html:71 +msgid "Keyword search" +msgstr "Szukanie wg sÅ‚owa kluczowego" + +#: sphinx/templates/layout.html:73 +msgid "Go" +msgstr "Szukaj" + +#: sphinx/templates/layout.html:78 +msgid "Enter a module, class or function name." +msgstr "Wprowadź nazwÄ™ moduÅ‚u, klasy lub funkcji." + +#: sphinx/templates/layout.html:119 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "Szukaj poÅ›ród %(docstitle)s" + +#: sphinx/templates/layout.html:128 +msgid "About these documents" +msgstr "O tych dokumentach" + +#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2 +#: sphinx/templates/search.html:5 +msgid "Search" +msgstr "Szukaj" + +#: sphinx/templates/layout.html:133 +msgid "Copyright" +msgstr "Copyright" + +#: sphinx/templates/layout.html:178 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:180 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:183 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "Ostatnia modyfikacja %(last_updated)s." + +#: sphinx/templates/layout.html:186 +#, python-format +msgid "" +"Created using Sphinx " +"%(sphinx_version)s." +msgstr "" +"Utworzone przy pomocy Sphinx'a " +"%(sphinx_version)s." + +#: sphinx/templates/modindex.html:15 +msgid "Most popular modules:" +msgstr "Najbardziej popularne moduÅ‚y:" + +#: sphinx/templates/modindex.html:24 +msgid "Show modules only available on these platforms" +msgstr "Pokaż moduÅ‚y dostÄ™pne tylko na tych platformach" + +#: sphinx/templates/modindex.html:56 +msgid "Deprecated" +msgstr "Niezalecane" + +#: sphinx/templates/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "Przeszukaj %(docstitle)s" + +#: sphinx/templates/page.html:8 +msgid "" +"Note: You requested an out-of-date URL from this server." +" We've tried to redirect you to the new location of this page, but it may" +" not be the right one." +msgstr "" +"Uwaga: Zażądano przedawnionego URL'a z tego serwera. " +"NastÄ…piÅ‚a próba przekierowania do nowej lokalizacji, ale może ona być " +"niewÅ‚aÅ›ciwa." + +#: sphinx/templates/search.html:7 +#, fuzzy +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" +"StÄ…d możesz przeszukać dokumentacjÄ™. Wprowadź szukane\n" +" sÅ‚owa w poniższym okienku i kliknij \"Szukaj\". Zwróć uwagÄ™, że\n" +" funkcja szukajÄ…ca bÄ™dzie automatycznie szukaÅ‚a wszystkich słów. " +"Strony nie zawierajÄ…ce wszystkich słów nie znajdÄ… siÄ™ na wynikowej " +"liÅ›cie." + +#: sphinx/templates/search.html:14 +msgid "search" +msgstr "Szukaj" + +#: sphinx/templates/search.html:20 +msgid "Your search did not match any results." +msgstr "Nie znaleziono żadnych pasujÄ…cych stron." + +#: sphinx/templates/changes/frameset.html:5 +#: sphinx/templates/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "Zmiany w wesji %(version)s — %(docstitle)s" + +#: sphinx/templates/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "%(filename)s — %(docstitle)s" + +#: sphinx/templates/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "Automatycznie wygenerowana lista zmian w wersji %(version)s" + +#: sphinx/templates/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "Zmiany w bibliotekach" + +#: sphinx/templates/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "Zmiany w C API" + +#: sphinx/templates/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "Inne zmiany" + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1 @@ +Documentation.addTranslations({"locale": "pt_BR", "plural_expr": "(n > 1)", "messages": {"module, in ": "m\u00f3dulo, em ", "Preparing search...": "Preparando pesquisa...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Sua pesquisa n\u00e3o encontrou nenhum documento. Por favor assegure-se de que todas as palavras foram digitadas corretamente e de que voc\u00ea tenha selecionado o m\u00ednimo de categorias.", "Search finished, found %s page(s) matching the search query.": "Pesquisa finalizada, foram encontrada(s) %s p\u00e1gina(s) que conferem com o crit\u00e9rio de pesquisa.", ", in ": ", em ", "Permalink to this headline": "Link permanente para este t\u00edtulo", "Searching": "Pesquisando", "Permalink to this definition": "Link permanente para esta defini\u00e7\u00e3o", "Hide Search Matches": "Esconder Resultados da Pesquisa", "Search Results": "Resultados da Pesquisa"}}); \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,606 @@ +# Portuguese (Brazil) translations for Sphinx. +# Copyright (C) 2008 ORGANIZATION +# This file is distributed under the same license as the Sphinx project. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 0.5\n" +"Report-Msgid-Bugs-To: roger.demetrescu@gmail.com\n" +"POT-Creation-Date: 2008-11-09 19:46+0100\n" +"PO-Revision-Date: 2008-11-27 18:40+0100\n" +"Last-Translator: Roger Demetrescu \n" +"Language-Team: pt_BR \n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: sphinx/builder.py:408 +#, python-format +msgid "%b %d, %Y" +msgstr "%d/%m/%Y" + +#: sphinx/builder.py:427 sphinx/templates/defindex.html:21 +msgid "General Index" +msgstr "Ãndice Geral" + +#: sphinx/builder.py:427 +msgid "index" +msgstr "índice" + +#: sphinx/builder.py:429 sphinx/htmlhelp.py:156 +#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2 +#: sphinx/templates/modindex.html:13 +msgid "Global Module Index" +msgstr "Ãndice Global de Módulos" + +#: sphinx/builder.py:429 +msgid "modules" +msgstr "módulos" + +#: sphinx/builder.py:466 +msgid "next" +msgstr "próximo" + +#: sphinx/builder.py:473 +msgid "previous" +msgstr "anterior" + +#: sphinx/builder.py:1054 +msgid " (in " +msgstr " (em " + +#: sphinx/builder.py:1129 +msgid "Builtins" +msgstr "Internos" + +#: sphinx/builder.py:1131 +msgid "Module level" +msgstr "Módulo" + +#: sphinx/environment.py:102 sphinx/latexwriter.py:169 +#, python-format +msgid "%B %d, %Y" +msgstr "%d/%m/%Y" + +#: sphinx/environment.py:291 sphinx/latexwriter.py:175 +#: sphinx/templates/genindex-single.html:2 +#: sphinx/templates/genindex-split.html:2 +#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2 +#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48 +#: sphinx/templates/layout.html:130 +msgid "Index" +msgstr "Ãndice" + +#: sphinx/environment.py:292 sphinx/latexwriter.py:174 +msgid "Module Index" +msgstr "Ãndice do Módulo" + +#: sphinx/environment.py:293 sphinx/templates/defindex.html:16 +msgid "Search Page" +msgstr "Página de Pesquisa" + +#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145 +msgid "Permalink to this definition" +msgstr "Link permanente para esta definição" + +#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139 +msgid "Permalink to this headline" +msgstr "Link permanente para este título" + +#: sphinx/latexwriter.py:172 +msgid "Release" +msgstr "Versão" + +#: sphinx/roles.py:53 sphinx/directives/desc.py:537 +#, python-format +msgid "environment variable; %s" +msgstr "váriavel de ambiente; %s" + +#: sphinx/roles.py:60 +#, python-format +msgid "Python Enhancement Proposals!PEP %s" +msgstr "Python Enhancement Proposals!PEP %s" + +#: sphinx/textwriter.py:166 +#, python-format +msgid "Platform: %s" +msgstr "Plataforma: %s" + +#: sphinx/textwriter.py:422 +msgid "[image]" +msgstr "[imagem]" + +#: sphinx/directives/desc.py:25 +#, python-format +msgid "%s() (built-in function)" +msgstr "%s() (função interna)" + +#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42 +#: sphinx/directives/desc.py:54 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (no módulo %s)" + +#: sphinx/directives/desc.py:29 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s (variável interna)" + +#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66 +#, python-format +msgid "%s (in module %s)" +msgstr "%s (no módulo %s)" + +#: sphinx/directives/desc.py:33 +#, python-format +msgid "%s (built-in class)" +msgstr "%s (classe interna)" + +#: sphinx/directives/desc.py:34 +#, python-format +msgid "%s (class in %s)" +msgstr "%s (classe em %s)" + +#: sphinx/directives/desc.py:46 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (método %s.%s)" + +#: sphinx/directives/desc.py:48 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (método %s)" + +#: sphinx/directives/desc.py:58 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (método estático %s.%s)" + +#: sphinx/directives/desc.py:60 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (método estático %s)" + +#: sphinx/directives/desc.py:70 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (atributo %s.%s)" + +#: sphinx/directives/desc.py:72 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s (atributo %s)" + +#: sphinx/directives/desc.py:74 +#, python-format +msgid "%s (C function)" +msgstr "%s (função C)" + +#: sphinx/directives/desc.py:76 +#, python-format +msgid "%s (C member)" +msgstr "%s (membro C)" + +#: sphinx/directives/desc.py:78 +#, python-format +msgid "%s (C macro)" +msgstr "%s (macro C)" + +#: sphinx/directives/desc.py:80 +#, python-format +msgid "%s (C type)" +msgstr "%s (tipo C)" + +#: sphinx/directives/desc.py:82 +#, python-format +msgid "%s (C variable)" +msgstr "%s (variável C)" + +#: sphinx/directives/desc.py:100 +msgid "Raises" +msgstr "Levanta" + +#: sphinx/directives/desc.py:104 +msgid "Variable" +msgstr "Variável" + +#: sphinx/directives/desc.py:107 +msgid "Returns" +msgstr "Retorna" + +#: sphinx/directives/desc.py:116 +msgid "Return type" +msgstr "Tipo de retorno" + +#: sphinx/directives/desc.py:143 +msgid "Parameters" +msgstr "Parâmetros" + +#: sphinx/directives/desc.py:423 +#, python-format +msgid "%scommand line option; %s" +msgstr "%sopção de linha de comando; %s" + +#: sphinx/directives/other.py:101 +msgid "Platforms: " +msgstr "Plataformas: " + +#: sphinx/directives/other.py:106 +#, python-format +msgid "%s (module)" +msgstr "%s (módulo)" + +#: sphinx/directives/other.py:146 +msgid "Section author: " +msgstr "Autor da seção: " + +#: sphinx/directives/other.py:148 +msgid "Module author: " +msgstr "Autor do módulo: " + +#: sphinx/directives/other.py:150 +msgid "Author: " +msgstr "Autor: " + +#: sphinx/directives/other.py:246 +msgid "See also" +msgstr "Veja também" + +#: sphinx/ext/todo.py:31 +msgid "Todo" +msgstr "Por fazer" + +#: sphinx/ext/todo.py:75 +#, python-format +msgid "(The original entry is located in %s, line %d and can be found " +msgstr "(A entrada original está localizada em %s, linha %d e pode ser encontrada " + +#: sphinx/ext/todo.py:81 +msgid "here" +msgstr "aqui" + +#: sphinx/locale/__init__.py:15 +msgid "Attention" +msgstr "Atenção" + +#: sphinx/locale/__init__.py:16 +msgid "Caution" +msgstr "Cuidado" + +#: sphinx/locale/__init__.py:17 +msgid "Danger" +msgstr "Perigo" + +#: sphinx/locale/__init__.py:18 +msgid "Error" +msgstr "Erro" + +#: sphinx/locale/__init__.py:19 +msgid "Hint" +msgstr "Dica" + +#: sphinx/locale/__init__.py:20 +msgid "Important" +msgstr "Importante" + +#: sphinx/locale/__init__.py:21 +msgid "Note" +msgstr "Nota" + +#: sphinx/locale/__init__.py:22 +msgid "See Also" +msgstr "Veja Também" + +#: sphinx/locale/__init__.py:23 +msgid "Tip" +msgstr "Dica" + +#: sphinx/locale/__init__.py:24 +msgid "Warning" +msgstr "Aviso" + +#: sphinx/locale/__init__.py:28 +#, python-format +msgid "New in version %s" +msgstr "Novo na versão %s" + +#: sphinx/locale/__init__.py:29 +#, python-format +msgid "Changed in version %s" +msgstr "Alterado na versão %s" + +#: sphinx/locale/__init__.py:30 +#, python-format +msgid "Deprecated since version %s" +msgstr "Obsoleto desde a versão %s" + +#: sphinx/locale/__init__.py:34 +msgid "module" +msgstr "módulo" + +#: sphinx/locale/__init__.py:35 +msgid "keyword" +msgstr "palavra-chave" + +#: sphinx/locale/__init__.py:36 +msgid "operator" +msgstr "operador" + +#: sphinx/locale/__init__.py:37 +msgid "object" +msgstr "objeto" + +#: sphinx/locale/__init__.py:38 +msgid "exception" +msgstr "exceção" + +#: sphinx/locale/__init__.py:39 +msgid "statement" +msgstr "comando" + +#: sphinx/locale/__init__.py:40 +msgid "built-in function" +msgstr "função interna" + +#: sphinx/static/doctools.js:174 +msgid "Hide Search Matches" +msgstr "Esconder Resultados da Pesquisa" + +#: sphinx/static/searchtools.js:274 +msgid "Searching" +msgstr "Pesquisando" + +#: sphinx/static/searchtools.js:279 +msgid "Preparing search..." +msgstr "Preparando pesquisa..." + +#: sphinx/static/searchtools.js:338 +msgid "module, in " +msgstr "módulo, em " + +#: sphinx/static/searchtools.js:347 +msgid ", in " +msgstr ", em " + +#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18 +msgid "Search Results" +msgstr "Resultados da Pesquisa" + +#: sphinx/static/searchtools.js:449 +msgid "" +"Your search did not match any documents. Please make sure that all words " +"are spelled correctly and that you've selected enough categories." +msgstr "" +"Sua pesquisa não encontrou nenhum documento. Por favor assegure-se de que" +" todas as palavras foram digitadas corretamente e de que você tenha " +"selecionado o mínimo de categorias." + +#: sphinx/static/searchtools.js:451 +#, python-format +msgid "Search finished, found %s page(s) matching the search query." +msgstr "" +"Pesquisa finalizada, foram encontrada(s) %s página(s) que conferem com o " +"critério de pesquisa." + +#: sphinx/templates/defindex.html:2 +msgid "Overview" +msgstr "Visão geral" + +#: sphinx/templates/defindex.html:11 +msgid "Indices and tables:" +msgstr "Ãndices e tabelas:" + +#: sphinx/templates/defindex.html:14 +msgid "Complete Table of Contents" +msgstr "Tabela de Conteúdo Completa" + +#: sphinx/templates/defindex.html:15 +msgid "lists all sections and subsections" +msgstr "Lista todas seções e subseções" + +#: sphinx/templates/defindex.html:17 +msgid "search this documentation" +msgstr "Pesquisar esta documentação" + +#: sphinx/templates/defindex.html:20 +msgid "quick access to all modules" +msgstr "acesso rápido para todos os módulos" + +#: sphinx/templates/defindex.html:22 +msgid "all functions, classes, terms" +msgstr "todas funções, classes, termos" + +#: sphinx/templates/genindex-single.html:5 +#, python-format +msgid "Index – %(key)s" +msgstr "Ãndice – %(key)s" + +#: sphinx/templates/genindex-single.html:44 +#: sphinx/templates/genindex-split.html:14 +#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54 +msgid "Full index on one page" +msgstr "Ãndice completo em uma página" + +#: sphinx/templates/genindex-split.html:7 +msgid "Index pages by letter" +msgstr "Paginas de índice por letra" + +#: sphinx/templates/genindex-split.html:15 +msgid "can be huge" +msgstr "pode ser enorme" + +#: sphinx/templates/layout.html:9 +msgid "Navigation" +msgstr "Navegação" + +#: sphinx/templates/layout.html:40 +msgid "Table Of Contents" +msgstr "Tabela de Conteúdo" + +#: sphinx/templates/layout.html:46 +msgid "Previous topic" +msgstr "Tópico anterior" + +#: sphinx/templates/layout.html:47 +msgid "previous chapter" +msgstr "capítulo anterior" + +#: sphinx/templates/layout.html:50 +msgid "Next topic" +msgstr "Próximo tópico" + +#: sphinx/templates/layout.html:51 +msgid "next chapter" +msgstr "próximo capítulo" + +#: sphinx/templates/layout.html:55 +msgid "This Page" +msgstr "Esta Página" + +#: sphinx/templates/layout.html:59 +msgid "Suggest Change" +msgstr "Sugerir Alteração" + +#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62 +msgid "Show Source" +msgstr "Exibir Fonte" + +#: sphinx/templates/layout.html:71 +msgid "Quick search" +msgstr "Pesquisa rápida" + +#: sphinx/templates/layout.html:71 +msgid "Keyword search" +msgstr "Pesquisa de palavras-chave" + +#: sphinx/templates/layout.html:73 +msgid "Go" +msgstr "Ir" + +#: sphinx/templates/layout.html:78 +msgid "Enter a module, class or function name." +msgstr "Informe o nome de um módulo, classe ou função." + +#: sphinx/templates/layout.html:119 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "Pesquisar dentro de %(docstitle)s" + +#: sphinx/templates/layout.html:128 +msgid "About these documents" +msgstr "Sobre estes documentos" + +#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2 +#: sphinx/templates/search.html:5 +msgid "Search" +msgstr "Pesquisar" + +#: sphinx/templates/layout.html:133 +msgid "Copyright" +msgstr "Copyright" + +#: sphinx/templates/layout.html:178 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:180 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Copyright %(copyright)s." + +#: sphinx/templates/layout.html:183 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "Última atualização em %(last_updated)s." + +#: sphinx/templates/layout.html:186 +#, python-format +msgid "" +"Created using Sphinx " +"%(sphinx_version)s." +msgstr "" +"Criado com Sphinx " +"%(sphinx_version)s." + +#: sphinx/templates/modindex.html:15 +msgid "Most popular modules:" +msgstr "Módulos mais populares:" + +#: sphinx/templates/modindex.html:24 +msgid "Show modules only available on these platforms" +msgstr "Exibir somente módulos disponíveis nestas plataformas" + +#: sphinx/templates/modindex.html:56 +msgid "Deprecated" +msgstr "Obsoleto" + +#: sphinx/templates/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "Pesquisar em %(docstitle)s" + +#: sphinx/templates/page.html:8 +msgid "" +"Note: You requested an out-of-date URL from this server." +" We've tried to redirect you to the new location of this page, but it may" +" not be the right one." +msgstr "" +"Nota: Você requisitou uma URL desatualizada deste " +"servidor. Tentamos redirecioná-lo para um novo endereço desta página, " +"porém é possível que o mesmo não seja o correto." + +#: sphinx/templates/search.html:7 +#, fuzzy +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" +"A partir daqui você pode pesquisar estes documentos. Preencha suas \n" +" palavras de pesquisa na caixa abaixo e clique em \"pesquisar\". " +"Observe que a função de pesquisa\n" +" irá pesquisar automaticamente por todas as palavras.\n" +" Páginas contendo menos palavras não irão aparecer na lista de " +"resultado." + +#: sphinx/templates/search.html:14 +msgid "search" +msgstr "pesquisar" + +#: sphinx/templates/search.html:20 +msgid "Your search did not match any results." +msgstr "Sua pesquisa não encontrou nenhum resultado." + +#: sphinx/templates/changes/frameset.html:5 +#: sphinx/templates/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "Alterações na Versão%(version)s — %(docstitle)s" + +#: sphinx/templates/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "%(filename)s — %(docstitle)s" + +#: sphinx/templates/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "Lista de alterações na versão %(version)s gerada automaticamente" + +#: sphinx/templates/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "Alterações na biblioteca" + +#: sphinx/templates/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "Alterações na API C" + +#: sphinx/templates/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "Outras alterações" + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1 @@ +Documentation.addTranslations({"locale": "sl", "plural_expr": "0", "messages": {"module, in ": "modul, v ", "Preparing search...": "Pripravljam iskanje...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Za va\u0161e iskanje ni rezultatov. Prosimo preglejte ali so vse besede pravilno \u010drkovane in ali ste izbrali dovolj kategorij.", "Search finished, found %s page(s) matching the search query.": "Iskanje kon\u010dano, najdeno %s strani, ki ustrezajo iskalnemu nizu.", ", in ": ", v ", "Permalink to this headline": "Povezava na naslov", "Searching": "I\u0161\u010dem", "Permalink to this definition": "Povezava na to definicijo", "Hide Search Matches": "Skrij Resultate Iskanja", "Search Results": "Rezultati Iskanja"}}); \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.mo Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.mo has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sl/LC_MESSAGES/sphinx.po Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,597 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2008-09-11 23:58+0200\n" +"PO-Revision-Date: 2008-11-27 18:40+0100\n" +"Last-Translator: Rok Garbas \n" +"Language-Team: Rok Garbas \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: sphinx/builder.py:408 +#, python-format +msgid "%b %d, %Y" +msgstr "%d %b, %Y" + +#: sphinx/builder.py:427 sphinx/templates/defindex.html:21 +msgid "General Index" +msgstr "SploÅ¡ni abecedni seznam" + +#: sphinx/builder.py:427 +msgid "index" +msgstr "abecedni seznam" + +#: sphinx/builder.py:429 sphinx/htmlhelp.py:156 +#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2 +#: sphinx/templates/modindex.html:13 +msgid "Global Module Index" +msgstr "SploÅ¡en Seznam Modulov" + +#: sphinx/builder.py:429 +msgid "modules" +msgstr "Moduli" + +#: sphinx/builder.py:466 +msgid "next" +msgstr "naprej" + +#: sphinx/builder.py:473 +msgid "previous" +msgstr "nazaj" + +#: sphinx/builder.py:1054 +msgid " (in " +msgstr "(v " + +#: sphinx/builder.py:1129 +msgid "Builtins" +msgstr "Vgrajeni deli" + +#: sphinx/builder.py:1131 +msgid "Module level" +msgstr "Nivo modula" + +#: sphinx/environment.py:102 sphinx/latexwriter.py:169 +#, python-format +msgid "%B %d, %Y" +msgstr "%d %B, %Y" + +#: sphinx/environment.py:291 sphinx/latexwriter.py:175 +#: sphinx/templates/genindex-single.html:2 +#: sphinx/templates/genindex-split.html:2 +#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2 +#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48 +#: sphinx/templates/layout.html:130 +msgid "Index" +msgstr "Abecedni seznam" + +#: sphinx/environment.py:292 sphinx/latexwriter.py:174 +msgid "Module Index" +msgstr "Seznam modulov" + +#: sphinx/environment.py:293 sphinx/templates/defindex.html:16 +msgid "Search Page" +msgstr "Iskalna stran" + +#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145 +msgid "Permalink to this definition" +msgstr "Povezava na to definicijo" + +#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139 +msgid "Permalink to this headline" +msgstr "Povezava na naslov" + +#: sphinx/latexwriter.py:172 +msgid "Release" +msgstr "Izdaja" + +#: sphinx/roles.py:53 sphinx/directives/desc.py:537 +#, python-format +msgid "environment variable; %s" +msgstr "globalna spremenljivka; %s" + +#: sphinx/roles.py:60 +#, python-format +msgid "Python Enhancement Proposals!PEP %s" +msgstr "Python Enhancement Proposals!PEP %s" + +#: sphinx/textwriter.py:166 +#, python-format +msgid "Platform: %s" +msgstr "Platforma: %s" + +#: sphinx/textwriter.py:422 +msgid "[image]" +msgstr "[slika]" + +#: sphinx/directives/desc.py:25 +#, python-format +msgid "%s() (built-in function)" +msgstr "%s() (vgrajene funkcije)" + +#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42 +#: sphinx/directives/desc.py:54 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (v modulu %s)" + +#: sphinx/directives/desc.py:29 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s (vgrajene spremenljivke)" + +#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66 +#, python-format +msgid "%s (in module %s)" +msgstr "%s (v modulu %s)" + +#: sphinx/directives/desc.py:33 +#, python-format +msgid "%s (built-in class)" +msgstr "%s (vgrajen razred)" + +#: sphinx/directives/desc.py:34 +#, python-format +msgid "%s (class in %s)" +msgstr "%s (razred v %s)" + +#: sphinx/directives/desc.py:46 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (%s.%s metoda)" + +#: sphinx/directives/desc.py:48 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (%s metoda)" + +#: sphinx/directives/desc.py:58 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (%s.%s statiÄna metoda)" + +#: sphinx/directives/desc.py:60 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (%s statiÄna metoda)" + +#: sphinx/directives/desc.py:70 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (%s.%s atribut)" + +#: sphinx/directives/desc.py:72 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s (%s atribut)" + +#: sphinx/directives/desc.py:74 +#, python-format +msgid "%s (C function)" +msgstr "%s (C funkcija)" + +#: sphinx/directives/desc.py:76 +#, python-format +msgid "%s (C member)" +msgstr "%s (C Älan)" + +#: sphinx/directives/desc.py:78 +#, python-format +msgid "%s (C macro)" +msgstr "%s (C makro)" + +#: sphinx/directives/desc.py:80 +#, python-format +msgid "%s (C type)" +msgstr "%s (C tip)" + +#: sphinx/directives/desc.py:82 +#, python-format +msgid "%s (C variable)" +msgstr "%s (C spremenljivka)" + +#: sphinx/directives/desc.py:100 +msgid "Raises" +msgstr "Javi" + +#: sphinx/directives/desc.py:104 +msgid "Variable" +msgstr "Spremenljivka" + +#: sphinx/directives/desc.py:107 +msgid "Returns" +msgstr "Vrne" + +#: sphinx/directives/desc.py:116 +msgid "Return type" +msgstr "Vrne tip" + +#: sphinx/directives/desc.py:143 +msgid "Parameters" +msgstr "Parametri" + +#: sphinx/directives/desc.py:423 +#, python-format +msgid "%scommand line option; %s" +msgstr "%sopcija komandne linije; %s" + +#: sphinx/directives/other.py:101 +msgid "Platforms: " +msgstr "Platforma:" + +#: sphinx/directives/other.py:106 +#, python-format +msgid "%s (module)" +msgstr "%s (modul)" + +#: sphinx/directives/other.py:146 +msgid "Section author: " +msgstr "Avtor sekcije:" + +#: sphinx/directives/other.py:148 +msgid "Module author: " +msgstr "Avtor modula:" + +#: sphinx/directives/other.py:150 +msgid "Author: " +msgstr "Avtor:" + +#: sphinx/directives/other.py:246 +msgid "See also" +msgstr "Poglej tudi" + +#: sphinx/ext/todo.py:31 +msgid "Todo" +msgstr "Naredi" + +#: sphinx/ext/todo.py:75 +#, python-format +msgid "(The original entry is located in %s, line %d and can be found " +msgstr "(Originalen vnos se nahajana v %s, vrstica %d in jo je moÄ poiskati " + +#: sphinx/ext/todo.py:81 +msgid "here" +msgstr "tukaj" + +#: sphinx/locale/__init__.py:15 +msgid "Attention" +msgstr "Pozor" + +#: sphinx/locale/__init__.py:16 +msgid "Caution" +msgstr "Previdno" + +#: sphinx/locale/__init__.py:17 +msgid "Danger" +msgstr "Navarno" + +#: sphinx/locale/__init__.py:18 +msgid "Error" +msgstr "Napaka" + +#: sphinx/locale/__init__.py:19 +msgid "Hint" +msgstr "Nasvet" + +#: sphinx/locale/__init__.py:20 +msgid "Important" +msgstr "Pomembno" + +#: sphinx/locale/__init__.py:21 +msgid "Note" +msgstr "Opomba" + +#: sphinx/locale/__init__.py:22 +msgid "See Also" +msgstr "Poglej Tudi" + +#: sphinx/locale/__init__.py:23 +msgid "Tip" +msgstr "Nasvet" + +#: sphinx/locale/__init__.py:24 +msgid "Warning" +msgstr "Opozorilo" + +#: sphinx/locale/__init__.py:28 +#, python-format +msgid "New in version %s" +msgstr "Novo v verziji %s" + +#: sphinx/locale/__init__.py:29 +#, python-format +msgid "Changed in version %s" +msgstr "Spemenjeno v verziji %s" + +#: sphinx/locale/__init__.py:30 +#, python-format +msgid "Deprecated since version %s" +msgstr "Zastarelo od verzije %s" + +#: sphinx/locale/__init__.py:34 +msgid "module" +msgstr "modul" + +#: sphinx/locale/__init__.py:35 +msgid "keyword" +msgstr "klluÄna beseda" + +#: sphinx/locale/__init__.py:36 +msgid "operator" +msgstr "operator" + +#: sphinx/locale/__init__.py:37 +msgid "object" +msgstr "objekt" + +#: sphinx/locale/__init__.py:38 +msgid "exception" +msgstr "izjema" + +#: sphinx/locale/__init__.py:39 +msgid "statement" +msgstr "izjava" + +#: sphinx/locale/__init__.py:40 +msgid "built-in function" +msgstr "vgrajene funkcije" + +#: sphinx/static/doctools.js:174 +msgid "Hide Search Matches" +msgstr "Skrij Resultate Iskanja" + +#: sphinx/static/searchtools.js:274 +msgid "Searching" +msgstr "IÅ¡Äem" + +#: sphinx/static/searchtools.js:279 +msgid "Preparing search..." +msgstr "Pripravljam iskanje..." + +#: sphinx/static/searchtools.js:338 +msgid "module, in " +msgstr "modul, v " + +#: sphinx/static/searchtools.js:347 +msgid ", in " +msgstr ", v " + +#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18 +msgid "Search Results" +msgstr "Rezultati Iskanja" + +#: sphinx/static/searchtools.js:449 +msgid "" +"Your search did not match any documents. Please make sure that all words " +"are spelled correctly and that you've selected enough categories." +msgstr "" +"Za vaÅ¡e iskanje ni rezultatov. Prosimo preglejte ali so vse besede " +"pravilno Ärkovane in ali ste izbrali dovolj kategorij." + +#: sphinx/static/searchtools.js:451 +#, python-format +msgid "Search finished, found %s page(s) matching the search query." +msgstr "Iskanje konÄano, najdeno %s strani, ki ustrezajo iskalnemu nizu." + +#: sphinx/templates/defindex.html:2 +msgid "Overview" +msgstr "Pregled" + +#: sphinx/templates/defindex.html:11 +msgid "Indices and tables:" +msgstr "Kazalo in tabele:" + +#: sphinx/templates/defindex.html:14 +msgid "Complete Table of Contents" +msgstr "Popoln Seznam Vsebine" + +#: sphinx/templates/defindex.html:15 +msgid "lists all sections and subsections" +msgstr "prikazi vse sekcije in podsekcije" + +#: sphinx/templates/defindex.html:17 +msgid "search this documentation" +msgstr "isÄi po dokumentaciji" + +#: sphinx/templates/defindex.html:20 +msgid "quick access to all modules" +msgstr "hiter dostop do vseh modulov" + +#: sphinx/templates/defindex.html:22 +msgid "all functions, classes, terms" +msgstr "vse funkcije, rezredi, termini" + +#: sphinx/templates/genindex-single.html:5 +#, python-format +msgid "Index – %(key)s" +msgstr "Seznam – %(key)s" + +#: sphinx/templates/genindex-single.html:44 +#: sphinx/templates/genindex-split.html:14 +#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54 +msgid "Full index on one page" +msgstr "Poln indeks na eni strani" + +#: sphinx/templates/genindex-split.html:7 +msgid "Index pages by letter" +msgstr "Indeksiraj strani po Ärki" + +#: sphinx/templates/genindex-split.html:15 +msgid "can be huge" +msgstr "lahko je veliko" + +#: sphinx/templates/layout.html:9 +msgid "Navigation" +msgstr "Navigacija" + +#: sphinx/templates/layout.html:40 +msgid "Table Of Contents" +msgstr "Seznam Vsebine" + +#: sphinx/templates/layout.html:46 +msgid "Previous topic" +msgstr "PrejÅ¡nja tema" + +#: sphinx/templates/layout.html:47 +msgid "previous chapter" +msgstr "prejÅ¡nje poglavje" + +#: sphinx/templates/layout.html:50 +msgid "Next topic" +msgstr "Naslednja tema" + +#: sphinx/templates/layout.html:51 +msgid "next chapter" +msgstr "naslednje poglavje" + +#: sphinx/templates/layout.html:55 +msgid "This Page" +msgstr "Ta stran" + +#: sphinx/templates/layout.html:59 +msgid "Suggest Change" +msgstr "Predlagaj spremembo" + +#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62 +msgid "Show Source" +msgstr "Prikaži izvorno kodo" + +#: sphinx/templates/layout.html:71 +msgid "Quick search" +msgstr "Hitro iskanje" + +#: sphinx/templates/layout.html:71 +msgid "Keyword search" +msgstr "Iskanje po kljuÄniih besedah" + +#: sphinx/templates/layout.html:73 +msgid "Go" +msgstr "Potrdi" + +#: sphinx/templates/layout.html:78 +msgid "Enter a module, class or function name." +msgstr "Vnesi ime mudla, razreda ali funkcije." + +#: sphinx/templates/layout.html:119 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "IÅ¡Äi med %(docstitle)s" + +#: sphinx/templates/layout.html:128 +msgid "About these documents" +msgstr "O teh dokumentih" + +#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2 +#: sphinx/templates/search.html:5 +msgid "Search" +msgstr "IÅ¡Äi" + +#: sphinx/templates/layout.html:133 +msgid "Copyright" +msgstr "Vse pravice pridržane" + +#: sphinx/templates/layout.html:178 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Vse pravice pridržane %(copyright)s." + +#: sphinx/templates/layout.html:180 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "© Vse pravice pridržane %(copyright)s." + +#: sphinx/templates/layout.html:183 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "ZadnjiÄ posodobljeno na %(last_updated)s." + +#: sphinx/templates/layout.html:186 +#, python-format +msgid "" +"Created using Sphinx " +"%(sphinx_version)s." +msgstr "" +"Narejeno s Sphinx " +"%(sphinx_version)s." + +#: sphinx/templates/modindex.html:15 +msgid "Most popular modules:" +msgstr "Najbolj popularni moduli:" + +#: sphinx/templates/modindex.html:24 +msgid "Show modules only available on these platforms" +msgstr "Prikaži module na razpolago na platformah" + +#: sphinx/templates/modindex.html:56 +msgid "Deprecated" +msgstr "Zastarelo" + +#: sphinx/templates/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "IÅ¡Äi %(docstitle)s" + +#: sphinx/templates/page.html:8 +msgid "" +"Note: You requested an out-of-date URL from this server." +" We've tried to redirect you to the new location of this page, but it may" +" not be the right one." +msgstr "" +"Opomba: VaÅ¡ zahtevek za URL s tega streznika je " +"zastaral. PoskuÅ¡ali smo vas preusmeriti na novo lokacijo, vendar utegne " +"biti napaÄna." + +#: sphinx/templates/search.html:7 +#, fuzzy +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" +"O tukaj lahko isÄete dokumente. Vnesite iskalni\n" +" niz v polje spodaj in pritisnite \"iÅ¡Äi\". Sproženo iskanje\n" +" bo iskalo po vseh besedah v iskalnem nizu. Strani, ki ne\n" +" vsebujejo vseh besed ne bodo prikazane na seznamu rezultatov." + +#: sphinx/templates/search.html:14 +msgid "search" +msgstr "iÅ¡Äi" + +#: sphinx/templates/search.html:20 +msgid "Your search did not match any results." +msgstr "VaÅ¡e iskanje ni imelo nobenega zadetka." + +#: sphinx/templates/changes/frameset.html:5 +#: sphinx/templates/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "Spremembe v Verziji %(version)s — %(docstitle)s" + +#: sphinx/templates/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "%(filename)s — %(docstitle)s" + +#: sphinx/templates/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "Avtomatsko generiran seznam sprememb v verziji %(version)s" + +#: sphinx/templates/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "Spremembe knjižnice" + +#: sphinx/templates/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "C API spremembe" + +#: sphinx/templates/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "Ostale spremembe" + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sphinx.pot --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/sphinx.pot Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,589 @@ +# Translations template for Sphinx. +# Copyright (C) 2008 ORGANIZATION +# This file is distributed under the same license as the Sphinx project. +# FIRST AUTHOR , 2008. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 0.5\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2008-11-27 18:39+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: sphinx/builder.py:408 +#, python-format +msgid "%b %d, %Y" +msgstr "" + +#: sphinx/builder.py:427 sphinx/templates/defindex.html:21 +msgid "General Index" +msgstr "" + +#: sphinx/builder.py:427 +msgid "index" +msgstr "" + +#: sphinx/builder.py:429 sphinx/htmlhelp.py:156 +#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2 +#: sphinx/templates/modindex.html:13 +msgid "Global Module Index" +msgstr "" + +#: sphinx/builder.py:429 +msgid "modules" +msgstr "" + +#: sphinx/builder.py:466 +msgid "next" +msgstr "" + +#: sphinx/builder.py:473 +msgid "previous" +msgstr "" + +#: sphinx/builder.py:1054 +msgid " (in " +msgstr "" + +#: sphinx/builder.py:1129 +msgid "Builtins" +msgstr "" + +#: sphinx/builder.py:1131 +msgid "Module level" +msgstr "" + +#: sphinx/environment.py:102 sphinx/latexwriter.py:169 +#, python-format +msgid "%B %d, %Y" +msgstr "" + +#: sphinx/environment.py:291 sphinx/latexwriter.py:175 +#: sphinx/templates/genindex-single.html:2 +#: sphinx/templates/genindex-split.html:2 +#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2 +#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48 +#: sphinx/templates/layout.html:130 +msgid "Index" +msgstr "" + +#: sphinx/environment.py:292 sphinx/latexwriter.py:174 +msgid "Module Index" +msgstr "" + +#: sphinx/environment.py:293 sphinx/templates/defindex.html:16 +msgid "Search Page" +msgstr "" + +#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145 +msgid "Permalink to this definition" +msgstr "" + +#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139 +msgid "Permalink to this headline" +msgstr "" + +#: sphinx/latexwriter.py:172 +msgid "Release" +msgstr "" + +#: sphinx/roles.py:53 sphinx/directives/desc.py:537 +#, python-format +msgid "environment variable; %s" +msgstr "" + +#: sphinx/roles.py:60 +#, python-format +msgid "Python Enhancement Proposals!PEP %s" +msgstr "" + +#: sphinx/textwriter.py:166 +#, python-format +msgid "Platform: %s" +msgstr "" + +#: sphinx/textwriter.py:422 +msgid "[image]" +msgstr "" + +#: sphinx/directives/desc.py:25 +#, python-format +msgid "%s() (built-in function)" +msgstr "" + +#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42 +#: sphinx/directives/desc.py:54 +#, python-format +msgid "%s() (in module %s)" +msgstr "" + +#: sphinx/directives/desc.py:29 +#, python-format +msgid "%s (built-in variable)" +msgstr "" + +#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66 +#, python-format +msgid "%s (in module %s)" +msgstr "" + +#: sphinx/directives/desc.py:33 +#, python-format +msgid "%s (built-in class)" +msgstr "" + +#: sphinx/directives/desc.py:34 +#, python-format +msgid "%s (class in %s)" +msgstr "" + +#: sphinx/directives/desc.py:46 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "" + +#: sphinx/directives/desc.py:48 +#, python-format +msgid "%s() (%s method)" +msgstr "" + +#: sphinx/directives/desc.py:58 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "" + +#: sphinx/directives/desc.py:60 +#, python-format +msgid "%s() (%s static method)" +msgstr "" + +#: sphinx/directives/desc.py:70 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "" + +#: sphinx/directives/desc.py:72 +#, python-format +msgid "%s (%s attribute)" +msgstr "" + +#: sphinx/directives/desc.py:74 +#, python-format +msgid "%s (C function)" +msgstr "" + +#: sphinx/directives/desc.py:76 +#, python-format +msgid "%s (C member)" +msgstr "" + +#: sphinx/directives/desc.py:78 +#, python-format +msgid "%s (C macro)" +msgstr "" + +#: sphinx/directives/desc.py:80 +#, python-format +msgid "%s (C type)" +msgstr "" + +#: sphinx/directives/desc.py:82 +#, python-format +msgid "%s (C variable)" +msgstr "" + +#: sphinx/directives/desc.py:100 +msgid "Raises" +msgstr "" + +#: sphinx/directives/desc.py:104 +msgid "Variable" +msgstr "" + +#: sphinx/directives/desc.py:107 +msgid "Returns" +msgstr "" + +#: sphinx/directives/desc.py:116 +msgid "Return type" +msgstr "" + +#: sphinx/directives/desc.py:143 +msgid "Parameters" +msgstr "" + +#: sphinx/directives/desc.py:423 +#, python-format +msgid "%scommand line option; %s" +msgstr "" + +#: sphinx/directives/other.py:101 +msgid "Platforms: " +msgstr "" + +#: sphinx/directives/other.py:106 +#, python-format +msgid "%s (module)" +msgstr "" + +#: sphinx/directives/other.py:146 +msgid "Section author: " +msgstr "" + +#: sphinx/directives/other.py:148 +msgid "Module author: " +msgstr "" + +#: sphinx/directives/other.py:150 +msgid "Author: " +msgstr "" + +#: sphinx/directives/other.py:246 +msgid "See also" +msgstr "" + +#: sphinx/ext/todo.py:31 +msgid "Todo" +msgstr "" + +#: sphinx/ext/todo.py:75 +#, python-format +msgid "(The original entry is located in %s, line %d and can be found " +msgstr "" + +#: sphinx/ext/todo.py:81 +msgid "here" +msgstr "" + +#: sphinx/locale/__init__.py:15 +msgid "Attention" +msgstr "" + +#: sphinx/locale/__init__.py:16 +msgid "Caution" +msgstr "" + +#: sphinx/locale/__init__.py:17 +msgid "Danger" +msgstr "" + +#: sphinx/locale/__init__.py:18 +msgid "Error" +msgstr "" + +#: sphinx/locale/__init__.py:19 +msgid "Hint" +msgstr "" + +#: sphinx/locale/__init__.py:20 +msgid "Important" +msgstr "" + +#: sphinx/locale/__init__.py:21 +msgid "Note" +msgstr "" + +#: sphinx/locale/__init__.py:22 +msgid "See Also" +msgstr "" + +#: sphinx/locale/__init__.py:23 +msgid "Tip" +msgstr "" + +#: sphinx/locale/__init__.py:24 +msgid "Warning" +msgstr "" + +#: sphinx/locale/__init__.py:28 +#, python-format +msgid "New in version %s" +msgstr "" + +#: sphinx/locale/__init__.py:29 +#, python-format +msgid "Changed in version %s" +msgstr "" + +#: sphinx/locale/__init__.py:30 +#, python-format +msgid "Deprecated since version %s" +msgstr "" + +#: sphinx/locale/__init__.py:34 +msgid "module" +msgstr "" + +#: sphinx/locale/__init__.py:35 +msgid "keyword" +msgstr "" + +#: sphinx/locale/__init__.py:36 +msgid "operator" +msgstr "" + +#: sphinx/locale/__init__.py:37 +msgid "object" +msgstr "" + +#: sphinx/locale/__init__.py:38 +msgid "exception" +msgstr "" + +#: sphinx/locale/__init__.py:39 +msgid "statement" +msgstr "" + +#: sphinx/locale/__init__.py:40 +msgid "built-in function" +msgstr "" + +#: sphinx/static/doctools.js:174 +msgid "Hide Search Matches" +msgstr "" + +#: sphinx/static/searchtools.js:274 +msgid "Searching" +msgstr "" + +#: sphinx/static/searchtools.js:279 +msgid "Preparing search..." +msgstr "" + +#: sphinx/static/searchtools.js:338 +msgid "module, in " +msgstr "" + +#: sphinx/static/searchtools.js:347 +msgid ", in " +msgstr "" + +#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18 +msgid "Search Results" +msgstr "" + +#: sphinx/static/searchtools.js:449 +msgid "" +"Your search did not match any documents. Please make sure that all words " +"are spelled correctly and that you've selected enough categories." +msgstr "" + +#: sphinx/static/searchtools.js:451 +#, python-format +msgid "Search finished, found %s page(s) matching the search query." +msgstr "" + +#: sphinx/templates/defindex.html:2 +msgid "Overview" +msgstr "" + +#: sphinx/templates/defindex.html:11 +msgid "Indices and tables:" +msgstr "" + +#: sphinx/templates/defindex.html:14 +msgid "Complete Table of Contents" +msgstr "" + +#: sphinx/templates/defindex.html:15 +msgid "lists all sections and subsections" +msgstr "" + +#: sphinx/templates/defindex.html:17 +msgid "search this documentation" +msgstr "" + +#: sphinx/templates/defindex.html:20 +msgid "quick access to all modules" +msgstr "" + +#: sphinx/templates/defindex.html:22 +msgid "all functions, classes, terms" +msgstr "" + +#: sphinx/templates/genindex-single.html:5 +#, python-format +msgid "Index – %(key)s" +msgstr "" + +#: sphinx/templates/genindex-single.html:44 +#: sphinx/templates/genindex-split.html:14 +#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54 +msgid "Full index on one page" +msgstr "" + +#: sphinx/templates/genindex-split.html:7 +msgid "Index pages by letter" +msgstr "" + +#: sphinx/templates/genindex-split.html:15 +msgid "can be huge" +msgstr "" + +#: sphinx/templates/layout.html:9 +msgid "Navigation" +msgstr "" + +#: sphinx/templates/layout.html:40 +msgid "Table Of Contents" +msgstr "" + +#: sphinx/templates/layout.html:46 +msgid "Previous topic" +msgstr "" + +#: sphinx/templates/layout.html:47 +msgid "previous chapter" +msgstr "" + +#: sphinx/templates/layout.html:50 +msgid "Next topic" +msgstr "" + +#: sphinx/templates/layout.html:51 +msgid "next chapter" +msgstr "" + +#: sphinx/templates/layout.html:55 +msgid "This Page" +msgstr "" + +#: sphinx/templates/layout.html:59 +msgid "Suggest Change" +msgstr "" + +#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62 +msgid "Show Source" +msgstr "" + +#: sphinx/templates/layout.html:71 +msgid "Quick search" +msgstr "" + +#: sphinx/templates/layout.html:71 +msgid "Keyword search" +msgstr "" + +#: sphinx/templates/layout.html:73 +msgid "Go" +msgstr "" + +#: sphinx/templates/layout.html:78 +msgid "Enter a module, class or function name." +msgstr "" + +#: sphinx/templates/layout.html:119 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "" + +#: sphinx/templates/layout.html:128 +msgid "About these documents" +msgstr "" + +#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2 +#: sphinx/templates/search.html:5 +msgid "Search" +msgstr "" + +#: sphinx/templates/layout.html:133 +msgid "Copyright" +msgstr "" + +#: sphinx/templates/layout.html:178 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "" + +#: sphinx/templates/layout.html:180 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "" + +#: sphinx/templates/layout.html:183 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "" + +#: sphinx/templates/layout.html:186 +#, python-format +msgid "" +"Created using Sphinx " +"%(sphinx_version)s." +msgstr "" + +#: sphinx/templates/modindex.html:15 +msgid "Most popular modules:" +msgstr "" + +#: sphinx/templates/modindex.html:24 +msgid "Show modules only available on these platforms" +msgstr "" + +#: sphinx/templates/modindex.html:56 +msgid "Deprecated" +msgstr "" + +#: sphinx/templates/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "" + +#: sphinx/templates/page.html:8 +msgid "" +"Note: You requested an out-of-date URL from this server." +" We've tried to redirect you to the new location of this page, but it may" +" not be the right one." +msgstr "" + +#: sphinx/templates/search.html:7 +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" + +#: sphinx/templates/search.html:14 +msgid "search" +msgstr "" + +#: sphinx/templates/search.html:20 +msgid "Your search did not match any results." +msgstr "" + +#: sphinx/templates/changes/frameset.html:5 +#: sphinx/templates/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "" + +#: sphinx/templates/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "" + +#: sphinx/templates/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "" + +#: sphinx/templates/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "" + +#: sphinx/templates/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "" + +#: sphinx/templates/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "" + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1 @@ +Documentation.addTranslations({"locale": "zh_TW", "plural_expr": "0", "messages": {"module, in ": "", "Preparing search...": "\u6e96\u5099\u641c\u5c0b...", "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "", "Search finished, found %s page(s) matching the search query.": "", ", in ": "", "Permalink to this headline": "", "Searching": "\u641c\u5c0b\u4e2d", "Permalink to this definition": "", "Hide Search Matches": "", "Search Results": "\u641c\u5c0b\u7d50\u679c"}}); \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,598 @@ +# Chinese (Taiwan) translations for Sphinx. +# Copyright (C) 2008 ORGANIZATION +# This file is distributed under the same license as the Sphinx project. +# Fred Lin , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 0.5\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2008-11-09 19:46+0100\n" +"PO-Revision-Date: 2008-11-27 18:40+0100\n" +"Last-Translator: Fred Lin \n" +"Language-Team: tw \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: sphinx/builder.py:408 +#, python-format +msgid "%b %d, %Y" +msgstr "%Y å¹´ %m 月 %d æ—¥" + +#: sphinx/builder.py:427 sphinx/templates/defindex.html:21 +msgid "General Index" +msgstr "總索引" + +#: sphinx/builder.py:427 +msgid "index" +msgstr "索引" + +#: sphinx/builder.py:429 sphinx/htmlhelp.py:156 +#: sphinx/templates/defindex.html:19 sphinx/templates/modindex.html:2 +#: sphinx/templates/modindex.html:13 +msgid "Global Module Index" +msgstr "" + +#: sphinx/builder.py:429 +msgid "modules" +msgstr "模組" + +#: sphinx/builder.py:466 +msgid "next" +msgstr "下一é " + +#: sphinx/builder.py:473 +msgid "previous" +msgstr "上一é " + +#: sphinx/builder.py:1054 +msgid " (in " +msgstr "" + +#: sphinx/builder.py:1129 +msgid "Builtins" +msgstr "" + +#: sphinx/builder.py:1131 +msgid "Module level" +msgstr "" + +#: sphinx/environment.py:102 sphinx/latexwriter.py:169 +#, python-format +msgid "%B %d, %Y" +msgstr "%Y å¹´ %m 月 %d æ—¥" + +#: sphinx/environment.py:291 sphinx/latexwriter.py:175 +#: sphinx/templates/genindex-single.html:2 +#: sphinx/templates/genindex-split.html:2 +#: sphinx/templates/genindex-split.html:5 sphinx/templates/genindex.html:2 +#: sphinx/templates/genindex.html:5 sphinx/templates/genindex.html:48 +#: sphinx/templates/layout.html:130 +msgid "Index" +msgstr "索引" + +#: sphinx/environment.py:292 sphinx/latexwriter.py:174 +msgid "Module Index" +msgstr "模組索引" + +#: sphinx/environment.py:293 sphinx/templates/defindex.html:16 +msgid "Search Page" +msgstr "æœå°‹é é¢" + +#: sphinx/htmlwriter.py:79 sphinx/static/doctools.js:145 +msgid "Permalink to this definition" +msgstr "" + +#: sphinx/htmlwriter.py:399 sphinx/static/doctools.js:139 +msgid "Permalink to this headline" +msgstr "" + +#: sphinx/latexwriter.py:172 +msgid "Release" +msgstr "釋出" + +#: sphinx/roles.py:53 sphinx/directives/desc.py:537 +#, python-format +msgid "environment variable; %s" +msgstr "環境變數; %s" + +#: sphinx/roles.py:60 +#, python-format +msgid "Python Enhancement Proposals!PEP %s" +msgstr "Python 建議文件!PEP %s" + +#: sphinx/textwriter.py:166 +#, python-format +msgid "Platform: %s" +msgstr "å¹³å°ï¼š%s" + +#: sphinx/textwriter.py:422 +msgid "[image]" +msgstr "[圖片]" + +#: sphinx/directives/desc.py:25 +#, python-format +msgid "%s() (built-in function)" +msgstr "%s() (內建函å¼)" + +#: sphinx/directives/desc.py:26 sphinx/directives/desc.py:42 +#: sphinx/directives/desc.py:54 +#, python-format +msgid "%s() (in module %s)" +msgstr "%s() (在 %s 模組中)" + +#: sphinx/directives/desc.py:29 +#, python-format +msgid "%s (built-in variable)" +msgstr "%s (內建變數)" + +#: sphinx/directives/desc.py:30 sphinx/directives/desc.py:66 +#, python-format +msgid "%s (in module %s)" +msgstr "%s() (在 %s 模組中)" + +#: sphinx/directives/desc.py:33 +#, python-format +msgid "%s (built-in class)" +msgstr "%s (內建類別)" + +#: sphinx/directives/desc.py:34 +#, python-format +msgid "%s (class in %s)" +msgstr "" + +#: sphinx/directives/desc.py:46 +#, python-format +msgid "%s() (%s.%s method)" +msgstr "%s() (%s.%s 方法)" + +#: sphinx/directives/desc.py:48 +#, python-format +msgid "%s() (%s method)" +msgstr "%s() (%s 方法)" + +#: sphinx/directives/desc.py:58 +#, python-format +msgid "%s() (%s.%s static method)" +msgstr "%s() (%s.%s éœæ…‹æ–¹æ³•)" + +#: sphinx/directives/desc.py:60 +#, python-format +msgid "%s() (%s static method)" +msgstr "%s() (%s éœæ…‹æ–¹æ³•)" + +#: sphinx/directives/desc.py:70 +#, python-format +msgid "%s (%s.%s attribute)" +msgstr "%s (%s.%s 屬性)" + +#: sphinx/directives/desc.py:72 +#, python-format +msgid "%s (%s attribute)" +msgstr "%s (%s 屬性)" + +#: sphinx/directives/desc.py:74 +#, python-format +msgid "%s (C function)" +msgstr "%s (C 函å¼)" + +#: sphinx/directives/desc.py:76 +#, python-format +msgid "%s (C member)" +msgstr "%s (C æˆå“¡)" + +#: sphinx/directives/desc.py:78 +#, python-format +msgid "%s (C macro)" +msgstr "%s (C 巨集)" + +#: sphinx/directives/desc.py:80 +#, python-format +msgid "%s (C type)" +msgstr "%s (C 類別)" + +#: sphinx/directives/desc.py:82 +#, python-format +msgid "%s (C variable)" +msgstr "%s (C 變數)" + +#: sphinx/directives/desc.py:100 +msgid "Raises" +msgstr "" + +#: sphinx/directives/desc.py:104 +msgid "Variable" +msgstr "變數" + +#: sphinx/directives/desc.py:107 +msgid "Returns" +msgstr "返回" + +#: sphinx/directives/desc.py:116 +msgid "Return type" +msgstr "返回類別" + +#: sphinx/directives/desc.py:143 +msgid "Parameters" +msgstr "åƒæ•¸" + +#: sphinx/directives/desc.py:423 +#, python-format +msgid "%scommand line option; %s" +msgstr "%s命令列é¸é …; %s" + +#: sphinx/directives/other.py:101 +msgid "Platforms: " +msgstr "å¹³å°" + +#: sphinx/directives/other.py:106 +#, python-format +msgid "%s (module)" +msgstr "%s (模組)" + +#: sphinx/directives/other.py:146 +msgid "Section author: " +msgstr "Section 作者:" + +#: sphinx/directives/other.py:148 +msgid "Module author: " +msgstr "模組作者:" + +#: sphinx/directives/other.py:150 +msgid "Author: " +msgstr "作者:" + +#: sphinx/directives/other.py:246 +msgid "See also" +msgstr "" + +#: sphinx/ext/todo.py:31 +msgid "Todo" +msgstr "待辦" + +#: sphinx/ext/todo.py:75 +#, python-format +msgid "(The original entry is located in %s, line %d and can be found " +msgstr "" + +#: sphinx/ext/todo.py:81 +msgid "here" +msgstr "" + +#: sphinx/locale/__init__.py:15 +msgid "Attention" +msgstr "注æ„" + +#: sphinx/locale/__init__.py:16 +msgid "Caution" +msgstr "警示" + +#: sphinx/locale/__init__.py:17 +msgid "Danger" +msgstr "å±éšª" + +#: sphinx/locale/__init__.py:18 +msgid "Error" +msgstr "錯誤" + +#: sphinx/locale/__init__.py:19 +msgid "Hint" +msgstr "æç¤º" + +#: sphinx/locale/__init__.py:20 +msgid "Important" +msgstr "é‡è¦" + +#: sphinx/locale/__init__.py:21 +msgid "Note" +msgstr "註解" + +#: sphinx/locale/__init__.py:22 +msgid "See Also" +msgstr "" + +#: sphinx/locale/__init__.py:23 +msgid "Tip" +msgstr "尿Ѐ巧" + +#: sphinx/locale/__init__.py:24 +msgid "Warning" +msgstr "警告" + +#: sphinx/locale/__init__.py:28 +#, python-format +msgid "New in version %s" +msgstr "%s 版新功能" + +#: sphinx/locale/__init__.py:29 +#, python-format +msgid "Changed in version %s" +msgstr "在 %s 版改變" + +#: sphinx/locale/__init__.py:30 +#, python-format +msgid "Deprecated since version %s" +msgstr "%s 版後已移除" + +#: sphinx/locale/__init__.py:34 +msgid "module" +msgstr "模組" + +#: sphinx/locale/__init__.py:35 +msgid "keyword" +msgstr "é—œéµå­—" + +#: sphinx/locale/__init__.py:36 +msgid "operator" +msgstr "é‹ç®—å­" + +#: sphinx/locale/__init__.py:37 +msgid "object" +msgstr "物件" + +#: sphinx/locale/__init__.py:38 +msgid "exception" +msgstr "例外" + +#: sphinx/locale/__init__.py:39 +msgid "statement" +msgstr "" + +#: sphinx/locale/__init__.py:40 +msgid "built-in function" +msgstr "內建函å¼" + +#: sphinx/static/doctools.js:174 +msgid "Hide Search Matches" +msgstr "" + +#: sphinx/static/searchtools.js:274 +msgid "Searching" +msgstr "æœå°‹ä¸­" + +#: sphinx/static/searchtools.js:279 +msgid "Preparing search..." +msgstr "準備æœå°‹..." + +#: sphinx/static/searchtools.js:338 +msgid "module, in " +msgstr "" + +#: sphinx/static/searchtools.js:347 +msgid ", in " +msgstr "" + +#: sphinx/static/searchtools.js:447 sphinx/templates/search.html:18 +msgid "Search Results" +msgstr "æœå°‹çµæžœ" + +#: sphinx/static/searchtools.js:449 +msgid "" +"Your search did not match any documents. Please make sure that all words " +"are spelled correctly and that you've selected enough categories." +msgstr "" + +#: sphinx/static/searchtools.js:451 +#, python-format +msgid "Search finished, found %s page(s) matching the search query." +msgstr "" + +#: sphinx/templates/defindex.html:2 +msgid "Overview" +msgstr "" + +#: sphinx/templates/defindex.html:11 +msgid "Indices and tables:" +msgstr "" + +#: sphinx/templates/defindex.html:14 +msgid "Complete Table of Contents" +msgstr "" + +#: sphinx/templates/defindex.html:15 +msgid "lists all sections and subsections" +msgstr "" + +#: sphinx/templates/defindex.html:17 +msgid "search this documentation" +msgstr "" + +#: sphinx/templates/defindex.html:20 +msgid "quick access to all modules" +msgstr "" + +#: sphinx/templates/defindex.html:22 +msgid "all functions, classes, terms" +msgstr "" + +#: sphinx/templates/genindex-single.html:5 +#, python-format +msgid "Index – %(key)s" +msgstr "" + +#: sphinx/templates/genindex-single.html:44 +#: sphinx/templates/genindex-split.html:14 +#: sphinx/templates/genindex-split.html:27 sphinx/templates/genindex.html:54 +msgid "Full index on one page" +msgstr "" + +#: sphinx/templates/genindex-split.html:7 +msgid "Index pages by letter" +msgstr "" + +#: sphinx/templates/genindex-split.html:15 +msgid "can be huge" +msgstr "" + +#: sphinx/templates/layout.html:9 +msgid "Navigation" +msgstr "ç€è¦½" + +#: sphinx/templates/layout.html:40 +msgid "Table Of Contents" +msgstr "內容目錄" + +#: sphinx/templates/layout.html:46 +msgid "Previous topic" +msgstr "上一個主題" + +#: sphinx/templates/layout.html:47 +msgid "previous chapter" +msgstr "上一章" + +#: sphinx/templates/layout.html:50 +msgid "Next topic" +msgstr "下一個主題" + +#: sphinx/templates/layout.html:51 +msgid "next chapter" +msgstr "下一章" + +#: sphinx/templates/layout.html:55 +msgid "This Page" +msgstr "本é " + +#: sphinx/templates/layout.html:59 +msgid "Suggest Change" +msgstr "" + +#: sphinx/templates/layout.html:60 sphinx/templates/layout.html:62 +msgid "Show Source" +msgstr "顯示原始碼" + +#: sphinx/templates/layout.html:71 +msgid "Quick search" +msgstr "快速æœå°‹" + +#: sphinx/templates/layout.html:71 +msgid "Keyword search" +msgstr "é—œéµå­—æœå°‹" + +#: sphinx/templates/layout.html:73 +msgid "Go" +msgstr "" + +#: sphinx/templates/layout.html:78 +msgid "Enter a module, class or function name." +msgstr "輸入一個模組ã€é¡žåˆ¥ã€æˆ–是函å¼å稱." + +#: sphinx/templates/layout.html:119 +#, python-format +msgid "Search within %(docstitle)s" +msgstr "在 %(docstitle)s 中æœå°‹" + +#: sphinx/templates/layout.html:128 +msgid "About these documents" +msgstr "" + +#: sphinx/templates/layout.html:131 sphinx/templates/search.html:2 +#: sphinx/templates/search.html:5 +msgid "Search" +msgstr "æœå°‹" + +#: sphinx/templates/layout.html:133 +msgid "Copyright" +msgstr "版權所有" + +#: sphinx/templates/layout.html:178 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "" + +#: sphinx/templates/layout.html:180 +#, python-format +msgid "© Copyright %(copyright)s." +msgstr "" + +#: sphinx/templates/layout.html:183 +#, python-format +msgid "Last updated on %(last_updated)s." +msgstr "最後更新日期是 %(last_updated)s." + +#: sphinx/templates/layout.html:186 +#, python-format +msgid "" +"Created using Sphinx " +"%(sphinx_version)s." +msgstr "" + +#: sphinx/templates/modindex.html:15 +msgid "Most popular modules:" +msgstr "" + +#: sphinx/templates/modindex.html:24 +msgid "Show modules only available on these platforms" +msgstr "" + +#: sphinx/templates/modindex.html:56 +msgid "Deprecated" +msgstr "已移除" + +#: sphinx/templates/opensearch.xml:4 +#, python-format +msgid "Search %(docstitle)s" +msgstr "æœå°‹ %(docstitle)s" + +#: sphinx/templates/page.html:8 +msgid "" +"Note: You requested an out-of-date URL from this server." +" We've tried to redirect you to the new location of this page, but it may" +" not be the right one." +msgstr "" + +#: sphinx/templates/search.html:7 +msgid "" +"From here you can search these documents. Enter your search\n" +" words into the box below and click \"search\". Note that the search\n" +" function will automatically search for all of the words. Pages\n" +" containing fewer words won't appear in the result list." +msgstr "" + +#: sphinx/templates/search.html:14 +msgid "search" +msgstr "æœå°‹" + +#: sphinx/templates/search.html:20 +msgid "Your search did not match any results." +msgstr "" + +#: sphinx/templates/changes/frameset.html:5 +#: sphinx/templates/changes/versionchanges.html:12 +#, python-format +msgid "Changes in Version %(version)s — %(docstitle)s" +msgstr "" + +#: sphinx/templates/changes/rstsource.html:5 +#, python-format +msgid "%(filename)s — %(docstitle)s" +msgstr "" + +#: sphinx/templates/changes/versionchanges.html:17 +#, python-format +msgid "Automatically generated list of changes in version %(version)s" +msgstr "" + +#: sphinx/templates/changes/versionchanges.html:18 +msgid "Library changes" +msgstr "" + +#: sphinx/templates/changes/versionchanges.html:23 +msgid "C API changes" +msgstr "C API 改變" + +#: sphinx/templates/changes/versionchanges.html:25 +msgid "Other changes" +msgstr "其他改變:" + +#~ msgid "" +#~ "From here you can search these documents. Enter your search\n" +#~ " words into the box below and" +#~ " click \"search\". Note that the " +#~ "search\n" +#~ " function will automatically search for all of the words. Pages\n" +#~ " containing less words won't appear in the result list." +#~ msgstr "" + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/quickstart.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/quickstart.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,533 @@ +# -*- coding: utf-8 -*- +""" + sphinx.quickstart + ~~~~~~~~~~~~~~~~~ + + Quickly setup documentation source to work with Sphinx. + + :copyright: 2008 by Georg Brandl. + :license: BSD. +""" + +import sys, os, time +from os import path + +TERM_ENCODING = getattr(sys.stdin, 'encoding', None) + +from sphinx.util import make_filename +from sphinx.util.console import purple, bold, red, turquoise, nocolor, color_terminal +from sphinx.util.texescape import tex_escape_map + + +PROMPT_PREFIX = '> ' + +QUICKSTART_CONF = '''\ +# -*- coding: utf-8 -*- +# +# %(project)s documentation build configuration file, created by +# sphinx-quickstart on %(now)s. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# The contents of this file are pickled, so don't put values in the namespace +# that aren't pickleable (module imports are okay, they're removed automatically). +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If your extensions are in another directory, add it here. If the directory +# is relative to the documentation root, use os.path.abspath to make it +# absolute, like shown here. +#sys.path.append(os.path.abspath('.')) + +# General configuration +# --------------------- + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = [%(extensions)s] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['%(dot)stemplates'] + +# The suffix of source filenames. +source_suffix = '%(suffix)s' + +# The encoding of source files. +#source_encoding = 'utf-8' + +# The master toctree document. +master_doc = '%(master)s' + +# General information about the project. +project = u'%(project)s' +copyright = u'%(copyright)s' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '%(version)s' +# The full version, including alpha/beta/rc tags. +release = '%(release)s' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%%B %%d, %%Y' + +# List of documents that shouldn't be included in the build. +#unused_docs = [] + +# List of directories, relative to source directory, that shouldn't be searched +# for source files. +exclude_trees = [%(exclude_trees)s] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + + +# Options for HTML output +# ----------------------- + +# The style sheet to use for HTML and HTML Help pages. A file of that name +# must exist either in Sphinx' static/ path, or in one of the custom paths +# given in html_static_path. +html_style = 'default.css' + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['%(dot)sstatic'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%%b %%d, %%Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_use_modindex = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, the reST sources are included in the HTML build as _sources/. +#html_copy_source = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = '' + +# Output file base name for HTML help builder. +htmlhelp_basename = '%(project_fn)sdoc' + + +# Options for LaTeX output +# ------------------------ + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, document class [howto/manual]). +latex_documents = [ + ('%(master)s', '%(project_fn)s.tex', ur'%(project_doc_texescaped)s', + ur'%(author_texescaped)s', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_use_modindex = True +''' + +INTERSPHINX_CONFIG = ''' + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = {'http://docs.python.org/dev': None} +''' + +MASTER_FILE = '''\ +.. %(project)s documentation master file, created by sphinx-quickstart on %(now)s. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to %(project)s's documentation! +===========%(underline)s================= + +Contents: + +.. toctree:: + :maxdepth: 2 + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +''' + +MAKEFILE = '''\ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d %(rbuilddir)s/doctrees $(PAPEROPT_$(PAPER)) \ +$(SPHINXOPTS) %(rsrcdir)s + +.PHONY: help clean html web pickle htmlhelp latex changes linkcheck + +help: +\t@echo "Please use \\`make ' where is one of" +\t@echo " html to make standalone HTML files" +\t@echo " pickle to make pickle files" +\t@echo " json to make JSON files" +\t@echo " htmlhelp to make HTML files and a HTML help project" +\t@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" +\t@echo " changes to make an overview over all changed/added/deprecated items" +\t@echo " linkcheck to check all external links for integrity" + +clean: +\t-rm -rf %(rbuilddir)s/* + +html: +\tmkdir -p %(rbuilddir)s/html %(rbuilddir)s/doctrees +\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) %(rbuilddir)s/html +\t@echo +\t@echo "Build finished. The HTML pages are in %(rbuilddir)s/html." + +pickle: +\tmkdir -p %(rbuilddir)s/pickle %(rbuilddir)s/doctrees +\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) %(rbuilddir)s/pickle +\t@echo +\t@echo "Build finished; now you can process the pickle files." + +web: pickle + +json: +\tmkdir -p %(rbuilddir)s/json %(rbuilddir)s/doctrees +\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) %(rbuilddir)s/json +\t@echo +\t@echo "Build finished; now you can process the JSON files." + +htmlhelp: +\tmkdir -p %(rbuilddir)s/htmlhelp %(rbuilddir)s/doctrees +\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) %(rbuilddir)s/htmlhelp +\t@echo +\t@echo "Build finished; now you can run HTML Help Workshop with the" \\ +\t ".hhp project file in %(rbuilddir)s/htmlhelp." + +latex: +\tmkdir -p %(rbuilddir)s/latex %(rbuilddir)s/doctrees +\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) %(rbuilddir)s/latex +\t@echo +\t@echo "Build finished; the LaTeX files are in %(rbuilddir)s/latex." +\t@echo "Run \\`make all-pdf' or \\`make all-ps' in that directory to" \\ +\t "run these through (pdf)latex." + +changes: +\tmkdir -p %(rbuilddir)s/changes %(rbuilddir)s/doctrees +\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) %(rbuilddir)s/changes +\t@echo +\t@echo "The overview file is in %(rbuilddir)s/changes." + +linkcheck: +\tmkdir -p %(rbuilddir)s/linkcheck %(rbuilddir)s/doctrees +\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) %(rbuilddir)s/linkcheck +\t@echo +\t@echo "Link check complete; look for any errors in the above output " \\ +\t "or in %(rbuilddir)s/linkcheck/output.txt." +''' + + +def mkdir_p(dir): + if path.isdir(dir): + return + os.makedirs(dir) + + +def is_path(x): + """Please enter a valid path name.""" + return path.isdir(x) or not path.exists(x) + +def nonempty(x): + """Please enter some text.""" + return len(x) + +def choice(*l): + def val(x): + return x in l + val.__doc__ = 'Please enter one of %s.' % ', '.join(l) + return val + +def boolean(x): + """Please enter either 'y' or 'n'.""" + return x.upper() in ('Y', 'YES', 'N', 'NO') + +def suffix(x): + """Please enter a file suffix, e.g. '.rst' or '.txt'.""" + return x[0:1] == '.' and len(x) > 1 + +def ok(x): + return True + + +def do_prompt(d, key, text, default=None, validator=nonempty): + while True: + if default: + prompt = purple(PROMPT_PREFIX + '%s [%s]: ' % (text, default)) + else: + prompt = purple(PROMPT_PREFIX + text + ': ') + x = raw_input(prompt) + if default and not x: + x = default + if x.decode('ascii', 'replace').encode('ascii', 'replace') != x: + if TERM_ENCODING: + x = x.decode(TERM_ENCODING) + else: + print turquoise('* Note: non-ASCII characters entered and terminal ' + 'encoding unknown -- assuming UTF-8 or Latin-1.') + try: + x = x.decode('utf-8') + except UnicodeDecodeError: + x = x.decode('latin1') + if validator and not validator(x): + print red('* ' + validator.__doc__) + continue + break + d[key] = x + + +def inner_main(args): + d = {} + + if not sys.stdout.isatty() or not color_terminal(): + nocolor() + + print bold('Welcome to the Sphinx quickstart utility.') + print ''' +Please enter values for the following settings (just press Enter to +accept a default value, if one is given in brackets).''' + + print ''' +Enter the root path for documentation.''' + do_prompt(d, 'path', 'Root path for the documentation', '.', is_path) + + while path.isfile(path.join(d['path'], 'conf.py')) or \ + path.isfile(path.join(d['path'], 'source', 'conf.py')): + print + print bold('Error: an existing conf.py has been found in the ' + 'selected root path.') + print 'sphinx-quickstart will not overwrite existing Sphinx projects.' + print + do_prompt(d, 'path', 'Please enter a new root path (or just Enter to exit)', + '', is_path) + if not d['path']: + sys.exit(1) + + print ''' +You have two options for placing the build directory for Sphinx output. +Either, you use a directory ".build" within the root path, or you separate +"source" and "build" directories within the root path.''' + do_prompt(d, 'sep', 'Separate source and build directories (y/N)', 'n', + boolean) + print ''' +Inside the root directory, two more directories will be created; ".templates" +for custom HTML templates and ".static" for custom stylesheets and other +static files. Since the leading dot may be inconvenient for Windows users, +you can enter another prefix (such as "_") to replace the dot.''' + do_prompt(d, 'dot', 'Name prefix for templates and static dir', '.', ok) + + print ''' +The project name will occur in several places in the built documentation.''' + do_prompt(d, 'project', 'Project name') + do_prompt(d, 'author', 'Author name(s)') + print ''' +Sphinx has the notion of a "version" and a "release" for the +software. Each version can have multiple releases. For example, for +Python the version is something like 2.5 or 3.0, while the release is +something like 2.5.1 or 3.0a1. If you don't need this dual structure, +just set both to the same value.''' + do_prompt(d, 'version', 'Project version') + do_prompt(d, 'release', 'Project release', d['version']) + print ''' +The file name suffix for source files. Commonly, this is either ".txt" +or ".rst". Only files with this suffix are considered documents.''' + do_prompt(d, 'suffix', 'Source file suffix', '.rst', suffix) + print ''' +One document is special in that it is considered the top node of the +"contents tree", that is, it is the root of the hierarchical structure +of the documents. Normally, this is "index", but if your "index" +document is a custom template, you can also set this to another filename.''' + do_prompt(d, 'master', 'Name of your master document (without suffix)', + 'index') + print ''' +Please indicate if you want to use one of the following Sphinx extensions:''' + do_prompt(d, 'ext_autodoc', 'autodoc: automatically insert docstrings ' + 'from modules (y/N)', 'n', boolean) + do_prompt(d, 'ext_doctest', 'doctest: automatically test code snippets ' + 'in doctest blocks (y/N)', 'n', boolean) + do_prompt(d, 'ext_intersphinx', 'intersphinx: link between Sphinx documentation ' + 'of different projects (y/N)', 'n', boolean) + print ''' +If you are under Unix, a Makefile can be generated for you so that you +only have to run e.g. `make html' instead of invoking sphinx-build +directly.''' + do_prompt(d, 'makefile', 'Create Makefile? (Y/n)', + os.name == 'posix' and 'y' or 'n', boolean) + + d['project_fn'] = make_filename(d['project']) + d['now'] = time.asctime() + d['underline'] = len(d['project']) * '=' + d['extensions'] = ', '.join( + repr('sphinx.ext.' + name) for name in ('autodoc', 'doctest', 'intersphinx') + if d['ext_' + name].upper() in ('Y', 'YES')) + d['copyright'] = time.strftime('%Y') + ', ' + d['author'] + d['author_texescaped'] = unicode(d['author']).translate(tex_escape_map) + d['project_doc'] = d['project'] + ' Documentation' + d['project_doc_texescaped'] = \ + unicode(d['project'] + ' Documentation').translate(tex_escape_map) + + if not path.isdir(d['path']): + mkdir_p(d['path']) + + separate = d['sep'].upper() in ('Y', 'YES') + srcdir = separate and path.join(d['path'], 'source') or d['path'] + + mkdir_p(srcdir) + if separate: + builddir = path.join(d['path'], 'build') + d['exclude_trees'] = '' + else: + builddir = path.join(srcdir, d['dot'] + 'build') + d['exclude_trees'] = repr(d['dot'] + 'build') + mkdir_p(builddir) + mkdir_p(path.join(srcdir, d['dot'] + 'templates')) + mkdir_p(path.join(srcdir, d['dot'] + 'static')) + + conf_text = QUICKSTART_CONF % d + if d['ext_intersphinx'].upper() in ('Y', 'YES'): + conf_text += INTERSPHINX_CONFIG + + f = open(path.join(srcdir, 'conf.py'), 'w') + f.write(conf_text.encode('utf-8')) + f.close() + + masterfile = path.join(srcdir, d['master'] + d['suffix']) + f = open(masterfile, 'w') + f.write((MASTER_FILE % d).encode('utf-8')) + f.close() + + create_makefile = d['makefile'].upper() in ('Y', 'YES') + if create_makefile: + d['rsrcdir'] = separate and 'source' or '.' + d['rbuilddir'] = separate and 'build' or d['dot'] + 'build' + f = open(path.join(d['path'], 'Makefile'), 'w') + f.write((MAKEFILE % d).encode('utf-8')) + f.close() + + print + print bold('Finished: An initial directory structure has been created.') + print ''' +You should now populate your master file %s and create other documentation +source files. ''' % masterfile + (create_makefile and '''\ +Use the Makefile to build the docs, like so: + make builder +''' or '''\ +Use the sphinx-build command to build the docs, like so: + sphinx-build -b builder %s %s +''' % (srcdir, builddir)) + '''\ +where "builder" is one of the supported builders, e.g. html, latex or linkcheck. +''' + + +def main(argv=sys.argv): + try: + return inner_main(argv) + except (KeyboardInterrupt, EOFError): + print + print '[Interrupted.]' + return + diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/roles.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/roles.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,245 @@ +# -*- coding: utf-8 -*- +""" + sphinx.roles + ~~~~~~~~~~~~ + + Handlers for additional ReST roles. + + :copyright: 2007-2008 by Georg Brandl. + :license: BSD. +""" + +import re + +from docutils import nodes, utils +from docutils.parsers.rst import roles + +from sphinx import addnodes +from sphinx.util import ws_re, caption_ref_re + + +generic_docroles = { + 'command' : nodes.strong, + 'dfn' : nodes.emphasis, + 'guilabel' : nodes.strong, + 'kbd' : nodes.literal, + 'mailheader' : addnodes.literal_emphasis, + 'makevar' : nodes.Text, + 'manpage' : addnodes.literal_emphasis, + 'mimetype' : addnodes.literal_emphasis, + 'newsgroup' : addnodes.literal_emphasis, + 'program' : nodes.strong, + 'regexp' : nodes.literal, +} + +for rolename, nodeclass in generic_docroles.iteritems(): + roles.register_generic_role(rolename, nodeclass) + + +def indexmarkup_role(typ, rawtext, etext, lineno, inliner, options={}, content=[]): + env = inliner.document.settings.env + if not typ: + typ = env.config.default_role + else: + typ = typ.lower() + text = utils.unescape(etext) + targetid = 'index-%s' % env.index_num + env.index_num += 1 + indexnode = addnodes.index() + targetnode = nodes.target('', '', ids=[targetid]) + inliner.document.note_explicit_target(targetnode) + if typ == 'envvar': + indexnode['entries'] = [('single', text, targetid, text), + ('single', _('environment variable; %s') % text, + targetid, text)] + xref_nodes = xfileref_role(typ, rawtext, etext, lineno, inliner, + options, content)[0] + return [indexnode, targetnode] + xref_nodes, [] + elif typ == 'pep': + indexnode['entries'] = [('single', + _('Python Enhancement Proposals!PEP %s') % text, + targetid, 'PEP %s' % text)] + try: + pepnum = int(text) + except ValueError: + msg = inliner.reporter.error('invalid PEP number %s' % text, line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + ref = inliner.document.settings.pep_base_url + 'pep-%04d' % pepnum + sn = nodes.strong('PEP '+text, 'PEP '+text) + rn = nodes.reference('', '', refuri=ref) + rn += sn + return [indexnode, targetnode, rn], [] + elif typ == 'rfc': + indexnode['entries'] = [('single', 'RFC; RFC %s' % text, + targetid, 'RFC %s' % text)] + try: + rfcnum = int(text) + except ValueError: + msg = inliner.reporter.error('invalid RFC number %s' % text, line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + ref = inliner.document.settings.rfc_base_url + inliner.rfc_url % rfcnum + sn = nodes.strong('RFC '+text, 'RFC '+text) + rn = nodes.reference('', '', refuri=ref) + rn += sn + return [indexnode, targetnode, rn], [] + +roles.register_canonical_role('envvar', indexmarkup_role) +roles.register_local_role('pep', indexmarkup_role) +roles.register_local_role('rfc', indexmarkup_role) + + +# default is `literal` +innernodetypes = { + 'ref': nodes.emphasis, + 'term': nodes.emphasis, + 'token': nodes.strong, + 'envvar': nodes.strong, + 'option': addnodes.literal_emphasis, +} + +def _fix_parens(typ, text, env): + if typ in ('func', 'meth', 'cfunc'): + if text.endswith('()'): + # remove parentheses + text = text[:-2] + if env.config.add_function_parentheses: + # add them back to all occurrences if configured + text += '()' + return text + +def xfileref_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): + env = inliner.document.settings.env + if not typ: + typ = env.config.default_role + else: + typ = typ.lower() + text = utils.unescape(text) + # if the first character is a bang, don't cross-reference at all + if text[0:1] == '!': + text = _fix_parens(typ, text[1:], env) + return [innernodetypes.get(typ, nodes.literal)( + rawtext, text, classes=['xref'])], [] + # we want a cross-reference, create the reference node + pnode = addnodes.pending_xref(rawtext, reftype=typ, refcaption=False, + modname=env.currmodule, classname=env.currclass) + # we may need the line number for warnings + pnode.line = lineno + # the link title may differ from the target, but by default they are the same + title = target = text + titleistarget = True + # look if explicit title and target are given with `foo ` syntax + brace = text.find('<') + if brace != -1: + titleistarget = False + pnode['refcaption'] = True + m = caption_ref_re.match(text) + if m: + target = m.group(2) + title = m.group(1) + else: + # fallback: everything after '<' is the target + target = text[brace+1:] + title = text[:brace] + # special target for Python object cross-references + if typ in ('data', 'exc', 'func', 'class', 'const', 'attr', 'meth', 'mod', 'obj'): + # fix-up parentheses in link title + if titleistarget: + title = title.lstrip('.') # only has a meaning for the target + target = target.lstrip('~') # only has a meaning for the title + title = _fix_parens(typ, title, env) + # if the first character is a tilde, don't display the module/class + # parts of the contents + if title[0:1] == '~': + title = title[1:] + dot = title.rfind('.') + if dot != -1: + title = title[dot+1:] + # remove parentheses from the target too + if target.endswith('()'): + target = target[:-2] + # if the first character is a dot, search more specific namespaces first + # else search builtins first + if target[0:1] == '.': + target = target[1:] + pnode['refspecific'] = True + # some other special cases for the target + elif typ == 'option': + program = env.currprogram + if titleistarget: + if ' ' in title and not (title.startswith('/') or title.startswith('-')): + program, target = re.split(' (?=-|--|/)', title, 1) + program = ws_re.sub('-', program) + target = target.strip() + elif ' ' in target: + program, target = re.split(' (?=-|--|/)', target, 1) + program = ws_re.sub('-', program) + pnode['refprogram'] = program + elif typ == 'term': + # normalize whitespace in definition terms (if the term reference is + # broken over a line, a newline will be in target) + target = ws_re.sub(' ', target).lower() + elif typ == 'ref': + # reST label names are always lowercased + target = ws_re.sub('', target).lower() + else: + # remove all whitespace to avoid referencing problems + target = ws_re.sub('', target) + pnode['reftarget'] = target + pnode += innernodetypes.get(typ, nodes.literal)(rawtext, title, classes=['xref']) + return [pnode], [] + + +def menusel_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): + return [nodes.emphasis( + rawtext, utils.unescape(text).replace('-->', u'\N{TRIANGULAR BULLET}'))], [] + + +_litvar_re = re.compile('{([^}]+)}') + +def emph_literal_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): + text = utils.unescape(text) + pos = 0 + retnode = nodes.literal(role=typ.lower()) + for m in _litvar_re.finditer(text): + if m.start() > pos: + txt = text[pos:m.start()] + retnode += nodes.Text(txt, txt) + retnode += nodes.emphasis(m.group(1), m.group(1)) + pos = m.end() + if pos < len(text): + retnode += nodes.Text(text[pos:], text[pos:]) + return [retnode], [] + + +specific_docroles = { + 'data': xfileref_role, + 'exc': xfileref_role, + 'func': xfileref_role, + 'class': xfileref_role, + 'const': xfileref_role, + 'attr': xfileref_role, + 'meth': xfileref_role, + 'obj': xfileref_role, + 'cfunc' : xfileref_role, + 'cmember': xfileref_role, + 'cdata': xfileref_role, + 'ctype': xfileref_role, + 'cmacro': xfileref_role, + + 'mod': xfileref_role, + + 'keyword': xfileref_role, + 'ref': xfileref_role, + 'token': xfileref_role, + 'term': xfileref_role, + 'option': xfileref_role, + + 'menuselection': menusel_role, + 'file': emph_literal_role, + 'samp': emph_literal_role, +} + +for rolename, func in specific_docroles.iteritems(): + roles.register_canonical_role(rolename, func) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/search.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/search.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,205 @@ +# -*- coding: utf-8 -*- +""" + sphinx.search + ~~~~~~~~~~~~~ + + Create a search index for offline search. + + :copyright: 2007-2008 by Armin Ronacher. + :license: BSD. +""" +import re +import cPickle as pickle +from cStringIO import StringIO + +from docutils.nodes import Text, NodeVisitor + +from sphinx.util.stemmer import PorterStemmer +from sphinx.util import jsdump, rpartition + + +word_re = re.compile(r'\w+(?u)') + +stopwords = set(""" +a and are as at +be but by +for +if in into is it +near no not +of on or +such +that the their then there these they this to +was will with +""".split()) + + +class _JavaScriptIndex(object): + """ + The search index as javascript file that calls a function + on the documentation search object to register the index. + """ + + PREFIX = 'Search.setIndex(' + SUFFIX = ')' + + def dumps(self, data): + return self.PREFIX + jsdump.dumps(data) + self.SUFFIX + + def loads(self, s): + data = s[len(self.PREFIX):-len(self.SUFFIX)] + if not data or not s.startswith(self.PREFIX) or not \ + s.endswith(self.SUFFIX): + raise ValueError('invalid data') + return jsdump.loads(data) + + def dump(self, data, f): + f.write(self.dumps(data)) + + def load(self, f): + return self.loads(f.read()) + + +js_index = _JavaScriptIndex() + + +class Stemmer(PorterStemmer): + """ + All those porter stemmer implementations look hideous. + make at least the stem method nicer. + """ + + def stem(self, word): + word = word.lower() + return PorterStemmer.stem(self, word, 0, len(word) - 1) + + +class WordCollector(NodeVisitor): + """ + A special visitor that collects words for the `IndexBuilder`. + """ + + def __init__(self, document): + NodeVisitor.__init__(self, document) + self.found_words = [] + + def dispatch_visit(self, node): + if node.__class__ is Text: + self.found_words.extend(word_re.findall(node.astext())) + + +class IndexBuilder(object): + """ + Helper class that creates a searchindex based on the doctrees + passed to the `feed` method. + """ + formats = { + 'jsdump': jsdump, + 'pickle': pickle + } + + def __init__(self, env): + self.env = env + self._stemmer = Stemmer() + # filename -> title + self._titles = {} + # stemmed word -> set(filenames) + self._mapping = {} + # desctypes -> index + self._desctypes = {} + + def load(self, stream, format): + """Reconstruct from frozen data.""" + if isinstance(format, basestring): + format = self.formats[format] + frozen = format.load(stream) + # if an old index is present, we treat it as not existing. + if not isinstance(frozen, dict): + raise ValueError('old format') + index2fn = frozen['filenames'] + self._titles = dict(zip(index2fn, frozen['titles'])) + self._mapping = {} + for k, v in frozen['terms'].iteritems(): + if isinstance(v, int): + self._mapping[k] = set([index2fn[v]]) + else: + self._mapping[k] = set(index2fn[i] for i in v) + # no need to load keywords/desctypes + + def dump(self, stream, format): + """Dump the frozen index to a stream.""" + if isinstance(format, basestring): + format = self.formats[format] + format.dump(self.freeze(), stream) + + def get_modules(self, fn2index): + rv = {} + for name, (doc, _, _, _) in self.env.modules.iteritems(): + rv[name] = fn2index[doc] + return rv + + def get_descrefs(self, fn2index): + rv = {} + dt = self._desctypes + for fullname, (doc, desctype) in self.env.descrefs.iteritems(): + prefix, name = rpartition(fullname, '.') + pdict = rv.setdefault(prefix, {}) + try: + i = dt[desctype] + except KeyError: + i = len(dt) + dt[desctype] = i + pdict[name] = (fn2index[doc], i) + return rv + + def get_terms(self, fn2index): + rv = {} + for k, v in self._mapping.iteritems(): + if len(v) == 1: + fn, = v + rv[k] = fn2index[fn] + else: + rv[k] = [fn2index[fn] for fn in v] + return rv + + def freeze(self): + """Create a usable data structure for serializing.""" + filenames = self._titles.keys() + titles = self._titles.values() + fn2index = dict((f, i) for (i, f) in enumerate(filenames)) + return dict( + filenames=filenames, + titles=titles, + terms=self.get_terms(fn2index), + descrefs=self.get_descrefs(fn2index), + modules=self.get_modules(fn2index), + desctypes=dict((v, k) for (k, v) in self._desctypes.items()), + ) + + def prune(self, filenames): + """Remove data for all filenames not in the list.""" + new_titles = {} + for filename in filenames: + if filename in self._titles: + new_titles[filename] = self._titles[filename] + self._titles = new_titles + for wordnames in self._mapping.itervalues(): + wordnames.intersection_update(filenames) + + def feed(self, filename, title, doctree): + """Feed a doctree to the index.""" + self._titles[filename] = title + + visitor = WordCollector(doctree) + doctree.walk(visitor) + + def add_term(word, prefix='', stem=self._stemmer.stem): + word = stem(word) + if len(word) < 3 or word in stopwords or word.isdigit(): + return + self._mapping.setdefault(prefix + word, set()).add(filename) + + for word in word_re.findall(title): + add_term(word) + + for word in visitor.found_words: + add_term(word) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/setup_command.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/setup_command.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +""" + sphinx.setup_command + ~~~~~~~~~~~~~~~~~~~~ + + Setuptools/distutils commands to assist the building of sphinx + documentation. + + :author: Sebastian Wiesner + :contact: basti.wiesner@gmx.net + :copyright: 2008 by Sebastian Wiesner. + :license: MIT. +""" + +import sys +import os +from StringIO import StringIO +from distutils.cmd import Command + +from sphinx.application import Sphinx +from sphinx.util.console import darkred, nocolor + + +class BuildDoc(Command): + """Distutils command to build Sphinx documentation.""" + + description = 'Build Sphinx documentation' + user_options = [ + ('fresh-env', 'E', 'discard saved environment'), + ('all-files', 'a', 'build all files'), + ('source-dir=', 's', 'Source directory'), + ('build-dir=', None, 'Build directory'), + ('builder=', 'b', 'The builder to use. Defaults to "html"'), + ] + boolean_options = ['fresh-env', 'all-files'] + + + def initialize_options(self): + self.fresh_env = self.all_files = False + self.source_dir = self.build_dir = None + self.conf_file_name = 'conf.py' + self.builder = 'html' + + def finalize_options(self): + if self.source_dir is None: + if os.path.isdir('doc'): + for root, dirnames, filenames in os.walk('doc'): + if 'conf.py' in filenames: + self.source_dir = root + self.announce('Using source directory %s' % root) + break + self.ensure_dirname('source_dir') + self.source_dir = os.path.abspath(self.source_dir) + + if self.build_dir is None: + build = self.get_finalized_command('build') + self.build_dir = os.path.join(build.build_base, 'sphinx') + self.mkpath(self.build_dir) + self.ensure_dirname('build_dir') + self.doctree_dir = os.path.join(self.build_dir, 'doctrees') + self.mkpath(self.doctree_dir) + self.builder_target_dir = os.path.join(self.build_dir, self.builder) + self.mkpath(self.builder_target_dir) + + def run(self): + if not sys.stdout.isatty() or sys.platform == 'win32': + # Windows' poor cmd box doesn't understand ANSI sequences + nocolor() + if not self.verbose: + status_stream = StringIO() + else: + status_stream = sys.stdout + app = Sphinx(self.source_dir, self.source_dir, + self.builder_target_dir, self.doctree_dir, + self.builder, {}, status_stream, + freshenv=self.fresh_env) + + try: + if self.all_files: + app.builder.build_all() + else: + app.builder.build_update() + except Exception, err: + from docutils.utils import SystemMessage + if isinstance(err, SystemMessage): + sys.stderr, darkred('reST markup error:') + print >>sys.stderr, err.args[0].encode('ascii', 'backslashreplace') + else: + raise diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/contents.png Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/contents.png has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/default.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/default.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,657 @@ +/** + * Sphinx Doc Design + */ + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +/* :::: LAYOUT :::: */ + +div.document { + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: white; + padding: 0 20px 30px 20px; +} + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; +} + +div.clearer { + clear: both; +} + +div.footer { + color: #fff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #fff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + color: #fff; + width: 100%; + line-height: 30px; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +div.related a { + color: white; +} + +/* ::: TOC :::: */ +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: white; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: white; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: white; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: white; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + list-style: none; + color: white; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +/* :::: MODULE CLOUD :::: */ +div.modulecloud { + margin: -5px 10px 5px 10px; + padding: 10px; + line-height: 160%; + border: 1px solid #cbe7e5; + background-color: #f2fbfd; +} + +div.modulecloud a { + padding: 0 5px 0 5px; +} + +/* :::: SEARCH :::: */ +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* :::: COMMON FORM STYLES :::: */ + +div.actions { + padding: 5px 10px 5px 10px; + border-top: 1px solid #cbe7e5; + border-bottom: 1px solid #cbe7e5; + background-color: #e0f6f4; +} + +form dl { + color: #333; +} + +form dt { + clear: both; + float: left; + min-width: 110px; + margin-right: 10px; + padding-top: 2px; +} + +input#homepage { + display: none; +} + +div.error { + margin: 5px 20px 0 0; + padding: 5px; + border: 1px solid #d00; + font-weight: bold; +} + +/* :::: INDEX PAGE :::: */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* :::: INDEX STYLES :::: */ + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +form.pfform { + margin: 10px 0 20px 0; +} + +/* :::: GLOBAL STYLES :::: */ + +.docwarning { + background-color: #ffe4e4; + padding: 10px; + margin: 0 -20px 0 -20px; + border-bottom: 1px solid #f66; +} + +p.subhead { + font-weight: bold; + margin-top: 20px; +} + +a { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + text-align: justify; + line-height: 130%; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +ul.fakelist { + list-style: none; + margin: 10px 0 10px 20px; + padding: 0; +} + +.field-list ul { + padding-left: 1em; +} + +.first { + margin-top: 0 !important; +} + +/* "Footnotes" heading */ +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +/* Sidebars */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* "Topics" */ + +div.topic { + background-color: #eee; + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* Admonitions */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +table.docutils { + border: 0; +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 0; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +dl { + margin-bottom: 15px; + clear: both; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.refcount { + color: #060; +} + +dt:target, +.highlight { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +th { + text-align: left; + padding-right: 5px; +} + +pre { + padding: 5px; + background-color: #efc; + color: #333; + border: 1px solid #ac9; + border-left: none; + border-right: none; + overflow: auto; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +tt { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +tt.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +tt.descclassname { + background-color: transparent; +} + +tt.xref, a tt { + background-color: transparent; + font-weight: bold; +} + +.footnote:target { background-color: #ffa } + +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.versionmodified { + font-style: italic; +} + +form.comment { + margin: 0; + padding: 10px 30px 10px 30px; + background-color: #eee; +} + +form.comment h3 { + background-color: #326591; + color: white; + margin: -10px -30px 10px -30px; + padding: 5px; + font-size: 1.4em; +} + +form.comment input, +form.comment textarea { + border: 1px solid #ccc; + padding: 2px; + font-family: sans-serif; + font-size: 100%; +} + +form.comment input[type="text"] { + width: 240px; +} + +form.comment textarea { + width: 100%; + height: 200px; + margin-bottom: 10px; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +img.math { + vertical-align: middle; +} + +div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +img.logo { + border: 0; +} + +/* :::: PRINT :::: */ +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0; + width : 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + div#comments div.new-comment-box, + #top-link { + display: none; + } +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/doctools.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/doctools.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,232 @@ +/// XXX: make it cross browser + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger + */ +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", + "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {} +} + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +} + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s == 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +} + +/** + * small function to check if an array contains + * a given item. + */ +jQuery.contains = function(arr, item) { + for (var i = 0; i < arr.length; i++) { + if (arr[i] == item) + return true; + } + return false; +} + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node) { + if (node.nodeType == 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && !jQuery.className.has(node.parentNode, className)) { + var span = document.createElement("span"); + span.className = className; + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this) + }); + } + } + return this.each(function() { + highlight(this); + }); +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initModIndex(); + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can savely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated == 'undefined') + return string; + return (typeof translated == 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated == 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[@id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[@id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlight'); + }); + }, 10); + $('
  • ') + .appendTo($('.sidebar .this-page-menu')); + } + }, + + /** + * init the modindex toggle buttons + */ + initModIndex : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + console.log($('tr.cg-' + idnum).toggle()); + if (src.substr(-9) == 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('.sidebar .this-page-menu li.highlight-link').fadeOut(300); + $('span.highlight').removeClass('highlight'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this == '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/file.png Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/file.png has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/jquery.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/jquery.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,32 @@ +/* + * jQuery 1.2.6 - New Wave Javascript + * + * Copyright (c) 2008 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $ + * $Rev: 5685 $ + */ +(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else +return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else +return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else +selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else +this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else +return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else +jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else +jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("",""]||!tags.indexOf("",""]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
    "]||!tags.indexOf("",""]||(!tags.indexOf("",""]||!tags.indexOf("",""]||jQuery.browser.msie&&[1,"div
    ","
    "]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf(""&&tags.indexOf("=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else +ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&¬xml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&¬xml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&¬xml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else +while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return im[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else +for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("
    ").append(res.responseText.replace(//g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else +xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else +jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else +for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else +s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else +e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;ithis.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})(); \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/minus.png Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/minus.png has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/navigation.png Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/navigation.png has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/plus.png Binary file buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/plus.png has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/rightsidebar.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/rightsidebar.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,16 @@ +/** + * Sphinx Doc Design -- Right Side Bar Overrides + */ + + +div.sphinxsidebar { + float: right; +} + +div.bodywrapper { + margin: 0 230px 0 0; +} + +div.inlinecomments { + right: 250px; +} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/searchtools.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/Sphinx-0.5.1-py2.5.egg/sphinx/static/searchtools.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,467 @@ +/** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words, hlwords is the list of normal, unstemmed + * words. the first one is used to find the occurance, the + * latter for highlighting it. + */ + +jQuery.makeSearchSummary = function(text, keywords, hlwords) { + var textLower = text.toLowerCase(); + var start = 0; + $.each(keywords, function() { + var i = textLower.indexOf(this.toLowerCase()); + if (i > -1) + start = i; + }); + start = Math.max(start - 120, 0); + var excerpt = ((start > 0) ? '...' : '') + + $.trim(text.substr(start, 240)) + + ((start + 240 - text.length) ? '...' : ''); + var rv = $('
    ').text(excerpt); + $.each(hlwords, function() { + rv = rv.highlightText(this, 'highlight'); + }); + return rv; +} + +/** + * Porter Stemmer + */ +var PorterStemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + + +/** + * Search Module + */ +var Search = { + + _index : null, + _queued_query : null, + _pulse_status : -1, + + init : function() { + var params = $.getQueryParameters(); + if (params.q) { + var query = params.q[0]; + $('input[@name="q"]')[0].value = query; + this.performSearch(query); + } + }, + + /** + * Sets the index + */ + setIndex : function(index) { + var q; + this._index = index; + if ((q = this._queued_query) !== null) { + this._queued_query = null; + Search.query(q); + } + }, + + hasIndex : function() { + return this._index !== null; + }, + + deferQuery : function(query) { + this._queued_query = query; + }, + + stopPulse : function() { + this._pulse_status = 0; + }, + + startPulse : function() { + if (this._pulse_status >= 0) + return; + function pulse() { + Search._pulse_status = (Search._pulse_status + 1) % 4; + var dotString = ''; + for (var i = 0; i < Search._pulse_status; i++) + dotString += '.'; + Search.dots.text(dotString); + if (Search._pulse_status > -1) + window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something + */ + performSearch : function(query) { + // create the required interface elements + this.out = $('#search-results'); + this.title = $('

    ' + _('Searching') + '

    ').appendTo(this.out); + this.dots = $('').appendTo(this.title); + this.status = $('

    ').appendTo(this.out); + this.output = $('
    \n') + # skip content-type meta tag with interpolated charset value: + self.html_head.extend(self.head[1:]) + self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo + + self.docinfo + self.body + + self.body_suffix[:-1]) + assert not self.context, 'len(context) = %s' % len(self.context) + + def visit_emphasis(self, node): + self.body.append('') + + def depart_emphasis(self, node): + self.body.append('') + + def visit_entry(self, node): + atts = {'class': []} + if isinstance(node.parent.parent, nodes.thead): + atts['class'].append('head') + if node.parent.parent.parent.stubs[node.parent.column]: + # "stubs" list is an attribute of the tgroup element + atts['class'].append('stub') + if atts['class']: + tagname = 'th' + atts['class'] = ' '.join(atts['class']) + else: + tagname = 'td' + del atts['class'] + node.parent.column += 1 + if node.has_key('morerows'): + atts['rowspan'] = node['morerows'] + 1 + if node.has_key('morecols'): + atts['colspan'] = node['morecols'] + 1 + node.parent.column += node['morecols'] + self.body.append(self.starttag(node, tagname, '', **atts)) + self.context.append('\n' % tagname.lower()) + if len(node) == 0: # empty cell + self.body.append(' ') + self.set_first_last(node) + + def depart_entry(self, node): + self.body.append(self.context.pop()) + + def visit_enumerated_list(self, node): + """ + The 'start' attribute does not conform to HTML 4.01's strict.dtd, but + CSS1 doesn't help. CSS2 isn't widely enough supported yet to be + usable. + """ + atts = {} + if node.has_key('start'): + atts['start'] = node['start'] + if node.has_key('enumtype'): + atts['class'] = node['enumtype'] + # @@@ To do: prefix, suffix. How? Change prefix/suffix to a + # single "format" attribute? Use CSS2? + old_compact_simple = self.compact_simple + self.context.append((self.compact_simple, self.compact_p)) + self.compact_p = None + self.compact_simple = self.is_compactable(node) + if self.compact_simple and not old_compact_simple: + atts['class'] = (atts.get('class', '') + ' simple').strip() + self.body.append(self.starttag(node, 'ol', **atts)) + + def depart_enumerated_list(self, node): + self.compact_simple, self.compact_p = self.context.pop() + self.body.append('\n') + + def visit_field(self, node): + self.body.append(self.starttag(node, 'tr', '', CLASS='field')) + + def depart_field(self, node): + self.body.append('\n') + + def visit_field_body(self, node): + self.body.append(self.starttag(node, 'td', '', CLASS='field-body')) + self.set_class_on_child(node, 'first', 0) + field = node.parent + if (self.compact_field_list or + isinstance(field.parent, nodes.docinfo) or + field.parent.index(field) == len(field.parent) - 1): + # If we are in a compact list, the docinfo, or if this is + # the last field of the field list, do not add vertical + # space after last element. + self.set_class_on_child(node, 'last', -1) + + def depart_field_body(self, node): + self.body.append('\n') + + def visit_field_list(self, node): + self.context.append((self.compact_field_list, self.compact_p)) + self.compact_p = None + if 'compact' in node['classes']: + self.compact_field_list = 1 + elif (self.settings.compact_field_lists + and 'open' not in node['classes']): + self.compact_field_list = 1 + if self.compact_field_list: + for field in node: + field_body = field[-1] + assert isinstance(field_body, nodes.field_body) + children = [n for n in field_body + if not isinstance(n, nodes.Invisible)] + if not (len(children) == 0 or + len(children) == 1 and + isinstance(children[0], nodes.paragraph)): + self.compact_field_list = 0 + break + self.body.append(self.starttag(node, 'table', frame='void', + rules='none', + CLASS='docutils field-list')) + self.body.append('\n' + '\n' + '\n') + + def depart_field_list(self, node): + self.body.append('\n\n') + self.compact_field_list, self.compact_p = self.context.pop() + + def visit_field_name(self, node): + atts = {} + if self.in_docinfo: + atts['class'] = 'docinfo-name' + else: + atts['class'] = 'field-name' + if ( self.settings.field_name_limit + and len(node.astext()) > self.settings.field_name_limit): + atts['colspan'] = 2 + self.context.append('\n ') + else: + self.context.append('') + self.body.append(self.starttag(node, 'th', '', **atts)) + + def depart_field_name(self, node): + self.body.append(':') + self.body.append(self.context.pop()) + + def visit_figure(self, node): + atts = {'class': 'figure'} + if node.get('width'): + atts['style'] = 'width: %spx' % node['width'] + if node.get('align'): + atts['align'] = node['align'] + self.body.append(self.starttag(node, 'div', **atts)) + + def depart_figure(self, node): + self.body.append('\n') + + def visit_footer(self, node): + self.context.append(len(self.body)) + + def depart_footer(self, node): + start = self.context.pop() + footer = [self.starttag(node, 'div', CLASS='footer'), + '\n'] + footer.extend(self.body[start:]) + footer.append('\n\n') + self.footer.extend(footer) + self.body_suffix[:0] = footer + del self.body[start:] + + def visit_footnote(self, node): + self.body.append(self.starttag(node, 'table', + CLASS='docutils footnote', + frame="void", rules="none")) + self.body.append('\n' + '\n' + '') + self.footnote_backrefs(node) + + def footnote_backrefs(self, node): + backlinks = [] + backrefs = node['backrefs'] + if self.settings.footnote_backlinks and backrefs: + if len(backrefs) == 1: + self.context.append('') + self.context.append('') + self.context.append('' + % backrefs[0]) + else: + i = 1 + for backref in backrefs: + backlinks.append('%s' + % (backref, i)) + i += 1 + self.context.append('(%s) ' % ', '.join(backlinks)) + self.context += ['', ''] + else: + self.context.append('') + self.context += ['', ''] + # If the node does not only consist of a label. + if len(node) > 1: + # If there are preceding backlinks, we do not set class + # 'first', because we need to retain the top-margin. + if not backlinks: + node[1]['classes'].append('first') + node[-1]['classes'].append('last') + + def depart_footnote(self, node): + self.body.append('\n' + '\n\n') + + def visit_footnote_reference(self, node): + href = '#' + node['refid'] + format = self.settings.footnote_references + if format == 'brackets': + suffix = '[' + self.context.append(']') + else: + assert format == 'superscript' + suffix = '' + self.context.append('') + self.body.append(self.starttag(node, 'a', suffix, + CLASS='footnote-reference', href=href)) + + def depart_footnote_reference(self, node): + self.body.append(self.context.pop() + '') + + def visit_generated(self, node): + pass + + def depart_generated(self, node): + pass + + def visit_header(self, node): + self.context.append(len(self.body)) + + def depart_header(self, node): + start = self.context.pop() + header = [self.starttag(node, 'div', CLASS='header')] + header.extend(self.body[start:]) + header.append('\n
    \n\n') + self.body_prefix.extend(header) + self.header.extend(header) + del self.body[start:] + + def visit_image(self, node): + atts = {} + atts['src'] = node['uri'] + if node.has_key('width'): + atts['width'] = node['width'] + if node.has_key('height'): + atts['height'] = node['height'] + if node.has_key('scale'): + if Image and not (node.has_key('width') + and node.has_key('height')): + try: + im = Image.open(str(atts['src'])) + except (IOError, # Source image can't be found or opened + UnicodeError): # PIL doesn't like Unicode paths. + pass + else: + if not atts.has_key('width'): + atts['width'] = str(im.size[0]) + if not atts.has_key('height'): + atts['height'] = str(im.size[1]) + del im + for att_name in 'width', 'height': + if atts.has_key(att_name): + match = re.match(r'([0-9.]+)(\S*)$', atts[att_name]) + assert match + atts[att_name] = '%s%s' % ( + float(match.group(1)) * (float(node['scale']) / 100), + match.group(2)) + style = [] + for att_name in 'width', 'height': + if atts.has_key(att_name): + if re.match(r'^[0-9.]+$', atts[att_name]): + # Interpret unitless values as pixels. + atts[att_name] += 'px' + style.append('%s: %s;' % (att_name, atts[att_name])) + del atts[att_name] + if style: + atts['style'] = ' '.join(style) + atts['alt'] = node.get('alt', atts['src']) + if (isinstance(node.parent, nodes.TextElement) or + (isinstance(node.parent, nodes.reference) and + not isinstance(node.parent.parent, nodes.TextElement))): + # Inline context or surrounded by .... + suffix = '' + else: + suffix = '\n' + if node.has_key('align'): + if node['align'] == 'center': + # "align" attribute is set in surrounding "div" element. + self.body.append('
    ') + self.context.append('
    \n') + suffix = '' + else: + # "align" attribute is set in "img" element. + atts['align'] = node['align'] + self.context.append('') + atts['class'] = 'align-%s' % node['align'] + else: + self.context.append('') + self.body.append(self.emptytag(node, 'img', suffix, **atts)) + + def depart_image(self, node): + self.body.append(self.context.pop()) + + def visit_inline(self, node): + self.body.append(self.starttag(node, 'span', '')) + + def depart_inline(self, node): + self.body.append('') + + def visit_label(self, node): + # Context added in footnote_backrefs. + self.body.append(self.starttag(node, 'td', '%s[' % self.context.pop(), + CLASS='label')) + + def depart_label(self, node): + # Context added in footnote_backrefs. + self.body.append(']%s%s' % (self.context.pop(), self.context.pop())) + + def visit_legend(self, node): + self.body.append(self.starttag(node, 'div', CLASS='legend')) + + def depart_legend(self, node): + self.body.append('\n') + + def visit_line(self, node): + self.body.append(self.starttag(node, 'div', suffix='', CLASS='line')) + if not len(node): + self.body.append('
    ') + + def depart_line(self, node): + self.body.append('\n') + + def visit_line_block(self, node): + self.body.append(self.starttag(node, 'div', CLASS='line-block')) + + def depart_line_block(self, node): + self.body.append('\n') + + def visit_list_item(self, node): + self.body.append(self.starttag(node, 'li', '')) + if len(node): + node[0]['classes'].append('first') + + def depart_list_item(self, node): + self.body.append('\n') + + def visit_literal(self, node): + """Process text to prevent tokens from wrapping.""" + self.body.append( + self.starttag(node, 'tt', '', CLASS='docutils literal')) + text = node.astext() + for token in self.words_and_spaces.findall(text): + if token.strip(): + # Protect text like "--an-option" from bad line wrapping: + self.body.append('%s' + % self.encode(token)) + elif token in ('\n', ' '): + # Allow breaks at whitespace: + self.body.append(token) + else: + # Protect runs of multiple spaces; the last space can wrap: + self.body.append(' ' * (len(token) - 1) + ' ') + self.body.append('') + # Content already processed: + raise nodes.SkipNode + + def visit_literal_block(self, node): + self.body.append(self.starttag(node, 'pre', CLASS='literal-block')) + + def depart_literal_block(self, node): + self.body.append('\n\n') + + def visit_meta(self, node): + meta = self.emptytag(node, 'meta', **node.non_default_attributes()) + self.add_meta(meta) + + def depart_meta(self, node): + pass + + def add_meta(self, tag): + self.meta.append(tag) + self.head.append(tag) + + def visit_option(self, node): + if self.context[-1]: + self.body.append(', ') + self.body.append(self.starttag(node, 'span', '', CLASS='option')) + + def depart_option(self, node): + self.body.append('') + self.context[-1] += 1 + + def visit_option_argument(self, node): + self.body.append(node.get('delimiter', ' ')) + self.body.append(self.starttag(node, 'var', '')) + + def depart_option_argument(self, node): + self.body.append('') + + def visit_option_group(self, node): + atts = {} + if ( self.settings.option_limit + and len(node.astext()) > self.settings.option_limit): + atts['colspan'] = 2 + self.context.append('\n ') + else: + self.context.append('') + self.body.append( + self.starttag(node, 'td', CLASS='option-group', **atts)) + self.body.append('') + self.context.append(0) # count number of options + + def depart_option_group(self, node): + self.context.pop() + self.body.append('\n') + self.body.append(self.context.pop()) + + def visit_option_list(self, node): + self.body.append( + self.starttag(node, 'table', CLASS='docutils option-list', + frame="void", rules="none")) + self.body.append('\n' + '\n' + '\n') + + def depart_option_list(self, node): + self.body.append('\n\n') + + def visit_option_list_item(self, node): + self.body.append(self.starttag(node, 'tr', '')) + + def depart_option_list_item(self, node): + self.body.append('\n') + + def visit_option_string(self, node): + pass + + def depart_option_string(self, node): + pass + + def visit_organization(self, node): + self.visit_docinfo_item(node, 'organization') + + def depart_organization(self, node): + self.depart_docinfo_item() + + def should_be_compact_paragraph(self, node): + """ + Determine if the

    tags around paragraph ``node`` can be omitted. + """ + if (isinstance(node.parent, nodes.document) or + isinstance(node.parent, nodes.compound)): + # Never compact paragraphs in document or compound. + return 0 + for key, value in node.attlist(): + if (node.is_not_default(key) and + not (key == 'classes' and value in + ([], ['first'], ['last'], ['first', 'last']))): + # Attribute which needs to survive. + return 0 + first = isinstance(node.parent[0], nodes.label) # skip label + for child in node.parent.children[first:]: + # only first paragraph can be compact + if isinstance(child, nodes.Invisible): + continue + if child is node: + break + return 0 + parent_length = len([n for n in node.parent if not isinstance( + n, (nodes.Invisible, nodes.label))]) + if ( self.compact_simple + or self.compact_field_list + or self.compact_p and parent_length == 1): + return 1 + return 0 + + def visit_paragraph(self, node): + if self.should_be_compact_paragraph(node): + self.context.append('') + else: + self.body.append(self.starttag(node, 'p', '')) + self.context.append('

    \n') + + def depart_paragraph(self, node): + self.body.append(self.context.pop()) + + def visit_problematic(self, node): + if node.hasattr('refid'): + self.body.append('' % node['refid']) + self.context.append('') + else: + self.context.append('') + self.body.append(self.starttag(node, 'span', '', CLASS='problematic')) + + def depart_problematic(self, node): + self.body.append('') + self.body.append(self.context.pop()) + + def visit_raw(self, node): + if 'html' in node.get('format', '').split(): + t = isinstance(node.parent, nodes.TextElement) and 'span' or 'div' + if node['classes']: + self.body.append(self.starttag(node, t, suffix='')) + self.body.append(node.astext()) + if node['classes']: + self.body.append('' % t) + # Keep non-HTML raw text out of output: + raise nodes.SkipNode + + def visit_reference(self, node): + atts = {'class': 'reference'} + if node.has_key('refuri'): + atts['href'] = node['refuri'] + if ( self.settings.cloak_email_addresses + and atts['href'].startswith('mailto:')): + atts['href'] = self.cloak_mailto(atts['href']) + self.in_mailto = 1 + atts['class'] += ' external' + else: + assert node.has_key('refid'), \ + 'References must have "refuri" or "refid" attribute.' + atts['href'] = '#' + node['refid'] + atts['class'] += ' internal' + if not isinstance(node.parent, nodes.TextElement): + assert len(node) == 1 and isinstance(node[0], nodes.image) + atts['class'] += ' image-reference' + self.body.append(self.starttag(node, 'a', '', **atts)) + + def depart_reference(self, node): + self.body.append('') + if not isinstance(node.parent, nodes.TextElement): + self.body.append('\n') + self.in_mailto = 0 + + def visit_revision(self, node): + self.visit_docinfo_item(node, 'revision', meta=None) + + def depart_revision(self, node): + self.depart_docinfo_item() + + def visit_row(self, node): + self.body.append(self.starttag(node, 'tr', '')) + node.column = 0 + + def depart_row(self, node): + self.body.append('\n') + + def visit_rubric(self, node): + self.body.append(self.starttag(node, 'p', '', CLASS='rubric')) + + def depart_rubric(self, node): + self.body.append('

    \n') + + def visit_section(self, node): + self.section_level += 1 + self.body.append( + self.starttag(node, 'div', CLASS='section')) + + def depart_section(self, node): + self.section_level -= 1 + self.body.append('\n') + + def visit_sidebar(self, node): + self.body.append( + self.starttag(node, 'div', CLASS='sidebar')) + self.set_first_last(node) + self.in_sidebar = 1 + + def depart_sidebar(self, node): + self.body.append('\n') + self.in_sidebar = None + + def visit_status(self, node): + self.visit_docinfo_item(node, 'status', meta=None) + + def depart_status(self, node): + self.depart_docinfo_item() + + def visit_strong(self, node): + self.body.append('') + + def depart_strong(self, node): + self.body.append('') + + def visit_subscript(self, node): + self.body.append(self.starttag(node, 'sub', '')) + + def depart_subscript(self, node): + self.body.append('') + + def visit_substitution_definition(self, node): + """Internal only.""" + raise nodes.SkipNode + + def visit_substitution_reference(self, node): + self.unimplemented_visit(node) + + def visit_subtitle(self, node): + if isinstance(node.parent, nodes.sidebar): + self.body.append(self.starttag(node, 'p', '', + CLASS='sidebar-subtitle')) + self.context.append('

    \n') + elif isinstance(node.parent, nodes.document): + self.body.append(self.starttag(node, 'h2', '', CLASS='subtitle')) + self.context.append('\n') + self.in_document_title = len(self.body) + elif isinstance(node.parent, nodes.section): + tag = 'h%s' % (self.section_level + self.initial_header_level - 1) + self.body.append( + self.starttag(node, tag, '', CLASS='section-subtitle') + + self.starttag({}, 'span', '', CLASS='section-subtitle')) + self.context.append('\n' % tag) + + def depart_subtitle(self, node): + self.body.append(self.context.pop()) + if self.in_document_title: + self.subtitle = self.body[self.in_document_title:-1] + self.in_document_title = 0 + self.body_pre_docinfo.extend(self.body) + self.html_subtitle.extend(self.body) + del self.body[:] + + def visit_superscript(self, node): + self.body.append(self.starttag(node, 'sup', '')) + + def depart_superscript(self, node): + self.body.append('') + + def visit_system_message(self, node): + self.body.append(self.starttag(node, 'div', CLASS='system-message')) + self.body.append('

    ') + backref_text = '' + if len(node['backrefs']): + backrefs = node['backrefs'] + if len(backrefs) == 1: + backref_text = ('; backlink' + % backrefs[0]) + else: + i = 1 + backlinks = [] + for backref in backrefs: + backlinks.append('%s' % (backref, i)) + i += 1 + backref_text = ('; backlinks: %s' + % ', '.join(backlinks)) + if node.hasattr('line'): + line = ', line %s' % node['line'] + else: + line = '' + self.body.append('System Message: %s/%s ' + '(%s%s)%s

    \n' + % (node['type'], node['level'], + self.encode(node['source']), line, backref_text)) + + def depart_system_message(self, node): + self.body.append('\n') + + def visit_table(self, node): + self.body.append( + self.starttag(node, 'table', CLASS='docutils', border="1")) + + def depart_table(self, node): + self.body.append('\n') + + def visit_target(self, node): + if not (node.has_key('refuri') or node.has_key('refid') + or node.has_key('refname')): + self.body.append(self.starttag(node, 'span', '', CLASS='target')) + self.context.append('') + else: + self.context.append('') + + def depart_target(self, node): + self.body.append(self.context.pop()) + + def visit_tbody(self, node): + self.write_colspecs() + self.body.append(self.context.pop()) # '\n' or '' + self.body.append(self.starttag(node, 'tbody', valign='top')) + + def depart_tbody(self, node): + self.body.append('\n') + + def visit_term(self, node): + self.body.append(self.starttag(node, 'dt', '')) + + def depart_term(self, node): + """ + Leave the end tag to `self.visit_definition()`, in case there's a + classifier. + """ + pass + + def visit_tgroup(self, node): + # Mozilla needs : + self.body.append(self.starttag(node, 'colgroup')) + # Appended by thead or tbody: + self.context.append('\n') + node.stubs = [] + + def depart_tgroup(self, node): + pass + + def visit_thead(self, node): + self.write_colspecs() + self.body.append(self.context.pop()) # '\n' + # There may or may not be a ; this is for to use: + self.context.append('') + self.body.append(self.starttag(node, 'thead', valign='bottom')) + + def depart_thead(self, node): + self.body.append('\n') + + def visit_title(self, node): + """Only 6 section levels are supported by HTML.""" + check_id = 0 + close_tag = '

    \n' + if isinstance(node.parent, nodes.topic): + self.body.append( + self.starttag(node, 'p', '', CLASS='topic-title first')) + elif isinstance(node.parent, nodes.sidebar): + self.body.append( + self.starttag(node, 'p', '', CLASS='sidebar-title')) + elif isinstance(node.parent, nodes.Admonition): + self.body.append( + self.starttag(node, 'p', '', CLASS='admonition-title')) + elif isinstance(node.parent, nodes.table): + self.body.append( + self.starttag(node, 'caption', '')) + close_tag = '\n' + elif isinstance(node.parent, nodes.document): + self.body.append(self.starttag(node, 'h1', '', CLASS='title')) + close_tag = '\n' + self.in_document_title = len(self.body) + else: + assert isinstance(node.parent, nodes.section) + h_level = self.section_level + self.initial_header_level - 1 + atts = {} + if (len(node.parent) >= 2 and + isinstance(node.parent[1], nodes.subtitle)): + atts['CLASS'] = 'with-subtitle' + self.body.append( + self.starttag(node, 'h%s' % h_level, '', **atts)) + atts = {} + if node.hasattr('refid'): + atts['class'] = 'toc-backref' + atts['href'] = '#' + node['refid'] + if atts: + self.body.append(self.starttag({}, 'a', '', **atts)) + close_tag = '\n' % (h_level) + else: + close_tag = '\n' % (h_level) + self.context.append(close_tag) + + def depart_title(self, node): + self.body.append(self.context.pop()) + if self.in_document_title: + self.title = self.body[self.in_document_title:-1] + self.in_document_title = 0 + self.body_pre_docinfo.extend(self.body) + self.html_title.extend(self.body) + del self.body[:] + + def visit_title_reference(self, node): + self.body.append(self.starttag(node, 'cite', '')) + + def depart_title_reference(self, node): + self.body.append('') + + def visit_topic(self, node): + self.body.append(self.starttag(node, 'div', CLASS='topic')) + self.topic_classes = node['classes'] + + def depart_topic(self, node): + self.body.append('\n') + self.topic_classes = [] + + def visit_transition(self, node): + self.body.append(self.emptytag(node, 'hr', CLASS='docutils')) + + def depart_transition(self, node): + pass + + def visit_version(self, node): + self.visit_docinfo_item(node, 'version', meta=None) + + def depart_version(self, node): + self.depart_docinfo_item() + + def unimplemented_visit(self, node): + raise NotImplementedError('visiting unimplemented node type: %s' + % node.__class__.__name__) + + +class SimpleListChecker(nodes.GenericNodeVisitor): + + """ + Raise `nodes.NodeFound` if non-simple list item is encountered. + + Here "simple" means a list item containing nothing other than a single + paragraph, a simple list, or a paragraph followed by a simple list. + """ + + def default_visit(self, node): + raise nodes.NodeFound + + def visit_bullet_list(self, node): + pass + + def visit_enumerated_list(self, node): + pass + + def visit_list_item(self, node): + children = [] + for child in node.children: + if not isinstance(child, nodes.Invisible): + children.append(child) + if (children and isinstance(children[0], nodes.paragraph) + and (isinstance(children[-1], nodes.bullet_list) + or isinstance(children[-1], nodes.enumerated_list))): + children.pop() + if len(children) <= 1: + return + else: + raise nodes.NodeFound + + def visit_paragraph(self, node): + raise nodes.SkipNode + + def invisible_visit(self, node): + """Invisible nodes should be ignored.""" + raise nodes.SkipNode + + visit_comment = invisible_visit + visit_substitution_definition = invisible_visit + visit_target = invisible_visit + visit_pending = invisible_visit diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/html4css1/html4css1.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/html4css1/html4css1.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,273 @@ +/* +:Author: David Goodger (goodger@python.org) +:Id: $Id: html4css1.css 5196 2007-06-03 20:25:28Z wiemann $ +:Copyright: This stylesheet has been placed in the public domain. + +Default cascading style sheet for the HTML output of Docutils. + +See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to +customize this style sheet. +*/ + +/* used to remove borders from tables and images */ +.borderless, table.borderless td, table.borderless th { + border: 0 } + +table.borderless td, table.borderless th { + /* Override padding for "table.docutils td" with "! important". + The right padding separates the table cells. */ + padding: 0 0.5em 0 0 ! important } + +.first { + /* Override more specific margin styles with "! important". */ + margin-top: 0 ! important } + +.last, .with-subtitle { + margin-bottom: 0 ! important } + +.hidden { + display: none } + +a.toc-backref { + text-decoration: none ; + color: black } + +blockquote.epigraph { + margin: 2em 5em ; } + +dl.docutils dd { + margin-bottom: 0.5em } + +/* Uncomment (and remove this text!) to get bold-faced definition list terms +dl.docutils dt { + font-weight: bold } +*/ + +div.abstract { + margin: 2em 5em } + +div.abstract p.topic-title { + font-weight: bold ; + text-align: center } + +div.admonition, div.attention, div.caution, div.danger, div.error, +div.hint, div.important, div.note, div.tip, div.warning { + margin: 2em ; + border: medium outset ; + padding: 1em } + +div.admonition p.admonition-title, div.hint p.admonition-title, +div.important p.admonition-title, div.note p.admonition-title, +div.tip p.admonition-title { + font-weight: bold ; + font-family: sans-serif } + +div.attention p.admonition-title, div.caution p.admonition-title, +div.danger p.admonition-title, div.error p.admonition-title, +div.warning p.admonition-title { + color: red ; + font-weight: bold ; + font-family: sans-serif } + +/* Uncomment (and remove this text!) to get reduced vertical space in + compound paragraphs. +div.compound .compound-first, div.compound .compound-middle { + margin-bottom: 0.5em } + +div.compound .compound-last, div.compound .compound-middle { + margin-top: 0.5em } +*/ + +div.dedication { + margin: 2em 5em ; + text-align: center ; + font-style: italic } + +div.dedication p.topic-title { + font-weight: bold ; + font-style: normal } + +div.figure { + margin-left: 2em ; + margin-right: 2em } + +div.footer, div.header { + clear: both; + font-size: smaller } + +div.line-block { + display: block ; + margin-top: 1em ; + margin-bottom: 1em } + +div.line-block div.line-block { + margin-top: 0 ; + margin-bottom: 0 ; + margin-left: 1.5em } + +div.sidebar { + margin: 0 0 0.5em 1em ; + border: medium outset ; + padding: 1em ; + background-color: #ffffee ; + width: 40% ; + float: right ; + clear: right } + +div.sidebar p.rubric { + font-family: sans-serif ; + font-size: medium } + +div.system-messages { + margin: 5em } + +div.system-messages h1 { + color: red } + +div.system-message { + border: medium outset ; + padding: 1em } + +div.system-message p.system-message-title { + color: red ; + font-weight: bold } + +div.topic { + margin: 2em } + +h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, +h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { + margin-top: 0.4em } + +h1.title { + text-align: center } + +h2.subtitle { + text-align: center } + +hr.docutils { + width: 75% } + +img.align-left { + clear: left } + +img.align-right { + clear: right } + +ol.simple, ul.simple { + margin-bottom: 1em } + +ol.arabic { + list-style: decimal } + +ol.loweralpha { + list-style: lower-alpha } + +ol.upperalpha { + list-style: upper-alpha } + +ol.lowerroman { + list-style: lower-roman } + +ol.upperroman { + list-style: upper-roman } + +p.attribution { + text-align: right ; + margin-left: 50% } + +p.caption { + font-style: italic } + +p.credits { + font-style: italic ; + font-size: smaller } + +p.label { + white-space: nowrap } + +p.rubric { + font-weight: bold ; + font-size: larger ; + color: maroon ; + text-align: center } + +p.sidebar-title { + font-family: sans-serif ; + font-weight: bold ; + font-size: larger } + +p.sidebar-subtitle { + font-family: sans-serif ; + font-weight: bold } + +p.topic-title { + font-weight: bold } + +pre.address { + margin-bottom: 0 ; + margin-top: 0 ; + font-family: serif ; + font-size: 100% } + +pre.literal-block, pre.doctest-block { + margin-left: 2em ; + margin-right: 2em } + +span.classifier { + font-family: sans-serif ; + font-style: oblique } + +span.classifier-delimiter { + font-family: sans-serif ; + font-weight: bold } + +span.interpreted { + font-family: sans-serif } + +span.option { + white-space: nowrap } + +span.pre { + white-space: pre } + +span.problematic { + color: red } + +span.section-subtitle { + /* font-size relative to parent (h1..h6 element) */ + font-size: 80% } + +table.citation { + border-left: solid 1px gray; + margin-left: 1px } + +table.docinfo { + margin: 2em 4em } + +table.docutils { + margin-top: 0.5em ; + margin-bottom: 0.5em } + +table.footnote { + border-left: solid 1px black; + margin-left: 1px } + +table.docutils td, table.docutils th, +table.docinfo td, table.docinfo th { + padding-left: 0.5em ; + padding-right: 0.5em ; + vertical-align: top } + +table.docutils th.field-name, table.docinfo th.docinfo-name { + font-weight: bold ; + text-align: left ; + white-space: nowrap ; + padding-left: 0 } + +h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, +h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { + font-size: 100% } + +ul.auto-toc { + list-style-type: none } diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/html4css1/template.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/html4css1/template.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,8 @@ +%(head_prefix)s +%(head)s +%(stylesheet)s +%(body_prefix)s +%(body_pre_docinfo)s +%(docinfo)s +%(body)s +%(body_suffix)s diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/latex2e/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/latex2e/__init__.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,2177 @@ +# $Id: __init__.py 5333 2007-07-10 17:31:28Z grubert $ +# Author: Engelbert Gruber +# Copyright: This module has been placed in the public domain. + +""" +LaTeX2e document tree Writer. +""" + +__docformat__ = 'reStructuredText' + +# code contributions from several people included, thanks to all. +# some named: David Abrahams, Julien Letessier, Lele Gaifax, and others. +# +# convention deactivate code by two # e.g. ##. + +import sys +import time +import re +import string +from types import ListType +from docutils import frontend, nodes, languages, writers, utils +from docutils.writers.newlatex2e import unicode_map + +from docutils.transforms.references import DanglingReferencesVisitor + +class Writer(writers.Writer): + + supported = ('latex','latex2e') + """Formats this writer supports.""" + + settings_spec = ( + 'LaTeX-Specific Options', + 'The LaTeX "--output-encoding" default is "latin-1:strict".', + (('Specify documentclass. Default is "article".', + ['--documentclass'], + {'default': 'article', }), + ('Specify document options. Multiple options can be given, ' + 'separated by commas. Default is "10pt,a4paper".', + ['--documentoptions'], + {'default': '10pt,a4paper', }), + ('Use LaTeX footnotes. LaTeX supports only numbered footnotes (does it?). ' + 'Default: no, uses figures.', + ['--use-latex-footnotes'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Format for footnote references: one of "superscript" or ' + '"brackets". Default is "superscript".', + ['--footnote-references'], + {'choices': ['superscript', 'brackets'], 'default': 'superscript', + 'metavar': '', + 'overrides': 'trim_footnote_reference_space'}), + ('Use LaTeX citations. ' + 'Default: no, uses figures which might get mixed with images.', + ['--use-latex-citations'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Format for block quote attributions: one of "dash" (em-dash ' + 'prefix), "parentheses"/"parens", or "none". Default is "dash".', + ['--attribution'], + {'choices': ['dash', 'parentheses', 'parens', 'none'], + 'default': 'dash', 'metavar': ''}), + ('Specify a stylesheet file. The file will be "input" by latex in ' + 'the document header. Default is no stylesheet (""). ' + 'Overrides --stylesheet-path.', + ['--stylesheet'], + {'default': '', 'metavar': '', + 'overrides': 'stylesheet_path'}), + ('Specify a stylesheet file, relative to the current working ' + 'directory. Overrides --stylesheet.', + ['--stylesheet-path'], + {'metavar': '', 'overrides': 'stylesheet'}), + ('Table of contents by docutils (default) or LaTeX. LaTeX (writer) ' + 'supports only one ToC per document, but docutils does not know of ' + 'pagenumbers. LaTeX table of contents also means LaTeX generates ' + 'sectionnumbers.', + ['--use-latex-toc'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Add parts on top of the section hierarchy.', + ['--use-part-section'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Let LaTeX print author and date, do not show it in docutils ' + 'document info.', + ['--use-latex-docinfo'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Use LaTeX abstract environment for the documents abstract.' + 'Per default the abstract is an unnumbered section.', + ['--use-latex-abstract'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Color of any hyperlinks embedded in text ' + '(default: "blue", "0" to disable).', + ['--hyperlink-color'], {'default': 'blue'}), + ('Enable compound enumerators for nested enumerated lists ' + '(e.g. "1.2.a.ii"). Default: disabled.', + ['--compound-enumerators'], + {'default': None, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Disable compound enumerators for nested enumerated lists. This is ' + 'the default.', + ['--no-compound-enumerators'], + {'action': 'store_false', 'dest': 'compound_enumerators'}), + ('Enable section ("." subsection ...) prefixes for compound ' + 'enumerators. This has no effect without --compound-enumerators. ' + 'Default: disabled.', + ['--section-prefix-for-enumerators'], + {'default': None, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Disable section prefixes for compound enumerators. ' + 'This is the default.', + ['--no-section-prefix-for-enumerators'], + {'action': 'store_false', 'dest': 'section_prefix_for_enumerators'}), + ('Set the separator between section number and enumerator ' + 'for compound enumerated lists. Default is "-".', + ['--section-enumerator-separator'], + {'default': '-', 'metavar': ''}), + ('When possibile, use verbatim for literal-blocks. ' + 'Default is to always use the mbox environment.', + ['--use-verbatim-when-possible'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Table style. "standard" with horizontal and vertical lines, ' + '"booktabs" (LaTeX booktabs style) only horizontal lines ' + 'above and below the table and below the header or "nolines". ' + 'Default: "standard"', + ['--table-style'], + {'choices': ['standard', 'booktabs','nolines'], 'default': 'standard', + 'metavar': ''}), + ('LaTeX graphicx package option. ' + 'Possible values are "dvips", "pdftex". "auto" includes LaTeX code ' + 'to use "pdftex" if processing with pdf(la)tex and dvips otherwise. ' + 'Default is no option.', + ['--graphicx-option'], + {'default': ''}), + ('LaTeX font encoding. ' + 'Possible values are "T1", "OT1", "" or some other fontenc option. ' + 'The font encoding influences available symbols, e.g. "<<" as one ' + 'character. Default is "" which leads to package "ae" (a T1 ' + 'emulation using CM fonts).', + ['--font-encoding'], + {'default': ''}), + ('Per default the latex-writer puts the reference title into ' + 'hyperreferences. Specify "ref*" or "pageref*" to get the section ' + 'number or the page number.', + ['--reference-label'], + {'default': None, }), + ('Specify style and database for bibtex, for example ' + '"--use-bibtex=mystyle,mydb1,mydb2".', + ['--use-bibtex'], + {'default': None, }), + ),) + + settings_defaults = {'output_encoding': 'latin-1'} + + relative_path_settings = ('stylesheet_path',) + + config_section = 'latex2e writer' + config_section_dependencies = ('writers',) + + visitor_attributes = ("head_prefix", "head", + "body_prefix", "body", "body_suffix") + + output = None + """Final translated form of `document`.""" + + def __init__(self): + writers.Writer.__init__(self) + self.translator_class = LaTeXTranslator + + def translate(self): + visitor = self.translator_class(self.document) + self.document.walkabout(visitor) + self.output = visitor.astext() + # copy parts + for attr in self.visitor_attributes: + setattr(self, attr, getattr(visitor, attr)) + + def assemble_parts(self): + writers.Writer.assemble_parts(self) + for part in self.visitor_attributes: + self.parts[part] = ''.join(getattr(self, part)) + + +""" +Notes on LaTeX +-------------- + +* LaTeX does not support multiple tocs in one document. + (might be no limitation except for docutils documentation) + + The "minitoc" latex package can produce per-chapter tocs in + book and report document classes. + +* width + + * linewidth - width of a line in the local environment + * textwidth - the width of text on the page + + Maybe always use linewidth ? + + *Bug* inside a minipage a (e.g. Sidebar) the linewidth is + not changed, needs fix in docutils so that tables + are not too wide. + + So we add locallinewidth set it initially and + on entering sidebar and reset on exit. +""" + +class Babel: + """Language specifics for LaTeX.""" + # country code by a.schlock. + # partly manually converted from iso and babel stuff, dialects and some + _ISO639_TO_BABEL = { + 'no': 'norsk', #XXX added by hand ( forget about nynorsk?) + 'gd': 'scottish', #XXX added by hand + 'hu': 'magyar', #XXX added by hand + 'pt': 'portuguese',#XXX added by hand + 'sl': 'slovenian', + 'af': 'afrikaans', + 'bg': 'bulgarian', + 'br': 'breton', + 'ca': 'catalan', + 'cs': 'czech', + 'cy': 'welsh', + 'da': 'danish', + 'fr': 'french', + # french, francais, canadien, acadian + 'de': 'ngerman', #XXX rather than german + # ngerman, naustrian, german, germanb, austrian + 'el': 'greek', + 'en': 'english', + # english, USenglish, american, UKenglish, british, canadian + 'eo': 'esperanto', + 'es': 'spanish', + 'et': 'estonian', + 'eu': 'basque', + 'fi': 'finnish', + 'ga': 'irish', + 'gl': 'galician', + 'he': 'hebrew', + 'hr': 'croatian', + 'hu': 'hungarian', + 'is': 'icelandic', + 'it': 'italian', + 'la': 'latin', + 'nl': 'dutch', + 'pl': 'polish', + 'pt': 'portuguese', + 'ro': 'romanian', + 'ru': 'russian', + 'sk': 'slovak', + 'sr': 'serbian', + 'sv': 'swedish', + 'tr': 'turkish', + 'uk': 'ukrainian' + } + + def __init__(self,lang): + self.language = lang + # pdflatex does not produce double quotes for ngerman in tt. + self.double_quote_replacment = None + if re.search('^de',self.language): + #self.quotes = ("\"`", "\"'") + self.quotes = ('{\\glqq}', '{\\grqq}') + self.double_quote_replacment = "{\\dq}" + elif re.search('^it',self.language): + self.quotes = ("``", "''") + self.double_quote_replacment = r'{\char`\"}' + else: + self.quotes = ("``", "''") + self.quote_index = 0 + + def next_quote(self): + q = self.quotes[self.quote_index] + self.quote_index = (self.quote_index+1)%2 + return q + + def quote_quotes(self,text): + t = None + for part in text.split('"'): + if t == None: + t = part + else: + t += self.next_quote() + part + return t + + def double_quotes_in_tt (self,text): + if not self.double_quote_replacment: + return text + return text.replace('"', self.double_quote_replacment) + + def get_language(self): + if self._ISO639_TO_BABEL.has_key(self.language): + return self._ISO639_TO_BABEL[self.language] + else: + # support dialects. + l = self.language.split("_")[0] + if self._ISO639_TO_BABEL.has_key(l): + return self._ISO639_TO_BABEL[l] + return None + + +latex_headings = { + 'optionlist_environment' : [ + '\\newcommand{\\optionlistlabel}[1]{\\bf #1 \\hfill}\n' + '\\newenvironment{optionlist}[1]\n' + '{\\begin{list}{}\n' + ' {\\setlength{\\labelwidth}{#1}\n' + ' \\setlength{\\rightmargin}{1cm}\n' + ' \\setlength{\\leftmargin}{\\rightmargin}\n' + ' \\addtolength{\\leftmargin}{\\labelwidth}\n' + ' \\addtolength{\\leftmargin}{\\labelsep}\n' + ' \\renewcommand{\\makelabel}{\\optionlistlabel}}\n' + '}{\\end{list}}\n', + ], + 'lineblock_environment' : [ + '\\newlength{\\lineblockindentation}\n' + '\\setlength{\\lineblockindentation}{2.5em}\n' + '\\newenvironment{lineblock}[1]\n' + '{\\begin{list}{}\n' + ' {\\setlength{\\partopsep}{\\parskip}\n' + ' \\addtolength{\\partopsep}{\\baselineskip}\n' + ' \\topsep0pt\\itemsep0.15\\baselineskip\\parsep0pt\n' + ' \\leftmargin#1}\n' + ' \\raggedright}\n' + '{\\end{list}}\n' + ], + 'footnote_floats' : [ + '% begin: floats for footnotes tweaking.\n', + '\\setlength{\\floatsep}{0.5em}\n', + '\\setlength{\\textfloatsep}{\\fill}\n', + '\\addtolength{\\textfloatsep}{3em}\n', + '\\renewcommand{\\textfraction}{0.5}\n', + '\\renewcommand{\\topfraction}{0.5}\n', + '\\renewcommand{\\bottomfraction}{0.5}\n', + '\\setcounter{totalnumber}{50}\n', + '\\setcounter{topnumber}{50}\n', + '\\setcounter{bottomnumber}{50}\n', + '% end floats for footnotes\n', + ], + 'some_commands' : [ + '% some commands, that could be overwritten in the style file.\n' + '\\newcommand{\\rubric}[1]' + '{\\subsection*{~\\hfill {\\it #1} \\hfill ~}}\n' + '\\newcommand{\\titlereference}[1]{\\textsl{#1}}\n' + '% end of "some commands"\n', + ] + } + +class DocumentClass: + """Details of a LaTeX document class.""" + + def __init__(self, document_class, with_part=False): + self.document_class = document_class + self._with_part = with_part + + def section(self, level): + """ Return the section name at the given level for the specific + document class. + + Level is 1,2,3..., as level 0 is the title.""" + + sections = [ 'section', 'subsection', 'subsubsection', + 'paragraph', 'subparagraph' ] + if self.document_class in ('book', 'report', 'scrreprt', 'scrbook'): + sections.insert(0, 'chapter') + if self._with_part: + sections.insert(0, 'part') + if level <= len(sections): + return sections[level-1] + else: + return sections[-1] + +class Table: + """ Manage a table while traversing. + Maybe change to a mixin defining the visit/departs, but then + class Table internal variables are in the Translator. + + Table style might be + + * standard: horizontal and vertical lines + * booktabs (requires booktabs latex package): only horizontal lines + * nolines, borderless : no lines + """ + def __init__(self,latex_type,table_style): + self._latex_type = latex_type + self._table_style = table_style + self._open = 0 + # miscellaneous attributes + self._attrs = {} + self._col_width = [] + self._rowspan = [] + self.stubs = [] + + def open(self): + self._open = 1 + self._col_specs = [] + self.caption = None + self._attrs = {} + self._in_head = 0 # maybe context with search + def close(self): + self._open = 0 + self._col_specs = None + self.caption = None + self._attrs = {} + self.stubs = [] + def is_open(self): + return self._open + + def set_table_style(self, table_style): + if not table_style in ('standard','booktabs','borderless','nolines'): + return + self._table_style = table_style + + def used_packages(self): + if self._table_style == 'booktabs': + return '\\usepackage{booktabs}\n' + return '' + def get_latex_type(self): + return self._latex_type + + def set(self,attr,value): + self._attrs[attr] = value + def get(self,attr): + if self._attrs.has_key(attr): + return self._attrs[attr] + return None + def get_vertical_bar(self): + if self._table_style == 'standard': + return '|' + return '' + # horizontal lines are drawn below a row, because we. + def get_opening(self): + if self._latex_type == 'longtable': + # otherwise longtable might move before paragraph and subparagraph + prefix = '\\leavevmode\n' + else: + prefix = '' + return '%s\\begin{%s}[c]' % (prefix, self._latex_type) + def get_closing(self): + line = "" + if self._table_style == 'booktabs': + line = '\\bottomrule\n' + elif self._table_style == 'standard': + lines = '\\hline\n' + return '%s\\end{%s}' % (line,self._latex_type) + + def visit_colspec(self, node): + self._col_specs.append(node) + # "stubs" list is an attribute of the tgroup element: + self.stubs.append(node.attributes.get('stub')) + + def get_colspecs(self): + """ + Return column specification for longtable. + + Assumes reST line length being 80 characters. + Table width is hairy. + + === === + ABC DEF + === === + + usually gets to narrow, therefore we add 1 (fiddlefactor). + """ + width = 80 + + total_width = 0.0 + # first see if we get too wide. + for node in self._col_specs: + colwidth = float(node['colwidth']+1) / width + total_width += colwidth + self._col_width = [] + self._rowspan = [] + # donot make it full linewidth + factor = 0.93 + if total_width > 1.0: + factor /= total_width + bar = self.get_vertical_bar() + latex_table_spec = "" + for node in self._col_specs: + colwidth = factor * float(node['colwidth']+1) / width + self._col_width.append(colwidth+0.005) + self._rowspan.append(0) + latex_table_spec += "%sp{%.3f\\locallinewidth}" % (bar,colwidth+0.005) + return latex_table_spec+bar + + def get_column_width(self): + """ return columnwidth for current cell (not multicell) + """ + return "%.2f\\locallinewidth" % self._col_width[self._cell_in_row-1] + + def visit_thead(self): + self._in_thead = 1 + if self._table_style == 'standard': + return ['\\hline\n'] + elif self._table_style == 'booktabs': + return ['\\toprule\n'] + return [] + def depart_thead(self): + a = [] + #if self._table_style == 'standard': + # a.append('\\hline\n') + if self._table_style == 'booktabs': + a.append('\\midrule\n') + if self._latex_type == 'longtable': + a.append('\\endhead\n') + # for longtable one could add firsthead, foot and lastfoot + self._in_thead = 0 + return a + def visit_row(self): + self._cell_in_row = 0 + def depart_row(self): + res = [' \\\\\n'] + self._cell_in_row = None # remove cell counter + for i in range(len(self._rowspan)): + if (self._rowspan[i]>0): + self._rowspan[i] -= 1 + + if self._table_style == 'standard': + rowspans = [] + for i in range(len(self._rowspan)): + if (self._rowspan[i]<=0): + rowspans.append(i+1) + if len(rowspans)==len(self._rowspan): + res.append('\\hline\n') + else: + cline = '' + rowspans.reverse() + # TODO merge clines + while 1: + try: + c_start = rowspans.pop() + except: + break + cline += '\\cline{%d-%d}\n' % (c_start,c_start) + res.append(cline) + return res + + def set_rowspan(self,cell,value): + try: + self._rowspan[cell] = value + except: + pass + def get_rowspan(self,cell): + try: + return self._rowspan[cell] + except: + return 0 + def get_entry_number(self): + return self._cell_in_row + def visit_entry(self): + self._cell_in_row += 1 + def is_stub_column(self): + if len(self.stubs) >= self._cell_in_row: + return self.stubs[self._cell_in_row-1] + return False + + +class LaTeXTranslator(nodes.NodeVisitor): + + # When options are given to the documentclass, latex will pass them + # to other packages, as done with babel. + # Dummy settings might be taken from document settings + + # Templates + # --------- + + latex_head = '\\documentclass[%s]{%s}\n' + linking = '\\usepackage[colorlinks=%s,linkcolor=%s,urlcolor=%s]{hyperref}\n' + stylesheet = '\\input{%s}\n' + # add a generated on day , machine by user using docutils version. + generator = '% generated by Docutils \n' + # Config setting defaults + # ----------------------- + + # use latex tableofcontents or let docutils do it. + use_latex_toc = 0 + + # TODO: use mixins for different implementations. + # list environment for docinfo. else tabularx + use_optionlist_for_docinfo = 0 # NOT YET IN USE + + # Use compound enumerations (1.A.1.) + compound_enumerators = 0 + + # If using compound enumerations, include section information. + section_prefix_for_enumerators = 0 + + # This is the character that separates the section ("." subsection ...) + # prefix from the regular list enumerator. + section_enumerator_separator = '-' + + # default link color + hyperlink_color = "blue" + + def __init__(self, document): + nodes.NodeVisitor.__init__(self, document) + self.settings = settings = document.settings + self.latex_encoding = self.to_latex_encoding(settings.output_encoding) + self.use_latex_toc = settings.use_latex_toc + self.use_latex_docinfo = settings.use_latex_docinfo + self.use_latex_footnotes = settings.use_latex_footnotes + self._use_latex_citations = settings.use_latex_citations + self._reference_label = settings.reference_label + self.hyperlink_color = settings.hyperlink_color + self.compound_enumerators = settings.compound_enumerators + self.font_encoding = settings.font_encoding + self.section_prefix_for_enumerators = ( + settings.section_prefix_for_enumerators) + self.section_enumerator_separator = ( + settings.section_enumerator_separator.replace('_', '\\_')) + if self.hyperlink_color == '0': + self.hyperlink_color = 'black' + self.colorlinks = 'false' + else: + self.colorlinks = 'true' + + if self.settings.use_bibtex: + self.bibtex = self.settings.use_bibtex.split(",",1) + # TODO avoid errors on not declared citations. + else: + self.bibtex = None + # language: labels, bibliographic_fields, and author_separators. + # to allow writing labes for specific languages. + self.language = languages.get_language(settings.language_code) + self.babel = Babel(settings.language_code) + self.author_separator = self.language.author_separators[0] + self.d_options = self.settings.documentoptions + if self.babel.get_language(): + self.d_options += ',%s' % self.babel.get_language() + + self.d_class = DocumentClass(settings.documentclass, + settings.use_part_section) + # object for a table while proccessing. + self.table_stack = [] + self.active_table = Table('longtable',settings.table_style) + + # HACK. Should have more sophisticated typearea handling. + if settings.documentclass.find('scr') == -1: + self.typearea = '\\usepackage[DIV12]{typearea}\n' + else: + if self.d_options.find('DIV') == -1 and self.d_options.find('BCOR') == -1: + self.typearea = '\\typearea{12}\n' + else: + self.typearea = '' + + if self.font_encoding == 'OT1': + fontenc_header = '' + elif self.font_encoding == '': + fontenc_header = '\\usepackage{ae}\n\\usepackage{aeguill}\n' + else: + fontenc_header = '\\usepackage[%s]{fontenc}\n' % (self.font_encoding,) + if self.latex_encoding.startswith('utf8'): + input_encoding = '\\usepackage{ucs}\n\\usepackage[utf8x]{inputenc}\n' + else: + input_encoding = '\\usepackage[%s]{inputenc}\n' % self.latex_encoding + if self.settings.graphicx_option == '': + self.graphicx_package = '\\usepackage{graphicx}\n' + elif self.settings.graphicx_option.lower() == 'auto': + self.graphicx_package = '\n'.join( + ('%Check if we are compiling under latex or pdflatex', + '\\ifx\\pdftexversion\\undefined', + ' \\usepackage{graphicx}', + '\\else', + ' \\usepackage[pdftex]{graphicx}', + '\\fi\n')) + else: + self.graphicx_package = ( + '\\usepackage[%s]{graphicx}\n' % self.settings.graphicx_option) + + self.head_prefix = [ + self.latex_head % (self.d_options,self.settings.documentclass), + '\\usepackage{babel}\n', # language is in documents settings. + fontenc_header, + '\\usepackage{shortvrb}\n', # allows verb in footnotes. + input_encoding, + # * tabularx: for docinfo, automatic width of columns, always on one page. + '\\usepackage{tabularx}\n', + '\\usepackage{longtable}\n', + self.active_table.used_packages(), + # possible other packages. + # * fancyhdr + # * ltxtable is a combination of tabularx and longtable (pagebreaks). + # but ?? + # + # extra space between text in tables and the line above them + '\\setlength{\\extrarowheight}{2pt}\n', + '\\usepackage{amsmath}\n', # what fore amsmath. + self.graphicx_package, + '\\usepackage{color}\n', + '\\usepackage{multirow}\n', + '\\usepackage{ifthen}\n', # before hyperref! + self.linking % (self.colorlinks, self.hyperlink_color, self.hyperlink_color), + self.typearea, + self.generator, + # latex lengths + '\\newlength{\\admonitionwidth}\n', + '\\setlength{\\admonitionwidth}{0.9\\textwidth}\n' + # width for docinfo tablewidth + '\\newlength{\\docinfowidth}\n', + '\\setlength{\\docinfowidth}{0.9\\textwidth}\n' + # linewidth of current environment, so tables are not wider + # than the sidebar: using locallinewidth seems to defer evaluation + # of linewidth, this is fixing it. + '\\newlength{\\locallinewidth}\n', + # will be set later. + ] + self.head_prefix.extend( latex_headings['optionlist_environment'] ) + self.head_prefix.extend( latex_headings['lineblock_environment'] ) + self.head_prefix.extend( latex_headings['footnote_floats'] ) + self.head_prefix.extend( latex_headings['some_commands'] ) + ## stylesheet is last: so it might be possible to overwrite defaults. + stylesheet = utils.get_stylesheet_reference(settings) + if stylesheet: + settings.record_dependencies.add(stylesheet) + self.head_prefix.append(self.stylesheet % (stylesheet)) + + if self.linking: # and maybe check for pdf + self.pdfinfo = [ ] + self.pdfauthor = None + # pdftitle, pdfsubject, pdfauthor, pdfkeywords, + # pdfcreator, pdfproducer + else: + self.pdfinfo = None + # NOTE: Latex wants a date and an author, rst puts this into + # docinfo, so normally we do not want latex author/date handling. + # latex article has its own handling of date and author, deactivate. + # self.astext() adds \title{...} \author{...} \date{...}, even if the + # "..." are empty strings. + self.head = [ ] + # separate title, so we can appen subtitle. + self.title = '' + # if use_latex_docinfo: collects lists of author/organization/contact/address lines + self.author_stack = [] + self.date = '' + + self.body_prefix = ['\\raggedbottom\n'] + self.body = [] + self.body_suffix = ['\n'] + self.section_level = 0 + self.context = [] + self.topic_classes = [] + # column specification for tables + self.table_caption = None + + # Flags to encode + # --------------- + # verbatim: to tell encode not to encode. + self.verbatim = 0 + # insert_newline: to tell encode to replace blanks by "~". + self.insert_none_breaking_blanks = 0 + # insert_newline: to tell encode to add latex newline. + self.insert_newline = 0 + # mbox_newline: to tell encode to add mbox and newline. + self.mbox_newline = 0 + # inside citation reference labels underscores dont need to be escaped. + self.inside_citation_reference_label = 0 + + # Stack of section counters so that we don't have to use_latex_toc. + # This will grow and shrink as processing occurs. + # Initialized for potential first-level sections. + self._section_number = [0] + + # The current stack of enumerations so that we can expand + # them into a compound enumeration. + self._enumeration_counters = [] + + # The maximum number of enumeration counters we've used. + # If we go beyond this number, we need to create a new + # counter; otherwise, just reuse an old one. + self._max_enumeration_counters = 0 + + self._bibitems = [] + + # docinfo. + self.docinfo = None + # inside literal block: no quote mangling. + self.literal_block = 0 + self.literal_block_stack = [] + self.literal = 0 + # true when encoding in math mode + self.mathmode = 0 + + def to_latex_encoding(self,docutils_encoding): + """ + Translate docutils encoding name into latex's. + + Default fallback method is remove "-" and "_" chars from docutils_encoding. + + """ + tr = { "iso-8859-1": "latin1", # west european + "iso-8859-2": "latin2", # east european + "iso-8859-3": "latin3", # esperanto, maltese + "iso-8859-4": "latin4", # north european,scandinavian, baltic + "iso-8859-5": "iso88595", # cyrillic (ISO) + "iso-8859-9": "latin5", # turkish + "iso-8859-15": "latin9", # latin9, update to latin1. + "mac_cyrillic": "maccyr", # cyrillic (on Mac) + "windows-1251": "cp1251", # cyrillic (on Windows) + "koi8-r": "koi8-r", # cyrillic (Russian) + "koi8-u": "koi8-u", # cyrillic (Ukrainian) + "windows-1250": "cp1250", # + "windows-1252": "cp1252", # + "us-ascii": "ascii", # ASCII (US) + # unmatched encodings + #"": "applemac", + #"": "ansinew", # windows 3.1 ansi + #"": "ascii", # ASCII encoding for the range 32--127. + #"": "cp437", # dos latine us + #"": "cp850", # dos latin 1 + #"": "cp852", # dos latin 2 + #"": "decmulti", + #"": "latin10", + #"iso-8859-6": "" # arabic + #"iso-8859-7": "" # greek + #"iso-8859-8": "" # hebrew + #"iso-8859-10": "" # latin6, more complete iso-8859-4 + } + if tr.has_key(docutils_encoding.lower()): + return tr[docutils_encoding.lower()] + # convert: latin-1 and utf-8 and similar things + return docutils_encoding.replace("_", "").replace("-", "").lower() + + def language_label(self, docutil_label): + return self.language.labels[docutil_label] + + latex_equivalents = { + u'\u00A0' : '~', + u'\u2013' : '{--}', + u'\u2014' : '{---}', + u'\u2018' : '`', + u'\u2019' : '\'', + u'\u201A' : ',', + u'\u201C' : '``', + u'\u201D' : '\'\'', + u'\u201E' : ',,', + u'\u2020' : '{\\dag}', + u'\u2021' : '{\\ddag}', + u'\u2026' : '{\\dots}', + u'\u2122' : '{\\texttrademark}', + u'\u21d4' : '{$\\Leftrightarrow$}', + # greek alphabet ? + } + + def unicode_to_latex(self,text): + # see LaTeX codec + # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252124 + # Only some special chracters are translated, for documents with many + # utf-8 chars one should use the LaTeX unicode package. + for uchar in self.latex_equivalents.keys(): + text = text.replace(uchar,self.latex_equivalents[uchar]) + return text + + def ensure_math(self, text): + if not self.__dict__.has_key('ensure_math_re'): + chars = { + # lnot,pm,twosuperior,threesuperior,mu,onesuperior,times,div + 'latin1' : '\xac\xb1\xb2\xb3\xb5\xb9\xd7\xf7' , + # also latin5 and latin9 + } + self.ensure_math_re = re.compile('([%s])' % chars['latin1']) + text = self.ensure_math_re.sub(r'\\ensuremath{\1}', text) + return text + + def encode(self, text): + """ + Encode special characters (``# $ % & ~ _ ^ \ { }``) in `text` & return + """ + # Escaping with a backslash does not help with backslashes, ~ and ^. + + # < > are only available in math-mode or tt font. (really ?) + # $ starts math- mode. + # AND quotes + if self.verbatim: + return text + # compile the regexps once. do it here so one can see them. + # + # first the braces. + if not self.__dict__.has_key('encode_re_braces'): + self.encode_re_braces = re.compile(r'([{}])') + text = self.encode_re_braces.sub(r'{\\\1}',text) + if not self.__dict__.has_key('encode_re_bslash'): + # find backslash: except in the form '{\{}' or '{\}}'. + self.encode_re_bslash = re.compile(r'(?", '{\\textgreater}') + # then + text = text.replace("&", '{\\&}') + # the ^: + # * verb|^| does not work in mbox. + # * mathmode has wedge. hat{~} would also work. + # text = text.replace("^", '{\\ensuremath{^\\wedge}}') + text = text.replace("^", '{\\textasciicircum}') + text = text.replace("%", '{\\%}') + text = text.replace("#", '{\\#}') + text = text.replace("~", '{\\textasciitilde}') + # Separate compound characters, e.g. "--" to "-{}-". (The + # actual separation is done later; see below.) + separate_chars = '-' + if self.literal_block or self.literal: + # In monospace-font, we also separate ",,", "``" and "''" + # and some other characters which can't occur in + # non-literal text. + separate_chars += ',`\'"<>' + # pdflatex does not produce doublequotes for ngerman. + text = self.babel.double_quotes_in_tt(text) + if self.font_encoding == 'OT1': + # We're using OT1 font-encoding and have to replace + # underscore by underlined blank, because this has + # correct width. + text = text.replace('_', '{\\underline{ }}') + # And the tt-backslash doesn't work in OT1, so we use + # a mirrored slash. + text = text.replace('\\textbackslash', '\\reflectbox{/}') + else: + text = text.replace('_', '{\\_}') + else: + text = self.babel.quote_quotes(text) + if not self.inside_citation_reference_label: + text = text.replace("_", '{\\_}') + for char in separate_chars * 2: + # Do it twice ("* 2") becaues otherwise we would replace + # "---" by "-{}--". + text = text.replace(char + char, char + '{}' + char) + if self.insert_newline or self.literal_block: + # Insert a blank before the newline, to avoid + # ! LaTeX Error: There's no line here to end. + text = text.replace("\n", '~\\\\\n') + elif self.mbox_newline: + if self.literal_block: + closings = "}" * len(self.literal_block_stack) + openings = "".join(self.literal_block_stack) + else: + closings = "" + openings = "" + text = text.replace("\n", "%s}\\\\\n\\mbox{%s" % (closings,openings)) + text = text.replace('[', '{[}').replace(']', '{]}') + if self.insert_none_breaking_blanks: + text = text.replace(' ', '~') + if self.latex_encoding != 'utf8': + text = self.unicode_to_latex(text) + text = self.ensure_math(text) + return text + + def attval(self, text, + whitespace=re.compile('[\n\r\t\v\f]')): + """Cleanse, encode, and return attribute value text.""" + return self.encode(whitespace.sub(' ', text)) + + def astext(self): + if self.pdfinfo is not None and self.pdfauthor: + self.pdfinfo.append('pdfauthor={%s}' % self.pdfauthor) + if self.pdfinfo: + pdfinfo = '\\hypersetup{\n' + ',\n'.join(self.pdfinfo) + '\n}\n' + else: + pdfinfo = '' + head = '\\title{%s}\n\\author{%s}\n\\date{%s}\n' % \ + (self.title, + ' \\and\n'.join(['~\\\\\n'.join(author_lines) + for author_lines in self.author_stack]), + self.date) + return ''.join(self.head_prefix + [head] + self.head + [pdfinfo] + + self.body_prefix + self.body + self.body_suffix) + + def visit_Text(self, node): + self.body.append(self.encode(node.astext())) + + def depart_Text(self, node): + pass + + def visit_address(self, node): + self.visit_docinfo_item(node, 'address') + + def depart_address(self, node): + self.depart_docinfo_item(node) + + def visit_admonition(self, node, name=''): + self.body.append('\\begin{center}\\begin{sffamily}\n') + self.body.append('\\fbox{\\parbox{\\admonitionwidth}{\n') + if name: + self.body.append('\\textbf{\\large '+ self.language.labels[name] + '}\n'); + self.body.append('\\vspace{2mm}\n') + + + def depart_admonition(self, node=None): + self.body.append('}}\n') # end parbox fbox + self.body.append('\\end{sffamily}\n\\end{center}\n'); + + def visit_attention(self, node): + self.visit_admonition(node, 'attention') + + def depart_attention(self, node): + self.depart_admonition() + + def visit_author(self, node): + self.visit_docinfo_item(node, 'author') + + def depart_author(self, node): + self.depart_docinfo_item(node) + + def visit_authors(self, node): + # not used: visit_author is called anyway for each author. + pass + + def depart_authors(self, node): + pass + + def visit_block_quote(self, node): + self.body.append( '\\begin{quote}\n') + + def depart_block_quote(self, node): + self.body.append( '\\end{quote}\n') + + def visit_bullet_list(self, node): + if 'contents' in self.topic_classes: + if self.use_latex_toc: + raise nodes.SkipNode + self.body.append( '\\begin{list}{}{}\n' ) + else: + self.body.append( '\\begin{itemize}\n' ) + + def depart_bullet_list(self, node): + if 'contents' in self.topic_classes: + self.body.append( '\\end{list}\n' ) + else: + self.body.append( '\\end{itemize}\n' ) + + # Imperfect superscript/subscript handling: mathmode italicizes + # all letters by default. + def visit_superscript(self, node): + self.body.append('$^{') + self.mathmode = 1 + + def depart_superscript(self, node): + self.body.append('}$') + self.mathmode = 0 + + def visit_subscript(self, node): + self.body.append('$_{') + self.mathmode = 1 + + def depart_subscript(self, node): + self.body.append('}$') + self.mathmode = 0 + + def visit_caption(self, node): + self.body.append( '\\caption{' ) + + def depart_caption(self, node): + self.body.append('}') + + def visit_caution(self, node): + self.visit_admonition(node, 'caution') + + def depart_caution(self, node): + self.depart_admonition() + + def visit_title_reference(self, node): + self.body.append( '\\titlereference{' ) + + def depart_title_reference(self, node): + self.body.append( '}' ) + + def visit_citation(self, node): + # TODO maybe use cite bibitems + if self._use_latex_citations: + self.context.append(len(self.body)) + else: + self.body.append('\\begin{figure}[b]') + for id in node['ids']: + self.body.append('\\hypertarget{%s}' % id) + + def depart_citation(self, node): + if self._use_latex_citations: + size = self.context.pop() + label = self.body[size] + text = ''.join(self.body[size+1:]) + del self.body[size:] + self._bibitems.append([label, text]) + else: + self.body.append('\\end{figure}\n') + + def visit_citation_reference(self, node): + if self._use_latex_citations: + self.body.append('\\cite{') + self.inside_citation_reference_label = 1 + else: + href = '' + if node.has_key('refid'): + href = node['refid'] + elif node.has_key('refname'): + href = self.document.nameids[node['refname']] + self.body.append('[\\hyperlink{%s}{' % href) + + def depart_citation_reference(self, node): + if self._use_latex_citations: + self.body.append('}') + self.inside_citation_reference_label = 0 + else: + self.body.append('}]') + + def visit_classifier(self, node): + self.body.append( '(\\textbf{' ) + + def depart_classifier(self, node): + self.body.append( '})\n' ) + + def visit_colspec(self, node): + self.active_table.visit_colspec(node) + + def depart_colspec(self, node): + pass + + def visit_comment(self, node): + # Escape end of line by a new comment start in comment text. + self.body.append('%% %s \n' % node.astext().replace('\n', '\n% ')) + raise nodes.SkipNode + + def visit_compound(self, node): + pass + + def depart_compound(self, node): + pass + + def visit_contact(self, node): + self.visit_docinfo_item(node, 'contact') + + def depart_contact(self, node): + self.depart_docinfo_item(node) + + def visit_container(self, node): + pass + + def depart_container(self, node): + pass + + def visit_copyright(self, node): + self.visit_docinfo_item(node, 'copyright') + + def depart_copyright(self, node): + self.depart_docinfo_item(node) + + def visit_danger(self, node): + self.visit_admonition(node, 'danger') + + def depart_danger(self, node): + self.depart_admonition() + + def visit_date(self, node): + self.visit_docinfo_item(node, 'date') + + def depart_date(self, node): + self.depart_docinfo_item(node) + + def visit_decoration(self, node): + pass + + def depart_decoration(self, node): + pass + + def visit_definition(self, node): + pass + + def depart_definition(self, node): + self.body.append('\n') + + def visit_definition_list(self, node): + self.body.append( '\\begin{description}\n' ) + + def depart_definition_list(self, node): + self.body.append( '\\end{description}\n' ) + + def visit_definition_list_item(self, node): + pass + + def depart_definition_list_item(self, node): + pass + + def visit_description(self, node): + self.body.append( ' ' ) + + def depart_description(self, node): + pass + + def visit_docinfo(self, node): + self.docinfo = [] + self.docinfo.append('%' + '_'*75 + '\n') + self.docinfo.append('\\begin{center}\n') + self.docinfo.append('\\begin{tabularx}{\\docinfowidth}{lX}\n') + + def depart_docinfo(self, node): + self.docinfo.append('\\end{tabularx}\n') + self.docinfo.append('\\end{center}\n') + self.body = self.docinfo + self.body + # clear docinfo, so field names are no longer appended. + self.docinfo = None + + def visit_docinfo_item(self, node, name): + if name == 'author': + if not self.pdfinfo == None: + if not self.pdfauthor: + self.pdfauthor = self.attval(node.astext()) + else: + self.pdfauthor += self.author_separator + self.attval(node.astext()) + if self.use_latex_docinfo: + if name in ('author', 'organization', 'contact', 'address'): + # We attach these to the last author. If any of them precedes + # the first author, put them in a separate "author" group (for + # no better semantics). + if name == 'author' or not self.author_stack: + self.author_stack.append([]) + if name == 'address': # newlines are meaningful + self.insert_newline = 1 + text = self.encode(node.astext()) + self.insert_newline = 0 + else: + text = self.attval(node.astext()) + self.author_stack[-1].append(text) + raise nodes.SkipNode + elif name == 'date': + self.date = self.attval(node.astext()) + raise nodes.SkipNode + self.docinfo.append('\\textbf{%s}: &\n\t' % self.language_label(name)) + if name == 'address': + self.insert_newline = 1 + self.docinfo.append('{\\raggedright\n') + self.context.append(' } \\\\\n') + else: + self.context.append(' \\\\\n') + self.context.append(self.docinfo) + self.context.append(len(self.body)) + + def depart_docinfo_item(self, node): + size = self.context.pop() + dest = self.context.pop() + tail = self.context.pop() + tail = self.body[size:] + [tail] + del self.body[size:] + dest.extend(tail) + # for address we did set insert_newline + self.insert_newline = 0 + + def visit_doctest_block(self, node): + self.body.append( '\\begin{verbatim}' ) + self.verbatim = 1 + + def depart_doctest_block(self, node): + self.body.append( '\\end{verbatim}\n' ) + self.verbatim = 0 + + def visit_document(self, node): + self.body_prefix.append('\\begin{document}\n') + # titled document? + if self.use_latex_docinfo or len(node) and isinstance(node[0], nodes.title): + self.body_prefix.append('\\maketitle\n') + # alternative use titlepage environment. + # \begin{titlepage} + # ... + self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n') + + def depart_document(self, node): + # TODO insertion point of bibliography should none automatic. + if self._use_latex_citations and len(self._bibitems)>0: + if not self.bibtex: + widest_label = "" + for bi in self._bibitems: + if len(widest_label) self._max_enumeration_counters: + self._max_enumeration_counters = len(self._enumeration_counters) + self.body.append('\\newcounter{%s}\n' % counter_name) + else: + self.body.append('\\setcounter{%s}{0}\n' % counter_name) + + self.body.append('\\begin{list}{%s\\%s{%s}%s}\n' % \ + (enum_prefix,enum_type,counter_name,enum_suffix)) + self.body.append('{\n') + self.body.append('\\usecounter{%s}\n' % counter_name) + # set start after usecounter, because it initializes to zero. + if node.has_key('start'): + self.body.append('\\addtocounter{%s}{%d}\n' \ + % (counter_name,node['start']-1)) + ## set rightmargin equal to leftmargin + self.body.append('\\setlength{\\rightmargin}{\\leftmargin}\n') + self.body.append('}\n') + + def depart_enumerated_list(self, node): + self.body.append('\\end{list}\n') + self._enumeration_counters.pop() + + def visit_error(self, node): + self.visit_admonition(node, 'error') + + def depart_error(self, node): + self.depart_admonition() + + def visit_field(self, node): + # real output is done in siblings: _argument, _body, _name + pass + + def depart_field(self, node): + self.body.append('\n') + ##self.body.append('%[depart_field]\n') + + def visit_field_argument(self, node): + self.body.append('%[visit_field_argument]\n') + + def depart_field_argument(self, node): + self.body.append('%[depart_field_argument]\n') + + def visit_field_body(self, node): + # BUG by attach as text we loose references. + if self.docinfo: + self.docinfo.append('%s \\\\\n' % self.encode(node.astext())) + raise nodes.SkipNode + # BUG: what happens if not docinfo + + def depart_field_body(self, node): + self.body.append( '\n' ) + + def visit_field_list(self, node): + if not self.docinfo: + self.body.append('\\begin{quote}\n') + self.body.append('\\begin{description}\n') + + def depart_field_list(self, node): + if not self.docinfo: + self.body.append('\\end{description}\n') + self.body.append('\\end{quote}\n') + + def visit_field_name(self, node): + # BUG this duplicates docinfo_item + if self.docinfo: + self.docinfo.append('\\textbf{%s}: &\n\t' % self.encode(node.astext())) + raise nodes.SkipNode + else: + self.body.append('\\item [') + + def depart_field_name(self, node): + if not self.docinfo: + self.body.append(':]') + + def visit_figure(self, node): + if (not node.attributes.has_key('align') or + node.attributes['align'] == 'center'): + # centering does not add vertical space like center. + align = '\n\\centering' + align_end = '' + else: + # TODO non vertical space for other alignments. + align = '\\begin{flush%s}' % node.attributes['align'] + align_end = '\\end{flush%s}' % node.attributes['align'] + self.body.append( '\\begin{figure}[htbp]%s\n' % align ) + self.context.append( '%s\\end{figure}\n' % align_end ) + + def depart_figure(self, node): + self.body.append( self.context.pop() ) + + def visit_footer(self, node): + self.context.append(len(self.body)) + + def depart_footer(self, node): + start = self.context.pop() + footer = (['\n\\begin{center}\small\n'] + + self.body[start:] + ['\n\\end{center}\n']) + self.body_suffix[:0] = footer + del self.body[start:] + + def visit_footnote(self, node): + if self.use_latex_footnotes: + num,text = node.astext().split(None,1) + num = self.encode(num.strip()) + self.body.append('\\footnotetext['+num+']') + self.body.append('{') + else: + self.body.append('\\begin{figure}[b]') + for id in node['ids']: + self.body.append('\\hypertarget{%s}' % id) + + def depart_footnote(self, node): + if self.use_latex_footnotes: + self.body.append('}\n') + else: + self.body.append('\\end{figure}\n') + + def visit_footnote_reference(self, node): + if self.use_latex_footnotes: + self.body.append("\\footnotemark["+self.encode(node.astext())+"]") + raise nodes.SkipNode + href = '' + if node.has_key('refid'): + href = node['refid'] + elif node.has_key('refname'): + href = self.document.nameids[node['refname']] + format = self.settings.footnote_references + if format == 'brackets': + suffix = '[' + self.context.append(']') + elif format == 'superscript': + suffix = '\\raisebox{.5em}[0em]{\\scriptsize' + self.context.append('}') + else: # shouldn't happen + raise AssertionError('Illegal footnote reference format.') + self.body.append('%s\\hyperlink{%s}{' % (suffix,href)) + + def depart_footnote_reference(self, node): + if self.use_latex_footnotes: + return + self.body.append('}%s' % self.context.pop()) + + # footnote/citation label + def label_delim(self, node, bracket, superscript): + if isinstance(node.parent, nodes.footnote): + if self.use_latex_footnotes: + raise nodes.SkipNode + if self.settings.footnote_references == 'brackets': + self.body.append(bracket) + else: + self.body.append(superscript) + else: + assert isinstance(node.parent, nodes.citation) + if not self._use_latex_citations: + self.body.append(bracket) + + def visit_label(self, node): + self.label_delim(node, '[', '$^{') + + def depart_label(self, node): + self.label_delim(node, ']', '}$') + + # elements generated by the framework e.g. section numbers. + def visit_generated(self, node): + pass + + def depart_generated(self, node): + pass + + def visit_header(self, node): + self.context.append(len(self.body)) + + def depart_header(self, node): + start = self.context.pop() + self.body_prefix.append('\n\\verb|begin_header|\n') + self.body_prefix.extend(self.body[start:]) + self.body_prefix.append('\n\\verb|end_header|\n') + del self.body[start:] + + def visit_hint(self, node): + self.visit_admonition(node, 'hint') + + def depart_hint(self, node): + self.depart_admonition() + + def latex_image_length(self, width_str): + match = re.match('(\d*\.?\d*)\s*(\S*)', width_str) + if not match: + # fallback + return width_str + res = width_str + amount, unit = match.groups()[:2] + if unit == "px": + # LaTeX does not know pixels but points + res = "%spt" % amount + elif unit == "%": + res = "%.3f\\linewidth" % (float(amount)/100.0) + return res + + def visit_image(self, node): + attrs = node.attributes + # Add image URI to dependency list, assuming that it's + # referring to a local file. + self.settings.record_dependencies.add(attrs['uri']) + pre = [] # in reverse order + post = [] + include_graphics_options = [] + inline = isinstance(node.parent, nodes.TextElement) + if attrs.has_key('scale'): + # Could also be done with ``scale`` option to + # ``\includegraphics``; doing it this way for consistency. + pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,)) + post.append('}') + if attrs.has_key('width'): + include_graphics_options.append('width=%s' % ( + self.latex_image_length(attrs['width']), )) + if attrs.has_key('height'): + include_graphics_options.append('height=%s' % ( + self.latex_image_length(attrs['height']), )) + if attrs.has_key('align'): + align_prepost = { + # By default latex aligns the top of an image. + (1, 'top'): ('', ''), + (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'), + (1, 'bottom'): ('\\raisebox{-\\height}{', '}'), + (0, 'center'): ('{\\hfill', '\\hfill}'), + # These 2 don't exactly do the right thing. The image should + # be floated alongside the paragraph. See + # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG + (0, 'left'): ('{', '\\hfill}'), + (0, 'right'): ('{\\hfill', '}'),} + try: + pre.append(align_prepost[inline, attrs['align']][0]) + post.append(align_prepost[inline, attrs['align']][1]) + except KeyError: + pass # XXX complain here? + if not inline: + pre.append('\n') + post.append('\n') + pre.reverse() + self.body.extend( pre ) + options = '' + if len(include_graphics_options)>0: + options = '[%s]' % (','.join(include_graphics_options)) + self.body.append( '\\includegraphics%s{%s}' % ( + options, attrs['uri'] ) ) + self.body.extend( post ) + + def depart_image(self, node): + pass + + def visit_important(self, node): + self.visit_admonition(node, 'important') + + def depart_important(self, node): + self.depart_admonition() + + def visit_interpreted(self, node): + # @@@ Incomplete, pending a proper implementation on the + # Parser/Reader end. + self.visit_literal(node) + + def depart_interpreted(self, node): + self.depart_literal(node) + + def visit_legend(self, node): + self.body.append('{\\small ') + + def depart_legend(self, node): + self.body.append('}') + + def visit_line(self, node): + self.body.append('\item[] ') + + def depart_line(self, node): + self.body.append('\n') + + def visit_line_block(self, node): + if isinstance(node.parent, nodes.line_block): + self.body.append('\\item[] \n' + '\\begin{lineblock}{\\lineblockindentation}\n') + else: + self.body.append('\n\\begin{lineblock}{0em}\n') + + def depart_line_block(self, node): + self.body.append('\\end{lineblock}\n') + + def visit_list_item(self, node): + # Append "{}" in case the next character is "[", which would break + # LaTeX's list environment (no numbering and the "[" is not printed). + self.body.append('\\item {} ') + + def depart_list_item(self, node): + self.body.append('\n') + + def visit_literal(self, node): + self.literal = 1 + self.body.append('\\texttt{') + + def depart_literal(self, node): + self.body.append('}') + self.literal = 0 + + def visit_literal_block(self, node): + """ + Render a literal-block. + + Literal blocks are used for "::"-prefixed literal-indented + blocks of text, where the inline markup is not recognized, + but are also the product of the parsed-literal directive, + where the markup is respected. + """ + # In both cases, we want to use a typewriter/monospaced typeface. + # For "real" literal-blocks, we can use \verbatim, while for all + # the others we must use \mbox. + # + # We can distinguish between the two kinds by the number of + # siblings that compose this node: if it is composed by a + # single element, it's surely either a real one or a + # parsed-literal that does not contain any markup. + # + if not self.active_table.is_open(): + # no quote inside tables, to avoid vertical space between + # table border and literal block. + # BUG: fails if normal text preceeds the literal block. + self.body.append('\\begin{quote}') + self.context.append('\\end{quote}\n') + else: + self.body.append('\n') + self.context.append('\n') + if (self.settings.use_verbatim_when_possible and (len(node) == 1) + # in case of a parsed-literal containing just a "**bold**" word: + and isinstance(node[0], nodes.Text)): + self.verbatim = 1 + self.body.append('\\begin{verbatim}\n') + else: + self.literal_block = 1 + self.insert_none_breaking_blanks = 1 + self.body.append('{\\ttfamily \\raggedright \\noindent\n') + # * obey..: is from julien and never worked for me (grubert). + # self.body.append('{\\obeylines\\obeyspaces\\ttfamily\n') + + def depart_literal_block(self, node): + if self.verbatim: + self.body.append('\n\\end{verbatim}\n') + self.verbatim = 0 + else: + self.body.append('\n}') + self.insert_none_breaking_blanks = 0 + self.literal_block = 0 + # obey end: self.body.append('}\n') + self.body.append(self.context.pop()) + + def visit_meta(self, node): + self.body.append('[visit_meta]\n') + # BUG maybe set keywords for pdf + ##self.head.append(self.starttag(node, 'meta', **node.attributes)) + + def depart_meta(self, node): + self.body.append('[depart_meta]\n') + + def visit_note(self, node): + self.visit_admonition(node, 'note') + + def depart_note(self, node): + self.depart_admonition() + + def visit_option(self, node): + if self.context[-1]: + # this is not the first option + self.body.append(', ') + + def depart_option(self, node): + # flag tha the first option is done. + self.context[-1] += 1 + + def visit_option_argument(self, node): + """The delimiter betweeen an option and its argument.""" + self.body.append(node.get('delimiter', ' ')) + + def depart_option_argument(self, node): + pass + + def visit_option_group(self, node): + self.body.append('\\item [') + # flag for first option + self.context.append(0) + + def depart_option_group(self, node): + self.context.pop() # the flag + self.body.append('] ') + + def visit_option_list(self, node): + self.body.append('\\begin{optionlist}{3cm}\n') + + def depart_option_list(self, node): + self.body.append('\\end{optionlist}\n') + + def visit_option_list_item(self, node): + pass + + def depart_option_list_item(self, node): + pass + + def visit_option_string(self, node): + ##self.body.append(self.starttag(node, 'span', '', CLASS='option')) + pass + + def depart_option_string(self, node): + ##self.body.append('') + pass + + def visit_organization(self, node): + self.visit_docinfo_item(node, 'organization') + + def depart_organization(self, node): + self.depart_docinfo_item(node) + + def visit_paragraph(self, node): + index = node.parent.index(node) + if not ('contents' in self.topic_classes or + (isinstance(node.parent, nodes.compound) and + index > 0 and + not isinstance(node.parent[index - 1], nodes.paragraph) and + not isinstance(node.parent[index - 1], nodes.compound))): + self.body.append('\n') + + def depart_paragraph(self, node): + self.body.append('\n') + + def visit_problematic(self, node): + self.body.append('{\\color{red}\\bfseries{}') + + def depart_problematic(self, node): + self.body.append('}') + + def visit_raw(self, node): + if 'latex' in node.get('format', '').split(): + self.body.append(node.astext()) + raise nodes.SkipNode + + def visit_reference(self, node): + # BUG: hash_char "#" is trouble some in LaTeX. + # mbox and other environment do not like the '#'. + hash_char = '\\#' + if node.has_key('refuri'): + href = node['refuri'].replace('#',hash_char) + elif node.has_key('refid'): + href = hash_char + node['refid'] + elif node.has_key('refname'): + href = hash_char + self.document.nameids[node['refname']] + else: + raise AssertionError('Unknown reference.') + self.body.append('\\href{%s}{' % href) + if self._reference_label and not node.has_key('refuri'): + self.body.append('\\%s{%s}}' % (self._reference_label, + href.replace(hash_char, ''))) + raise nodes.SkipNode + + def depart_reference(self, node): + self.body.append('}') + + def visit_revision(self, node): + self.visit_docinfo_item(node, 'revision') + + def depart_revision(self, node): + self.depart_docinfo_item(node) + + def visit_section(self, node): + self.section_level += 1 + # Initialize counter for potential subsections: + self._section_number.append(0) + # Counter for this section's level (initialized by parent section): + self._section_number[self.section_level - 1] += 1 + + def depart_section(self, node): + # Remove counter for potential subsections: + self._section_number.pop() + self.section_level -= 1 + + def visit_sidebar(self, node): + # BUG: this is just a hack to make sidebars render something + self.body.append('\n\\setlength{\\locallinewidth}{0.9\\admonitionwidth}\n') + self.body.append('\\begin{center}\\begin{sffamily}\n') + self.body.append('\\fbox{\\colorbox[gray]{0.80}{\\parbox{\\admonitionwidth}{\n') + + def depart_sidebar(self, node): + self.body.append('}}}\n') # end parbox colorbox fbox + self.body.append('\\end{sffamily}\n\\end{center}\n'); + self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n') + + + attribution_formats = {'dash': ('---', ''), + 'parentheses': ('(', ')'), + 'parens': ('(', ')'), + 'none': ('', '')} + + def visit_attribution(self, node): + prefix, suffix = self.attribution_formats[self.settings.attribution] + self.body.append('\n\\begin{flushright}\n') + self.body.append(prefix) + self.context.append(suffix) + + def depart_attribution(self, node): + self.body.append(self.context.pop() + '\n') + self.body.append('\\end{flushright}\n') + + def visit_status(self, node): + self.visit_docinfo_item(node, 'status') + + def depart_status(self, node): + self.depart_docinfo_item(node) + + def visit_strong(self, node): + self.body.append('\\textbf{') + self.literal_block_stack.append('\\textbf{') + + def depart_strong(self, node): + self.body.append('}') + self.literal_block_stack.pop() + + def visit_substitution_definition(self, node): + raise nodes.SkipNode + + def visit_substitution_reference(self, node): + self.unimplemented_visit(node) + + def visit_subtitle(self, node): + if isinstance(node.parent, nodes.sidebar): + self.body.append('~\\\\\n\\textbf{') + self.context.append('}\n\\smallskip\n') + elif isinstance(node.parent, nodes.document): + self.title = self.title + \ + '\\\\\n\\large{%s}\n' % self.encode(node.astext()) + raise nodes.SkipNode + elif isinstance(node.parent, nodes.section): + self.body.append('\\textbf{') + self.context.append('}\\vspace{0.2cm}\n\n\\noindent ') + + def depart_subtitle(self, node): + self.body.append(self.context.pop()) + + def visit_system_message(self, node): + pass + + def depart_system_message(self, node): + self.body.append('\n') + + def visit_table(self, node): + if self.active_table.is_open(): + self.table_stack.append(self.active_table) + # nesting longtable does not work (e.g. 2007-04-18) + self.active_table = Table('tabular',self.settings.table_style) + self.active_table.open() + for cl in node['classes']: + self.active_table.set_table_style(cl) + self.body.append('\n' + self.active_table.get_opening()) + + def depart_table(self, node): + self.body.append(self.active_table.get_closing() + '\n') + self.active_table.close() + if len(self.table_stack)>0: + self.active_table = self.table_stack.pop() + else: + self.active_table.set_table_style(self.settings.table_style) + + def visit_target(self, node): + # BUG: why not (refuri or refid or refname) means not footnote ? + if not (node.has_key('refuri') or node.has_key('refid') + or node.has_key('refname')): + for id in node['ids']: + self.body.append('\\hypertarget{%s}{' % id) + self.context.append('}' * len(node['ids'])) + elif node.get("refid"): + self.body.append('\\hypertarget{%s}{' % node.get("refid")) + self.context.append('}') + else: + self.context.append('') + + def depart_target(self, node): + self.body.append(self.context.pop()) + + def visit_tbody(self, node): + # BUG write preamble if not yet done (colspecs not []) + # for tables without heads. + if not self.active_table.get('preamble written'): + self.visit_thead(None) + # self.depart_thead(None) + + def depart_tbody(self, node): + pass + + def visit_term(self, node): + self.body.append('\\item[{') + + def depart_term(self, node): + # definition list term. + # \leavevmode results in a line break if the term is followed by a item list. + self.body.append('}] \leavevmode ') + + def visit_tgroup(self, node): + #self.body.append(self.starttag(node, 'colgroup')) + #self.context.append('\n') + pass + + def depart_tgroup(self, node): + pass + + def visit_thead(self, node): + self.body.append('{%s}\n' % self.active_table.get_colspecs()) + if self.active_table.caption: + self.body.append('\\caption{%s}\\\\\n' % self.active_table.caption) + self.active_table.set('preamble written',1) + # TODO longtable supports firsthead and lastfoot too. + self.body.extend(self.active_table.visit_thead()) + + def depart_thead(self, node): + # the table header written should be on every page + # => \endhead + self.body.extend(self.active_table.depart_thead()) + # and the firsthead => \endfirsthead + # BUG i want a "continued from previous page" on every not + # firsthead, but then we need the header twice. + # + # there is a \endfoot and \endlastfoot too. + # but we need the number of columns to + # self.body.append('\\multicolumn{%d}{c}{"..."}\n' % number_of_columns) + # self.body.append('\\hline\n\\endfoot\n') + # self.body.append('\\hline\n') + # self.body.append('\\endlastfoot\n') + + def visit_tip(self, node): + self.visit_admonition(node, 'tip') + + def depart_tip(self, node): + self.depart_admonition() + + def bookmark(self, node): + """Append latex href and pdfbookmarks for titles. + """ + if node.parent['ids']: + for id in node.parent['ids']: + self.body.append('\\hypertarget{%s}{}\n' % id) + if not self.use_latex_toc: + # BUG level depends on style. pdflatex allows level 0 to 3 + # ToC would be the only on level 0 so i choose to decrement the rest. + # "Table of contents" bookmark to see the ToC. To avoid this + # we set all zeroes to one. + l = self.section_level + if l>0: + l = l-1 + # pdftex does not like "_" subscripts in titles + text = self.encode(node.astext()) + for id in node.parent['ids']: + self.body.append('\\pdfbookmark[%d]{%s}{%s}\n' % \ + (l, text, id)) + + def visit_title(self, node): + """Section and other titles.""" + + if isinstance(node.parent, nodes.topic): + # the table of contents. + self.bookmark(node) + if ('contents' in self.topic_classes + and self.use_latex_toc): + self.body.append('\\renewcommand{\\contentsname}{') + self.context.append('}\n\\tableofcontents\n\n\\bigskip\n') + elif ('abstract' in self.topic_classes + and self.settings.use_latex_abstract): + raise nodes.SkipNode + else: # or section titles before the table of contents. + # BUG: latex chokes on center environment with + # "perhaps a missing item", therefore we use hfill. + self.body.append('\\subsubsection*{~\\hfill ') + # the closing brace for subsection. + self.context.append('\\hfill ~}\n') + # TODO: for admonition titles before the first section + # either specify every possible node or ... ? + elif isinstance(node.parent, nodes.sidebar) \ + or isinstance(node.parent, nodes.admonition): + self.body.append('\\textbf{\\large ') + self.context.append('}\n\\smallskip\n') + elif isinstance(node.parent, nodes.table): + # caption must be written after column spec + self.active_table.caption = self.encode(node.astext()) + raise nodes.SkipNode + elif self.section_level == 0: + # document title + self.title = self.encode(node.astext()) + if not self.pdfinfo == None: + self.pdfinfo.append( 'pdftitle={%s}' % self.encode(node.astext()) ) + raise nodes.SkipNode + else: + self.body.append('\n\n') + self.body.append('%' + '_' * 75) + self.body.append('\n\n') + self.bookmark(node) + + if self.use_latex_toc: + section_star = "" + else: + section_star = "*" + + section_name = self.d_class.section(self.section_level) + self.body.append('\\%s%s{' % (section_name, section_star)) + # MAYBE postfix paragraph and subparagraph with \leavemode to + # ensure floatables stay in the section and text starts on a new line. + self.context.append('}\n') + + def depart_title(self, node): + self.body.append(self.context.pop()) + for id in node.parent['ids']: + self.body.append('\\label{%s}\n' % id) + + def visit_topic(self, node): + self.topic_classes = node['classes'] + if ('abstract' in self.topic_classes + and self.settings.use_latex_abstract): + self.body.append('\\begin{abstract}\n') + + def depart_topic(self, node): + if ('abstract' in self.topic_classes + and self.settings.use_latex_abstract): + self.body.append('\\end{abstract}\n') + self.topic_classes = [] + if 'contents' in node['classes'] and self.use_latex_toc: + pass + else: + self.body.append('\n') + + def visit_inline(self, node): # titlereference + classes = node.get('classes', ['Unknown', ]) + for cls in classes: + self.body.append( '\\docutilsrole%s{' % cls) + self.context.append('}'*len(classes)) + + def depart_inline(self, node): + self.body.append(self.context.pop()) + + def visit_rubric(self, node): + self.body.append('\\rubric{') + self.context.append('}\n') + + def depart_rubric(self, node): + self.body.append(self.context.pop()) + + def visit_transition(self, node): + self.body.append('\n\n') + self.body.append('%' + '_' * 75) + self.body.append('\n\\hspace*{\\fill}\\hrulefill\\hspace*{\\fill}') + self.body.append('\n\n') + + def depart_transition(self, node): + pass + + def visit_version(self, node): + self.visit_docinfo_item(node, 'version') + + def depart_version(self, node): + self.depart_docinfo_item(node) + + def visit_warning(self, node): + self.visit_admonition(node, 'warning') + + def depart_warning(self, node): + self.depart_admonition() + + def unimplemented_visit(self, node): + raise NotImplementedError('visiting unimplemented node type: %s' + % node.__class__.__name__) + +# def unknown_visit(self, node): +# def default_visit(self, node): + +# vim: set ts=4 et ai : diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/latex2e/latex2e.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/latex2e/latex2e.tex Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,74 @@ +% latex include file for docutils latex writer +% -------------------------------------------- +% +% CVS: $Id: latex2e.tex 4163 2005-12-09 04:21:34Z goodger $ +% +% This is included at the end of the latex header in the generated file, +% to allow overwriting defaults, although this could get hairy. +% Generated files should process well standalone too, LaTeX might give a +% message about a missing file. + +% donot indent first line of paragraph. +\setlength{\parindent}{0pt} +\setlength{\parskip}{5pt plus 2pt minus 1pt} + +% sloppy +% ------ +% Less strict (opposite to default fussy) space size between words. Therefore +% less hyphenation. +\sloppy + +% fonts +% ----- +% times for pdf generation, gives smaller pdf files. +% +% But in standard postscript fonts: courier and times/helvetica do not fit. +% Maybe use pslatex. +\usepackage{times} + +% pagestyle +% --------- +% headings might put section titles in the page heading, but not if +% the table of contents is done by docutils. +% If pagestyle{headings} is used, \geometry{headheight=10pt,headsep=1pt} +% should be set too. +%\pagestyle{plain} +% +% or use fancyhdr (untested !) +%\usepackage{fancyhdr} +%\pagestyle{fancy} +%\addtolength{\headheight}{\\baselineskip} +%\renewcommand{\sectionmark}[1]{\markboth{#1}{}} +%\renewcommand{\subsectionmark}[1]{\markright{#1}} +%\fancyhf{} +%\fancyhead[LE,RO]{\\bfseries\\textsf{\Large\\thepage}} +%\fancyhead[LO]{\\textsf{\\footnotesize\\rightmark}} +%\fancyhead[RE]{\\textsc{\\textsf{\\footnotesize\leftmark}}} +%\\fancyfoot[LE,RO]{\\bfseries\\textsf{\scriptsize Docutils}} +%\fancyfoot[RE,LO]{\\textsf{\scriptsize\\today}} + +% geometry +% -------- +% = papersizes and margins +%\geometry{a4paper,twoside,tmargin=1.5cm, +% headheight=1cm,headsep=0.75cm} + +% Do section number display +% ------------------------- +%\makeatletter +%\def\@seccntformat#1{} +%\makeatother +% no numbers in toc +%\renewcommand{\numberline}[1]{} + + +% change maketitle +% ---------------- +%\renewcommand{\maketitle}{ +% \begin{titlepage} +% \begin{center} +% \textsf{TITLE \@title} \\ +% Date: \today +% \end{center} +% \end{titlepage} +%} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/__init__.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,825 @@ +# $Id: __init__.py 5174 2007-05-31 00:01:52Z wiemann $ +# Author: Lea Wiemann +# Copyright: This module has been placed in the public domain. + +""" +LaTeX2e document tree Writer. +""" + +# Thanks to Engelbert Gruber and various contributors for the original +# LaTeX writer, some code and many ideas of which have been used for +# this writer. + +__docformat__ = 'reStructuredText' + + +import re +import os.path +from types import ListType + +import docutils +from docutils import nodes, writers, utils +from docutils.writers.newlatex2e import unicode_map +from docutils.transforms import writer_aux + + +class Writer(writers.Writer): + + supported = ('newlatex', 'newlatex2e') + """Formats this writer supports.""" + + default_stylesheet = 'base.tex' + + default_stylesheet_path = utils.relative_path( + os.path.join(os.getcwd(), 'dummy'), + os.path.join(os.path.dirname(__file__), default_stylesheet)) + + settings_spec = ( + 'LaTeX-Specific Options', + 'Note that this LaTeX writer is still EXPERIMENTAL and not ' + 'feature-complete. ', + (('Specify a stylesheet file. The path is used verbatim to include ' + 'the file. Overrides --stylesheet-path.', + ['--stylesheet'], + {'default': '', 'metavar': '', + 'overrides': 'stylesheet_path'}), + ('Specify a stylesheet file, relative to the current working ' + 'directory. Overrides --stylesheet. Default: "%s"' + % default_stylesheet_path, + ['--stylesheet-path'], + {'metavar': '', 'overrides': 'stylesheet', + 'default': default_stylesheet_path}), + ('Specify a user stylesheet file. See --stylesheet.', + ['--user-stylesheet'], + {'default': '', 'metavar': '', + 'overrides': 'user_stylesheet_path'}), + ('Specify a user stylesheet file. See --stylesheet-path.', + ['--user-stylesheet-path'], + {'metavar': '', 'overrides': 'user_stylesheet'}) + ),) + + settings_defaults = { + # Many Unicode characters are provided by unicode_map.py, so + # we can default to latin-1. + 'output_encoding': 'latin-1', + 'output_encoding_error_handler': 'strict', + # Since we are using superscript footnotes, it is necessary to + # trim whitespace in front of footnote references. + 'trim_footnote_reference_space': 1, + # Currently unsupported: + 'docinfo_xform': 0, + # During development: + 'traceback': 1 + } + + relative_path_settings = ('stylesheet_path', 'user_stylesheet_path') + + config_section = 'newlatex2e writer' + config_section_dependencies = ('writers',) + + output = None + """Final translated form of `document`.""" + + def get_transforms(self): + return writers.Writer.get_transforms(self) + [ + writer_aux.Compound, writer_aux.Admonitions] + + def __init__(self): + writers.Writer.__init__(self) + self.translator_class = LaTeXTranslator + + def translate(self): + visitor = self.translator_class(self.document) + self.document.walkabout(visitor) + assert not visitor.context, 'context not empty: %s' % visitor.context + self.output = visitor.astext() + self.head = visitor.header + self.body = visitor.body + + +class LaTeXException(Exception): + """ + Exception base class to for exceptions which influence the + automatic generation of LaTeX code. + """ + + +class SkipAttrParentLaTeX(LaTeXException): + """ + Do not generate ``\DECattr`` and ``\renewcommand{\DEVparent}{...}`` for this + node. + + To be raised from ``before_...`` methods. + """ + + +class SkipParentLaTeX(LaTeXException): + """ + Do not generate ``\renewcommand{\DEVparent}{...}`` for this node. + + To be raised from ``before_...`` methods. + """ + + +class LaTeXTranslator(nodes.SparseNodeVisitor): + + # Country code by a.schlock. + # Partly manually converted from iso and babel stuff. + iso639_to_babel = { + 'no': 'norsk', # added by hand + 'gd': 'scottish', # added by hand + 'sl': 'slovenian', + 'af': 'afrikaans', + 'bg': 'bulgarian', + 'br': 'breton', + 'ca': 'catalan', + 'cs': 'czech', + 'cy': 'welsh', + 'da': 'danish', + 'fr': 'french', + # french, francais, canadien, acadian + 'de': 'ngerman', + # ngerman, naustrian, german, germanb, austrian + 'el': 'greek', + 'en': 'english', + # english, USenglish, american, UKenglish, british, canadian + 'eo': 'esperanto', + 'es': 'spanish', + 'et': 'estonian', + 'eu': 'basque', + 'fi': 'finnish', + 'ga': 'irish', + 'gl': 'galician', + 'he': 'hebrew', + 'hr': 'croatian', + 'hu': 'hungarian', + 'is': 'icelandic', + 'it': 'italian', + 'la': 'latin', + 'nl': 'dutch', + 'pl': 'polish', + 'pt': 'portuguese', + 'ro': 'romanian', + 'ru': 'russian', + 'sk': 'slovak', + 'sr': 'serbian', + 'sv': 'swedish', + 'tr': 'turkish', + 'uk': 'ukrainian' + } + + # Start with left double quote. + left_quote = 1 + + def __init__(self, document): + nodes.NodeVisitor.__init__(self, document) + self.settings = document.settings + self.header = [] + self.body = [] + self.context = [] + self.stylesheet_path = utils.get_stylesheet_reference( + self.settings, os.path.join(os.getcwd(), 'dummy')) + if self.stylesheet_path: + self.settings.record_dependencies.add(self.stylesheet_path) + # This ugly hack will be cleaned up when refactoring the + # stylesheet mess. + self.settings.stylesheet = self.settings.user_stylesheet + self.settings.stylesheet_path = self.settings.user_stylesheet_path + self.user_stylesheet_path = utils.get_stylesheet_reference( + self.settings, os.path.join(os.getcwd(), 'dummy')) + if self.user_stylesheet_path: + self.settings.record_dependencies.add(self.user_stylesheet_path) + self.write_header() + + def write_header(self): + a = self.header.append + a('%% Generated by Docutils %s .' + % docutils.__version__) + a('') + a('% Docutils settings:') + lang = self.settings.language_code or '' + a(r'\providecommand{\DEVlanguageiso}{%s}' % lang) + a(r'\providecommand{\DEVlanguagebabel}{%s}' % self.iso639_to_babel.get( + lang, self.iso639_to_babel.get(lang.split('_')[0], ''))) + a('') + if self.user_stylesheet_path: + a('% User stylesheet:') + a(r'\input{%s}' % self.user_stylesheet_path) + a('% Docutils stylesheet:') + a(r'\input{%s}' % self.stylesheet_path) + a('') + a('% Default definitions for Docutils nodes:') + for node_name in nodes.node_class_names: + a(r'\providecommand{\DN%s}[1]{#1}' % node_name.replace('_', '')) + a('') + a('% Auxiliary definitions:') + for attr in (r'\DEVparent \DEVattrlen \DEVtitleastext ' + r'\DEVsinglebackref \DEVmultiplebackrefs' + ).split(): + # Later set using \renewcommand. + a(r'\providecommand{%s}{DOCUTILSUNINITIALIZEDVARIABLE}' % attr) + for attr in (r'\DEVparagraphindented \DEVhassubtitle').split(): + # Initialize as boolean variables. + a(r'\providecommand{%s}{false}' % attr) + a('\n\n') + + unicode_map = unicode_map.unicode_map # comprehensive Unicode map + # Fix problems with unimap.py. + unicode_map.update({ + # We have AE or T1 encoding, so "``" etc. work. The macros + # from unimap.py may *not* work. + u'\u201C': '{``}', + u'\u201D': "{''}", + u'\u201E': '{,,}', + }) + + character_map = { + '\\': r'{\textbackslash}', + '{': r'{\{}', + '}': r'{\}}', + '$': r'{\$}', + '&': r'{\&}', + '%': r'{\%}', + '#': r'{\#}', + '[': r'{[}', + ']': r'{]}', + '-': r'{-}', + '`': r'{`}', + "'": r"{'}", + ',': r'{,}', + '"': r'{"}', + '|': r'{\textbar}', + '<': r'{\textless}', + '>': r'{\textgreater}', + '^': r'{\textasciicircum}', + '~': r'{\textasciitilde}', + '_': r'{\DECtextunderscore}', + } + character_map.update(unicode_map) + #character_map.update(special_map) + + # `att_map` is for encoding attributes. According to + # , + # the following characters are special: # $ % & ~ _ ^ \ { } + # These work without special treatment in macro parameters: + # $, &, ~, _, ^ + att_map = {'#': '\\#', + '%': '\\%', + # We cannot do anything about backslashes. + '\\': '', + '{': '\\{', + '}': '\\}', + # The quotation mark may be redefined by babel. + '"': '"{}', + } + att_map.update(unicode_map) + + def encode(self, text, attval=None): + """ + Encode special characters in ``text`` and return it. + + If attval is true, preserve as much as possible verbatim (used + in attribute value encoding). If attval is 'width' or + 'height', `text` is interpreted as a length value. + """ + if attval in ('width', 'height'): + match = re.match(r'([0-9.]+)(\S*)$', text) + assert match, '%s="%s" must be a length' % (attval, text) + value, unit = match.groups() + if unit == '%': + value = str(float(value) / 100) + unit = r'\DECrelativeunit' + elif unit in ('', 'px'): + # If \DECpixelunit is "pt", this gives the same notion + # of pixels as graphicx. This is a bit of a hack. + value = str(float(value) * 0.75) + unit = '\DECpixelunit' + return '%s%s' % (value, unit) + if attval: + get = self.att_map.get + else: + get = self.character_map.get + text = ''.join([get(c, c) for c in text]) + if (self.literal_block or self.inline_literal) and not attval: + # NB: We can have inline literals within literal blocks. + # Shrink '\r\n'. + text = text.replace('\r\n', '\n') + # Convert space. If "{ }~~~~~" is wrapped (at the + # brace-enclosed space "{ }"), the following non-breaking + # spaces ("~~~~") do *not* wind up at the beginning of the + # next line. Also note that no hyphenation is done if the + # breaking space ("{ }") comes *after* the non-breaking + # spaces. + if self.literal_block: + # Replace newlines with real newlines. + text = text.replace('\n', '\mbox{}\\\\{}') + replace_fn = self.encode_replace_for_literal_block_spaces + else: + replace_fn = self.encode_replace_for_inline_literal_spaces + text = re.sub(r'\s+', replace_fn, text) + # Protect hyphens; if we don't, line breaks will be + # possible at the hyphens and even the \textnhtt macro + # from the hyphenat package won't change that. + text = text.replace('-', r'\mbox{-}') + text = text.replace("'", r'{\DECtextliteralsinglequote}') + return text + else: + if not attval: + # Replace space with single protected space. + text = re.sub(r'\s+', '{ }', text) + # Replace double quotes with macro calls. + L = [] + for part in text.split(self.character_map['"']): + if L: + # Insert quote. + L.append(self.left_quote and r'{\DECtextleftdblquote}' + or r'{\DECtextrightdblquote}') + self.left_quote = not self.left_quote + L.append(part) + return ''.join(L) + else: + return text + + def encode_replace_for_literal_block_spaces(self, match): + return '~' * len(match.group()) + + def encode_replace_for_inline_literal_spaces(self, match): + return '{ }' + '~' * (len(match.group()) - 1) + + def astext(self): + return '\n'.join(self.header) + (''.join(self.body)) + + def append(self, text, newline='%\n'): + """ + Append text, stripping newlines, producing nice LaTeX code. + """ + lines = [' ' * self.indentation_level + line + newline + for line in text.splitlines(0)] + self.body.append(''.join(lines)) + + def visit_Text(self, node): + self.append(self.encode(node.astext())) + + def depart_Text(self, node): + pass + + def is_indented(self, paragraph): + """Return true if `paragraph` should be first-line-indented.""" + assert isinstance(paragraph, nodes.paragraph) + siblings = [n for n in paragraph.parent if + self.is_visible(n) and not isinstance(n, nodes.Titular)] + index = siblings.index(paragraph) + if ('continued' in paragraph['classes'] or + index > 0 and isinstance(siblings[index-1], nodes.transition)): + return 0 + # Indent all but the first paragraphs. + return index > 0 + + def before_paragraph(self, node): + self.append(r'\renewcommand{\DEVparagraphindented}{%s}' + % (self.is_indented(node) and 'true' or 'false')) + + def before_title(self, node): + self.append(r'\renewcommand{\DEVtitleastext}{%s}' + % self.encode(node.astext())) + self.append(r'\renewcommand{\DEVhassubtitle}{%s}' + % ((len(node.parent) > 2 and + isinstance(node.parent[1], nodes.subtitle)) + and 'true' or 'false')) + + def before_generated(self, node): + if 'sectnum' in node['classes']: + node[0] = node[0].strip() + + literal_block = 0 + + def visit_literal_block(self, node): + self.literal_block = 1 + + def depart_literal_block(self, node): + self.literal_block = 0 + + visit_doctest_block = visit_literal_block + depart_doctest_block = depart_literal_block + + inline_literal = 0 + + def visit_literal(self, node): + self.inline_literal += 1 + + def depart_literal(self, node): + self.inline_literal -= 1 + + def _make_encodable(self, text): + """ + Return text (a unicode object) with all unencodable characters + replaced with '?'. + + Thus, the returned unicode string is guaranteed to be encodable. + """ + encoding = self.settings.output_encoding + return text.encode(encoding, 'replace').decode(encoding) + + def visit_comment(self, node): + """ + Insert the comment unchanged into the document, replacing + unencodable characters with '?'. + + (This is done in order not to fail if comments contain unencodable + characters, because our default encoding is not UTF-8.) + """ + self.append('\n'.join(['% ' + self._make_encodable(line) for line + in node.astext().splitlines(0)]), newline='\n') + raise nodes.SkipChildren + + def before_topic(self, node): + if 'contents' in node['classes']: + for bullet_list in list(node.traverse(nodes.bullet_list)): + p = bullet_list.parent + if isinstance(p, nodes.list_item): + p.parent.insert(p.parent.index(p) + 1, bullet_list) + del p[1] + for paragraph in node.traverse(nodes.paragraph): + paragraph.attributes.update(paragraph[0].attributes) + paragraph[:] = paragraph[0] + paragraph.parent['tocrefid'] = paragraph['refid'] + node['contents'] = 1 + else: + node['contents'] = 0 + + bullet_list_level = 0 + + def visit_bullet_list(self, node): + self.append(r'\DECsetbullet{\labelitem%s}' % + ['i', 'ii', 'iii', 'iv'][min(self.bullet_list_level, 3)]) + self.bullet_list_level += 1 + + def depart_bullet_list(self, node): + self.bullet_list_level -= 1 + + enum_styles = {'arabic': 'arabic', 'loweralpha': 'alph', 'upperalpha': + 'Alph', 'lowerroman': 'roman', 'upperroman': 'Roman'} + + enum_counter = 0 + + def visit_enumerated_list(self, node): + # We create our own enumeration list environment. This allows + # to set the style and starting value and unlimited nesting. + # Maybe the actual creation (\DEC) can be moved to the + # stylesheet? + self.enum_counter += 1 + enum_prefix = self.encode(node['prefix']) + enum_suffix = self.encode(node['suffix']) + enum_type = '\\' + self.enum_styles.get(node['enumtype'], r'arabic') + start = node.get('start', 1) - 1 + counter = 'Denumcounter%d' % self.enum_counter + self.append(r'\DECmakeenumeratedlist{%s}{%s}{%s}{%s}{%s}{' + % (enum_prefix, enum_type, enum_suffix, counter, start)) + # for Emacs: } + + def depart_enumerated_list(self, node): + self.append('}') # for Emacs: { + + def before_list_item(self, node): + # XXX needs cleanup. + if (len(node) and (isinstance(node[-1], nodes.TextElement) or + isinstance(node[-1], nodes.Text)) and + node.parent.index(node) == len(node.parent) - 1): + node['lastitem'] = 'true' + + before_line = before_list_item + + def before_raw(self, node): + if 'latex' in node.get('format', '').split(): + # We're inserting the text in before_raw and thus outside + # of \DN... and \DECattr in order to make grouping with + # curly brackets work. + self.append(node.astext()) + raise nodes.SkipChildren + + def process_backlinks(self, node, type): + """ + Add LaTeX handling code for backlinks of footnote or citation + node `node`. `type` is either 'footnote' or 'citation'. + """ + self.append(r'\renewcommand{\DEVsinglebackref}{}') + self.append(r'\renewcommand{\DEVmultiplebackrefs}{}') + if len(node['backrefs']) > 1: + refs = [] + for i in range(len(node['backrefs'])): + # \DECmulticitationbacklink or \DECmultifootnotebacklink. + refs.append(r'\DECmulti%sbacklink{%s}{%s}' + % (type, node['backrefs'][i], i + 1)) + self.append(r'\renewcommand{\DEVmultiplebackrefs}{(%s){ }}' + % ', '.join(refs)) + elif len(node['backrefs']) == 1: + self.append(r'\renewcommand{\DEVsinglebackref}{%s}' + % node['backrefs'][0]) + + def visit_footnote(self, node): + self.process_backlinks(node, 'footnote') + + def visit_citation(self, node): + self.process_backlinks(node, 'citation') + + def before_table(self, node): + # A table contains exactly one tgroup. See before_tgroup. + pass + + def before_tgroup(self, node): + widths = [] + total_width = 0 + for i in range(int(node['cols'])): + assert isinstance(node[i], nodes.colspec) + widths.append(int(node[i]['colwidth']) + 1) + total_width += widths[-1] + del node[:len(widths)] + tablespec = '|' + for w in widths: + # 0.93 is probably wrong in many cases. XXX Find a + # solution which works *always*. + tablespec += r'p{%s\textwidth}|' % (0.93 * w / + max(total_width, 60)) + self.append(r'\DECmaketable{%s}{' % tablespec) + self.context.append('}') + raise SkipAttrParentLaTeX + + def depart_tgroup(self, node): + self.append(self.context.pop()) + + def before_row(self, node): + raise SkipAttrParentLaTeX + + def before_thead(self, node): + raise SkipAttrParentLaTeX + + def before_tbody(self, node): + raise SkipAttrParentLaTeX + + def is_simply_entry(self, node): + return (len(node) == 1 and isinstance(node[0], nodes.paragraph) or + len(node) == 0) + + def before_entry(self, node): + is_leftmost = 0 + if node.hasattr('morerows'): + self.document.reporter.severe('Rowspans are not supported.') + # Todo: Add empty cells below rowspanning cell and issue + # warning instead of severe. + if node.hasattr('morecols'): + # The author got a headache trying to implement + # multicolumn support. + if not self.is_simply_entry(node): + self.document.reporter.severe( + 'Colspanning table cells may only contain one paragraph.') + # Todo: Same as above. + # The number of columns this entry spans (as a string). + colspan = int(node['morecols']) + 1 + del node['morecols'] + else: + colspan = 1 + # Macro to call -- \DECcolspan or \DECcolspanleft. + macro_name = r'\DECcolspan' + if node.parent.index(node) == 0: + # Leftmost column. + macro_name += 'left' + is_leftmost = 1 + if colspan > 1: + self.append('%s{%s}{' % (macro_name, colspan)) + self.context.append('}') + else: + # Do not add a multicolumn with colspan 1 beacuse we need + # at least one non-multicolumn cell per column to get the + # desired column widths, and we can only do colspans with + # cells consisting of only one paragraph. + if not is_leftmost: + self.append(r'\DECsubsequententry{') + self.context.append('}') + else: + self.context.append('') + if isinstance(node.parent.parent, nodes.thead): + node['tableheaderentry'] = 'true' + + # Don't add \renewcommand{\DEVparent}{...} because there must + # not be any non-expandable commands in front of \multicolumn. + raise SkipParentLaTeX + + def depart_entry(self, node): + self.append(self.context.pop()) + + def before_substitution_definition(self, node): + raise nodes.SkipNode + + indentation_level = 0 + + def node_name(self, node): + return node.__class__.__name__.replace('_', '') + + # Attribute propagation order. + attribute_order = ['align', 'classes', 'ids'] + + def attribute_cmp(self, a1, a2): + """ + Compare attribute names `a1` and `a2`. Used in + propagate_attributes to determine propagation order. + + See built-in function `cmp` for return value. + """ + if a1 in self.attribute_order and a2 in self.attribute_order: + return cmp(self.attribute_order.index(a1), + self.attribute_order.index(a2)) + if (a1 in self.attribute_order) != (a2 in self.attribute_order): + # Attributes not in self.attribute_order come last. + return a1 in self.attribute_order and -1 or 1 + else: + return cmp(a1, a2) + + def propagate_attributes(self, node): + # Propagate attributes using \DECattr macros. + node_name = self.node_name(node) + attlist = [] + if isinstance(node, nodes.Element): + attlist = node.attlist() + attlist.sort(lambda pair1, pair2: self.attribute_cmp(pair1[0], + pair2[0])) + # `numatts` may be greater than len(attlist) due to list + # attributes. + numatts = 0 + pass_contents = self.pass_contents(node) + for key, value in attlist: + if isinstance(value, ListType): + self.append(r'\renewcommand{\DEVattrlen}{%s}' % len(value)) + for i in range(len(value)): + self.append(r'\DECattr{%s}{%s}{%s}{%s}{' % + (i+1, key, self.encode(value[i], attval=key), + node_name)) + if not pass_contents: + self.append('}') + numatts += len(value) + else: + self.append(r'\DECattr{}{%s}{%s}{%s}{' % + (key, self.encode(unicode(value), attval=key), + node_name)) + if not pass_contents: + self.append('}') + numatts += 1 + if pass_contents: + self.context.append('}' * numatts) # for Emacs: { + else: + self.context.append('') + + def visit_docinfo(self, node): + raise NotImplementedError('Docinfo not yet implemented.') + + def visit_document(self, node): + document = node + # Move IDs into TextElements. This won't work for images. + # Need to review this. + for node in document.traverse(nodes.Element): + if node.has_key('ids') and not isinstance(node, + nodes.TextElement): + next_text_element = node.next_node(nodes.TextElement) + if next_text_element: + next_text_element['ids'].extend(node['ids']) + node['ids'] = [] + + def pass_contents(self, node): + r""" + Return True if the node contents should be passed in + \DN{} and \DECattr{}{}{}{}{}. + Return False if the node contents should be passed in + \DECvisit \DECdepart, and no + attribute handler should be called. + """ + # Passing the whole document or whole sections as parameters + # to \DN... or \DECattr causes LaTeX to run out of memory. + return not isinstance(node, (nodes.document, nodes.section)) + + def dispatch_visit(self, node): + skip_attr = skip_parent = 0 + # TreePruningException to be propagated. + tree_pruning_exception = None + if hasattr(self, 'before_' + node.__class__.__name__): + try: + getattr(self, 'before_' + node.__class__.__name__)(node) + except SkipParentLaTeX: + skip_parent = 1 + except SkipAttrParentLaTeX: + skip_attr = 1 + skip_parent = 1 + except nodes.SkipNode: + raise + except (nodes.SkipChildren, nodes.SkipSiblings), instance: + tree_pruning_exception = instance + except nodes.SkipDeparture: + raise NotImplementedError( + 'SkipDeparture not usable in LaTeX writer') + + if not isinstance(node, nodes.Text): + node_name = self.node_name(node) + # attribute_deleters will be appended to self.context. + attribute_deleters = [] + if not skip_parent and not isinstance(node, nodes.document): + self.append(r'\renewcommand{\DEVparent}{%s}' + % self.node_name(node.parent)) + for name, value in node.attlist(): + if not isinstance(value, ListType) and not ':' in name: + # For non-list and non-special (like + # 'xml:preserve') attributes, set + # \DEVcurrentNA to the + # attribute value, so that the value of the + # attribute is available in the node handler + # and all children. + macro = r'\DEVcurrentN%sA%s' % (node_name, name) + self.append(r'\def%s{%s}' % ( + macro, self.encode(unicode(value), attval=name))) + # Make the attribute undefined afterwards. + attribute_deleters.append(r'\let%s=\relax' % macro) + self.context.append('\n'.join(attribute_deleters)) + if self.pass_contents(node): + # Call \DN{}. + self.append(r'\DN%s{' % node_name) + self.context.append('}') + else: + # Call \DECvisit + # \DECdepart. (Maybe we should use LaTeX + # environments for this?) + self.append(r'\DECvisit%s' % node_name) + self.context.append(r'\DECdepart%s' % node_name) + self.indentation_level += 1 + if not skip_attr: + self.propagate_attributes(node) + else: + self.context.append('') + + if (isinstance(node, nodes.TextElement) and + not isinstance(node.parent, nodes.TextElement)): + # Reset current quote to left. + self.left_quote = 1 + + # Call visit_... method. + try: + nodes.SparseNodeVisitor.dispatch_visit(self, node) + except LaTeXException: + raise NotImplementedError( + 'visit_... methods must not raise LaTeXExceptions') + + if tree_pruning_exception: + # Propagate TreePruningException raised in before_... method. + raise tree_pruning_exception + + def is_invisible(self, node): + # Return true if node is invisible or moved away in the LaTeX + # rendering. + return (not isinstance(node, nodes.Text) and + (isinstance(node, nodes.Invisible) or + isinstance(node, nodes.footnote) or + isinstance(node, nodes.citation) or + # Assume raw nodes to be invisible. + isinstance(node, nodes.raw) or + # Floating image or figure. + node.get('align') in ('left', 'right'))) + + def is_visible(self, node): + return not self.is_invisible(node) + + def needs_space(self, node): + """Two nodes for which `needs_space` is true need auxiliary space.""" + # Return true if node is a visible block-level element. + return ((isinstance(node, nodes.Body) or + isinstance(node, nodes.topic)) and + not (self.is_invisible(node) or + isinstance(node.parent, nodes.TextElement))) + + def always_needs_space(self, node): + """ + Always add space around nodes for which `always_needs_space()` + is true, regardless of whether the other node needs space as + well. (E.g. transition next to section.) + """ + return isinstance(node, nodes.transition) + + def dispatch_departure(self, node): + # Call departure method. + nodes.SparseNodeVisitor.dispatch_departure(self, node) + + if not isinstance(node, nodes.Text): + # Close attribute and node handler call (\DN...{...}). + self.indentation_level -= 1 + self.append(self.context.pop() + self.context.pop()) + # Delete \DECcurrentN... attribute macros. + self.append(self.context.pop()) + # Get next sibling. + next_node = node.next_node( + ascend=0, siblings=1, descend=0, + condition=self.is_visible) + # Insert space if necessary. + if (self.needs_space(node) and self.needs_space(next_node) or + self.always_needs_space(node) or + self.always_needs_space(next_node)): + if isinstance(node, nodes.paragraph) and isinstance(next_node, nodes.paragraph): + # Space between paragraphs. + self.append(r'\DECparagraphspace') + else: + # One of the elements is not a paragraph. + self.append(r'\DECauxiliaryspace') diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/base.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/base.tex Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1180 @@ +% System stylesheet for the new LaTeX writer, newlatex2e. + +% Major parts of the rendering are done in this stylesheet and not in the +% Python module. + +% For development notes, see notes.txt. + +% User documentation (in the stylesheet for now; that may change though): + +% Naming conventions: +% All uppercase letters in macro names have a specific meaning. +% \D...: All macros introduced by the Docutils LaTeX writer start with "D". +% \DS: Setup function (called at the bottom of this stylesheet). +% \DN{}: Handler for Docutils document tree node `node`; called by +% the Python module. +% \DEV: External variable, set by the Python module. +% \DEC: External command. It is called by the Python module and must be +% defined in this stylesheet. +% \DNA{}{}{}{}{}: +% Attribute handler for `attribute` set on nodes of type `nodename`. +% See below for a discussion of attribute handlers. +% \DA{}{}{}{}{}: +% Attribute handler for all `attribute`. Called only when no specific +% \DNA handler is defined. +% \DNC{}: +% Handler for `class`, when set on nodes of type `nodename`. +% \DC{}: +% Handler for `class`. Called only when no specific \DNC +% handler is defined. +% \D: Generic variable or function. + +% Attribute handlers: +% TODO + +% --------------------------------------------------------------------------- + +% Having to intersperse code with \makeatletter-\makeatother pairs is very +% annoying, so we call \makeatletter at the top and \makeatother at the +% bottom. Just be aware that you cannot use "@" as a text character inside +% this stylesheet. +\makeatletter + +% Print-mode (as opposed to online mode e.g. with Adobe Reader). +% This causes for example blue hyperlinks. +\providecommand{\Dprinting}{false} + +% \DSearly is called right after \documentclass. +\providecommand{\DSearly}{} +% \DSlate is called at the end of the stylesheet (right before the document +% tree). +\providecommand{\DSlate}{} + +% Use the KOMA script article class. +\providecommand{\Ddocumentclass}{scrartcl} +\providecommand{\Ddocumentoptions}{a4paper} +\providecommand{\DSdocumentclass}{ + \documentclass[\Ddocumentoptions]{\Ddocumentclass} } + +% Todo: This should be movable to the bottom, but it isn't as long as +% we use \usepackage commands at the top level of this stylesheet +% (which we shouldn't). +\DSdocumentclass + +\providecommand{\DSpackages}{ + % Load miscellaneous packages. + % Note 1: Many of the packages loaded here are used throughout this stylesheet. + % If one of these packages does not work on your system or in your scenario, + % please let us know, so we can consider making the package optional. + % Note 2: It would appear cleaner to load packages where they are used. + % However, since using a wrong package loading order can lead to *very* + % subtle bugs, we centralize the loading of most packages here. + \DSfontencoding % load font encoding packages + \DSlanguage % load babel + % Using \ifthenelse conditionals. + \usepackage{ifthen} % before hyperref (really!) + % There is not support for *not* using hyperref because it's used in many + % places. If this is a problem (e.g. because hyperref doesn't work on your + % system), please let us know. + \usepackage[colorlinks=false,pdfborder={0 0 0}]{hyperref} + % Get color, e.g. for links and system messages. + \usepackage{color} + % Get \textnhtt macro (non-hyphenating type writer). + \usepackage{hyphenat} + % For sidebars. + \usepackage{picins} + % We use longtable to create tables. + \usepackage{longtable} + % Images. + \usepackage{graphicx} + % These packages might be useful (some just add magic pixie dust), so + % evaluate them: + %\usepackage{fixmath} + %\usepackage{amsmath} + % Add some missing symbols like \textonehalf. + \usepackage{textcomp} +} + +\providecommand{\DSfontencoding}{ + % Set up font encoding. Called by \DSpackages. + % AE is a T1 emulation. It provides mostly the same characters and + % features as T1-encoded fonts but doesn't use bitmap fonts (which are + % unsuitable for online reading and subtle for printers). + \usepackage{ae} + % Provide the characters not contained in AE from EC bitmap fonts. + \usepackage{aecompl} + % Guillemets ("<<", ">>") in AE. + \usepackage{aeguill} +} + +\providecommand{\DSsymbols}{% + % Fix up symbols. + % The Euro symbol in Computer Modern looks, um, funny. Let's get a + % proper Euro symbol. + \usepackage{eurosym}% + \renewcommand{\texteuro}{\euro}% +} + +% Taken from +% +% and modified. Used with permission. +\providecommand{\Dprovidelength}[2]{% + \begingroup% + \escapechar\m@ne% + \xdef\@gtempa{{\string#1}}% + \endgroup% + \expandafter\@ifundefined\@gtempa% + {\newlength{#1}\setlength{#1}{#2}}% + {}% +} + +\providecommand{\Dprovidecounter}[2]{% + % Like \newcounter except that it doesn't crash if the counter + % already exists. + \@ifundefined{c@#1}{\newcounter{#1}\setcounter{#1}{#2}}{} +} + +\Dprovidelength{\Dboxparindent}{\parindent} + +\providecommand{\Dmakebox}[1]{% + % Make a centered, frameless box. Useful e.g. for block quotes. + % Do not use minipages here, but create pseudo-lists to allow + % page-breaking. (Don't use KOMA-script's addmargin environment + % because it messes up bullet lists.) + \Dmakelistenvironment{}{}{% + \setlength{\parskip}{0pt}% + \setlength{\parindent}{\Dboxparindent}% + \item{#1}% + }% +} + +\providecommand{\Dmakefbox}[1]{% + % Make a centered, framed box. Useful e.g. for admonitions. + \vspace{0.4\baselineskip}% + \begin{center}% + \fbox{% + \begin{minipage}[t]{0.9\linewidth}% + \setlength{\parindent}{\Dboxparindent}% + #1% + \end{minipage}% + }% + \end{center}% + \vspace{0.4\baselineskip}% +} + +% We do not currently recognize the difference between an end-sentence and a +% mid-sentence period (". " vs. ". " in plain text). So \frenchspacing is +% appropriate. +\providecommand{\DSfrenchspacing}{\frenchspacing} + + +\Dprovidelength{\Dblocklevelvspace}{% + % Space between block-level elements other than paragraphs. + 0.7\baselineskip plus 0.3\baselineskip minus 0.2\baselineskip% +} +\providecommand{\DECauxiliaryspace}{% + \ifthenelse{\equal{\Dneedvspace}{true}}{\vspace{\Dblocklevelvspace}}{}% + \par\noindent% +} +\providecommand{\DECparagraphspace}{\par} +\providecommand{\Dneedvspace}{true} + +\providecommand{\DSlanguage}{% + % Set up babel. + \usepackage[\DEVlanguagebabel]{babel} +} + +\providecommand{\Difdefined}[3]{\@ifundefined{#1}{#3}{#2}} + +% Handler for 'classes' attribute (called for each class attribute). +\providecommand{\DAclasses}[5]{% + % Dispatch to \DNC. + \Difdefined{DN#4C#3}{% + % Pass only contents, nothing else! + \csname DN#4C#3\endcsname{#5}% + }{% + % Otherwise, dispatch to \DC. + \Difdefined{DC#3}{% + \csname DC#3\endcsname{#5}% + }{% + #5% + }% + }% +} + +\providecommand{\DECattr}[5]{% + % Global attribute dispatcher, called inside the document tree. + % Parameters: + % 1. Attribute number. + % 2. Attribute name. + % 3. Attribute value. + % 4. Node name. + % 5. Node contents. + \Difdefined{DN#4A#2}{% + % Dispatch to \DNA. + \csname DN#4A#2\endcsname{#1}{#2}{#3}{#4}{#5}% + }{\Difdefined{DA#2}{% + % Otherwise dispatch to \DA. + \csname DA#2\endcsname{#1}{#2}{#3}{#4}{#5}% + }{% + % Otherwise simply run the contents without calling a handler. + #5% + }}% +} + +% ---------- Link handling ---------- +% Targets and references. + +\providecommand{\Draisedlink}[1]{% + % Anchors are placed on the base line by default. This is a bad thing for + % inline context, so we raise the anchor (normally by \baselineskip). + \Hy@raisedlink{#1}% +} + +% References. +% We're assuming here that the "refid" and "refuri" attributes occur +% only in inline context (in TextElements). +\providecommand{\DArefid}[5]{% + \ifthenelse{\equal{#4}{reference}}{% + \Dexplicitreference{\##3}{#5}% + }{% + % If this is not a target node (targets with refids are + % uninteresting and should be silently dropped). + \ifthenelse{\not\equal{#4}{target}}{% + % If this is a footnote reference, call special macro. + \ifthenelse{\equal{#4}{footnotereference}}{% + \Dimplicitfootnotereference{\##3}{#5}% + }{% + \ifthenelse{\equal{#4}{citationreference}}{% + \Dimplicitcitationreference{\##3}{#5}% + }{% + \Dimplicitreference{\##3}{#5}% + }% + }% + }{}% + }% +} +\providecommand{\DArefuri}[5]{% + \ifthenelse{\equal{#4}{target}}{% + % The node name is 'target', so this is a hyperlink target, like this: + % .. _mytarget: URI + % Hyperlink targets are ignored because they are invisible. + }{% + % If a non-target node has a refuri attribute, it must be an explicit URI + % reference (i.e. node name is 'reference'). + \Durireference{#3}{#5}% + }% +} +% Targets. +\providecommand{\DAids}[5]{% + \label{#3}% + \ifthenelse{\equal{#4}{footnotereference}}{% + {% + \renewcommand{\HyperRaiseLinkDefault}{% + % Dirty hack to make backrefs to footnote references work. + % For some reason, \baselineskip is 0pt in fn references. + 0.5\Doriginalbaselineskip% + }% + \Draisedlink{\hypertarget{#3}{}}#5% + }% + }{% + \Draisedlink{\hypertarget{#3}{}}#5% + }% +} +\providecommand{\Dimplicitreference}[2]{% + % Create implicit reference to ID. Implicit references occur + % e.g. in TOC-backlinks of section titles. Parameters: + % 1. Target. + % 2. Link text. + \href{#1}{#2}% +} +\providecommand{\Dimplicitfootnotereference}[2]{% + % Ditto, but for the special case of footnotes. + % We want them to be rendered like explicit references. + \Dexplicitreference{#1}{#2}% +} +\providecommand{\Dimplicitcitationreference}[2]{% + % Ditto for citation references. + \Dimplicitfootnotereference{#1}{#2}% +} +\providecommand{\Dcolorexplicitreference}{% + \ifthenelse{\equal{\Dprinting}{true}}{\color{black}}{\color{blue}}% +} +\providecommand{\Dexplicitreference}[2]{% + % Create explicit reference to ID, e.g. created with "foo_". + % Parameters: + % 1. Target. + % 2. Link text. + \href{#1}{{\Dcolorexplicitreference#2}}% +} +\providecommand{\Dcolorurireference}{\Dcolorexplicitreference} +\providecommand{\Durireference}[2]{% + % Create reference to URI. Parameters: + % 1. Target. + % 2. Link text. + \href{#1}{{\Dcolorurireference#2}}% +} + +\Dprovidecounter{Dpdfbookmarkid}{0}% +\providecommand{\Dpdfbookmark}[1]{% + % Temporarily decrement Desctionlevel counter. + \addtocounter{Dsectionlevel}{-1}% + %\typeout{\arabic{Dsectionlevel}}% + %\typeout{#1}% + %\typeout{docutils\roman{Dpdfbookmarkid}}% + %\typeout{}% + \pdfbookmark[\arabic{Dsectionlevel}]{#1}{docutils\arabic{Dpdfbookmarkid}}% + \addtocounter{Dsectionlevel}{1}% + \addtocounter{Dpdfbookmarkid}{1}% +} +% ---------- End of Link Handling ---------- + +\providecommand{\DNparagraph}[1]{% + \ifthenelse{\equal{\DEVparagraphindented}{true}}{\indent}{\noindent}% + #1% +} +\providecommand{\Dformatboxtitle}[1]{{\Large\textbf{#1}}} +\providecommand{\Dformatboxsubtitle}[1]{{\large\textbf{#1}}} +\providecommand{\Dtopictitle}[1]{% + \Difinsidetoc{\vspace{1em}\par}{}% + \noindent\Dformatboxtitle{#1}% + \ifthenelse{\equal{\DEVhassubtitle}{false}}{\vspace{1em}}{\vspace{0.5em}}% + \par% +} +\providecommand{\Dadmonitiontitle}[1]{% + \Dtopictitle{#1}% +} +\providecommand{\Dtopicsubtitle}[1]{% + \noindent\Dformatboxsubtitle{#1}% + \vspace{1em}% + \par% +} +\providecommand{\Dsidebartitle}[1]{\Dtopictitle{#1}} +\providecommand{\Dsidebarsubtitle}[1]{\Dtopicsubtitle{#1}} +\providecommand{\Ddocumenttitle}[1]{% + \begin{center}{\Huge#1}\end{center}% + \ifthenelse{\equal{\DEVhassubtitle}{true}}{\vspace{0.1cm}}{\vspace{1cm}}% +} +\providecommand{\Ddocumentsubtitle}[1]{% + \begin{center}{\huge#1}\end{center}% + \vspace{1cm}% +} +% Can be overwritten by user stylesheet. +\providecommand{\Dformatsectiontitle}[1]{#1} +\providecommand{\Dformatsectionsubtitle}[1]{\Dformatsectiontitle{#1}} +\providecommand{\Dbookmarksectiontitle}[1]{% + % Return text suitable for use in \section*, \subsection*, etc., + % containing a PDF bookmark. Parameter: The title (as node tree). + \Draisedlink{\Dpdfbookmark{\DEVtitleastext}}% + #1% +} +\providecommand{\Dsectiontitlehook}[1]{#1} +\providecommand{\Dsectiontitle}[1]{% + \Dsectiontitlehook{% + \Ddispatchsectiontitle{\Dbookmarksectiontitle{\Dformatsectiontitle{#1}}}% + }% +} +\providecommand{\Ddispatchsectiontitle}[1]{% + \@ifundefined{Dsectiontitle\roman{Dsectionlevel}}{% + \Ddeepsectiontitle{#1}% + }{% + \csname Dsectiontitle\roman{Dsectionlevel}\endcsname{#1}% + }% +} +\providecommand{\Ddispatchsectionsubtitle}[1]{% + \Ddispatchsectiontitle{#1}% +} +\providecommand{\Dsectiontitlei}[1]{\section*{#1}} +\providecommand{\Dsectiontitleii}[1]{\subsection*{#1}} +\providecommand{\Ddeepsectiontitle}[1]{% + % Anything below \subsubsection (like \paragraph or \subparagraph) + % is useless because it uses the same font. The only way to + % (visually) distinguish such deeply nested sections is to use + % section numbering. + \subsubsection*{#1}% +} +\providecommand{\Dsectionsubtitlehook}[1]{#1} +\Dprovidelength{\Dsectionsubtitleraisedistance}{0.7em} +\providecommand{\Dsectionsubtitlescaling}{0.85} +\providecommand{\Dsectionsubtitle}[1]{% + \Dsectionsubtitlehook{% + % Move the subtitle nearer to the title. + \vspace{-\Dsectionsubtitleraisedistance}% + % Don't create a PDF bookmark. + \Ddispatchsectionsubtitle{% + \Dformatsectionsubtitle{\scalebox{\Dsectionsubtitlescaling}{#1}}% + }% + }% +} +\providecommand{\DNtitle}[1]{% + % Dispatch to \Dtitle. + \csname D\DEVparent title\endcsname{#1}% +} +\providecommand{\DNsubtitle}[1]{% + % Dispatch to \Dsubtitle. + \csname D\DEVparent subtitle\endcsname{#1}% +} + +\providecommand{\DNliteralblock}[1]{% + \Dmakelistenvironment{}{% + \ifthenelse{\equal{\Dinsidetabular}{true}}{% + \setlength{\leftmargin}{0pt}% + }{}% + \setlength{\rightmargin}{0pt}% + }{% + \raggedright\item\noindent\nohyphens{\textnhtt{#1\Dfinalstrut}}% + }% +} +\providecommand{\DNdoctestblock}[1]{\DNliteralblock{#1}} +\providecommand{\DNliteral}[1]{\textnhtt{#1}} +\providecommand{\DNemphasis}[1]{\emph{#1}} +\providecommand{\DNstrong}[1]{\textbf{#1}} +\providecommand{\DECvisitdocument}{\begin{document}\noindent} +\providecommand{\DECdepartdocument}{\end{document}} +\providecommand{\DNtopic}[1]{% + \ifthenelse{\equal{\DEVcurrentNtopicAcontents}{1}}{% + \addtocounter{Dtoclevel}{1}% + \par\noindent% + #1% + \addtocounter{Dtoclevel}{-1}% + }{% + \par\noindent% + \Dmakebox{#1}% + }% +} +\providecommand{\DNadmonition}[1]{% + \DNtopic{#1}% +} +\providecommand{\Dformatrubric}[1]{\textbf{#1}} +\Dprovidelength{\Dprerubricspace}{0.3em} +\providecommand{\DNrubric}[1]{% + \vspace{\Dprerubricspace}\par\noindent\Dformatrubric{#1}\par% +} + +\providecommand{\Dbullet}{} +\providecommand{\DECsetbullet}[1]{\renewcommand{\Dbullet}{#1}} +\providecommand{\DNbulletlist}[1]{% + \Difinsidetoc{% + \Dtocbulletlist{#1}% + }{% + \Dmakelistenvironment{\Dbullet}{}{#1}% + }% +} +% Todo: So what on earth is @pnumwidth? +\renewcommand{\@pnumwidth}{2.2em} +\providecommand{\DNlistitem}[1]{% + \Difinsidetoc{% + \ifthenelse{\equal{\theDtoclevel}{1}\and\equal{\Dlocaltoc}{false}}{% + {% + \par\addvspace{1em}\noindent% + \sectfont% + #1\hfill\pageref{\DEVcurrentNlistitemAtocrefid}% + }% + }{% + \@dottedtocline{0}{\Dtocindent}{0em}{#1}{% + \pageref{\DEVcurrentNlistitemAtocrefid}% + }% + }% + }{% + \item{#1}% + }% +} +\providecommand{\DNenumeratedlist}[1]{#1} +\Dprovidecounter{Dsectionlevel}{0} +\providecommand{\Dvisitsectionhook}{} +\providecommand{\Ddepartsectionhook}{} +\providecommand{\DECvisitsection}{% + \addtocounter{Dsectionlevel}{1}% + \Dvisitsectionhook% +} +\providecommand{\DECdepartsection}{% + \Ddepartsectionhook% + \addtocounter{Dsectionlevel}{-1}% +} + +% Using \_ will cause hyphenation after _ even in \textnhtt-typewriter +% because the hyphenat package redefines \_. So we use +% \textunderscore here. +\providecommand{\DECtextunderscore}{\textunderscore} + +\providecommand{\Dtextinlineliteralfirstspace}{{ }} +\providecommand{\Dtextinlineliteralsecondspace}{{~}} + +\Dprovidelength{\Dlistspacing}{0.8\baselineskip} + +\providecommand{\Dsetlistrightmargin}{% + \ifthenelse{\lengthtest{\linewidth>12em}}{% + % Equal margins. + \setlength{\rightmargin}{\leftmargin}% + }{% + % If the line is narrower than 10em, we don't remove any further + % space from the right. + \setlength{\rightmargin}{0pt}% + }% +} +\providecommand{\Dresetlistdepth}{false} +\Dprovidelength{\Doriginallabelsep}{\labelsep} +\providecommand{\Dmakelistenvironment}[3]{% + % Make list environment with support for unlimited nesting and with + % reasonable default lengths. Parameters: + % 1. Label (same as in list environment). + % 2. Spacing (same as in list environment). + % 3. List contents (contents of list environment). + \ifthenelse{\equal{\Dinsidetabular}{true}}{% + % Unfortunately, vertical spacing doesn't work correctly when + % using lists inside tabular environments, so we use a minipage. + \begin{minipage}[t]{\linewidth}% + }{}% + {% + \renewcommand{\Dneedvspace}{false}% + % \parsep0.5\baselineskip + \renewcommand{\Dresetlistdepth}{false}% + \ifnum \@listdepth>5% + \protect\renewcommand{\Dresetlistdepth}{true}% + \@listdepth=5% + \fi% + \begin{list}{% + #1% + }{% + \setlength{\itemsep}{0pt}% + \setlength{\partopsep}{0pt}% + \setlength{\topsep}{0pt}% + % List should take 90% of total width. + \setlength{\leftmargin}{0.05\linewidth}% + \ifthenelse{\lengthtest{\leftmargin<1.8em}}{% + \setlength{\leftmargin}{1.8em}% + }{}% + \setlength{\labelsep}{\Doriginallabelsep}% + \Dsetlistrightmargin% + #2% + }{% + #3% + }% + \end{list}% + \ifthenelse{\equal{\Dresetlistdepth}{true}}{\@listdepth=5}{}% + }% + \ifthenelse{\equal{\Dinsidetabular}{true}}{\end{minipage}}{}% +} +\providecommand{\Dfinalstrut}{\@finalstrut\@arstrutbox} +\providecommand{\DAlastitem}[5]{#5\Dfinalstrut} + +\Dprovidelength{\Ditemsep}{0pt} +\providecommand{\DECmakeenumeratedlist}[6]{% + % Make enumerated list. + % Parameters: + % - prefix + % - type (\arabic, \roman, ...) + % - suffix + % - suggested counter name + % - start number - 1 + % - list contents + \newcounter{#4}% + \Dmakelistenvironment{#1#2{#4}#3}{% + % Use as much space as needed for the label. + \setlength{\labelwidth}{10em}% + % Reserve enough space so that the label doesn't go beyond the + % left margin of preceding paragraphs. Like that: + % + % A paragraph. + % + % 1. First item. + \setlength{\leftmargin}{2.5em}% + \Dsetlistrightmargin% + \setlength{\itemsep}{\Ditemsep}% + % Use counter recommended by Python module. + \usecounter{#4}% + % Set start value. + \addtocounter{#4}{#5}% + }{% + % The list contents. + #6% + }% +} + + +% Single quote in literal mode. \textquotesingle from package +% textcomp has wrong width when using package ae, so we use a normal +% single curly quote here. +\providecommand{\DECtextliteralsinglequote}{'} + + +% "Tabular lists" are field lists and options lists (not definition +% lists because there the term always appears on its own line). We'll +% use the terminology of field lists now ("field", "field name", +% "field body"), but the same is also analogously applicable to option +% lists. +% +% We want these lists to be breakable across pages. We cannot +% automatically get the narrowest possible size for the left column +% (i.e. the field names or option groups) because tabularx does not +% support multi-page tables, ltxtable needs to have the table in an +% external file and we don't want to clutter the user's directories +% with auxiliary files created by the filecontents environment, and +% ltablex is not included in teTeX. +% +% Thus we set a fixed length for the left column and use list +% environments. This also has the nice side effect that breaking is +% now possible anywhere, not just between fields. +% +% Note that we are creating a distinct list environment for each +% field. There is no macro for a whole tabular list! +\Dprovidelength{\Dtabularlistfieldnamewidth}{6em} +\Dprovidelength{\Dtabularlistfieldnamesep}{0.5em} +\providecommand{\Dinsidetabular}{false} +\providecommand{\Dsavefieldname}{} +\providecommand{\Dsavefieldbody}{} +\Dprovidelength{\Dusedfieldnamewidth}{0pt} +\Dprovidelength{\Drealfieldnamewidth}{0pt} +\providecommand{\Dtabularlistfieldname}[1]{\renewcommand{\Dsavefieldname}{#1}} +\providecommand{\Dtabularlistfieldbody}[1]{\renewcommand{\Dsavefieldbody}{#1}} +\Dprovidelength{\Dparskiptemp}{0pt} +\providecommand{\Dtabularlistfield}[1]{% + {% + % This only saves field name and field body in \Dsavefieldname and + % \Dsavefieldbody, resp. It does not insert any text into the + % document. + #1% + % Recalculate the real field name width everytime we encounter a + % tabular list field because it may have been changed using a + % "raw" node. + \setlength{\Drealfieldnamewidth}{\Dtabularlistfieldnamewidth}% + \addtolength{\Drealfieldnamewidth}{\Dtabularlistfieldnamesep}% + \Dmakelistenvironment{% + \makebox[\Drealfieldnamewidth][l]{\Dsavefieldname}% + }{% + \setlength{\labelwidth}{\Drealfieldnamewidth}% + \setlength{\leftmargin}{\Drealfieldnamewidth}% + \setlength{\rightmargin}{0pt}% + \setlength{\labelsep}{0pt}% + }{% + \item% + \settowidth{\Dusedfieldnamewidth}{\Dsavefieldname}% + \setlength{\Dparskiptemp}{\parskip}% + \ifthenelse{% + \lengthtest{\Dusedfieldnamewidth>\Dtabularlistfieldnamewidth}% + }{% + \mbox{}\par% + \setlength{\parskip}{0pt}% + }{}% + \Dsavefieldbody% + \setlength{\parskip}{\Dparskiptemp}% + %XXX Why did we need this? + %\@finalstrut\@arstrutbox% + }% + \par% + }% +} + +\providecommand{\Dformatfieldname}[1]{\textbf{#1:}} +\providecommand{\DNfieldlist}[1]{#1} +\providecommand{\DNfield}[1]{\Dtabularlistfield{#1}} +\providecommand{\DNfieldname}[1]{% + \Dtabularlistfieldname{% + \Dformatfieldname{#1}% + }% +} +\providecommand{\DNfieldbody}[1]{\Dtabularlistfieldbody{#1}} + +\providecommand{\Dformatoptiongroup}[1]{% + % Format option group, e.g. "-f file, --input file". + \texttt{#1}% +} +\providecommand{\Dformatoption}[1]{% + % Format option, e.g. "-f file". + % Put into mbox to avoid line-breaking at spaces. + \mbox{#1}% +} +\providecommand{\Dformatoptionstring}[1]{% + % Format option string, e.g. "-f". + #1% +} +\providecommand{\Dformatoptionargument}[1]{% + % Format option argument, e.g. "file". + \textsl{#1}% +} +\providecommand{\Dformatoptiondescription}[1]{% + % Format option description, e.g. + % "\DNparagraph{Read input data from file.}" + #1% +} +\providecommand{\DNoptionlist}[1]{#1} +\providecommand{\Doptiongroupjoiner}{,{ }} +\providecommand{\Disfirstoption}{% + % Auxiliary macro indicating if a given option is the first child + % of its option group (if it's not, it has to preceded by + % \Doptiongroupjoiner). + false% +} +\providecommand{\DNoptionlistitem}[1]{% + \Dtabularlistfield{#1}% +} +\providecommand{\DNoptiongroup}[1]{% + \renewcommand{\Disfirstoption}{true}% + \Dtabularlistfieldname{\Dformatoptiongroup{#1}}% +} +\providecommand{\DNoption}[1]{% + % If this is not the first option in this option group, add a + % joiner. + \ifthenelse{\equal{\Disfirstoption}{true}}{% + \renewcommand{\Disfirstoption}{false}% + }{% + \Doptiongroupjoiner% + }% + \Dformatoption{#1}% +} +\providecommand{\DNoptionstring}[1]{\Dformatoptionstring{#1}} +\providecommand{\DNoptionargument}[1]{{ }\Dformatoptionargument{#1}} +\providecommand{\DNdescription}[1]{% + \Dtabularlistfieldbody{\Dformatoptiondescription{#1}}% +} + +\providecommand{\DNdefinitionlist}[1]{% + \begin{description}% + \parskip0pt% + #1% + \end{description}% +} +\providecommand{\DNdefinitionlistitem}[1]{% + % LaTeX expects the label in square brackets; we provide an empty + % label. + \item[]#1% +} +\providecommand{\Dformatterm}[1]{#1} +\providecommand{\DNterm}[1]{\hspace{-5pt}\Dformatterm{#1}} +% I'm still not sure what's the best rendering for classifiers. The +% colon syntax is used by reStructuredText, so it's at least WYSIWYG. +% Use slanted text because italic would cause too much emphasis. +\providecommand{\Dformatclassifier}[1]{\textsl{#1}} +\providecommand{\DNclassifier}[1]{~:~\Dformatclassifier{#1}} +\providecommand{\Dformatdefinition}[1]{#1} +\providecommand{\DNdefinition}[1]{\par\Dformatdefinition{#1}} + +\providecommand{\Dlineblockindentation}{2.5em} +\providecommand{\DNlineblock}[1]{% + \Dmakelistenvironment{}{% + \ifthenelse{\equal{\DEVparent}{lineblock}}{% + % Parent is a line block, so indent. + \setlength{\leftmargin}{\Dlineblockindentation}% + }{% + % At top level; don't indent. + \setlength{\leftmargin}{0pt}% + }% + \setlength{\rightmargin}{0pt}% + \setlength{\parsep}{0pt}% + }{% + #1% + }% +} +\providecommand{\DNline}[1]{\item#1} + +\providecommand{\DNtransition}{% + \raisebox{0.25em}{\parbox{\linewidth}{\hspace*{\fill}\hrulefill\hrulefill\hspace*{\fill}}}% +} + +\providecommand{\Dformatblockquote}[1]{% + % Format contents of block quote. + % This occurs in block-level context, so we cannot use \textsl. + {\slshape#1}% +} +\providecommand{\Dformatattribution}[1]{---\textup{#1}} +\providecommand{\DNblockquote}[1]{% + \Dmakebox{% + \Dformatblockquote{#1} + }% +} +\providecommand{\DNattribution}[1]{% + \par% + \begin{flushright}\Dformatattribution{#1}\end{flushright}% +} + + +% Sidebars: +% Vertical and horizontal margins. +\Dprovidelength{\Dsidebarvmargin}{0.5em} +\Dprovidelength{\Dsidebarhmargin}{1em} +% Padding (space between contents and frame). +\Dprovidelength{\Dsidebarpadding}{1em} +% Frame width. +\Dprovidelength{\Dsidebarframewidth}{2\fboxrule} +% Position ("l" or "r"). +\providecommand{\Dsidebarposition}{r} +% Width. +\Dprovidelength{\Dsidebarwidth}{0.45\linewidth} +\providecommand{\DNsidebar}[1]{ + \parpic[\Dsidebarposition]{% + \begin{minipage}[t]{\Dsidebarwidth}% + % Doing this with nested minipages is ugly, but I haven't found + % another way to place vertical space before and after the fbox. + \vspace{\Dsidebarvmargin}% + {% + \setlength{\fboxrule}{\Dsidebarframewidth}% + \setlength{\fboxsep}{\Dsidebarpadding}% + \fbox{% + \begin{minipage}[t]{\linewidth}% + \setlength{\parindent}{\Dboxparindent}% + #1% + \end{minipage}% + }% + }% + \vspace{\Dsidebarvmargin}% + \end{minipage}% + }% +} + + +% Citations and footnotes. +\providecommand{\Dformatfootnote}[1]{% + % Format footnote. + {% + \footnotesize#1% + % \par is necessary for LaTeX to adjust baselineskip to the + % changed font size. + \par% + }% +} +\providecommand{\Dformatcitation}[1]{\Dformatfootnote{#1}} +\Dprovidelength{\Doriginalbaselineskip}{0pt} +\providecommand{\DNfootnotereference}[1]{% + {% + % \baselineskip is 0pt in \textsuperscript, so we save it here. + \setlength{\Doriginalbaselineskip}{\baselineskip}% + \textsuperscript{#1}% + }% +} +\providecommand{\DNcitationreference}[1]{{[}#1{]}} +\Dprovidelength{\Dfootnotesep}{3.5pt} +\providecommand{\Dsetfootnotespacing}{% + % Spacing commands executed at the beginning of footnotes. + \setlength{\parindent}{0pt}% + \hspace{1em}% +} +\providecommand{\DNfootnote}[1]{% + % See ltfloat.dtx for details. + {% + \insert\footins{% + % BUG: This is too small if the user adds + % \onehalfspacing or \doublespace. + \vspace{\Dfootnotesep}% + \Dsetfootnotespacing% + \Dformatfootnote{#1}% + }% + }% +} +\providecommand{\DNcitation}[1]{\DNfootnote{#1}} +\providecommand{\Dformatfootnotelabel}[1]{% + % Keep \footnotesize in footnote labels (\textsuperscript would + % reduce the font size even more). + \textsuperscript{\footnotesize#1{ }}% +} +\providecommand{\Dformatcitationlabel}[1]{{[}#1{]}{ }} +\providecommand{\Dformatmultiplebackrefs}[1]{% + % If in printing mode, do not write out multiple backrefs. + \ifthenelse{\equal{\Dprinting}{true}}{}{\textsl{#1}}% +} +\providecommand{\Dthislabel}{} +\providecommand{\DNlabel}[1]{% + % Footnote or citatation label. + \renewcommand{\Dthislabel}{#1}% + \ifthenelse{\not\equal{\DEVsinglebackref}{}}{% + \let\Doriginallabel=\Dthislabel% + \def\Dthislabel{% + \Dsinglefootnotebacklink{\DEVsinglebackref}{\Doriginallabel}% + }% + }{}% + \ifthenelse{\equal{\DEVparent}{footnote}}{% + % Footnote label. + \Dformatfootnotelabel{\Dthislabel}% + }{% + \ifthenelse{\equal{\DEVparent}{citation}}{% + % Citation label. + \Dformatcitationlabel{\Dthislabel}% + }{}% + }% + % If there are multiple backrefs, add them now. + \Dformatmultiplebackrefs{\DEVmultiplebackrefs}% +} +\providecommand{\Dsinglefootnotebacklink}[2]{% + % Create normal backlink of a footnote label. Parameters: + % 1. ID. + % 2. Link text. + % Treat like a footnote reference. + \Dimplicitfootnotereference{\##1}{#2}% +} +\providecommand{\DECmultifootnotebacklink}[2]{% + % Create generated backlink, as in (1, 2). Parameters: + % 1. ID. + % 2. Link text. + % Treat like a footnote reference. + \Dimplicitfootnotereference{\##1}{#2}% +} +\providecommand{\Dsinglecitationbacklink}[2]{\Dsinglefootnotebacklink{#1}{#2}} +\providecommand{\DECmulticitationbacklink}[2]{\DECmultifootnotebacklink{#1}{#2}} + + +\providecommand{\DECmaketable}[2]{% + % Make table. Parameters: + % 1. Table spec (like "|p|p|"). + % 2. Table contents. + {% + \ifthenelse{\equal{\Dinsidetabular}{true}}{% + % Inside longtable; we cannot have nested longtables. + \begin{tabular}{#1}% + \hline% + #2% + \end{tabular}% + }{% + \renewcommand{\Dinsidetabular}{true}% + \begin{longtable}{#1}% + \hline% + #2% + \end{longtable}% + }% + }% +} +\providecommand{\DNthead}[1]{% + #1% + \endhead% +} +\providecommand{\DNrow}[1]{% + #1\tabularnewline% + \hline% +} +\providecommand{\Dinsidemulticolumn}{false} +\providecommand{\Dcompensatingmulticol}[3]{% + \multicolumn{#1}{#2}{% + {% + \renewcommand{\Dinsidemulticolumn}{true}% + % Compensate for weird missing vertical space at top of paragraph. + \raisebox{-2.5pt}{#3}% + }% + }% +} +\providecommand{\DECcolspan}[2]{% + % Take care of the morecols attribute (but incremented by 1). + &% + \Dcompensatingmulticol{#1}{l|}{#2}% +} +\providecommand{\DECcolspanleft}[2]{% + % Like \Dmorecols, but called for the leftmost entries in a table + % row. + \Dcompensatingmulticol{#1}{|l|}{#2}% +} +\providecommand{\DECsubsequententry}[1]{% + % +} +\providecommand{\DNentry}[1]{% + % The following sequence adds minimal vertical space above the top + % lines of the first cell paragraph, so that vertical space is + % balanced at the top and bottom of table cells. + \ifthenelse{\equal{\Dinsidemulticolumn}{false}}{% + \vspace{-1em}\vspace{-\parskip}\par% + }{}% + #1% + % No need to add an ampersand ("&"); that's done by \DECsubsequententry. +} +\providecommand{\DAtableheaderentry}[5]{\Dformattableheaderentry{#5}} +\providecommand{\Dformattableheaderentry}[1]{{\bfseries#1}} + + +\providecommand{\DNsystemmessage}[1]{% + {% + \ifthenelse{\equal{\Dprinting}{false}}{\color{red}}{}% + \bfseries% + #1% + }% +} + + +\providecommand{\Dinsidehalign}{false} +\newsavebox{\Dalignedimagebox} +\Dprovidelength{\Dalignedimagewidth}{0pt} +\providecommand{\Dhalign}[2]{% + % Horizontally align the contents to the left or right so that the + % text flows around it. + % Parameters: + % 1. l or r + % 2. Contents. + \renewcommand{\Dinsidehalign}{true}% + % For some obscure reason \parpic consumes some vertical space. + \vspace{-3pt}% + % Now we do something *really* ugly, but this enables us to wrap the + % image in a minipage while still allowing tight frames when + % class=border (see \DNimageCborder). + \sbox{\Dalignedimagebox}{#2}% + \settowidth{\Dalignedimagewidth}{\usebox{\Dalignedimagebox}}% + \parpic[#1]{% + \begin{minipage}[b]{\Dalignedimagewidth}% + % Compensate for previously added space, but not entirely. + \vspace*{2.0pt}% + \vspace*{\Dfloatimagetopmargin}% + \usebox{\Dalignedimagebox}% + \vspace*{1.5pt}% + \vspace*{\Dfloatimagebottommargin}% + \end{minipage}% + }% + \renewcommand{\Dinsidehalign}{false}% +} + + +% Maximum width of an image. +\providecommand{\Dimagemaxwidth}{\linewidth} +\providecommand{\Dfloatimagemaxwidth}{0.5\linewidth} +% Auxiliary variable. +\Dprovidelength{\Dcurrentimagewidth}{0pt} +\providecommand{\DNimageAalign}[5]{% + \ifthenelse{\equal{#3}{left}}{% + \Dhalign{l}{#5}% + }{% + \ifthenelse{\equal{#3}{right}}{% + \Dhalign{r}{#5}% + }{% + \ifthenelse{\equal{#3}{center}}{% + % Text floating around centered figures is a bad idea. Thus + % we use a center environment. Note that no extra space is + % added by the writer, so the space added by the center + % environment is fine. + \begin{center}#5\end{center}% + }{% + #5% + }% + }% + }% +} +% Base path for images. +\providecommand{\Dimagebase}{} +% Auxiliary command. Current image path. +\providecommand{\Dimagepath}{} +\providecommand{\DNimageAuri}[5]{% + % Insert image. We treat the URI like a path here. + \renewcommand{\Dimagepath}{\Dimagebase#3}% + \Difdefined{DcurrentNimageAwidth}{% + \Dwidthimage{\DEVcurrentNimageAwidth}{\Dimagepath}% + }{% + \Dsimpleimage{\Dimagepath}% + }% +} +\Dprovidelength{\Dfloatimagevmargin}{0pt} +\providecommand{\Dfloatimagetopmargin}{\Dfloatimagevmargin} +\providecommand{\Dfloatimagebottommargin}{\Dfloatimagevmargin} +\providecommand{\Dwidthimage}[2]{% + % Image with specified width. + % Parameters: + % 1. Image width. + % 2. Image path. + % Need to make bottom-alignment dependent on align attribute (add + % functional test first). Need to observe height attribute. + %\begin{minipage}[b]{#1}% + \includegraphics[width=#1,height=\textheight,keepaspectratio]{#2}% + %\end{minipage}% +} +\providecommand{\Dcurrentimagemaxwidth}{} +\providecommand{\Dsimpleimage}[1]{% + % Insert image, without much parametrization. + \settowidth{\Dcurrentimagewidth}{\includegraphics{#1}}% + \ifthenelse{\equal{\Dinsidehalign}{true}}{% + \renewcommand{\Dcurrentimagemaxwidth}{\Dfloatimagemaxwidth}% + }{% + \renewcommand{\Dcurrentimagemaxwidth}{\Dimagemaxwidth}% + }% + \ifthenelse{\lengthtest{\Dcurrentimagewidth>\Dcurrentimagemaxwidth}}{% + \Dwidthimage{\Dcurrentimagemaxwidth}{#1}% + }{% + \Dwidthimage{\Dcurrentimagewidth}{#1}% + }% +} +\providecommand{\Dwidthimage}[2]{% + % Image with specified width. + % Parameters: + % 1. Image width. + % 2. Image path. + \Dwidthimage{#1}{#2}% +} + +% Figures. +\providecommand{\DNfigureAalign}[5]{% + % Hack to make it work Right Now. + %\def\DEVcurrentNimageAwidth{\DEVcurrentNfigureAwidth}% + % + %\def\DEVcurrentNimageAwidth{\linewidth}% + \DNimageAalign{#1}{#2}{#3}{#4}{% + \begin{minipage}[b]{0.4\linewidth}#5\end{minipage}}% + %\let\DEVcurrentNimageAwidth=\relax% + % + %\let\DEVcurrentNimageAwidth=\relax% +} +\providecommand{\DNcaption}[1]{\par\noindent{\slshape#1}} +\providecommand{\DNlegend}[1]{\DECauxiliaryspace#1} + +\providecommand{\DCborder}[1]{\fbox{#1}} +% No padding between image and border. +\providecommand{\DNimageCborder}[1]{\frame{#1}} + + +% Need to replace with language-specific stuff. Maybe look at +% csquotes.sty and ask the author for permission to use parts of it. +\providecommand{\DECtextleftdblquote}{``} +\providecommand{\DECtextrightdblquote}{''} + +% Table of contents: +\Dprovidelength{\Dtocininitialsectnumwidth}{2.4em} +\Dprovidelength{\Dtocadditionalsectnumwidth}{0.7em} +% Level inside a table of contents. While this is at -1, we are not +% inside a TOC. +\Dprovidecounter{Dtoclevel}{-1}% +\providecommand{\Dlocaltoc}{false}% +\providecommand{\DNtopicClocal}[1]{% + \renewcommand{\Dlocaltoc}{true}% + \addtolength{\Dtocsectnumwidth}{2\Dtocadditionalsectnumwidth}% + \addtolength{\Dtocindent}{-2\Dtocadditionalsectnumwidth}% + #1% + \addtolength{\Dtocindent}{2\Dtocadditionalsectnumwidth}% + \addtolength{\Dtocsectnumwidth}{-2\Dtocadditionalsectnumwidth}% + \renewcommand{\Dlocaltoc}{false}% +} +\Dprovidelength{\Dtocindent}{0pt}% +\Dprovidelength{\Dtocsectnumwidth}{\Dtocininitialsectnumwidth} +% Compensate for one additional TOC indentation space so that the +% top-level is unindented. +\addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth} +\addtolength{\Dtocindent}{-\Dtocsectnumwidth} +\providecommand{\Difinsidetoc}[2]{% + \ifthenelse{\not\equal{\theDtoclevel}{-1}}{#1}{#2}% +} +\providecommand{\DNgeneratedCsectnum}[1]{% + \Difinsidetoc{% + % Section number inside TOC. + \makebox[\Dtocsectnumwidth][l]{#1}% + }{% + % Section number inside section title. + #1\quad% + }% +} +\providecommand{\Dtocbulletlist}[1]{% + \addtocounter{Dtoclevel}{1}% + \addtolength{\Dtocindent}{\Dtocsectnumwidth}% + \addtolength{\Dtocsectnumwidth}{\Dtocadditionalsectnumwidth}% + #1% + \addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}% + \addtolength{\Dtocindent}{-\Dtocsectnumwidth}% + \addtocounter{Dtoclevel}{-1}% +} + + +% For \DECpixelunit, the length value is pre-multiplied with 0.75, so by +% specifying "pt" we get the same notion of "pixel" as graphicx. +\providecommand{\DECpixelunit}{pt} +% Normally lengths are relative to the current linewidth. +\providecommand{\DECrelativeunit}{\linewidth} + + +% ACTION: These commands actually *do* something. +% Ultimately, everything should be done here, and no active content should be +% above (not even \usepackage). + +\DSearly +\DSpackages +\DSfrenchspacing +\DSsymbols +\DSlate + +\makeatother diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/unicode_map.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/unicode_map.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,2369 @@ +# $Id$ +# Author: Lea Wiemann +# Copyright: This file has been placed in the public domain. + +# This is a mapping of Unicode characters to LaTeX equivalents. +# The information has been extracted from +# , written by +# David Carlisle and Sebastian Rahtz. +# +# The extraction has been done by the "create_unimap.py" script +# located at . + +unicode_map = {u'\xa0': '$~$', +u'\xa1': '{\\textexclamdown}', +u'\xa2': '{\\textcent}', +u'\xa3': '{\\textsterling}', +u'\xa4': '{\\textcurrency}', +u'\xa5': '{\\textyen}', +u'\xa6': '{\\textbrokenbar}', +u'\xa7': '{\\textsection}', +u'\xa8': '{\\textasciidieresis}', +u'\xa9': '{\\textcopyright}', +u'\xaa': '{\\textordfeminine}', +u'\xab': '{\\guillemotleft}', +u'\xac': '$\\lnot$', +u'\xad': '$\\-$', +u'\xae': '{\\textregistered}', +u'\xaf': '{\\textasciimacron}', +u'\xb0': '{\\textdegree}', +u'\xb1': '$\\pm$', +u'\xb2': '${^2}$', +u'\xb3': '${^3}$', +u'\xb4': '{\\textasciiacute}', +u'\xb5': '$\\mathrm{\\mu}$', +u'\xb6': '{\\textparagraph}', +u'\xb7': '$\\cdot$', +u'\xb8': '{\\c{}}', +u'\xb9': '${^1}$', +u'\xba': '{\\textordmasculine}', +u'\xbb': '{\\guillemotright}', +u'\xbc': '{\\textonequarter}', +u'\xbd': '{\\textonehalf}', +u'\xbe': '{\\textthreequarters}', +u'\xbf': '{\\textquestiondown}', +u'\xc0': '{\\`{A}}', +u'\xc1': "{\\'{A}}", +u'\xc2': '{\\^{A}}', +u'\xc3': '{\\~{A}}', +u'\xc4': '{\\"{A}}', +u'\xc5': '{\\AA}', +u'\xc6': '{\\AE}', +u'\xc7': '{\\c{C}}', +u'\xc8': '{\\`{E}}', +u'\xc9': "{\\'{E}}", +u'\xca': '{\\^{E}}', +u'\xcb': '{\\"{E}}', +u'\xcc': '{\\`{I}}', +u'\xcd': "{\\'{I}}", +u'\xce': '{\\^{I}}', +u'\xcf': '{\\"{I}}', +u'\xd0': '{\\DH}', +u'\xd1': '{\\~{N}}', +u'\xd2': '{\\`{O}}', +u'\xd3': "{\\'{O}}", +u'\xd4': '{\\^{O}}', +u'\xd5': '{\\~{O}}', +u'\xd6': '{\\"{O}}', +u'\xd7': '{\\texttimes}', +u'\xd8': '{\\O}', +u'\xd9': '{\\`{U}}', +u'\xda': "{\\'{U}}", +u'\xdb': '{\\^{U}}', +u'\xdc': '{\\"{U}}', +u'\xdd': "{\\'{Y}}", +u'\xde': '{\\TH}', +u'\xdf': '{\\ss}', +u'\xe0': '{\\`{a}}', +u'\xe1': "{\\'{a}}", +u'\xe2': '{\\^{a}}', +u'\xe3': '{\\~{a}}', +u'\xe4': '{\\"{a}}', +u'\xe5': '{\\aa}', +u'\xe6': '{\\ae}', +u'\xe7': '{\\c{c}}', +u'\xe8': '{\\`{e}}', +u'\xe9': "{\\'{e}}", +u'\xea': '{\\^{e}}', +u'\xeb': '{\\"{e}}', +u'\xec': '{\\`{\\i}}', +u'\xed': "{\\'{\\i}}", +u'\xee': '{\\^{\\i}}', +u'\xef': '{\\"{\\i}}', +u'\xf0': '{\\dh}', +u'\xf1': '{\\~{n}}', +u'\xf2': '{\\`{o}}', +u'\xf3': "{\\'{o}}", +u'\xf4': '{\\^{o}}', +u'\xf5': '{\\~{o}}', +u'\xf6': '{\\"{o}}', +u'\xf7': '$\\div$', +u'\xf8': '{\\o}', +u'\xf9': '{\\`{u}}', +u'\xfa': "{\\'{u}}", +u'\xfb': '{\\^{u}}', +u'\xfc': '{\\"{u}}', +u'\xfd': "{\\'{y}}", +u'\xfe': '{\\th}', +u'\xff': '{\\"{y}}', +u'\u0100': '{\\={A}}', +u'\u0101': '{\\={a}}', +u'\u0102': '{\\u{A}}', +u'\u0103': '{\\u{a}}', +u'\u0104': '{\\k{A}}', +u'\u0105': '{\\k{a}}', +u'\u0106': "{\\'{C}}", +u'\u0107': "{\\'{c}}", +u'\u0108': '{\\^{C}}', +u'\u0109': '{\\^{c}}', +u'\u010a': '{\\.{C}}', +u'\u010b': '{\\.{c}}', +u'\u010c': '{\\v{C}}', +u'\u010d': '{\\v{c}}', +u'\u010e': '{\\v{D}}', +u'\u010f': '{\\v{d}}', +u'\u0110': '{\\DJ}', +u'\u0111': '{\\dj}', +u'\u0112': '{\\={E}}', +u'\u0113': '{\\={e}}', +u'\u0114': '{\\u{E}}', +u'\u0115': '{\\u{e}}', +u'\u0116': '{\\.{E}}', +u'\u0117': '{\\.{e}}', +u'\u0118': '{\\k{E}}', +u'\u0119': '{\\k{e}}', +u'\u011a': '{\\v{E}}', +u'\u011b': '{\\v{e}}', +u'\u011c': '{\\^{G}}', +u'\u011d': '{\\^{g}}', +u'\u011e': '{\\u{G}}', +u'\u011f': '{\\u{g}}', +u'\u0120': '{\\.{G}}', +u'\u0121': '{\\.{g}}', +u'\u0122': '{\\c{G}}', +u'\u0123': '{\\c{g}}', +u'\u0124': '{\\^{H}}', +u'\u0125': '{\\^{h}}', +u'\u0126': '{{\\fontencoding{LELA}\\selectfont\\char40}}', +u'\u0127': '$\\Elzxh$', +u'\u0128': '{\\~{I}}', +u'\u0129': '{\\~{\\i}}', +u'\u012a': '{\\={I}}', +u'\u012b': '{\\={\\i}}', +u'\u012c': '{\\u{I}}', +u'\u012d': '{\\u{\\i}}', +u'\u012e': '{\\k{I}}', +u'\u012f': '{\\k{i}}', +u'\u0130': '{\\.{I}}', +u'\u0131': '{\\i}', +u'\u0132': '{IJ}', +u'\u0133': '{ij}', +u'\u0134': '{\\^{J}}', +u'\u0135': '{\\^{\\j}}', +u'\u0136': '{\\c{K}}', +u'\u0137': '{\\c{k}}', +u'\u0138': '{{\\fontencoding{LELA}\\selectfont\\char91}}', +u'\u0139': "{\\'{L}}", +u'\u013a': "{\\'{l}}", +u'\u013b': '{\\c{L}}', +u'\u013c': '{\\c{l}}', +u'\u013d': '{\\v{L}}', +u'\u013e': '{\\v{l}}', +u'\u013f': '{{\\fontencoding{LELA}\\selectfont\\char201}}', +u'\u0140': '{{\\fontencoding{LELA}\\selectfont\\char202}}', +u'\u0141': '{\\L}', +u'\u0142': '{\\l}', +u'\u0143': "{\\'{N}}", +u'\u0144': "{\\'{n}}", +u'\u0145': '{\\c{N}}', +u'\u0146': '{\\c{n}}', +u'\u0147': '{\\v{N}}', +u'\u0148': '{\\v{n}}', +u'\u0149': "{'n}", +u'\u014a': '{\\NG}', +u'\u014b': '{\\ng}', +u'\u014c': '{\\={O}}', +u'\u014d': '{\\={o}}', +u'\u014e': '{\\u{O}}', +u'\u014f': '{\\u{o}}', +u'\u0150': '{\\H{O}}', +u'\u0151': '{\\H{o}}', +u'\u0152': '{\\OE}', +u'\u0153': '{\\oe}', +u'\u0154': "{\\'{R}}", +u'\u0155': "{\\'{r}}", +u'\u0156': '{\\c{R}}', +u'\u0157': '{\\c{r}}', +u'\u0158': '{\\v{R}}', +u'\u0159': '{\\v{r}}', +u'\u015a': "{\\'{S}}", +u'\u015b': "{\\'{s}}", +u'\u015c': '{\\^{S}}', +u'\u015d': '{\\^{s}}', +u'\u015e': '{\\c{S}}', +u'\u015f': '{\\c{s}}', +u'\u0160': '{\\v{S}}', +u'\u0161': '{\\v{s}}', +u'\u0162': '{\\c{T}}', +u'\u0163': '{\\c{t}}', +u'\u0164': '{\\v{T}}', +u'\u0165': '{\\v{t}}', +u'\u0166': '{{\\fontencoding{LELA}\\selectfont\\char47}}', +u'\u0167': '{{\\fontencoding{LELA}\\selectfont\\char63}}', +u'\u0168': '{\\~{U}}', +u'\u0169': '{\\~{u}}', +u'\u016a': '{\\={U}}', +u'\u016b': '{\\={u}}', +u'\u016c': '{\\u{U}}', +u'\u016d': '{\\u{u}}', +u'\u016e': '{\\r{U}}', +u'\u016f': '{\\r{u}}', +u'\u0170': '{\\H{U}}', +u'\u0171': '{\\H{u}}', +u'\u0172': '{\\k{U}}', +u'\u0173': '{\\k{u}}', +u'\u0174': '{\\^{W}}', +u'\u0175': '{\\^{w}}', +u'\u0176': '{\\^{Y}}', +u'\u0177': '{\\^{y}}', +u'\u0178': '{\\"{Y}}', +u'\u0179': "{\\'{Z}}", +u'\u017a': "{\\'{z}}", +u'\u017b': '{\\.{Z}}', +u'\u017c': '{\\.{z}}', +u'\u017d': '{\\v{Z}}', +u'\u017e': '{\\v{z}}', +u'\u0192': '$f$', +u'\u0195': '{\\texthvlig}', +u'\u019e': '{\\textnrleg}', +u'\u01aa': '$\\eth$', +u'\u01ba': '{{\\fontencoding{LELA}\\selectfont\\char195}}', +u'\u01c2': '{\\textdoublepipe}', +u'\u01f5': "{\\'{g}}", +u'\u0250': '$\\Elztrna$', +u'\u0252': '$\\Elztrnsa$', +u'\u0254': '$\\Elzopeno$', +u'\u0256': '$\\Elzrtld$', +u'\u0258': '{{\\fontencoding{LEIP}\\selectfont\\char61}}', +u'\u0259': '$\\Elzschwa$', +u'\u025b': '$\\varepsilon$', +u'\u0261': '{g}', +u'\u0263': '$\\Elzpgamma$', +u'\u0264': '$\\Elzpbgam$', +u'\u0265': '$\\Elztrnh$', +u'\u026c': '$\\Elzbtdl$', +u'\u026d': '$\\Elzrtll$', +u'\u026f': '$\\Elztrnm$', +u'\u0270': '$\\Elztrnmlr$', +u'\u0271': '$\\Elzltlmr$', +u'\u0272': '{\\Elzltln}', +u'\u0273': '$\\Elzrtln$', +u'\u0277': '$\\Elzclomeg$', +u'\u0278': '{\\textphi}', +u'\u0279': '$\\Elztrnr$', +u'\u027a': '$\\Elztrnrl$', +u'\u027b': '$\\Elzrttrnr$', +u'\u027c': '$\\Elzrl$', +u'\u027d': '$\\Elzrtlr$', +u'\u027e': '$\\Elzfhr$', +u'\u027f': '{{\\fontencoding{LEIP}\\selectfont\\char202}}', +u'\u0282': '$\\Elzrtls$', +u'\u0283': '$\\Elzesh$', +u'\u0287': '$\\Elztrnt$', +u'\u0288': '$\\Elzrtlt$', +u'\u028a': '$\\Elzpupsil$', +u'\u028b': '$\\Elzpscrv$', +u'\u028c': '$\\Elzinvv$', +u'\u028d': '$\\Elzinvw$', +u'\u028e': '$\\Elztrny$', +u'\u0290': '$\\Elzrtlz$', +u'\u0292': '$\\Elzyogh$', +u'\u0294': '$\\Elzglst$', +u'\u0295': '$\\Elzreglst$', +u'\u0296': '$\\Elzinglst$', +u'\u029e': '{\\textturnk}', +u'\u02a4': '$\\Elzdyogh$', +u'\u02a7': '$\\Elztesh$', +u'\u02bc': "{'}", +u'\u02c7': '{\\textasciicaron}', +u'\u02c8': '$\\Elzverts$', +u'\u02cc': '$\\Elzverti$', +u'\u02d0': '$\\Elzlmrk$', +u'\u02d1': '$\\Elzhlmrk$', +u'\u02d2': '$\\Elzsbrhr$', +u'\u02d3': '$\\Elzsblhr$', +u'\u02d4': '$\\Elzrais$', +u'\u02d5': '$\\Elzlow$', +u'\u02d8': '{\\textasciibreve}', +u'\u02d9': '{\\textperiodcentered}', +u'\u02da': '{\\r{}}', +u'\u02db': '{\\k{}}', +u'\u02dc': '{\\texttildelow}', +u'\u02dd': '{\\H{}}', +u'\u02e5': '{\\tone{55}}', +u'\u02e6': '{\\tone{44}}', +u'\u02e7': '{\\tone{33}}', +u'\u02e8': '{\\tone{22}}', +u'\u02e9': '{\\tone{11}}', +u'\u0300': '{\\`}', +u'\u0301': "{\\'}", +u'\u0302': '{\\^}', +u'\u0303': '{\\~}', +u'\u0304': '{\\=}', +u'\u0306': '{\\u}', +u'\u0307': '{\\.}', +u'\u0308': '{\\"}', +u'\u030a': '{\\r}', +u'\u030b': '{\\H}', +u'\u030c': '{\\v}', +u'\u030f': '{\\cyrchar\\C}', +u'\u0311': '{{\\fontencoding{LECO}\\selectfont\\char177}}', +u'\u0318': '{{\\fontencoding{LECO}\\selectfont\\char184}}', +u'\u0319': '{{\\fontencoding{LECO}\\selectfont\\char185}}', +u'\u0321': '$\\Elzpalh$', +u'\u0322': '{\\Elzrh}', +u'\u0327': '{\\c}', +u'\u0328': '{\\k}', +u'\u032a': '$\\Elzsbbrg$', +u'\u032b': '{{\\fontencoding{LECO}\\selectfont\\char203}}', +u'\u032f': '{{\\fontencoding{LECO}\\selectfont\\char207}}', +u'\u0335': '{\\Elzxl}', +u'\u0336': '{\\Elzbar}', +u'\u0337': '{{\\fontencoding{LECO}\\selectfont\\char215}}', +u'\u0338': '{{\\fontencoding{LECO}\\selectfont\\char216}}', +u'\u033a': '{{\\fontencoding{LECO}\\selectfont\\char218}}', +u'\u033b': '{{\\fontencoding{LECO}\\selectfont\\char219}}', +u'\u033c': '{{\\fontencoding{LECO}\\selectfont\\char220}}', +u'\u033d': '{{\\fontencoding{LECO}\\selectfont\\char221}}', +u'\u0361': '{{\\fontencoding{LECO}\\selectfont\\char225}}', +u'\u0386': "{\\'{A}}", +u'\u0388': "{\\'{E}}", +u'\u0389': "{\\'{H}}", +u'\u038a': "{\\'{}{I}}", +u'\u038c': "{\\'{}O}", +u'\u038e': "$\\mathrm{'Y}$", +u'\u038f': "$\\mathrm{'\\Omega}$", +u'\u0390': '$\\acute{\\ddot{\\iota}}$', +u'\u0391': '$\\Alpha$', +u'\u0392': '$\\Beta$', +u'\u0393': '$\\Gamma$', +u'\u0394': '$\\Delta$', +u'\u0395': '$\\Epsilon$', +u'\u0396': '$\\Zeta$', +u'\u0397': '$\\Eta$', +u'\u0398': '$\\Theta$', +u'\u0399': '$\\Iota$', +u'\u039a': '$\\Kappa$', +u'\u039b': '$\\Lambda$', +u'\u039c': '$M$', +u'\u039d': '$N$', +u'\u039e': '$\\Xi$', +u'\u039f': '$O$', +u'\u03a0': '$\\Pi$', +u'\u03a1': '$\\Rho$', +u'\u03a3': '$\\Sigma$', +u'\u03a4': '$\\Tau$', +u'\u03a5': '$\\Upsilon$', +u'\u03a6': '$\\Phi$', +u'\u03a7': '$\\Chi$', +u'\u03a8': '$\\Psi$', +u'\u03a9': '$\\Omega$', +u'\u03aa': '$\\mathrm{\\ddot{I}}$', +u'\u03ab': '$\\mathrm{\\ddot{Y}}$', +u'\u03ac': "{\\'{$\\alpha$}}", +u'\u03ad': '$\\acute{\\epsilon}$', +u'\u03ae': '$\\acute{\\eta}$', +u'\u03af': '$\\acute{\\iota}$', +u'\u03b0': '$\\acute{\\ddot{\\upsilon}}$', +u'\u03b1': '$\\alpha$', +u'\u03b2': '$\\beta$', +u'\u03b3': '$\\gamma$', +u'\u03b4': '$\\delta$', +u'\u03b5': '$\\epsilon$', +u'\u03b6': '$\\zeta$', +u'\u03b7': '$\\eta$', +u'\u03b8': '{\\texttheta}', +u'\u03b9': '$\\iota$', +u'\u03ba': '$\\kappa$', +u'\u03bb': '$\\lambda$', +u'\u03bc': '$\\mu$', +u'\u03bd': '$\\nu$', +u'\u03be': '$\\xi$', +u'\u03bf': '$o$', +u'\u03c0': '$\\pi$', +u'\u03c1': '$\\rho$', +u'\u03c2': '$\\varsigma$', +u'\u03c3': '$\\sigma$', +u'\u03c4': '$\\tau$', +u'\u03c5': '$\\upsilon$', +u'\u03c6': '$\\varphi$', +u'\u03c7': '$\\chi$', +u'\u03c8': '$\\psi$', +u'\u03c9': '$\\omega$', +u'\u03ca': '$\\ddot{\\iota}$', +u'\u03cb': '$\\ddot{\\upsilon}$', +u'\u03cc': "{\\'{o}}", +u'\u03cd': '$\\acute{\\upsilon}$', +u'\u03ce': '$\\acute{\\omega}$', +u'\u03d0': '{\\Pisymbol{ppi022}{87}}', +u'\u03d1': '{\\textvartheta}', +u'\u03d2': '$\\Upsilon$', +u'\u03d5': '$\\phi$', +u'\u03d6': '$\\varpi$', +u'\u03da': '$\\Stigma$', +u'\u03dc': '$\\Digamma$', +u'\u03dd': '$\\digamma$', +u'\u03de': '$\\Koppa$', +u'\u03e0': '$\\Sampi$', +u'\u03f0': '$\\varkappa$', +u'\u03f1': '$\\varrho$', +u'\u03f4': '{\\textTheta}', +u'\u03f6': '$\\backepsilon$', +u'\u0401': '{\\cyrchar\\CYRYO}', +u'\u0402': '{\\cyrchar\\CYRDJE}', +u'\u0403': "{\\cyrchar{\\'\\CYRG}}", +u'\u0404': '{\\cyrchar\\CYRIE}', +u'\u0405': '{\\cyrchar\\CYRDZE}', +u'\u0406': '{\\cyrchar\\CYRII}', +u'\u0407': '{\\cyrchar\\CYRYI}', +u'\u0408': '{\\cyrchar\\CYRJE}', +u'\u0409': '{\\cyrchar\\CYRLJE}', +u'\u040a': '{\\cyrchar\\CYRNJE}', +u'\u040b': '{\\cyrchar\\CYRTSHE}', +u'\u040c': "{\\cyrchar{\\'\\CYRK}}", +u'\u040e': '{\\cyrchar\\CYRUSHRT}', +u'\u040f': '{\\cyrchar\\CYRDZHE}', +u'\u0410': '{\\cyrchar\\CYRA}', +u'\u0411': '{\\cyrchar\\CYRB}', +u'\u0412': '{\\cyrchar\\CYRV}', +u'\u0413': '{\\cyrchar\\CYRG}', +u'\u0414': '{\\cyrchar\\CYRD}', +u'\u0415': '{\\cyrchar\\CYRE}', +u'\u0416': '{\\cyrchar\\CYRZH}', +u'\u0417': '{\\cyrchar\\CYRZ}', +u'\u0418': '{\\cyrchar\\CYRI}', +u'\u0419': '{\\cyrchar\\CYRISHRT}', +u'\u041a': '{\\cyrchar\\CYRK}', +u'\u041b': '{\\cyrchar\\CYRL}', +u'\u041c': '{\\cyrchar\\CYRM}', +u'\u041d': '{\\cyrchar\\CYRN}', +u'\u041e': '{\\cyrchar\\CYRO}', +u'\u041f': '{\\cyrchar\\CYRP}', +u'\u0420': '{\\cyrchar\\CYRR}', +u'\u0421': '{\\cyrchar\\CYRS}', +u'\u0422': '{\\cyrchar\\CYRT}', +u'\u0423': '{\\cyrchar\\CYRU}', +u'\u0424': '{\\cyrchar\\CYRF}', +u'\u0425': '{\\cyrchar\\CYRH}', +u'\u0426': '{\\cyrchar\\CYRC}', +u'\u0427': '{\\cyrchar\\CYRCH}', +u'\u0428': '{\\cyrchar\\CYRSH}', +u'\u0429': '{\\cyrchar\\CYRSHCH}', +u'\u042a': '{\\cyrchar\\CYRHRDSN}', +u'\u042b': '{\\cyrchar\\CYRERY}', +u'\u042c': '{\\cyrchar\\CYRSFTSN}', +u'\u042d': '{\\cyrchar\\CYREREV}', +u'\u042e': '{\\cyrchar\\CYRYU}', +u'\u042f': '{\\cyrchar\\CYRYA}', +u'\u0430': '{\\cyrchar\\cyra}', +u'\u0431': '{\\cyrchar\\cyrb}', +u'\u0432': '{\\cyrchar\\cyrv}', +u'\u0433': '{\\cyrchar\\cyrg}', +u'\u0434': '{\\cyrchar\\cyrd}', +u'\u0435': '{\\cyrchar\\cyre}', +u'\u0436': '{\\cyrchar\\cyrzh}', +u'\u0437': '{\\cyrchar\\cyrz}', +u'\u0438': '{\\cyrchar\\cyri}', +u'\u0439': '{\\cyrchar\\cyrishrt}', +u'\u043a': '{\\cyrchar\\cyrk}', +u'\u043b': '{\\cyrchar\\cyrl}', +u'\u043c': '{\\cyrchar\\cyrm}', +u'\u043d': '{\\cyrchar\\cyrn}', +u'\u043e': '{\\cyrchar\\cyro}', +u'\u043f': '{\\cyrchar\\cyrp}', +u'\u0440': '{\\cyrchar\\cyrr}', +u'\u0441': '{\\cyrchar\\cyrs}', +u'\u0442': '{\\cyrchar\\cyrt}', +u'\u0443': '{\\cyrchar\\cyru}', +u'\u0444': '{\\cyrchar\\cyrf}', +u'\u0445': '{\\cyrchar\\cyrh}', +u'\u0446': '{\\cyrchar\\cyrc}', +u'\u0447': '{\\cyrchar\\cyrch}', +u'\u0448': '{\\cyrchar\\cyrsh}', +u'\u0449': '{\\cyrchar\\cyrshch}', +u'\u044a': '{\\cyrchar\\cyrhrdsn}', +u'\u044b': '{\\cyrchar\\cyrery}', +u'\u044c': '{\\cyrchar\\cyrsftsn}', +u'\u044d': '{\\cyrchar\\cyrerev}', +u'\u044e': '{\\cyrchar\\cyryu}', +u'\u044f': '{\\cyrchar\\cyrya}', +u'\u0451': '{\\cyrchar\\cyryo}', +u'\u0452': '{\\cyrchar\\cyrdje}', +u'\u0453': "{\\cyrchar{\\'\\cyrg}}", +u'\u0454': '{\\cyrchar\\cyrie}', +u'\u0455': '{\\cyrchar\\cyrdze}', +u'\u0456': '{\\cyrchar\\cyrii}', +u'\u0457': '{\\cyrchar\\cyryi}', +u'\u0458': '{\\cyrchar\\cyrje}', +u'\u0459': '{\\cyrchar\\cyrlje}', +u'\u045a': '{\\cyrchar\\cyrnje}', +u'\u045b': '{\\cyrchar\\cyrtshe}', +u'\u045c': "{\\cyrchar{\\'\\cyrk}}", +u'\u045e': '{\\cyrchar\\cyrushrt}', +u'\u045f': '{\\cyrchar\\cyrdzhe}', +u'\u0460': '{\\cyrchar\\CYROMEGA}', +u'\u0461': '{\\cyrchar\\cyromega}', +u'\u0462': '{\\cyrchar\\CYRYAT}', +u'\u0464': '{\\cyrchar\\CYRIOTE}', +u'\u0465': '{\\cyrchar\\cyriote}', +u'\u0466': '{\\cyrchar\\CYRLYUS}', +u'\u0467': '{\\cyrchar\\cyrlyus}', +u'\u0468': '{\\cyrchar\\CYRIOTLYUS}', +u'\u0469': '{\\cyrchar\\cyriotlyus}', +u'\u046a': '{\\cyrchar\\CYRBYUS}', +u'\u046c': '{\\cyrchar\\CYRIOTBYUS}', +u'\u046d': '{\\cyrchar\\cyriotbyus}', +u'\u046e': '{\\cyrchar\\CYRKSI}', +u'\u046f': '{\\cyrchar\\cyrksi}', +u'\u0470': '{\\cyrchar\\CYRPSI}', +u'\u0471': '{\\cyrchar\\cyrpsi}', +u'\u0472': '{\\cyrchar\\CYRFITA}', +u'\u0474': '{\\cyrchar\\CYRIZH}', +u'\u0478': '{\\cyrchar\\CYRUK}', +u'\u0479': '{\\cyrchar\\cyruk}', +u'\u047a': '{\\cyrchar\\CYROMEGARND}', +u'\u047b': '{\\cyrchar\\cyromegarnd}', +u'\u047c': '{\\cyrchar\\CYROMEGATITLO}', +u'\u047d': '{\\cyrchar\\cyromegatitlo}', +u'\u047e': '{\\cyrchar\\CYROT}', +u'\u047f': '{\\cyrchar\\cyrot}', +u'\u0480': '{\\cyrchar\\CYRKOPPA}', +u'\u0481': '{\\cyrchar\\cyrkoppa}', +u'\u0482': '{\\cyrchar\\cyrthousands}', +u'\u0488': '{\\cyrchar\\cyrhundredthousands}', +u'\u0489': '{\\cyrchar\\cyrmillions}', +u'\u048c': '{\\cyrchar\\CYRSEMISFTSN}', +u'\u048d': '{\\cyrchar\\cyrsemisftsn}', +u'\u048e': '{\\cyrchar\\CYRRTICK}', +u'\u048f': '{\\cyrchar\\cyrrtick}', +u'\u0490': '{\\cyrchar\\CYRGUP}', +u'\u0491': '{\\cyrchar\\cyrgup}', +u'\u0492': '{\\cyrchar\\CYRGHCRS}', +u'\u0493': '{\\cyrchar\\cyrghcrs}', +u'\u0494': '{\\cyrchar\\CYRGHK}', +u'\u0495': '{\\cyrchar\\cyrghk}', +u'\u0496': '{\\cyrchar\\CYRZHDSC}', +u'\u0497': '{\\cyrchar\\cyrzhdsc}', +u'\u0498': '{\\cyrchar\\CYRZDSC}', +u'\u0499': '{\\cyrchar\\cyrzdsc}', +u'\u049a': '{\\cyrchar\\CYRKDSC}', +u'\u049b': '{\\cyrchar\\cyrkdsc}', +u'\u049c': '{\\cyrchar\\CYRKVCRS}', +u'\u049d': '{\\cyrchar\\cyrkvcrs}', +u'\u049e': '{\\cyrchar\\CYRKHCRS}', +u'\u049f': '{\\cyrchar\\cyrkhcrs}', +u'\u04a0': '{\\cyrchar\\CYRKBEAK}', +u'\u04a1': '{\\cyrchar\\cyrkbeak}', +u'\u04a2': '{\\cyrchar\\CYRNDSC}', +u'\u04a3': '{\\cyrchar\\cyrndsc}', +u'\u04a4': '{\\cyrchar\\CYRNG}', +u'\u04a5': '{\\cyrchar\\cyrng}', +u'\u04a6': '{\\cyrchar\\CYRPHK}', +u'\u04a7': '{\\cyrchar\\cyrphk}', +u'\u04a8': '{\\cyrchar\\CYRABHHA}', +u'\u04a9': '{\\cyrchar\\cyrabhha}', +u'\u04aa': '{\\cyrchar\\CYRSDSC}', +u'\u04ab': '{\\cyrchar\\cyrsdsc}', +u'\u04ac': '{\\cyrchar\\CYRTDSC}', +u'\u04ad': '{\\cyrchar\\cyrtdsc}', +u'\u04ae': '{\\cyrchar\\CYRY}', +u'\u04af': '{\\cyrchar\\cyry}', +u'\u04b0': '{\\cyrchar\\CYRYHCRS}', +u'\u04b1': '{\\cyrchar\\cyryhcrs}', +u'\u04b2': '{\\cyrchar\\CYRHDSC}', +u'\u04b3': '{\\cyrchar\\cyrhdsc}', +u'\u04b4': '{\\cyrchar\\CYRTETSE}', +u'\u04b5': '{\\cyrchar\\cyrtetse}', +u'\u04b6': '{\\cyrchar\\CYRCHRDSC}', +u'\u04b7': '{\\cyrchar\\cyrchrdsc}', +u'\u04b8': '{\\cyrchar\\CYRCHVCRS}', +u'\u04b9': '{\\cyrchar\\cyrchvcrs}', +u'\u04ba': '{\\cyrchar\\CYRSHHA}', +u'\u04bb': '{\\cyrchar\\cyrshha}', +u'\u04bc': '{\\cyrchar\\CYRABHCH}', +u'\u04bd': '{\\cyrchar\\cyrabhch}', +u'\u04be': '{\\cyrchar\\CYRABHCHDSC}', +u'\u04bf': '{\\cyrchar\\cyrabhchdsc}', +u'\u04c0': '{\\cyrchar\\CYRpalochka}', +u'\u04c3': '{\\cyrchar\\CYRKHK}', +u'\u04c4': '{\\cyrchar\\cyrkhk}', +u'\u04c7': '{\\cyrchar\\CYRNHK}', +u'\u04c8': '{\\cyrchar\\cyrnhk}', +u'\u04cb': '{\\cyrchar\\CYRCHLDSC}', +u'\u04cc': '{\\cyrchar\\cyrchldsc}', +u'\u04d4': '{\\cyrchar\\CYRAE}', +u'\u04d5': '{\\cyrchar\\cyrae}', +u'\u04d8': '{\\cyrchar\\CYRSCHWA}', +u'\u04d9': '{\\cyrchar\\cyrschwa}', +u'\u04e0': '{\\cyrchar\\CYRABHDZE}', +u'\u04e1': '{\\cyrchar\\cyrabhdze}', +u'\u04e8': '{\\cyrchar\\CYROTLD}', +u'\u04e9': '{\\cyrchar\\cyrotld}', +u'\u2002': '{\\hspace{0.6em}}', +u'\u2003': '{\\hspace{1em}}', +u'\u2004': '{\\hspace{0.33em}}', +u'\u2005': '{\\hspace{0.25em}}', +u'\u2006': '{\\hspace{0.166em}}', +u'\u2007': '{\\hphantom{0}}', +u'\u2008': '{\\hphantom{,}}', +u'\u2009': '{\\hspace{0.167em}}', +u'\u200a': '$\\mkern1mu$', +u'\u2010': '{-}', +u'\u2013': '{\\textendash}', +u'\u2014': '{\\textemdash}', +u'\u2015': '{\\rule{1em}{1pt}}', +u'\u2016': '$\\Vert$', +u'\u2018': '{`}', +u'\u2019': "{'}", +u'\u201a': '{,}', +u'\u201b': '$\\Elzreapos$', +u'\u201c': '{\\textquotedblleft}', +u'\u201d': '{\\textquotedblright}', +u'\u201e': '{,,}', +u'\u2020': '{\\textdagger}', +u'\u2021': '{\\textdaggerdbl}', +u'\u2022': '{\\textbullet}', +u'\u2024': '{.}', +u'\u2025': '{..}', +u'\u2026': '{\\ldots}', +u'\u2030': '{\\textperthousand}', +u'\u2031': '{\\textpertenthousand}', +u'\u2032': "${'}$", +u'\u2033': "${''}$", +u'\u2034': "${'''}$", +u'\u2035': '$\\backprime$', +u'\u2039': '{\\guilsinglleft}', +u'\u203a': '{\\guilsinglright}', +u'\u2057': "$''''$", +u'\u205f': '{\\mkern4mu}', +u'\u2060': '{\\nolinebreak}', +u'\u20a7': '{\\ensuremath{\\Elzpes}}', +u'\u20ac': '{\\mbox{\\texteuro}}', +u'\u20db': '$\\dddot$', +u'\u20dc': '$\\ddddot$', +u'\u2102': '$\\mathbb{C}$', +u'\u210a': '{\\mathscr{g}}', +u'\u210b': '$\\mathscr{H}$', +u'\u210c': '$\\mathfrak{H}$', +u'\u210d': '$\\mathbb{H}$', +u'\u210f': '$\\hslash$', +u'\u2110': '$\\mathscr{I}$', +u'\u2111': '$\\mathfrak{I}$', +u'\u2112': '$\\mathscr{L}$', +u'\u2113': '$\\mathscr{l}$', +u'\u2115': '$\\mathbb{N}$', +u'\u2116': '{\\cyrchar\\textnumero}', +u'\u2118': '$\\wp$', +u'\u2119': '$\\mathbb{P}$', +u'\u211a': '$\\mathbb{Q}$', +u'\u211b': '$\\mathscr{R}$', +u'\u211c': '$\\mathfrak{R}$', +u'\u211d': '$\\mathbb{R}$', +u'\u211e': '$\\Elzxrat$', +u'\u2122': '{\\texttrademark}', +u'\u2124': '$\\mathbb{Z}$', +u'\u2126': '$\\Omega$', +u'\u2127': '$\\mho$', +u'\u2128': '$\\mathfrak{Z}$', +u'\u2129': '$\\ElsevierGlyph{2129}$', +u'\u212b': '{\\AA}', +u'\u212c': '$\\mathscr{B}$', +u'\u212d': '$\\mathfrak{C}$', +u'\u212f': '$\\mathscr{e}$', +u'\u2130': '$\\mathscr{E}$', +u'\u2131': '$\\mathscr{F}$', +u'\u2133': '$\\mathscr{M}$', +u'\u2134': '$\\mathscr{o}$', +u'\u2135': '$\\aleph$', +u'\u2136': '$\\beth$', +u'\u2137': '$\\gimel$', +u'\u2138': '$\\daleth$', +u'\u2153': '$\\textfrac{1}{3}$', +u'\u2154': '$\\textfrac{2}{3}$', +u'\u2155': '$\\textfrac{1}{5}$', +u'\u2156': '$\\textfrac{2}{5}$', +u'\u2157': '$\\textfrac{3}{5}$', +u'\u2158': '$\\textfrac{4}{5}$', +u'\u2159': '$\\textfrac{1}{6}$', +u'\u215a': '$\\textfrac{5}{6}$', +u'\u215b': '$\\textfrac{1}{8}$', +u'\u215c': '$\\textfrac{3}{8}$', +u'\u215d': '$\\textfrac{5}{8}$', +u'\u215e': '$\\textfrac{7}{8}$', +u'\u2190': '$\\leftarrow$', +u'\u2191': '$\\uparrow$', +u'\u2192': '$\\rightarrow$', +u'\u2193': '$\\downarrow$', +u'\u2194': '$\\leftrightarrow$', +u'\u2195': '$\\updownarrow$', +u'\u2196': '$\\nwarrow$', +u'\u2197': '$\\nearrow$', +u'\u2198': '$\\searrow$', +u'\u2199': '$\\swarrow$', +u'\u219a': '$\\nleftarrow$', +u'\u219b': '$\\nrightarrow$', +u'\u219c': '$\\arrowwaveright$', +u'\u219d': '$\\arrowwaveright$', +u'\u219e': '$\\twoheadleftarrow$', +u'\u21a0': '$\\twoheadrightarrow$', +u'\u21a2': '$\\leftarrowtail$', +u'\u21a3': '$\\rightarrowtail$', +u'\u21a6': '$\\mapsto$', +u'\u21a9': '$\\hookleftarrow$', +u'\u21aa': '$\\hookrightarrow$', +u'\u21ab': '$\\looparrowleft$', +u'\u21ac': '$\\looparrowright$', +u'\u21ad': '$\\leftrightsquigarrow$', +u'\u21ae': '$\\nleftrightarrow$', +u'\u21b0': '$\\Lsh$', +u'\u21b1': '$\\Rsh$', +u'\u21b3': '$\\ElsevierGlyph{21B3}$', +u'\u21b6': '$\\curvearrowleft$', +u'\u21b7': '$\\curvearrowright$', +u'\u21ba': '$\\circlearrowleft$', +u'\u21bb': '$\\circlearrowright$', +u'\u21bc': '$\\leftharpoonup$', +u'\u21bd': '$\\leftharpoondown$', +u'\u21be': '$\\upharpoonright$', +u'\u21bf': '$\\upharpoonleft$', +u'\u21c0': '$\\rightharpoonup$', +u'\u21c1': '$\\rightharpoondown$', +u'\u21c2': '$\\downharpoonright$', +u'\u21c3': '$\\downharpoonleft$', +u'\u21c4': '$\\rightleftarrows$', +u'\u21c5': '$\\dblarrowupdown$', +u'\u21c6': '$\\leftrightarrows$', +u'\u21c7': '$\\leftleftarrows$', +u'\u21c8': '$\\upuparrows$', +u'\u21c9': '$\\rightrightarrows$', +u'\u21ca': '$\\downdownarrows$', +u'\u21cb': '$\\leftrightharpoons$', +u'\u21cc': '$\\rightleftharpoons$', +u'\u21cd': '$\\nLeftarrow$', +u'\u21ce': '$\\nLeftrightarrow$', +u'\u21cf': '$\\nRightarrow$', +u'\u21d0': '$\\Leftarrow$', +u'\u21d1': '$\\Uparrow$', +u'\u21d2': '$\\Rightarrow$', +u'\u21d3': '$\\Downarrow$', +u'\u21d4': '$\\Leftrightarrow$', +u'\u21d5': '$\\Updownarrow$', +u'\u21da': '$\\Lleftarrow$', +u'\u21db': '$\\Rrightarrow$', +u'\u21dd': '$\\rightsquigarrow$', +u'\u21f5': '$\\DownArrowUpArrow$', +u'\u2200': '$\\forall$', +u'\u2201': '$\\complement$', +u'\u2202': '$\\partial$', +u'\u2203': '$\\exists$', +u'\u2204': '$\\nexists$', +u'\u2205': '$\\varnothing$', +u'\u2207': '$\\nabla$', +u'\u2208': '$\\in$', +u'\u2209': '$\\not\\in$', +u'\u220b': '$\\ni$', +u'\u220c': '$\\not\\ni$', +u'\u220f': '$\\prod$', +u'\u2210': '$\\coprod$', +u'\u2211': '$\\sum$', +u'\u2212': '{-}', +u'\u2213': '$\\mp$', +u'\u2214': '$\\dotplus$', +u'\u2216': '$\\setminus$', +u'\u2217': '${_\\ast}$', +u'\u2218': '$\\circ$', +u'\u2219': '$\\bullet$', +u'\u221a': '$\\surd$', +u'\u221d': '$\\propto$', +u'\u221e': '$\\infty$', +u'\u221f': '$\\rightangle$', +u'\u2220': '$\\angle$', +u'\u2221': '$\\measuredangle$', +u'\u2222': '$\\sphericalangle$', +u'\u2223': '$\\mid$', +u'\u2224': '$\\nmid$', +u'\u2225': '$\\parallel$', +u'\u2226': '$\\nparallel$', +u'\u2227': '$\\wedge$', +u'\u2228': '$\\vee$', +u'\u2229': '$\\cap$', +u'\u222a': '$\\cup$', +u'\u222b': '$\\int$', +u'\u222c': '$\\int\\!\\int$', +u'\u222d': '$\\int\\!\\int\\!\\int$', +u'\u222e': '$\\oint$', +u'\u222f': '$\\surfintegral$', +u'\u2230': '$\\volintegral$', +u'\u2231': '$\\clwintegral$', +u'\u2232': '$\\ElsevierGlyph{2232}$', +u'\u2233': '$\\ElsevierGlyph{2233}$', +u'\u2234': '$\\therefore$', +u'\u2235': '$\\because$', +u'\u2237': '$\\Colon$', +u'\u2238': '$\\ElsevierGlyph{2238}$', +u'\u223a': '$\\mathbin{{:}\\!\\!{-}\\!\\!{:}}$', +u'\u223b': '$\\homothetic$', +u'\u223c': '$\\sim$', +u'\u223d': '$\\backsim$', +u'\u223e': '$\\lazysinv$', +u'\u2240': '$\\wr$', +u'\u2241': '$\\not\\sim$', +u'\u2242': '$\\ElsevierGlyph{2242}$', +u'\u2243': '$\\simeq$', +u'\u2244': '$\\not\\simeq$', +u'\u2245': '$\\cong$', +u'\u2246': '$\\approxnotequal$', +u'\u2247': '$\\not\\cong$', +u'\u2248': '$\\approx$', +u'\u2249': '$\\not\\approx$', +u'\u224a': '$\\approxeq$', +u'\u224b': '$\\tildetrpl$', +u'\u224c': '$\\allequal$', +u'\u224d': '$\\asymp$', +u'\u224e': '$\\Bumpeq$', +u'\u224f': '$\\bumpeq$', +u'\u2250': '$\\doteq$', +u'\u2251': '$\\doteqdot$', +u'\u2252': '$\\fallingdotseq$', +u'\u2253': '$\\risingdotseq$', +u'\u2254': '{:=}', +u'\u2255': '$=:$', +u'\u2256': '$\\eqcirc$', +u'\u2257': '$\\circeq$', +u'\u2259': '$\\estimates$', +u'\u225a': '$\\ElsevierGlyph{225A}$', +u'\u225b': '$\\starequal$', +u'\u225c': '$\\triangleq$', +u'\u225f': '$\\ElsevierGlyph{225F}$', +u'\u2260': '$\\not =$', +u'\u2261': '$\\equiv$', +u'\u2262': '$\\not\\equiv$', +u'\u2264': '$\\leq$', +u'\u2265': '$\\geq$', +u'\u2266': '$\\leqq$', +u'\u2267': '$\\geqq$', +u'\u2268': '$\\lneqq$', +u'\u2269': '$\\gneqq$', +u'\u226a': '$\\ll$', +u'\u226b': '$\\gg$', +u'\u226c': '$\\between$', +u'\u226d': '$\\not\\kern-0.3em\\times$', +u'\u226e': '$\\not<$', +u'\u226f': '$\\not>$', +u'\u2270': '$\\not\\leq$', +u'\u2271': '$\\not\\geq$', +u'\u2272': '$\\lessequivlnt$', +u'\u2273': '$\\greaterequivlnt$', +u'\u2274': '$\\ElsevierGlyph{2274}$', +u'\u2275': '$\\ElsevierGlyph{2275}$', +u'\u2276': '$\\lessgtr$', +u'\u2277': '$\\gtrless$', +u'\u2278': '$\\notlessgreater$', +u'\u2279': '$\\notgreaterless$', +u'\u227a': '$\\prec$', +u'\u227b': '$\\succ$', +u'\u227c': '$\\preccurlyeq$', +u'\u227d': '$\\succcurlyeq$', +u'\u227e': '$\\precapprox$', +u'\u227f': '$\\succapprox$', +u'\u2280': '$\\not\\prec$', +u'\u2281': '$\\not\\succ$', +u'\u2282': '$\\subset$', +u'\u2283': '$\\supset$', +u'\u2284': '$\\not\\subset$', +u'\u2285': '$\\not\\supset$', +u'\u2286': '$\\subseteq$', +u'\u2287': '$\\supseteq$', +u'\u2288': '$\\not\\subseteq$', +u'\u2289': '$\\not\\supseteq$', +u'\u228a': '$\\subsetneq$', +u'\u228b': '$\\supsetneq$', +u'\u228e': '$\\uplus$', +u'\u228f': '$\\sqsubset$', +u'\u2290': '$\\sqsupset$', +u'\u2291': '$\\sqsubseteq$', +u'\u2292': '$\\sqsupseteq$', +u'\u2293': '$\\sqcap$', +u'\u2294': '$\\sqcup$', +u'\u2295': '$\\oplus$', +u'\u2296': '$\\ominus$', +u'\u2297': '$\\otimes$', +u'\u2298': '$\\oslash$', +u'\u2299': '$\\odot$', +u'\u229a': '$\\circledcirc$', +u'\u229b': '$\\circledast$', +u'\u229d': '$\\circleddash$', +u'\u229e': '$\\boxplus$', +u'\u229f': '$\\boxminus$', +u'\u22a0': '$\\boxtimes$', +u'\u22a1': '$\\boxdot$', +u'\u22a2': '$\\vdash$', +u'\u22a3': '$\\dashv$', +u'\u22a4': '$\\top$', +u'\u22a5': '$\\perp$', +u'\u22a7': '$\\truestate$', +u'\u22a8': '$\\forcesextra$', +u'\u22a9': '$\\Vdash$', +u'\u22aa': '$\\Vvdash$', +u'\u22ab': '$\\VDash$', +u'\u22ac': '$\\nvdash$', +u'\u22ad': '$\\nvDash$', +u'\u22ae': '$\\nVdash$', +u'\u22af': '$\\nVDash$', +u'\u22b2': '$\\vartriangleleft$', +u'\u22b3': '$\\vartriangleright$', +u'\u22b4': '$\\trianglelefteq$', +u'\u22b5': '$\\trianglerighteq$', +u'\u22b6': '$\\original$', +u'\u22b7': '$\\image$', +u'\u22b8': '$\\multimap$', +u'\u22b9': '$\\hermitconjmatrix$', +u'\u22ba': '$\\intercal$', +u'\u22bb': '$\\veebar$', +u'\u22be': '$\\rightanglearc$', +u'\u22c0': '$\\ElsevierGlyph{22C0}$', +u'\u22c1': '$\\ElsevierGlyph{22C1}$', +u'\u22c2': '$\\bigcap$', +u'\u22c3': '$\\bigcup$', +u'\u22c4': '$\\diamond$', +u'\u22c5': '$\\cdot$', +u'\u22c6': '$\\star$', +u'\u22c7': '$\\divideontimes$', +u'\u22c8': '$\\bowtie$', +u'\u22c9': '$\\ltimes$', +u'\u22ca': '$\\rtimes$', +u'\u22cb': '$\\leftthreetimes$', +u'\u22cc': '$\\rightthreetimes$', +u'\u22cd': '$\\backsimeq$', +u'\u22ce': '$\\curlyvee$', +u'\u22cf': '$\\curlywedge$', +u'\u22d0': '$\\Subset$', +u'\u22d1': '$\\Supset$', +u'\u22d2': '$\\Cap$', +u'\u22d3': '$\\Cup$', +u'\u22d4': '$\\pitchfork$', +u'\u22d6': '$\\lessdot$', +u'\u22d7': '$\\gtrdot$', +u'\u22d8': '$\\verymuchless$', +u'\u22d9': '$\\verymuchgreater$', +u'\u22da': '$\\lesseqgtr$', +u'\u22db': '$\\gtreqless$', +u'\u22de': '$\\curlyeqprec$', +u'\u22df': '$\\curlyeqsucc$', +u'\u22e2': '$\\not\\sqsubseteq$', +u'\u22e3': '$\\not\\sqsupseteq$', +u'\u22e5': '$\\Elzsqspne$', +u'\u22e6': '$\\lnsim$', +u'\u22e7': '$\\gnsim$', +u'\u22e8': '$\\precedesnotsimilar$', +u'\u22e9': '$\\succnsim$', +u'\u22ea': '$\\ntriangleleft$', +u'\u22eb': '$\\ntriangleright$', +u'\u22ec': '$\\ntrianglelefteq$', +u'\u22ed': '$\\ntrianglerighteq$', +u'\u22ee': '$\\vdots$', +u'\u22ef': '$\\cdots$', +u'\u22f0': '$\\upslopeellipsis$', +u'\u22f1': '$\\downslopeellipsis$', +u'\u2305': '{\\barwedge}', +u'\u2306': '$\\perspcorrespond$', +u'\u2308': '$\\lceil$', +u'\u2309': '$\\rceil$', +u'\u230a': '$\\lfloor$', +u'\u230b': '$\\rfloor$', +u'\u2315': '$\\recorder$', +u'\u2316': '$\\mathchar"2208$', +u'\u231c': '$\\ulcorner$', +u'\u231d': '$\\urcorner$', +u'\u231e': '$\\llcorner$', +u'\u231f': '$\\lrcorner$', +u'\u2322': '$\\frown$', +u'\u2323': '$\\smile$', +u'\u2329': '$\\langle$', +u'\u232a': '$\\rangle$', +u'\u233d': '$\\ElsevierGlyph{E838}$', +u'\u23a3': '$\\Elzdlcorn$', +u'\u23b0': '$\\lmoustache$', +u'\u23b1': '$\\rmoustache$', +u'\u2423': '{\\textvisiblespace}', +u'\u2460': '{\\ding{172}}', +u'\u2461': '{\\ding{173}}', +u'\u2462': '{\\ding{174}}', +u'\u2463': '{\\ding{175}}', +u'\u2464': '{\\ding{176}}', +u'\u2465': '{\\ding{177}}', +u'\u2466': '{\\ding{178}}', +u'\u2467': '{\\ding{179}}', +u'\u2468': '{\\ding{180}}', +u'\u2469': '{\\ding{181}}', +u'\u24c8': '$\\circledS$', +u'\u2506': '$\\Elzdshfnc$', +u'\u2519': '$\\Elzsqfnw$', +u'\u2571': '$\\diagup$', +u'\u25a0': '{\\ding{110}}', +u'\u25a1': '$\\square$', +u'\u25aa': '$\\blacksquare$', +u'\u25ad': '$\\fbox{~~}$', +u'\u25af': '$\\Elzvrecto$', +u'\u25b1': '$\\ElsevierGlyph{E381}$', +u'\u25b2': '{\\ding{115}}', +u'\u25b3': '$\\bigtriangleup$', +u'\u25b4': '$\\blacktriangle$', +u'\u25b5': '$\\vartriangle$', +u'\u25b8': '$\\blacktriangleright$', +u'\u25b9': '$\\triangleright$', +u'\u25bc': '{\\ding{116}}', +u'\u25bd': '$\\bigtriangledown$', +u'\u25be': '$\\blacktriangledown$', +u'\u25bf': '$\\triangledown$', +u'\u25c2': '$\\blacktriangleleft$', +u'\u25c3': '$\\triangleleft$', +u'\u25c6': '{\\ding{117}}', +u'\u25ca': '$\\lozenge$', +u'\u25cb': '$\\bigcirc$', +u'\u25cf': '{\\ding{108}}', +u'\u25d0': '$\\Elzcirfl$', +u'\u25d1': '$\\Elzcirfr$', +u'\u25d2': '$\\Elzcirfb$', +u'\u25d7': '{\\ding{119}}', +u'\u25d8': '$\\Elzrvbull$', +u'\u25e7': '$\\Elzsqfl$', +u'\u25e8': '$\\Elzsqfr$', +u'\u25ea': '$\\Elzsqfse$', +u'\u25ef': '$\\bigcirc$', +u'\u2605': '{\\ding{72}}', +u'\u2606': '{\\ding{73}}', +u'\u260e': '{\\ding{37}}', +u'\u261b': '{\\ding{42}}', +u'\u261e': '{\\ding{43}}', +u'\u263e': '{\\rightmoon}', +u'\u263f': '{\\mercury}', +u'\u2640': '{\\venus}', +u'\u2642': '{\\male}', +u'\u2643': '{\\jupiter}', +u'\u2644': '{\\saturn}', +u'\u2645': '{\\uranus}', +u'\u2646': '{\\neptune}', +u'\u2647': '{\\pluto}', +u'\u2648': '{\\aries}', +u'\u2649': '{\\taurus}', +u'\u264a': '{\\gemini}', +u'\u264b': '{\\cancer}', +u'\u264c': '{\\leo}', +u'\u264d': '{\\virgo}', +u'\u264e': '{\\libra}', +u'\u264f': '{\\scorpio}', +u'\u2650': '{\\sagittarius}', +u'\u2651': '{\\capricornus}', +u'\u2652': '{\\aquarius}', +u'\u2653': '{\\pisces}', +u'\u2660': '{\\ding{171}}', +u'\u2662': '$\\diamond$', +u'\u2663': '{\\ding{168}}', +u'\u2665': '{\\ding{170}}', +u'\u2666': '{\\ding{169}}', +u'\u2669': '{\\quarternote}', +u'\u266a': '{\\eighthnote}', +u'\u266d': '$\\flat$', +u'\u266e': '$\\natural$', +u'\u266f': '$\\sharp$', +u'\u2701': '{\\ding{33}}', +u'\u2702': '{\\ding{34}}', +u'\u2703': '{\\ding{35}}', +u'\u2704': '{\\ding{36}}', +u'\u2706': '{\\ding{38}}', +u'\u2707': '{\\ding{39}}', +u'\u2708': '{\\ding{40}}', +u'\u2709': '{\\ding{41}}', +u'\u270c': '{\\ding{44}}', +u'\u270d': '{\\ding{45}}', +u'\u270e': '{\\ding{46}}', +u'\u270f': '{\\ding{47}}', +u'\u2710': '{\\ding{48}}', +u'\u2711': '{\\ding{49}}', +u'\u2712': '{\\ding{50}}', +u'\u2713': '{\\ding{51}}', +u'\u2714': '{\\ding{52}}', +u'\u2715': '{\\ding{53}}', +u'\u2716': '{\\ding{54}}', +u'\u2717': '{\\ding{55}}', +u'\u2718': '{\\ding{56}}', +u'\u2719': '{\\ding{57}}', +u'\u271a': '{\\ding{58}}', +u'\u271b': '{\\ding{59}}', +u'\u271c': '{\\ding{60}}', +u'\u271d': '{\\ding{61}}', +u'\u271e': '{\\ding{62}}', +u'\u271f': '{\\ding{63}}', +u'\u2720': '{\\ding{64}}', +u'\u2721': '{\\ding{65}}', +u'\u2722': '{\\ding{66}}', +u'\u2723': '{\\ding{67}}', +u'\u2724': '{\\ding{68}}', +u'\u2725': '{\\ding{69}}', +u'\u2726': '{\\ding{70}}', +u'\u2727': '{\\ding{71}}', +u'\u2729': '{\\ding{73}}', +u'\u272a': '{\\ding{74}}', +u'\u272b': '{\\ding{75}}', +u'\u272c': '{\\ding{76}}', +u'\u272d': '{\\ding{77}}', +u'\u272e': '{\\ding{78}}', +u'\u272f': '{\\ding{79}}', +u'\u2730': '{\\ding{80}}', +u'\u2731': '{\\ding{81}}', +u'\u2732': '{\\ding{82}}', +u'\u2733': '{\\ding{83}}', +u'\u2734': '{\\ding{84}}', +u'\u2735': '{\\ding{85}}', +u'\u2736': '{\\ding{86}}', +u'\u2737': '{\\ding{87}}', +u'\u2738': '{\\ding{88}}', +u'\u2739': '{\\ding{89}}', +u'\u273a': '{\\ding{90}}', +u'\u273b': '{\\ding{91}}', +u'\u273c': '{\\ding{92}}', +u'\u273d': '{\\ding{93}}', +u'\u273e': '{\\ding{94}}', +u'\u273f': '{\\ding{95}}', +u'\u2740': '{\\ding{96}}', +u'\u2741': '{\\ding{97}}', +u'\u2742': '{\\ding{98}}', +u'\u2743': '{\\ding{99}}', +u'\u2744': '{\\ding{100}}', +u'\u2745': '{\\ding{101}}', +u'\u2746': '{\\ding{102}}', +u'\u2747': '{\\ding{103}}', +u'\u2748': '{\\ding{104}}', +u'\u2749': '{\\ding{105}}', +u'\u274a': '{\\ding{106}}', +u'\u274b': '{\\ding{107}}', +u'\u274d': '{\\ding{109}}', +u'\u274f': '{\\ding{111}}', +u'\u2750': '{\\ding{112}}', +u'\u2751': '{\\ding{113}}', +u'\u2752': '{\\ding{114}}', +u'\u2756': '{\\ding{118}}', +u'\u2758': '{\\ding{120}}', +u'\u2759': '{\\ding{121}}', +u'\u275a': '{\\ding{122}}', +u'\u275b': '{\\ding{123}}', +u'\u275c': '{\\ding{124}}', +u'\u275d': '{\\ding{125}}', +u'\u275e': '{\\ding{126}}', +u'\u2761': '{\\ding{161}}', +u'\u2762': '{\\ding{162}}', +u'\u2763': '{\\ding{163}}', +u'\u2764': '{\\ding{164}}', +u'\u2765': '{\\ding{165}}', +u'\u2766': '{\\ding{166}}', +u'\u2767': '{\\ding{167}}', +u'\u2776': '{\\ding{182}}', +u'\u2777': '{\\ding{183}}', +u'\u2778': '{\\ding{184}}', +u'\u2779': '{\\ding{185}}', +u'\u277a': '{\\ding{186}}', +u'\u277b': '{\\ding{187}}', +u'\u277c': '{\\ding{188}}', +u'\u277d': '{\\ding{189}}', +u'\u277e': '{\\ding{190}}', +u'\u277f': '{\\ding{191}}', +u'\u2780': '{\\ding{192}}', +u'\u2781': '{\\ding{193}}', +u'\u2782': '{\\ding{194}}', +u'\u2783': '{\\ding{195}}', +u'\u2784': '{\\ding{196}}', +u'\u2785': '{\\ding{197}}', +u'\u2786': '{\\ding{198}}', +u'\u2787': '{\\ding{199}}', +u'\u2788': '{\\ding{200}}', +u'\u2789': '{\\ding{201}}', +u'\u278a': '{\\ding{202}}', +u'\u278b': '{\\ding{203}}', +u'\u278c': '{\\ding{204}}', +u'\u278d': '{\\ding{205}}', +u'\u278e': '{\\ding{206}}', +u'\u278f': '{\\ding{207}}', +u'\u2790': '{\\ding{208}}', +u'\u2791': '{\\ding{209}}', +u'\u2792': '{\\ding{210}}', +u'\u2793': '{\\ding{211}}', +u'\u2794': '{\\ding{212}}', +u'\u2798': '{\\ding{216}}', +u'\u2799': '{\\ding{217}}', +u'\u279a': '{\\ding{218}}', +u'\u279b': '{\\ding{219}}', +u'\u279c': '{\\ding{220}}', +u'\u279d': '{\\ding{221}}', +u'\u279e': '{\\ding{222}}', +u'\u279f': '{\\ding{223}}', +u'\u27a0': '{\\ding{224}}', +u'\u27a1': '{\\ding{225}}', +u'\u27a2': '{\\ding{226}}', +u'\u27a3': '{\\ding{227}}', +u'\u27a4': '{\\ding{228}}', +u'\u27a5': '{\\ding{229}}', +u'\u27a6': '{\\ding{230}}', +u'\u27a7': '{\\ding{231}}', +u'\u27a8': '{\\ding{232}}', +u'\u27a9': '{\\ding{233}}', +u'\u27aa': '{\\ding{234}}', +u'\u27ab': '{\\ding{235}}', +u'\u27ac': '{\\ding{236}}', +u'\u27ad': '{\\ding{237}}', +u'\u27ae': '{\\ding{238}}', +u'\u27af': '{\\ding{239}}', +u'\u27b1': '{\\ding{241}}', +u'\u27b2': '{\\ding{242}}', +u'\u27b3': '{\\ding{243}}', +u'\u27b4': '{\\ding{244}}', +u'\u27b5': '{\\ding{245}}', +u'\u27b6': '{\\ding{246}}', +u'\u27b7': '{\\ding{247}}', +u'\u27b8': '{\\ding{248}}', +u'\u27b9': '{\\ding{249}}', +u'\u27ba': '{\\ding{250}}', +u'\u27bb': '{\\ding{251}}', +u'\u27bc': '{\\ding{252}}', +u'\u27bd': '{\\ding{253}}', +u'\u27be': '{\\ding{254}}', +u'\u27f5': '$\\longleftarrow$', +u'\u27f6': '$\\longrightarrow$', +u'\u27f7': '$\\longleftrightarrow$', +u'\u27f8': '$\\Longleftarrow$', +u'\u27f9': '$\\Longrightarrow$', +u'\u27fa': '$\\Longleftrightarrow$', +u'\u27fc': '$\\longmapsto$', +u'\u27ff': '$\\sim\\joinrel\\leadsto$', +u'\u2905': '$\\ElsevierGlyph{E212}$', +u'\u2912': '$\\UpArrowBar$', +u'\u2913': '$\\DownArrowBar$', +u'\u2923': '$\\ElsevierGlyph{E20C}$', +u'\u2924': '$\\ElsevierGlyph{E20D}$', +u'\u2925': '$\\ElsevierGlyph{E20B}$', +u'\u2926': '$\\ElsevierGlyph{E20A}$', +u'\u2927': '$\\ElsevierGlyph{E211}$', +u'\u2928': '$\\ElsevierGlyph{E20E}$', +u'\u2929': '$\\ElsevierGlyph{E20F}$', +u'\u292a': '$\\ElsevierGlyph{E210}$', +u'\u2933': '$\\ElsevierGlyph{E21C}$', +u'\u2936': '$\\ElsevierGlyph{E21A}$', +u'\u2937': '$\\ElsevierGlyph{E219}$', +u'\u2940': '$\\Elolarr$', +u'\u2941': '$\\Elorarr$', +u'\u2942': '$\\ElzRlarr$', +u'\u2944': '$\\ElzrLarr$', +u'\u2947': '$\\Elzrarrx$', +u'\u294e': '$\\LeftRightVector$', +u'\u294f': '$\\RightUpDownVector$', +u'\u2950': '$\\DownLeftRightVector$', +u'\u2951': '$\\LeftUpDownVector$', +u'\u2952': '$\\LeftVectorBar$', +u'\u2953': '$\\RightVectorBar$', +u'\u2954': '$\\RightUpVectorBar$', +u'\u2955': '$\\RightDownVectorBar$', +u'\u2956': '$\\DownLeftVectorBar$', +u'\u2957': '$\\DownRightVectorBar$', +u'\u2958': '$\\LeftUpVectorBar$', +u'\u2959': '$\\LeftDownVectorBar$', +u'\u295a': '$\\LeftTeeVector$', +u'\u295b': '$\\RightTeeVector$', +u'\u295c': '$\\RightUpTeeVector$', +u'\u295d': '$\\RightDownTeeVector$', +u'\u295e': '$\\DownLeftTeeVector$', +u'\u295f': '$\\DownRightTeeVector$', +u'\u2960': '$\\LeftUpTeeVector$', +u'\u2961': '$\\LeftDownTeeVector$', +u'\u296e': '$\\UpEquilibrium$', +u'\u296f': '$\\ReverseUpEquilibrium$', +u'\u2970': '$\\RoundImplies$', +u'\u297c': '$\\ElsevierGlyph{E214}$', +u'\u297d': '$\\ElsevierGlyph{E215}$', +u'\u2980': '$\\Elztfnc$', +u'\u2985': '$\\ElsevierGlyph{3018}$', +u'\u2986': '$\\Elroang$', +u'\u2993': '$<\\kern-0.58em($', +u'\u2994': '$\\ElsevierGlyph{E291}$', +u'\u2999': '$\\Elzddfnc$', +u'\u299c': '$\\Angle$', +u'\u29a0': '$\\Elzlpargt$', +u'\u29b5': '$\\ElsevierGlyph{E260}$', +u'\u29b6': '$\\ElsevierGlyph{E61B}$', +u'\u29ca': '$\\ElzLap$', +u'\u29cb': '$\\Elzdefas$', +u'\u29cf': '$\\LeftTriangleBar$', +u'\u29d0': '$\\RightTriangleBar$', +u'\u29dc': '$\\ElsevierGlyph{E372}$', +u'\u29eb': '$\\blacklozenge$', +u'\u29f4': '$\\RuleDelayed$', +u'\u2a04': '$\\Elxuplus$', +u'\u2a05': '$\\ElzThr$', +u'\u2a06': '$\\Elxsqcup$', +u'\u2a07': '$\\ElzInf$', +u'\u2a08': '$\\ElzSup$', +u'\u2a0d': '$\\ElzCint$', +u'\u2a0f': '$\\clockoint$', +u'\u2a10': '$\\ElsevierGlyph{E395}$', +u'\u2a16': '$\\sqrint$', +u'\u2a25': '$\\ElsevierGlyph{E25A}$', +u'\u2a2a': '$\\ElsevierGlyph{E25B}$', +u'\u2a2d': '$\\ElsevierGlyph{E25C}$', +u'\u2a2e': '$\\ElsevierGlyph{E25D}$', +u'\u2a2f': '$\\ElzTimes$', +u'\u2a34': '$\\ElsevierGlyph{E25E}$', +u'\u2a35': '$\\ElsevierGlyph{E25E}$', +u'\u2a3c': '$\\ElsevierGlyph{E259}$', +u'\u2a3f': '$\\amalg$', +u'\u2a53': '$\\ElzAnd$', +u'\u2a54': '$\\ElzOr$', +u'\u2a55': '$\\ElsevierGlyph{E36E}$', +u'\u2a56': '$\\ElOr$', +u'\u2a5e': '$\\perspcorrespond$', +u'\u2a5f': '$\\Elzminhat$', +u'\u2a63': '$\\ElsevierGlyph{225A}$', +u'\u2a6e': '$\\stackrel{*}{=}$', +u'\u2a75': '$\\Equal$', +u'\u2a7d': '$\\leqslant$', +u'\u2a7e': '$\\geqslant$', +u'\u2a85': '$\\lessapprox$', +u'\u2a86': '$\\gtrapprox$', +u'\u2a87': '$\\lneq$', +u'\u2a88': '$\\gneq$', +u'\u2a89': '$\\lnapprox$', +u'\u2a8a': '$\\gnapprox$', +u'\u2a8b': '$\\lesseqqgtr$', +u'\u2a8c': '$\\gtreqqless$', +u'\u2a95': '$\\eqslantless$', +u'\u2a96': '$\\eqslantgtr$', +u'\u2a9d': '$\\Pisymbol{ppi020}{117}$', +u'\u2a9e': '$\\Pisymbol{ppi020}{105}$', +u'\u2aa1': '$\\NestedLessLess$', +u'\u2aa2': '$\\NestedGreaterGreater$', +u'\u2aaf': '$\\preceq$', +u'\u2ab0': '$\\succeq$', +u'\u2ab5': '$\\precneqq$', +u'\u2ab6': '$\\succneqq$', +u'\u2ab7': '$\\precapprox$', +u'\u2ab8': '$\\succapprox$', +u'\u2ab9': '$\\precnapprox$', +u'\u2aba': '$\\succnapprox$', +u'\u2ac5': '$\\subseteqq$', +u'\u2ac6': '$\\supseteqq$', +u'\u2acb': '$\\subsetneqq$', +u'\u2acc': '$\\supsetneqq$', +u'\u2aeb': '$\\ElsevierGlyph{E30D}$', +u'\u2af6': '$\\Elztdcol$', +u'\u2afd': '${{/}\\!\\!{/}}$', +u'\u300a': '$\\ElsevierGlyph{300A}$', +u'\u300b': '$\\ElsevierGlyph{300B}$', +u'\u3018': '$\\ElsevierGlyph{3018}$', +u'\u3019': '$\\ElsevierGlyph{3019}$', +u'\u301a': '$\\openbracketleft$', +u'\u301b': '$\\openbracketright$', +u'\ufb00': '{ff}', +u'\ufb01': '{fi}', +u'\ufb02': '{fl}', +u'\ufb03': '{ffi}', +u'\ufb04': '{ffl}', +u'\U0001d400': '$\\mathbf{A}$', +u'\U0001d401': '$\\mathbf{B}$', +u'\U0001d402': '$\\mathbf{C}$', +u'\U0001d403': '$\\mathbf{D}$', +u'\U0001d404': '$\\mathbf{E}$', +u'\U0001d405': '$\\mathbf{F}$', +u'\U0001d406': '$\\mathbf{G}$', +u'\U0001d407': '$\\mathbf{H}$', +u'\U0001d408': '$\\mathbf{I}$', +u'\U0001d409': '$\\mathbf{J}$', +u'\U0001d40a': '$\\mathbf{K}$', +u'\U0001d40b': '$\\mathbf{L}$', +u'\U0001d40c': '$\\mathbf{M}$', +u'\U0001d40d': '$\\mathbf{N}$', +u'\U0001d40e': '$\\mathbf{O}$', +u'\U0001d40f': '$\\mathbf{P}$', +u'\U0001d410': '$\\mathbf{Q}$', +u'\U0001d411': '$\\mathbf{R}$', +u'\U0001d412': '$\\mathbf{S}$', +u'\U0001d413': '$\\mathbf{T}$', +u'\U0001d414': '$\\mathbf{U}$', +u'\U0001d415': '$\\mathbf{V}$', +u'\U0001d416': '$\\mathbf{W}$', +u'\U0001d417': '$\\mathbf{X}$', +u'\U0001d418': '$\\mathbf{Y}$', +u'\U0001d419': '$\\mathbf{Z}$', +u'\U0001d41a': '$\\mathbf{a}$', +u'\U0001d41b': '$\\mathbf{b}$', +u'\U0001d41c': '$\\mathbf{c}$', +u'\U0001d41d': '$\\mathbf{d}$', +u'\U0001d41e': '$\\mathbf{e}$', +u'\U0001d41f': '$\\mathbf{f}$', +u'\U0001d420': '$\\mathbf{g}$', +u'\U0001d421': '$\\mathbf{h}$', +u'\U0001d422': '$\\mathbf{i}$', +u'\U0001d423': '$\\mathbf{j}$', +u'\U0001d424': '$\\mathbf{k}$', +u'\U0001d425': '$\\mathbf{l}$', +u'\U0001d426': '$\\mathbf{m}$', +u'\U0001d427': '$\\mathbf{n}$', +u'\U0001d428': '$\\mathbf{o}$', +u'\U0001d429': '$\\mathbf{p}$', +u'\U0001d42a': '$\\mathbf{q}$', +u'\U0001d42b': '$\\mathbf{r}$', +u'\U0001d42c': '$\\mathbf{s}$', +u'\U0001d42d': '$\\mathbf{t}$', +u'\U0001d42e': '$\\mathbf{u}$', +u'\U0001d42f': '$\\mathbf{v}$', +u'\U0001d430': '$\\mathbf{w}$', +u'\U0001d431': '$\\mathbf{x}$', +u'\U0001d432': '$\\mathbf{y}$', +u'\U0001d433': '$\\mathbf{z}$', +u'\U0001d434': '$\\mathsl{A}$', +u'\U0001d435': '$\\mathsl{B}$', +u'\U0001d436': '$\\mathsl{C}$', +u'\U0001d437': '$\\mathsl{D}$', +u'\U0001d438': '$\\mathsl{E}$', +u'\U0001d439': '$\\mathsl{F}$', +u'\U0001d43a': '$\\mathsl{G}$', +u'\U0001d43b': '$\\mathsl{H}$', +u'\U0001d43c': '$\\mathsl{I}$', +u'\U0001d43d': '$\\mathsl{J}$', +u'\U0001d43e': '$\\mathsl{K}$', +u'\U0001d43f': '$\\mathsl{L}$', +u'\U0001d440': '$\\mathsl{M}$', +u'\U0001d441': '$\\mathsl{N}$', +u'\U0001d442': '$\\mathsl{O}$', +u'\U0001d443': '$\\mathsl{P}$', +u'\U0001d444': '$\\mathsl{Q}$', +u'\U0001d445': '$\\mathsl{R}$', +u'\U0001d446': '$\\mathsl{S}$', +u'\U0001d447': '$\\mathsl{T}$', +u'\U0001d448': '$\\mathsl{U}$', +u'\U0001d449': '$\\mathsl{V}$', +u'\U0001d44a': '$\\mathsl{W}$', +u'\U0001d44b': '$\\mathsl{X}$', +u'\U0001d44c': '$\\mathsl{Y}$', +u'\U0001d44d': '$\\mathsl{Z}$', +u'\U0001d44e': '$\\mathsl{a}$', +u'\U0001d44f': '$\\mathsl{b}$', +u'\U0001d450': '$\\mathsl{c}$', +u'\U0001d451': '$\\mathsl{d}$', +u'\U0001d452': '$\\mathsl{e}$', +u'\U0001d453': '$\\mathsl{f}$', +u'\U0001d454': '$\\mathsl{g}$', +u'\U0001d456': '$\\mathsl{i}$', +u'\U0001d457': '$\\mathsl{j}$', +u'\U0001d458': '$\\mathsl{k}$', +u'\U0001d459': '$\\mathsl{l}$', +u'\U0001d45a': '$\\mathsl{m}$', +u'\U0001d45b': '$\\mathsl{n}$', +u'\U0001d45c': '$\\mathsl{o}$', +u'\U0001d45d': '$\\mathsl{p}$', +u'\U0001d45e': '$\\mathsl{q}$', +u'\U0001d45f': '$\\mathsl{r}$', +u'\U0001d460': '$\\mathsl{s}$', +u'\U0001d461': '$\\mathsl{t}$', +u'\U0001d462': '$\\mathsl{u}$', +u'\U0001d463': '$\\mathsl{v}$', +u'\U0001d464': '$\\mathsl{w}$', +u'\U0001d465': '$\\mathsl{x}$', +u'\U0001d466': '$\\mathsl{y}$', +u'\U0001d467': '$\\mathsl{z}$', +u'\U0001d468': '$\\mathbit{A}$', +u'\U0001d469': '$\\mathbit{B}$', +u'\U0001d46a': '$\\mathbit{C}$', +u'\U0001d46b': '$\\mathbit{D}$', +u'\U0001d46c': '$\\mathbit{E}$', +u'\U0001d46d': '$\\mathbit{F}$', +u'\U0001d46e': '$\\mathbit{G}$', +u'\U0001d46f': '$\\mathbit{H}$', +u'\U0001d470': '$\\mathbit{I}$', +u'\U0001d471': '$\\mathbit{J}$', +u'\U0001d472': '$\\mathbit{K}$', +u'\U0001d473': '$\\mathbit{L}$', +u'\U0001d474': '$\\mathbit{M}$', +u'\U0001d475': '$\\mathbit{N}$', +u'\U0001d476': '$\\mathbit{O}$', +u'\U0001d477': '$\\mathbit{P}$', +u'\U0001d478': '$\\mathbit{Q}$', +u'\U0001d479': '$\\mathbit{R}$', +u'\U0001d47a': '$\\mathbit{S}$', +u'\U0001d47b': '$\\mathbit{T}$', +u'\U0001d47c': '$\\mathbit{U}$', +u'\U0001d47d': '$\\mathbit{V}$', +u'\U0001d47e': '$\\mathbit{W}$', +u'\U0001d47f': '$\\mathbit{X}$', +u'\U0001d480': '$\\mathbit{Y}$', +u'\U0001d481': '$\\mathbit{Z}$', +u'\U0001d482': '$\\mathbit{a}$', +u'\U0001d483': '$\\mathbit{b}$', +u'\U0001d484': '$\\mathbit{c}$', +u'\U0001d485': '$\\mathbit{d}$', +u'\U0001d486': '$\\mathbit{e}$', +u'\U0001d487': '$\\mathbit{f}$', +u'\U0001d488': '$\\mathbit{g}$', +u'\U0001d489': '$\\mathbit{h}$', +u'\U0001d48a': '$\\mathbit{i}$', +u'\U0001d48b': '$\\mathbit{j}$', +u'\U0001d48c': '$\\mathbit{k}$', +u'\U0001d48d': '$\\mathbit{l}$', +u'\U0001d48e': '$\\mathbit{m}$', +u'\U0001d48f': '$\\mathbit{n}$', +u'\U0001d490': '$\\mathbit{o}$', +u'\U0001d491': '$\\mathbit{p}$', +u'\U0001d492': '$\\mathbit{q}$', +u'\U0001d493': '$\\mathbit{r}$', +u'\U0001d494': '$\\mathbit{s}$', +u'\U0001d495': '$\\mathbit{t}$', +u'\U0001d496': '$\\mathbit{u}$', +u'\U0001d497': '$\\mathbit{v}$', +u'\U0001d498': '$\\mathbit{w}$', +u'\U0001d499': '$\\mathbit{x}$', +u'\U0001d49a': '$\\mathbit{y}$', +u'\U0001d49b': '$\\mathbit{z}$', +u'\U0001d49c': '$\\mathscr{A}$', +u'\U0001d49e': '$\\mathscr{C}$', +u'\U0001d49f': '$\\mathscr{D}$', +u'\U0001d4a2': '$\\mathscr{G}$', +u'\U0001d4a5': '$\\mathscr{J}$', +u'\U0001d4a6': '$\\mathscr{K}$', +u'\U0001d4a9': '$\\mathscr{N}$', +u'\U0001d4aa': '$\\mathscr{O}$', +u'\U0001d4ab': '$\\mathscr{P}$', +u'\U0001d4ac': '$\\mathscr{Q}$', +u'\U0001d4ae': '$\\mathscr{S}$', +u'\U0001d4af': '$\\mathscr{T}$', +u'\U0001d4b0': '$\\mathscr{U}$', +u'\U0001d4b1': '$\\mathscr{V}$', +u'\U0001d4b2': '$\\mathscr{W}$', +u'\U0001d4b3': '$\\mathscr{X}$', +u'\U0001d4b4': '$\\mathscr{Y}$', +u'\U0001d4b5': '$\\mathscr{Z}$', +u'\U0001d4b6': '$\\mathscr{a}$', +u'\U0001d4b7': '$\\mathscr{b}$', +u'\U0001d4b8': '$\\mathscr{c}$', +u'\U0001d4b9': '$\\mathscr{d}$', +u'\U0001d4bb': '$\\mathscr{f}$', +u'\U0001d4bd': '$\\mathscr{h}$', +u'\U0001d4be': '$\\mathscr{i}$', +u'\U0001d4bf': '$\\mathscr{j}$', +u'\U0001d4c0': '$\\mathscr{k}$', +u'\U0001d4c1': '$\\mathscr{l}$', +u'\U0001d4c2': '$\\mathscr{m}$', +u'\U0001d4c3': '$\\mathscr{n}$', +u'\U0001d4c5': '$\\mathscr{p}$', +u'\U0001d4c6': '$\\mathscr{q}$', +u'\U0001d4c7': '$\\mathscr{r}$', +u'\U0001d4c8': '$\\mathscr{s}$', +u'\U0001d4c9': '$\\mathscr{t}$', +u'\U0001d4ca': '$\\mathscr{u}$', +u'\U0001d4cb': '$\\mathscr{v}$', +u'\U0001d4cc': '$\\mathscr{w}$', +u'\U0001d4cd': '$\\mathscr{x}$', +u'\U0001d4ce': '$\\mathscr{y}$', +u'\U0001d4cf': '$\\mathscr{z}$', +u'\U0001d4d0': '$\\mathmit{A}$', +u'\U0001d4d1': '$\\mathmit{B}$', +u'\U0001d4d2': '$\\mathmit{C}$', +u'\U0001d4d3': '$\\mathmit{D}$', +u'\U0001d4d4': '$\\mathmit{E}$', +u'\U0001d4d5': '$\\mathmit{F}$', +u'\U0001d4d6': '$\\mathmit{G}$', +u'\U0001d4d7': '$\\mathmit{H}$', +u'\U0001d4d8': '$\\mathmit{I}$', +u'\U0001d4d9': '$\\mathmit{J}$', +u'\U0001d4da': '$\\mathmit{K}$', +u'\U0001d4db': '$\\mathmit{L}$', +u'\U0001d4dc': '$\\mathmit{M}$', +u'\U0001d4dd': '$\\mathmit{N}$', +u'\U0001d4de': '$\\mathmit{O}$', +u'\U0001d4df': '$\\mathmit{P}$', +u'\U0001d4e0': '$\\mathmit{Q}$', +u'\U0001d4e1': '$\\mathmit{R}$', +u'\U0001d4e2': '$\\mathmit{S}$', +u'\U0001d4e3': '$\\mathmit{T}$', +u'\U0001d4e4': '$\\mathmit{U}$', +u'\U0001d4e5': '$\\mathmit{V}$', +u'\U0001d4e6': '$\\mathmit{W}$', +u'\U0001d4e7': '$\\mathmit{X}$', +u'\U0001d4e8': '$\\mathmit{Y}$', +u'\U0001d4e9': '$\\mathmit{Z}$', +u'\U0001d4ea': '$\\mathmit{a}$', +u'\U0001d4eb': '$\\mathmit{b}$', +u'\U0001d4ec': '$\\mathmit{c}$', +u'\U0001d4ed': '$\\mathmit{d}$', +u'\U0001d4ee': '$\\mathmit{e}$', +u'\U0001d4ef': '$\\mathmit{f}$', +u'\U0001d4f0': '$\\mathmit{g}$', +u'\U0001d4f1': '$\\mathmit{h}$', +u'\U0001d4f2': '$\\mathmit{i}$', +u'\U0001d4f3': '$\\mathmit{j}$', +u'\U0001d4f4': '$\\mathmit{k}$', +u'\U0001d4f5': '$\\mathmit{l}$', +u'\U0001d4f6': '$\\mathmit{m}$', +u'\U0001d4f7': '$\\mathmit{n}$', +u'\U0001d4f8': '$\\mathmit{o}$', +u'\U0001d4f9': '$\\mathmit{p}$', +u'\U0001d4fa': '$\\mathmit{q}$', +u'\U0001d4fb': '$\\mathmit{r}$', +u'\U0001d4fc': '$\\mathmit{s}$', +u'\U0001d4fd': '$\\mathmit{t}$', +u'\U0001d4fe': '$\\mathmit{u}$', +u'\U0001d4ff': '$\\mathmit{v}$', +u'\U0001d500': '$\\mathmit{w}$', +u'\U0001d501': '$\\mathmit{x}$', +u'\U0001d502': '$\\mathmit{y}$', +u'\U0001d503': '$\\mathmit{z}$', +u'\U0001d504': '$\\mathfrak{A}$', +u'\U0001d505': '$\\mathfrak{B}$', +u'\U0001d507': '$\\mathfrak{D}$', +u'\U0001d508': '$\\mathfrak{E}$', +u'\U0001d509': '$\\mathfrak{F}$', +u'\U0001d50a': '$\\mathfrak{G}$', +u'\U0001d50d': '$\\mathfrak{J}$', +u'\U0001d50e': '$\\mathfrak{K}$', +u'\U0001d50f': '$\\mathfrak{L}$', +u'\U0001d510': '$\\mathfrak{M}$', +u'\U0001d511': '$\\mathfrak{N}$', +u'\U0001d512': '$\\mathfrak{O}$', +u'\U0001d513': '$\\mathfrak{P}$', +u'\U0001d514': '$\\mathfrak{Q}$', +u'\U0001d516': '$\\mathfrak{S}$', +u'\U0001d517': '$\\mathfrak{T}$', +u'\U0001d518': '$\\mathfrak{U}$', +u'\U0001d519': '$\\mathfrak{V}$', +u'\U0001d51a': '$\\mathfrak{W}$', +u'\U0001d51b': '$\\mathfrak{X}$', +u'\U0001d51c': '$\\mathfrak{Y}$', +u'\U0001d51e': '$\\mathfrak{a}$', +u'\U0001d51f': '$\\mathfrak{b}$', +u'\U0001d520': '$\\mathfrak{c}$', +u'\U0001d521': '$\\mathfrak{d}$', +u'\U0001d522': '$\\mathfrak{e}$', +u'\U0001d523': '$\\mathfrak{f}$', +u'\U0001d524': '$\\mathfrak{g}$', +u'\U0001d525': '$\\mathfrak{h}$', +u'\U0001d526': '$\\mathfrak{i}$', +u'\U0001d527': '$\\mathfrak{j}$', +u'\U0001d528': '$\\mathfrak{k}$', +u'\U0001d529': '$\\mathfrak{l}$', +u'\U0001d52a': '$\\mathfrak{m}$', +u'\U0001d52b': '$\\mathfrak{n}$', +u'\U0001d52c': '$\\mathfrak{o}$', +u'\U0001d52d': '$\\mathfrak{p}$', +u'\U0001d52e': '$\\mathfrak{q}$', +u'\U0001d52f': '$\\mathfrak{r}$', +u'\U0001d530': '$\\mathfrak{s}$', +u'\U0001d531': '$\\mathfrak{t}$', +u'\U0001d532': '$\\mathfrak{u}$', +u'\U0001d533': '$\\mathfrak{v}$', +u'\U0001d534': '$\\mathfrak{w}$', +u'\U0001d535': '$\\mathfrak{x}$', +u'\U0001d536': '$\\mathfrak{y}$', +u'\U0001d537': '$\\mathfrak{z}$', +u'\U0001d538': '$\\mathbb{A}$', +u'\U0001d539': '$\\mathbb{B}$', +u'\U0001d53b': '$\\mathbb{D}$', +u'\U0001d53c': '$\\mathbb{E}$', +u'\U0001d53d': '$\\mathbb{F}$', +u'\U0001d53e': '$\\mathbb{G}$', +u'\U0001d540': '$\\mathbb{I}$', +u'\U0001d541': '$\\mathbb{J}$', +u'\U0001d542': '$\\mathbb{K}$', +u'\U0001d543': '$\\mathbb{L}$', +u'\U0001d544': '$\\mathbb{M}$', +u'\U0001d546': '$\\mathbb{O}$', +u'\U0001d54a': '$\\mathbb{S}$', +u'\U0001d54b': '$\\mathbb{T}$', +u'\U0001d54c': '$\\mathbb{U}$', +u'\U0001d54d': '$\\mathbb{V}$', +u'\U0001d54e': '$\\mathbb{W}$', +u'\U0001d54f': '$\\mathbb{X}$', +u'\U0001d550': '$\\mathbb{Y}$', +u'\U0001d552': '$\\mathbb{a}$', +u'\U0001d553': '$\\mathbb{b}$', +u'\U0001d554': '$\\mathbb{c}$', +u'\U0001d555': '$\\mathbb{d}$', +u'\U0001d556': '$\\mathbb{e}$', +u'\U0001d557': '$\\mathbb{f}$', +u'\U0001d558': '$\\mathbb{g}$', +u'\U0001d559': '$\\mathbb{h}$', +u'\U0001d55a': '$\\mathbb{i}$', +u'\U0001d55b': '$\\mathbb{j}$', +u'\U0001d55c': '$\\mathbb{k}$', +u'\U0001d55d': '$\\mathbb{l}$', +u'\U0001d55e': '$\\mathbb{m}$', +u'\U0001d55f': '$\\mathbb{n}$', +u'\U0001d560': '$\\mathbb{o}$', +u'\U0001d561': '$\\mathbb{p}$', +u'\U0001d562': '$\\mathbb{q}$', +u'\U0001d563': '$\\mathbb{r}$', +u'\U0001d564': '$\\mathbb{s}$', +u'\U0001d565': '$\\mathbb{t}$', +u'\U0001d566': '$\\mathbb{u}$', +u'\U0001d567': '$\\mathbb{v}$', +u'\U0001d568': '$\\mathbb{w}$', +u'\U0001d569': '$\\mathbb{x}$', +u'\U0001d56a': '$\\mathbb{y}$', +u'\U0001d56b': '$\\mathbb{z}$', +u'\U0001d56c': '$\\mathslbb{A}$', +u'\U0001d56d': '$\\mathslbb{B}$', +u'\U0001d56e': '$\\mathslbb{C}$', +u'\U0001d56f': '$\\mathslbb{D}$', +u'\U0001d570': '$\\mathslbb{E}$', +u'\U0001d571': '$\\mathslbb{F}$', +u'\U0001d572': '$\\mathslbb{G}$', +u'\U0001d573': '$\\mathslbb{H}$', +u'\U0001d574': '$\\mathslbb{I}$', +u'\U0001d575': '$\\mathslbb{J}$', +u'\U0001d576': '$\\mathslbb{K}$', +u'\U0001d577': '$\\mathslbb{L}$', +u'\U0001d578': '$\\mathslbb{M}$', +u'\U0001d579': '$\\mathslbb{N}$', +u'\U0001d57a': '$\\mathslbb{O}$', +u'\U0001d57b': '$\\mathslbb{P}$', +u'\U0001d57c': '$\\mathslbb{Q}$', +u'\U0001d57d': '$\\mathslbb{R}$', +u'\U0001d57e': '$\\mathslbb{S}$', +u'\U0001d57f': '$\\mathslbb{T}$', +u'\U0001d580': '$\\mathslbb{U}$', +u'\U0001d581': '$\\mathslbb{V}$', +u'\U0001d582': '$\\mathslbb{W}$', +u'\U0001d583': '$\\mathslbb{X}$', +u'\U0001d584': '$\\mathslbb{Y}$', +u'\U0001d585': '$\\mathslbb{Z}$', +u'\U0001d586': '$\\mathslbb{a}$', +u'\U0001d587': '$\\mathslbb{b}$', +u'\U0001d588': '$\\mathslbb{c}$', +u'\U0001d589': '$\\mathslbb{d}$', +u'\U0001d58a': '$\\mathslbb{e}$', +u'\U0001d58b': '$\\mathslbb{f}$', +u'\U0001d58c': '$\\mathslbb{g}$', +u'\U0001d58d': '$\\mathslbb{h}$', +u'\U0001d58e': '$\\mathslbb{i}$', +u'\U0001d58f': '$\\mathslbb{j}$', +u'\U0001d590': '$\\mathslbb{k}$', +u'\U0001d591': '$\\mathslbb{l}$', +u'\U0001d592': '$\\mathslbb{m}$', +u'\U0001d593': '$\\mathslbb{n}$', +u'\U0001d594': '$\\mathslbb{o}$', +u'\U0001d595': '$\\mathslbb{p}$', +u'\U0001d596': '$\\mathslbb{q}$', +u'\U0001d597': '$\\mathslbb{r}$', +u'\U0001d598': '$\\mathslbb{s}$', +u'\U0001d599': '$\\mathslbb{t}$', +u'\U0001d59a': '$\\mathslbb{u}$', +u'\U0001d59b': '$\\mathslbb{v}$', +u'\U0001d59c': '$\\mathslbb{w}$', +u'\U0001d59d': '$\\mathslbb{x}$', +u'\U0001d59e': '$\\mathslbb{y}$', +u'\U0001d59f': '$\\mathslbb{z}$', +u'\U0001d5a0': '$\\mathsf{A}$', +u'\U0001d5a1': '$\\mathsf{B}$', +u'\U0001d5a2': '$\\mathsf{C}$', +u'\U0001d5a3': '$\\mathsf{D}$', +u'\U0001d5a4': '$\\mathsf{E}$', +u'\U0001d5a5': '$\\mathsf{F}$', +u'\U0001d5a6': '$\\mathsf{G}$', +u'\U0001d5a7': '$\\mathsf{H}$', +u'\U0001d5a8': '$\\mathsf{I}$', +u'\U0001d5a9': '$\\mathsf{J}$', +u'\U0001d5aa': '$\\mathsf{K}$', +u'\U0001d5ab': '$\\mathsf{L}$', +u'\U0001d5ac': '$\\mathsf{M}$', +u'\U0001d5ad': '$\\mathsf{N}$', +u'\U0001d5ae': '$\\mathsf{O}$', +u'\U0001d5af': '$\\mathsf{P}$', +u'\U0001d5b0': '$\\mathsf{Q}$', +u'\U0001d5b1': '$\\mathsf{R}$', +u'\U0001d5b2': '$\\mathsf{S}$', +u'\U0001d5b3': '$\\mathsf{T}$', +u'\U0001d5b4': '$\\mathsf{U}$', +u'\U0001d5b5': '$\\mathsf{V}$', +u'\U0001d5b6': '$\\mathsf{W}$', +u'\U0001d5b7': '$\\mathsf{X}$', +u'\U0001d5b8': '$\\mathsf{Y}$', +u'\U0001d5b9': '$\\mathsf{Z}$', +u'\U0001d5ba': '$\\mathsf{a}$', +u'\U0001d5bb': '$\\mathsf{b}$', +u'\U0001d5bc': '$\\mathsf{c}$', +u'\U0001d5bd': '$\\mathsf{d}$', +u'\U0001d5be': '$\\mathsf{e}$', +u'\U0001d5bf': '$\\mathsf{f}$', +u'\U0001d5c0': '$\\mathsf{g}$', +u'\U0001d5c1': '$\\mathsf{h}$', +u'\U0001d5c2': '$\\mathsf{i}$', +u'\U0001d5c3': '$\\mathsf{j}$', +u'\U0001d5c4': '$\\mathsf{k}$', +u'\U0001d5c5': '$\\mathsf{l}$', +u'\U0001d5c6': '$\\mathsf{m}$', +u'\U0001d5c7': '$\\mathsf{n}$', +u'\U0001d5c8': '$\\mathsf{o}$', +u'\U0001d5c9': '$\\mathsf{p}$', +u'\U0001d5ca': '$\\mathsf{q}$', +u'\U0001d5cb': '$\\mathsf{r}$', +u'\U0001d5cc': '$\\mathsf{s}$', +u'\U0001d5cd': '$\\mathsf{t}$', +u'\U0001d5ce': '$\\mathsf{u}$', +u'\U0001d5cf': '$\\mathsf{v}$', +u'\U0001d5d0': '$\\mathsf{w}$', +u'\U0001d5d1': '$\\mathsf{x}$', +u'\U0001d5d2': '$\\mathsf{y}$', +u'\U0001d5d3': '$\\mathsf{z}$', +u'\U0001d5d4': '$\\mathsfbf{A}$', +u'\U0001d5d5': '$\\mathsfbf{B}$', +u'\U0001d5d6': '$\\mathsfbf{C}$', +u'\U0001d5d7': '$\\mathsfbf{D}$', +u'\U0001d5d8': '$\\mathsfbf{E}$', +u'\U0001d5d9': '$\\mathsfbf{F}$', +u'\U0001d5da': '$\\mathsfbf{G}$', +u'\U0001d5db': '$\\mathsfbf{H}$', +u'\U0001d5dc': '$\\mathsfbf{I}$', +u'\U0001d5dd': '$\\mathsfbf{J}$', +u'\U0001d5de': '$\\mathsfbf{K}$', +u'\U0001d5df': '$\\mathsfbf{L}$', +u'\U0001d5e0': '$\\mathsfbf{M}$', +u'\U0001d5e1': '$\\mathsfbf{N}$', +u'\U0001d5e2': '$\\mathsfbf{O}$', +u'\U0001d5e3': '$\\mathsfbf{P}$', +u'\U0001d5e4': '$\\mathsfbf{Q}$', +u'\U0001d5e5': '$\\mathsfbf{R}$', +u'\U0001d5e6': '$\\mathsfbf{S}$', +u'\U0001d5e7': '$\\mathsfbf{T}$', +u'\U0001d5e8': '$\\mathsfbf{U}$', +u'\U0001d5e9': '$\\mathsfbf{V}$', +u'\U0001d5ea': '$\\mathsfbf{W}$', +u'\U0001d5eb': '$\\mathsfbf{X}$', +u'\U0001d5ec': '$\\mathsfbf{Y}$', +u'\U0001d5ed': '$\\mathsfbf{Z}$', +u'\U0001d5ee': '$\\mathsfbf{a}$', +u'\U0001d5ef': '$\\mathsfbf{b}$', +u'\U0001d5f0': '$\\mathsfbf{c}$', +u'\U0001d5f1': '$\\mathsfbf{d}$', +u'\U0001d5f2': '$\\mathsfbf{e}$', +u'\U0001d5f3': '$\\mathsfbf{f}$', +u'\U0001d5f4': '$\\mathsfbf{g}$', +u'\U0001d5f5': '$\\mathsfbf{h}$', +u'\U0001d5f6': '$\\mathsfbf{i}$', +u'\U0001d5f7': '$\\mathsfbf{j}$', +u'\U0001d5f8': '$\\mathsfbf{k}$', +u'\U0001d5f9': '$\\mathsfbf{l}$', +u'\U0001d5fa': '$\\mathsfbf{m}$', +u'\U0001d5fb': '$\\mathsfbf{n}$', +u'\U0001d5fc': '$\\mathsfbf{o}$', +u'\U0001d5fd': '$\\mathsfbf{p}$', +u'\U0001d5fe': '$\\mathsfbf{q}$', +u'\U0001d5ff': '$\\mathsfbf{r}$', +u'\U0001d600': '$\\mathsfbf{s}$', +u'\U0001d601': '$\\mathsfbf{t}$', +u'\U0001d602': '$\\mathsfbf{u}$', +u'\U0001d603': '$\\mathsfbf{v}$', +u'\U0001d604': '$\\mathsfbf{w}$', +u'\U0001d605': '$\\mathsfbf{x}$', +u'\U0001d606': '$\\mathsfbf{y}$', +u'\U0001d607': '$\\mathsfbf{z}$', +u'\U0001d608': '$\\mathsfsl{A}$', +u'\U0001d609': '$\\mathsfsl{B}$', +u'\U0001d60a': '$\\mathsfsl{C}$', +u'\U0001d60b': '$\\mathsfsl{D}$', +u'\U0001d60c': '$\\mathsfsl{E}$', +u'\U0001d60d': '$\\mathsfsl{F}$', +u'\U0001d60e': '$\\mathsfsl{G}$', +u'\U0001d60f': '$\\mathsfsl{H}$', +u'\U0001d610': '$\\mathsfsl{I}$', +u'\U0001d611': '$\\mathsfsl{J}$', +u'\U0001d612': '$\\mathsfsl{K}$', +u'\U0001d613': '$\\mathsfsl{L}$', +u'\U0001d614': '$\\mathsfsl{M}$', +u'\U0001d615': '$\\mathsfsl{N}$', +u'\U0001d616': '$\\mathsfsl{O}$', +u'\U0001d617': '$\\mathsfsl{P}$', +u'\U0001d618': '$\\mathsfsl{Q}$', +u'\U0001d619': '$\\mathsfsl{R}$', +u'\U0001d61a': '$\\mathsfsl{S}$', +u'\U0001d61b': '$\\mathsfsl{T}$', +u'\U0001d61c': '$\\mathsfsl{U}$', +u'\U0001d61d': '$\\mathsfsl{V}$', +u'\U0001d61e': '$\\mathsfsl{W}$', +u'\U0001d61f': '$\\mathsfsl{X}$', +u'\U0001d620': '$\\mathsfsl{Y}$', +u'\U0001d621': '$\\mathsfsl{Z}$', +u'\U0001d622': '$\\mathsfsl{a}$', +u'\U0001d623': '$\\mathsfsl{b}$', +u'\U0001d624': '$\\mathsfsl{c}$', +u'\U0001d625': '$\\mathsfsl{d}$', +u'\U0001d626': '$\\mathsfsl{e}$', +u'\U0001d627': '$\\mathsfsl{f}$', +u'\U0001d628': '$\\mathsfsl{g}$', +u'\U0001d629': '$\\mathsfsl{h}$', +u'\U0001d62a': '$\\mathsfsl{i}$', +u'\U0001d62b': '$\\mathsfsl{j}$', +u'\U0001d62c': '$\\mathsfsl{k}$', +u'\U0001d62d': '$\\mathsfsl{l}$', +u'\U0001d62e': '$\\mathsfsl{m}$', +u'\U0001d62f': '$\\mathsfsl{n}$', +u'\U0001d630': '$\\mathsfsl{o}$', +u'\U0001d631': '$\\mathsfsl{p}$', +u'\U0001d632': '$\\mathsfsl{q}$', +u'\U0001d633': '$\\mathsfsl{r}$', +u'\U0001d634': '$\\mathsfsl{s}$', +u'\U0001d635': '$\\mathsfsl{t}$', +u'\U0001d636': '$\\mathsfsl{u}$', +u'\U0001d637': '$\\mathsfsl{v}$', +u'\U0001d638': '$\\mathsfsl{w}$', +u'\U0001d639': '$\\mathsfsl{x}$', +u'\U0001d63a': '$\\mathsfsl{y}$', +u'\U0001d63b': '$\\mathsfsl{z}$', +u'\U0001d63c': '$\\mathsfbfsl{A}$', +u'\U0001d63d': '$\\mathsfbfsl{B}$', +u'\U0001d63e': '$\\mathsfbfsl{C}$', +u'\U0001d63f': '$\\mathsfbfsl{D}$', +u'\U0001d640': '$\\mathsfbfsl{E}$', +u'\U0001d641': '$\\mathsfbfsl{F}$', +u'\U0001d642': '$\\mathsfbfsl{G}$', +u'\U0001d643': '$\\mathsfbfsl{H}$', +u'\U0001d644': '$\\mathsfbfsl{I}$', +u'\U0001d645': '$\\mathsfbfsl{J}$', +u'\U0001d646': '$\\mathsfbfsl{K}$', +u'\U0001d647': '$\\mathsfbfsl{L}$', +u'\U0001d648': '$\\mathsfbfsl{M}$', +u'\U0001d649': '$\\mathsfbfsl{N}$', +u'\U0001d64a': '$\\mathsfbfsl{O}$', +u'\U0001d64b': '$\\mathsfbfsl{P}$', +u'\U0001d64c': '$\\mathsfbfsl{Q}$', +u'\U0001d64d': '$\\mathsfbfsl{R}$', +u'\U0001d64e': '$\\mathsfbfsl{S}$', +u'\U0001d64f': '$\\mathsfbfsl{T}$', +u'\U0001d650': '$\\mathsfbfsl{U}$', +u'\U0001d651': '$\\mathsfbfsl{V}$', +u'\U0001d652': '$\\mathsfbfsl{W}$', +u'\U0001d653': '$\\mathsfbfsl{X}$', +u'\U0001d654': '$\\mathsfbfsl{Y}$', +u'\U0001d655': '$\\mathsfbfsl{Z}$', +u'\U0001d656': '$\\mathsfbfsl{a}$', +u'\U0001d657': '$\\mathsfbfsl{b}$', +u'\U0001d658': '$\\mathsfbfsl{c}$', +u'\U0001d659': '$\\mathsfbfsl{d}$', +u'\U0001d65a': '$\\mathsfbfsl{e}$', +u'\U0001d65b': '$\\mathsfbfsl{f}$', +u'\U0001d65c': '$\\mathsfbfsl{g}$', +u'\U0001d65d': '$\\mathsfbfsl{h}$', +u'\U0001d65e': '$\\mathsfbfsl{i}$', +u'\U0001d65f': '$\\mathsfbfsl{j}$', +u'\U0001d660': '$\\mathsfbfsl{k}$', +u'\U0001d661': '$\\mathsfbfsl{l}$', +u'\U0001d662': '$\\mathsfbfsl{m}$', +u'\U0001d663': '$\\mathsfbfsl{n}$', +u'\U0001d664': '$\\mathsfbfsl{o}$', +u'\U0001d665': '$\\mathsfbfsl{p}$', +u'\U0001d666': '$\\mathsfbfsl{q}$', +u'\U0001d667': '$\\mathsfbfsl{r}$', +u'\U0001d668': '$\\mathsfbfsl{s}$', +u'\U0001d669': '$\\mathsfbfsl{t}$', +u'\U0001d66a': '$\\mathsfbfsl{u}$', +u'\U0001d66b': '$\\mathsfbfsl{v}$', +u'\U0001d66c': '$\\mathsfbfsl{w}$', +u'\U0001d66d': '$\\mathsfbfsl{x}$', +u'\U0001d66e': '$\\mathsfbfsl{y}$', +u'\U0001d66f': '$\\mathsfbfsl{z}$', +u'\U0001d670': '$\\mathtt{A}$', +u'\U0001d671': '$\\mathtt{B}$', +u'\U0001d672': '$\\mathtt{C}$', +u'\U0001d673': '$\\mathtt{D}$', +u'\U0001d674': '$\\mathtt{E}$', +u'\U0001d675': '$\\mathtt{F}$', +u'\U0001d676': '$\\mathtt{G}$', +u'\U0001d677': '$\\mathtt{H}$', +u'\U0001d678': '$\\mathtt{I}$', +u'\U0001d679': '$\\mathtt{J}$', +u'\U0001d67a': '$\\mathtt{K}$', +u'\U0001d67b': '$\\mathtt{L}$', +u'\U0001d67c': '$\\mathtt{M}$', +u'\U0001d67d': '$\\mathtt{N}$', +u'\U0001d67e': '$\\mathtt{O}$', +u'\U0001d67f': '$\\mathtt{P}$', +u'\U0001d680': '$\\mathtt{Q}$', +u'\U0001d681': '$\\mathtt{R}$', +u'\U0001d682': '$\\mathtt{S}$', +u'\U0001d683': '$\\mathtt{T}$', +u'\U0001d684': '$\\mathtt{U}$', +u'\U0001d685': '$\\mathtt{V}$', +u'\U0001d686': '$\\mathtt{W}$', +u'\U0001d687': '$\\mathtt{X}$', +u'\U0001d688': '$\\mathtt{Y}$', +u'\U0001d689': '$\\mathtt{Z}$', +u'\U0001d68a': '$\\mathtt{a}$', +u'\U0001d68b': '$\\mathtt{b}$', +u'\U0001d68c': '$\\mathtt{c}$', +u'\U0001d68d': '$\\mathtt{d}$', +u'\U0001d68e': '$\\mathtt{e}$', +u'\U0001d68f': '$\\mathtt{f}$', +u'\U0001d690': '$\\mathtt{g}$', +u'\U0001d691': '$\\mathtt{h}$', +u'\U0001d692': '$\\mathtt{i}$', +u'\U0001d693': '$\\mathtt{j}$', +u'\U0001d694': '$\\mathtt{k}$', +u'\U0001d695': '$\\mathtt{l}$', +u'\U0001d696': '$\\mathtt{m}$', +u'\U0001d697': '$\\mathtt{n}$', +u'\U0001d698': '$\\mathtt{o}$', +u'\U0001d699': '$\\mathtt{p}$', +u'\U0001d69a': '$\\mathtt{q}$', +u'\U0001d69b': '$\\mathtt{r}$', +u'\U0001d69c': '$\\mathtt{s}$', +u'\U0001d69d': '$\\mathtt{t}$', +u'\U0001d69e': '$\\mathtt{u}$', +u'\U0001d69f': '$\\mathtt{v}$', +u'\U0001d6a0': '$\\mathtt{w}$', +u'\U0001d6a1': '$\\mathtt{x}$', +u'\U0001d6a2': '$\\mathtt{y}$', +u'\U0001d6a3': '$\\mathtt{z}$', +u'\U0001d6a8': '$\\mathbf{\\Alpha}$', +u'\U0001d6a9': '$\\mathbf{\\Beta}$', +u'\U0001d6aa': '$\\mathbf{\\Gamma}$', +u'\U0001d6ab': '$\\mathbf{\\Delta}$', +u'\U0001d6ac': '$\\mathbf{\\Epsilon}$', +u'\U0001d6ad': '$\\mathbf{\\Zeta}$', +u'\U0001d6ae': '$\\mathbf{\\Eta}$', +u'\U0001d6af': '$\\mathbf{\\Theta}$', +u'\U0001d6b0': '$\\mathbf{\\Iota}$', +u'\U0001d6b1': '$\\mathbf{\\Kappa}$', +u'\U0001d6b2': '$\\mathbf{\\Lambda}$', +u'\U0001d6b3': '$M$', +u'\U0001d6b4': '$N$', +u'\U0001d6b5': '$\\mathbf{\\Xi}$', +u'\U0001d6b6': '$O$', +u'\U0001d6b7': '$\\mathbf{\\Pi}$', +u'\U0001d6b8': '$\\mathbf{\\Rho}$', +u'\U0001d6b9': '{\\mathbf{\\vartheta}}', +u'\U0001d6ba': '$\\mathbf{\\Sigma}$', +u'\U0001d6bb': '$\\mathbf{\\Tau}$', +u'\U0001d6bc': '$\\mathbf{\\Upsilon}$', +u'\U0001d6bd': '$\\mathbf{\\Phi}$', +u'\U0001d6be': '$\\mathbf{\\Chi}$', +u'\U0001d6bf': '$\\mathbf{\\Psi}$', +u'\U0001d6c0': '$\\mathbf{\\Omega}$', +u'\U0001d6c1': '$\\mathbf{\\nabla}$', +u'\U0001d6c2': '$\\mathbf{\\Alpha}$', +u'\U0001d6c3': '$\\mathbf{\\Beta}$', +u'\U0001d6c4': '$\\mathbf{\\Gamma}$', +u'\U0001d6c5': '$\\mathbf{\\Delta}$', +u'\U0001d6c6': '$\\mathbf{\\Epsilon}$', +u'\U0001d6c7': '$\\mathbf{\\Zeta}$', +u'\U0001d6c8': '$\\mathbf{\\Eta}$', +u'\U0001d6c9': '$\\mathbf{\\theta}$', +u'\U0001d6ca': '$\\mathbf{\\Iota}$', +u'\U0001d6cb': '$\\mathbf{\\Kappa}$', +u'\U0001d6cc': '$\\mathbf{\\Lambda}$', +u'\U0001d6cd': '$M$', +u'\U0001d6ce': '$N$', +u'\U0001d6cf': '$\\mathbf{\\Xi}$', +u'\U0001d6d0': '$O$', +u'\U0001d6d1': '$\\mathbf{\\Pi}$', +u'\U0001d6d2': '$\\mathbf{\\Rho}$', +u'\U0001d6d3': '$\\mathbf{\\varsigma}$', +u'\U0001d6d4': '$\\mathbf{\\Sigma}$', +u'\U0001d6d5': '$\\mathbf{\\Tau}$', +u'\U0001d6d6': '$\\mathbf{\\Upsilon}$', +u'\U0001d6d7': '$\\mathbf{\\Phi}$', +u'\U0001d6d8': '$\\mathbf{\\Chi}$', +u'\U0001d6d9': '$\\mathbf{\\Psi}$', +u'\U0001d6da': '$\\mathbf{\\Omega}$', +u'\U0001d6db': '$\\partial$', +u'\U0001d6dc': '$\\in$', +u'\U0001d6dd': '{\\mathbf{\\vartheta}}', +u'\U0001d6de': '{\\mathbf{\\varkappa}}', +u'\U0001d6df': '{\\mathbf{\\phi}}', +u'\U0001d6e0': '{\\mathbf{\\varrho}}', +u'\U0001d6e1': '{\\mathbf{\\varpi}}', +u'\U0001d6e2': '$\\mathsl{\\Alpha}$', +u'\U0001d6e3': '$\\mathsl{\\Beta}$', +u'\U0001d6e4': '$\\mathsl{\\Gamma}$', +u'\U0001d6e5': '$\\mathsl{\\Delta}$', +u'\U0001d6e6': '$\\mathsl{\\Epsilon}$', +u'\U0001d6e7': '$\\mathsl{\\Zeta}$', +u'\U0001d6e8': '$\\mathsl{\\Eta}$', +u'\U0001d6e9': '$\\mathsl{\\Theta}$', +u'\U0001d6ea': '$\\mathsl{\\Iota}$', +u'\U0001d6eb': '$\\mathsl{\\Kappa}$', +u'\U0001d6ec': '$\\mathsl{\\Lambda}$', +u'\U0001d6ed': '$M$', +u'\U0001d6ee': '$N$', +u'\U0001d6ef': '$\\mathsl{\\Xi}$', +u'\U0001d6f0': '$O$', +u'\U0001d6f1': '$\\mathsl{\\Pi}$', +u'\U0001d6f2': '$\\mathsl{\\Rho}$', +u'\U0001d6f3': '{\\mathsl{\\vartheta}}', +u'\U0001d6f4': '$\\mathsl{\\Sigma}$', +u'\U0001d6f5': '$\\mathsl{\\Tau}$', +u'\U0001d6f6': '$\\mathsl{\\Upsilon}$', +u'\U0001d6f7': '$\\mathsl{\\Phi}$', +u'\U0001d6f8': '$\\mathsl{\\Chi}$', +u'\U0001d6f9': '$\\mathsl{\\Psi}$', +u'\U0001d6fa': '$\\mathsl{\\Omega}$', +u'\U0001d6fb': '$\\mathsl{\\nabla}$', +u'\U0001d6fc': '$\\mathsl{\\Alpha}$', +u'\U0001d6fd': '$\\mathsl{\\Beta}$', +u'\U0001d6fe': '$\\mathsl{\\Gamma}$', +u'\U0001d6ff': '$\\mathsl{\\Delta}$', +u'\U0001d700': '$\\mathsl{\\Epsilon}$', +u'\U0001d701': '$\\mathsl{\\Zeta}$', +u'\U0001d702': '$\\mathsl{\\Eta}$', +u'\U0001d703': '$\\mathsl{\\Theta}$', +u'\U0001d704': '$\\mathsl{\\Iota}$', +u'\U0001d705': '$\\mathsl{\\Kappa}$', +u'\U0001d706': '$\\mathsl{\\Lambda}$', +u'\U0001d707': '$M$', +u'\U0001d708': '$N$', +u'\U0001d709': '$\\mathsl{\\Xi}$', +u'\U0001d70a': '$O$', +u'\U0001d70b': '$\\mathsl{\\Pi}$', +u'\U0001d70c': '$\\mathsl{\\Rho}$', +u'\U0001d70d': '$\\mathsl{\\varsigma}$', +u'\U0001d70e': '$\\mathsl{\\Sigma}$', +u'\U0001d70f': '$\\mathsl{\\Tau}$', +u'\U0001d710': '$\\mathsl{\\Upsilon}$', +u'\U0001d711': '$\\mathsl{\\Phi}$', +u'\U0001d712': '$\\mathsl{\\Chi}$', +u'\U0001d713': '$\\mathsl{\\Psi}$', +u'\U0001d714': '$\\mathsl{\\Omega}$', +u'\U0001d715': '$\\partial$', +u'\U0001d716': '$\\in$', +u'\U0001d717': '{\\mathsl{\\vartheta}}', +u'\U0001d718': '{\\mathsl{\\varkappa}}', +u'\U0001d719': '{\\mathsl{\\phi}}', +u'\U0001d71a': '{\\mathsl{\\varrho}}', +u'\U0001d71b': '{\\mathsl{\\varpi}}', +u'\U0001d71c': '$\\mathbit{\\Alpha}$', +u'\U0001d71d': '$\\mathbit{\\Beta}$', +u'\U0001d71e': '$\\mathbit{\\Gamma}$', +u'\U0001d71f': '$\\mathbit{\\Delta}$', +u'\U0001d720': '$\\mathbit{\\Epsilon}$', +u'\U0001d721': '$\\mathbit{\\Zeta}$', +u'\U0001d722': '$\\mathbit{\\Eta}$', +u'\U0001d723': '$\\mathbit{\\Theta}$', +u'\U0001d724': '$\\mathbit{\\Iota}$', +u'\U0001d725': '$\\mathbit{\\Kappa}$', +u'\U0001d726': '$\\mathbit{\\Lambda}$', +u'\U0001d727': '$M$', +u'\U0001d728': '$N$', +u'\U0001d729': '$\\mathbit{\\Xi}$', +u'\U0001d72a': '$O$', +u'\U0001d72b': '$\\mathbit{\\Pi}$', +u'\U0001d72c': '$\\mathbit{\\Rho}$', +u'\U0001d72d': '{\\mathbit{O}}', +u'\U0001d72e': '$\\mathbit{\\Sigma}$', +u'\U0001d72f': '$\\mathbit{\\Tau}$', +u'\U0001d730': '$\\mathbit{\\Upsilon}$', +u'\U0001d731': '$\\mathbit{\\Phi}$', +u'\U0001d732': '$\\mathbit{\\Chi}$', +u'\U0001d733': '$\\mathbit{\\Psi}$', +u'\U0001d734': '$\\mathbit{\\Omega}$', +u'\U0001d735': '$\\mathbit{\\nabla}$', +u'\U0001d736': '$\\mathbit{\\Alpha}$', +u'\U0001d737': '$\\mathbit{\\Beta}$', +u'\U0001d738': '$\\mathbit{\\Gamma}$', +u'\U0001d739': '$\\mathbit{\\Delta}$', +u'\U0001d73a': '$\\mathbit{\\Epsilon}$', +u'\U0001d73b': '$\\mathbit{\\Zeta}$', +u'\U0001d73c': '$\\mathbit{\\Eta}$', +u'\U0001d73d': '$\\mathbit{\\Theta}$', +u'\U0001d73e': '$\\mathbit{\\Iota}$', +u'\U0001d73f': '$\\mathbit{\\Kappa}$', +u'\U0001d740': '$\\mathbit{\\Lambda}$', +u'\U0001d741': '$M$', +u'\U0001d742': '$N$', +u'\U0001d743': '$\\mathbit{\\Xi}$', +u'\U0001d744': '$O$', +u'\U0001d745': '$\\mathbit{\\Pi}$', +u'\U0001d746': '$\\mathbit{\\Rho}$', +u'\U0001d747': '$\\mathbit{\\varsigma}$', +u'\U0001d748': '$\\mathbit{\\Sigma}$', +u'\U0001d749': '$\\mathbit{\\Tau}$', +u'\U0001d74a': '$\\mathbit{\\Upsilon}$', +u'\U0001d74b': '$\\mathbit{\\Phi}$', +u'\U0001d74c': '$\\mathbit{\\Chi}$', +u'\U0001d74d': '$\\mathbit{\\Psi}$', +u'\U0001d74e': '$\\mathbit{\\Omega}$', +u'\U0001d74f': '$\\partial$', +u'\U0001d750': '$\\in$', +u'\U0001d751': '{\\mathbit{\\vartheta}}', +u'\U0001d752': '{\\mathbit{\\varkappa}}', +u'\U0001d753': '{\\mathbit{\\phi}}', +u'\U0001d754': '{\\mathbit{\\varrho}}', +u'\U0001d755': '{\\mathbit{\\varpi}}', +u'\U0001d756': '$\\mathsfbf{\\Alpha}$', +u'\U0001d757': '$\\mathsfbf{\\Beta}$', +u'\U0001d758': '$\\mathsfbf{\\Gamma}$', +u'\U0001d759': '$\\mathsfbf{\\Delta}$', +u'\U0001d75a': '$\\mathsfbf{\\Epsilon}$', +u'\U0001d75b': '$\\mathsfbf{\\Zeta}$', +u'\U0001d75c': '$\\mathsfbf{\\Eta}$', +u'\U0001d75d': '$\\mathsfbf{\\Theta}$', +u'\U0001d75e': '$\\mathsfbf{\\Iota}$', +u'\U0001d75f': '$\\mathsfbf{\\Kappa}$', +u'\U0001d760': '$\\mathsfbf{\\Lambda}$', +u'\U0001d761': '$M$', +u'\U0001d762': '$N$', +u'\U0001d763': '$\\mathsfbf{\\Xi}$', +u'\U0001d764': '$O$', +u'\U0001d765': '$\\mathsfbf{\\Pi}$', +u'\U0001d766': '$\\mathsfbf{\\Rho}$', +u'\U0001d767': '{\\mathsfbf{\\vartheta}}', +u'\U0001d768': '$\\mathsfbf{\\Sigma}$', +u'\U0001d769': '$\\mathsfbf{\\Tau}$', +u'\U0001d76a': '$\\mathsfbf{\\Upsilon}$', +u'\U0001d76b': '$\\mathsfbf{\\Phi}$', +u'\U0001d76c': '$\\mathsfbf{\\Chi}$', +u'\U0001d76d': '$\\mathsfbf{\\Psi}$', +u'\U0001d76e': '$\\mathsfbf{\\Omega}$', +u'\U0001d76f': '$\\mathsfbf{\\nabla}$', +u'\U0001d770': '$\\mathsfbf{\\Alpha}$', +u'\U0001d771': '$\\mathsfbf{\\Beta}$', +u'\U0001d772': '$\\mathsfbf{\\Gamma}$', +u'\U0001d773': '$\\mathsfbf{\\Delta}$', +u'\U0001d774': '$\\mathsfbf{\\Epsilon}$', +u'\U0001d775': '$\\mathsfbf{\\Zeta}$', +u'\U0001d776': '$\\mathsfbf{\\Eta}$', +u'\U0001d777': '$\\mathsfbf{\\Theta}$', +u'\U0001d778': '$\\mathsfbf{\\Iota}$', +u'\U0001d779': '$\\mathsfbf{\\Kappa}$', +u'\U0001d77a': '$\\mathsfbf{\\Lambda}$', +u'\U0001d77b': '$M$', +u'\U0001d77c': '$N$', +u'\U0001d77d': '$\\mathsfbf{\\Xi}$', +u'\U0001d77e': '$O$', +u'\U0001d77f': '$\\mathsfbf{\\Pi}$', +u'\U0001d780': '$\\mathsfbf{\\Rho}$', +u'\U0001d781': '$\\mathsfbf{\\varsigma}$', +u'\U0001d782': '$\\mathsfbf{\\Sigma}$', +u'\U0001d783': '$\\mathsfbf{\\Tau}$', +u'\U0001d784': '$\\mathsfbf{\\Upsilon}$', +u'\U0001d785': '$\\mathsfbf{\\Phi}$', +u'\U0001d786': '$\\mathsfbf{\\Chi}$', +u'\U0001d787': '$\\mathsfbf{\\Psi}$', +u'\U0001d788': '$\\mathsfbf{\\Omega}$', +u'\U0001d789': '$\\partial$', +u'\U0001d78a': '$\\in$', +u'\U0001d78b': '{\\mathsfbf{\\vartheta}}', +u'\U0001d78c': '{\\mathsfbf{\\varkappa}}', +u'\U0001d78d': '{\\mathsfbf{\\phi}}', +u'\U0001d78e': '{\\mathsfbf{\\varrho}}', +u'\U0001d78f': '{\\mathsfbf{\\varpi}}', +u'\U0001d790': '$\\mathsfbfsl{\\Alpha}$', +u'\U0001d791': '$\\mathsfbfsl{\\Beta}$', +u'\U0001d792': '$\\mathsfbfsl{\\Gamma}$', +u'\U0001d793': '$\\mathsfbfsl{\\Delta}$', +u'\U0001d794': '$\\mathsfbfsl{\\Epsilon}$', +u'\U0001d795': '$\\mathsfbfsl{\\Zeta}$', +u'\U0001d796': '$\\mathsfbfsl{\\Eta}$', +u'\U0001d797': '$\\mathsfbfsl{\\vartheta}$', +u'\U0001d798': '$\\mathsfbfsl{\\Iota}$', +u'\U0001d799': '$\\mathsfbfsl{\\Kappa}$', +u'\U0001d79a': '$\\mathsfbfsl{\\Lambda}$', +u'\U0001d79b': '$M$', +u'\U0001d79c': '$N$', +u'\U0001d79d': '$\\mathsfbfsl{\\Xi}$', +u'\U0001d79e': '$O$', +u'\U0001d79f': '$\\mathsfbfsl{\\Pi}$', +u'\U0001d7a0': '$\\mathsfbfsl{\\Rho}$', +u'\U0001d7a1': '{\\mathsfbfsl{\\vartheta}}', +u'\U0001d7a2': '$\\mathsfbfsl{\\Sigma}$', +u'\U0001d7a3': '$\\mathsfbfsl{\\Tau}$', +u'\U0001d7a4': '$\\mathsfbfsl{\\Upsilon}$', +u'\U0001d7a5': '$\\mathsfbfsl{\\Phi}$', +u'\U0001d7a6': '$\\mathsfbfsl{\\Chi}$', +u'\U0001d7a7': '$\\mathsfbfsl{\\Psi}$', +u'\U0001d7a8': '$\\mathsfbfsl{\\Omega}$', +u'\U0001d7a9': '$\\mathsfbfsl{\\nabla}$', +u'\U0001d7aa': '$\\mathsfbfsl{\\Alpha}$', +u'\U0001d7ab': '$\\mathsfbfsl{\\Beta}$', +u'\U0001d7ac': '$\\mathsfbfsl{\\Gamma}$', +u'\U0001d7ad': '$\\mathsfbfsl{\\Delta}$', +u'\U0001d7ae': '$\\mathsfbfsl{\\Epsilon}$', +u'\U0001d7af': '$\\mathsfbfsl{\\Zeta}$', +u'\U0001d7b0': '$\\mathsfbfsl{\\Eta}$', +u'\U0001d7b1': '$\\mathsfbfsl{\\vartheta}$', +u'\U0001d7b2': '$\\mathsfbfsl{\\Iota}$', +u'\U0001d7b3': '$\\mathsfbfsl{\\Kappa}$', +u'\U0001d7b4': '$\\mathsfbfsl{\\Lambda}$', +u'\U0001d7b5': '$M$', +u'\U0001d7b6': '$N$', +u'\U0001d7b7': '$\\mathsfbfsl{\\Xi}$', +u'\U0001d7b8': '$O$', +u'\U0001d7b9': '$\\mathsfbfsl{\\Pi}$', +u'\U0001d7ba': '$\\mathsfbfsl{\\Rho}$', +u'\U0001d7bb': '$\\mathsfbfsl{\\varsigma}$', +u'\U0001d7bc': '$\\mathsfbfsl{\\Sigma}$', +u'\U0001d7bd': '$\\mathsfbfsl{\\Tau}$', +u'\U0001d7be': '$\\mathsfbfsl{\\Upsilon}$', +u'\U0001d7bf': '$\\mathsfbfsl{\\Phi}$', +u'\U0001d7c0': '$\\mathsfbfsl{\\Chi}$', +u'\U0001d7c1': '$\\mathsfbfsl{\\Psi}$', +u'\U0001d7c2': '$\\mathsfbfsl{\\Omega}$', +u'\U0001d7c3': '$\\partial$', +u'\U0001d7c4': '$\\in$', +u'\U0001d7c5': '{\\mathsfbfsl{\\vartheta}}', +u'\U0001d7c6': '{\\mathsfbfsl{\\varkappa}}', +u'\U0001d7c7': '{\\mathsfbfsl{\\phi}}', +u'\U0001d7c8': '{\\mathsfbfsl{\\varrho}}', +u'\U0001d7c9': '{\\mathsfbfsl{\\varpi}}', +u'\U0001d7ce': '$\\mathbf{0}$', +u'\U0001d7cf': '$\\mathbf{1}$', +u'\U0001d7d0': '$\\mathbf{2}$', +u'\U0001d7d1': '$\\mathbf{3}$', +u'\U0001d7d2': '$\\mathbf{4}$', +u'\U0001d7d3': '$\\mathbf{5}$', +u'\U0001d7d4': '$\\mathbf{6}$', +u'\U0001d7d5': '$\\mathbf{7}$', +u'\U0001d7d6': '$\\mathbf{8}$', +u'\U0001d7d7': '$\\mathbf{9}$', +u'\U0001d7d8': '$\\mathbb{0}$', +u'\U0001d7d9': '$\\mathbb{1}$', +u'\U0001d7da': '$\\mathbb{2}$', +u'\U0001d7db': '$\\mathbb{3}$', +u'\U0001d7dc': '$\\mathbb{4}$', +u'\U0001d7dd': '$\\mathbb{5}$', +u'\U0001d7de': '$\\mathbb{6}$', +u'\U0001d7df': '$\\mathbb{7}$', +u'\U0001d7e0': '$\\mathbb{8}$', +u'\U0001d7e1': '$\\mathbb{9}$', +u'\U0001d7e2': '$\\mathsf{0}$', +u'\U0001d7e3': '$\\mathsf{1}$', +u'\U0001d7e4': '$\\mathsf{2}$', +u'\U0001d7e5': '$\\mathsf{3}$', +u'\U0001d7e6': '$\\mathsf{4}$', +u'\U0001d7e7': '$\\mathsf{5}$', +u'\U0001d7e8': '$\\mathsf{6}$', +u'\U0001d7e9': '$\\mathsf{7}$', +u'\U0001d7ea': '$\\mathsf{8}$', +u'\U0001d7eb': '$\\mathsf{9}$', +u'\U0001d7ec': '$\\mathsfbf{0}$', +u'\U0001d7ed': '$\\mathsfbf{1}$', +u'\U0001d7ee': '$\\mathsfbf{2}$', +u'\U0001d7ef': '$\\mathsfbf{3}$', +u'\U0001d7f0': '$\\mathsfbf{4}$', +u'\U0001d7f1': '$\\mathsfbf{5}$', +u'\U0001d7f2': '$\\mathsfbf{6}$', +u'\U0001d7f3': '$\\mathsfbf{7}$', +u'\U0001d7f4': '$\\mathsfbf{8}$', +u'\U0001d7f5': '$\\mathsfbf{9}$', +u'\U0001d7f6': '$\\mathtt{0}$', +u'\U0001d7f7': '$\\mathtt{1}$', +u'\U0001d7f8': '$\\mathtt{2}$', +u'\U0001d7f9': '$\\mathtt{3}$', +u'\U0001d7fa': '$\\mathtt{4}$', +u'\U0001d7fb': '$\\mathtt{5}$', +u'\U0001d7fc': '$\\mathtt{6}$', +u'\U0001d7fd': '$\\mathtt{7}$', +u'\U0001d7fe': '$\\mathtt{8}$', +u'\U0001d7ff': '$\\mathtt{9}$'} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/null.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/null.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,21 @@ +# $Id: null.py 4564 2006-05-21 20:44:42Z wiemann $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +A do-nothing Writer. +""" + +from docutils import writers + + +class Writer(writers.UnfilteredWriter): + + supported = ('null',) + """Formats this writer supports.""" + + config_section = 'null writer' + config_section_dependencies = ('writers',) + + def translate(self): + pass diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pep_html/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pep_html/__init__.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,105 @@ +# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +PEP HTML Writer. +""" + +__docformat__ = 'reStructuredText' + + +import sys +import os +import os.path +import codecs +import docutils +from docutils import frontend, nodes, utils, writers +from docutils.writers import html4css1 + + +class Writer(html4css1.Writer): + + default_stylesheet = 'pep.css' + + default_stylesheet_path = utils.relative_path( + os.path.join(os.getcwd(), 'dummy'), + os.path.join(os.path.dirname(__file__), default_stylesheet)) + + default_template = 'template.txt' + + default_template_path = utils.relative_path( + os.path.join(os.getcwd(), 'dummy'), + os.path.join(os.path.dirname(__file__), default_template)) + + settings_spec = html4css1.Writer.settings_spec + ( + 'PEP/HTML-Specific Options', + 'For the PEP/HTML writer, the default value for the --stylesheet-path ' + 'option is "%s", and the default value for --template is "%s". ' + 'See HTML-Specific Options above.' + % (default_stylesheet_path, default_template_path), + (('Python\'s home URL. Default is "http://www.python.org".', + ['--python-home'], + {'default': 'http://www.python.org', 'metavar': ''}), + ('Home URL prefix for PEPs. Default is "." (current directory).', + ['--pep-home'], + {'default': '.', 'metavar': ''}), + # For testing. + (frontend.SUPPRESS_HELP, + ['--no-random'], + {'action': 'store_true', 'validator': frontend.validate_boolean}),)) + + settings_default_overrides = {'stylesheet_path': default_stylesheet_path, + 'template': default_template_path,} + + relative_path_settings = (html4css1.Writer.relative_path_settings + + ('template',)) + + config_section = 'pep_html writer' + config_section_dependencies = ('writers', 'html4css1 writer') + + def __init__(self): + html4css1.Writer.__init__(self) + self.translator_class = HTMLTranslator + + def interpolation_dict(self): + subs = html4css1.Writer.interpolation_dict(self) + settings = self.document.settings + pyhome = settings.python_home + subs['pyhome'] = pyhome + subs['pephome'] = settings.pep_home + if pyhome == '..': + subs['pepindex'] = '.' + else: + subs['pepindex'] = pyhome + '/dev/peps' + index = self.document.first_child_matching_class(nodes.field_list) + header = self.document[index] + self.pepnum = header[0][1].astext() + subs['pep'] = self.pepnum + if settings.no_random: + subs['banner'] = 0 + else: + import random + subs['banner'] = random.randrange(64) + try: + subs['pepnum'] = '%04i' % int(self.pepnum) + except ValueError: + subs['pepnum'] = pepnum + self.title = header[1][1].astext() + subs['title'] = self.title + subs['body'] = ''.join( + self.body_pre_docinfo + self.docinfo + self.body) + return subs + + def assemble_parts(self): + html4css1.Writer.assemble_parts(self) + self.parts['title'] = [self.title] + self.parts['pepnum'] = self.pepnum + + +class HTMLTranslator(html4css1.HTMLTranslator): + + def depart_field_list(self, node): + html4css1.HTMLTranslator.depart_field_list(self, node) + if 'rfc2822' in node['classes']: + self.body.append('
    \n') diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pep_html/pep.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pep_html/pep.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,344 @@ +/* +:Author: David Goodger +:Contact: goodger@python.org +:date: $Date: 2006-05-21 22:44:42 +0200 (Sun, 21 May 2006) $ +:version: $Revision: 4564 $ +:copyright: This stylesheet has been placed in the public domain. + +Default cascading style sheet for the PEP HTML output of Docutils. +*/ + +/* "! important" is used here to override other ``margin-top`` and + ``margin-bottom`` styles that are later in the stylesheet or + more specific. See http://www.w3.org/TR/CSS1#the-cascade */ +.first { + margin-top: 0 ! important } + +.last, .with-subtitle { + margin-bottom: 0 ! important } + +.hidden { + display: none } + +.navigation { + width: 100% ; + background: #99ccff ; + margin-top: 0px ; + margin-bottom: 0px } + +.navigation .navicon { + width: 150px ; + height: 35px } + +.navigation .textlinks { + padding-left: 1em ; + text-align: left } + +.navigation td, .navigation th { + padding-left: 0em ; + padding-right: 0em ; + vertical-align: middle } + +.rfc2822 { + margin-top: 0.5em ; + margin-left: 0.5em ; + margin-right: 0.5em ; + margin-bottom: 0em } + +.rfc2822 td { + text-align: left } + +.rfc2822 th.field-name { + text-align: right ; + font-family: sans-serif ; + padding-right: 0.5em ; + font-weight: bold ; + margin-bottom: 0em } + +a.toc-backref { + text-decoration: none ; + color: black } + +blockquote.epigraph { + margin: 2em 5em ; } + +body { + margin: 0px ; + margin-bottom: 1em ; + padding: 0px } + +dl.docutils dd { + margin-bottom: 0.5em } + +div.section { + margin-left: 1em ; + margin-right: 1em ; + margin-bottom: 1.5em } + +div.section div.section { + margin-left: 0em ; + margin-right: 0em ; + margin-top: 1.5em } + +div.abstract { + margin: 2em 5em } + +div.abstract p.topic-title { + font-weight: bold ; + text-align: center } + +div.admonition, div.attention, div.caution, div.danger, div.error, +div.hint, div.important, div.note, div.tip, div.warning { + margin: 2em ; + border: medium outset ; + padding: 1em } + +div.admonition p.admonition-title, div.hint p.admonition-title, +div.important p.admonition-title, div.note p.admonition-title, +div.tip p.admonition-title { + font-weight: bold ; + font-family: sans-serif } + +div.attention p.admonition-title, div.caution p.admonition-title, +div.danger p.admonition-title, div.error p.admonition-title, +div.warning p.admonition-title { + color: red ; + font-weight: bold ; + font-family: sans-serif } + +/* Uncomment (and remove this text!) to get reduced vertical space in + compound paragraphs. +div.compound .compound-first, div.compound .compound-middle { + margin-bottom: 0.5em } + +div.compound .compound-last, div.compound .compound-middle { + margin-top: 0.5em } +*/ + +div.dedication { + margin: 2em 5em ; + text-align: center ; + font-style: italic } + +div.dedication p.topic-title { + font-weight: bold ; + font-style: normal } + +div.figure { + margin-left: 2em ; + margin-right: 2em } + +div.footer, div.header { + clear: both; + font-size: smaller } + +div.footer { + margin-left: 1em ; + margin-right: 1em } + +div.line-block { + display: block ; + margin-top: 1em ; + margin-bottom: 1em } + +div.line-block div.line-block { + margin-top: 0 ; + margin-bottom: 0 ; + margin-left: 1.5em } + +div.sidebar { + margin-left: 1em ; + border: medium outset ; + padding: 1em ; + background-color: #ffffee ; + width: 40% ; + float: right ; + clear: right } + +div.sidebar p.rubric { + font-family: sans-serif ; + font-size: medium } + +div.system-messages { + margin: 5em } + +div.system-messages h1 { + color: red } + +div.system-message { + border: medium outset ; + padding: 1em } + +div.system-message p.system-message-title { + color: red ; + font-weight: bold } + +div.topic { + margin: 2em } + +h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, +h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { + margin-top: 0.4em } + +h1 { + font-family: sans-serif ; + font-size: large } + +h2 { + font-family: sans-serif ; + font-size: medium } + +h3 { + font-family: sans-serif ; + font-size: small } + +h4 { + font-family: sans-serif ; + font-style: italic ; + font-size: small } + +h5 { + font-family: sans-serif; + font-size: x-small } + +h6 { + font-family: sans-serif; + font-style: italic ; + font-size: x-small } + +hr.docutils { + width: 75% } + +img.align-left { + clear: left } + +img.align-right { + clear: right } + +img.borderless { + border: 0 } + +ol.simple, ul.simple { + margin-bottom: 1em } + +ol.arabic { + list-style: decimal } + +ol.loweralpha { + list-style: lower-alpha } + +ol.upperalpha { + list-style: upper-alpha } + +ol.lowerroman { + list-style: lower-roman } + +ol.upperroman { + list-style: upper-roman } + +p.attribution { + text-align: right ; + margin-left: 50% } + +p.caption { + font-style: italic } + +p.credits { + font-style: italic ; + font-size: smaller } + +p.label { + white-space: nowrap } + +p.rubric { + font-weight: bold ; + font-size: larger ; + color: maroon ; + text-align: center } + +p.sidebar-title { + font-family: sans-serif ; + font-weight: bold ; + font-size: larger } + +p.sidebar-subtitle { + font-family: sans-serif ; + font-weight: bold } + +p.topic-title { + font-family: sans-serif ; + font-weight: bold } + +pre.address { + margin-bottom: 0 ; + margin-top: 0 ; + font-family: serif ; + font-size: 100% } + +pre.literal-block, pre.doctest-block { + margin-left: 2em ; + margin-right: 2em } + +span.classifier { + font-family: sans-serif ; + font-style: oblique } + +span.classifier-delimiter { + font-family: sans-serif ; + font-weight: bold } + +span.interpreted { + font-family: sans-serif } + +span.option { + white-space: nowrap } + +span.option-argument { + font-style: italic } + +span.pre { + white-space: pre } + +span.problematic { + color: red } + +span.section-subtitle { + /* font-size relative to parent (h1..h6 element) */ + font-size: 80% } + +table.citation { + border-left: solid 1px gray; + margin-left: 1px } + +table.docinfo { + margin: 2em 4em } + +table.docutils { + margin-top: 0.5em ; + margin-bottom: 0.5em } + +table.footnote { + border-left: solid 1px black; + margin-left: 1px } + +table.docutils td, table.docutils th, +table.docinfo td, table.docinfo th { + padding-left: 0.5em ; + padding-right: 0.5em ; + vertical-align: top } + +td.num { + text-align: right } + +th.field-name { + font-weight: bold ; + text-align: left ; + white-space: nowrap ; + padding-left: 0 } + +h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, +h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { + font-size: 100% } + +ul.auto-toc { + list-style-type: none } diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pep_html/template.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pep_html/template.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,29 @@ + + + + + + + + PEP %(pep)s -- %(title)s + %(stylesheet)s + + + + + +
    +%(body)s +%(body_suffix)s diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pseudoxml.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/pseudoxml.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,31 @@ +# $Id: pseudoxml.py 4564 2006-05-21 20:44:42Z wiemann $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +Simple internal document tree Writer, writes indented pseudo-XML. +""" + +__docformat__ = 'reStructuredText' + + +from docutils import writers + + +class Writer(writers.Writer): + + supported = ('pprint', 'pformat', 'pseudoxml') + """Formats this writer supports.""" + + config_section = 'pseudoxml writer' + config_section_dependencies = ('writers',) + + output = None + """Final translated form of `document`.""" + + def translate(self): + self.output = self.document.pformat() + + def supports(self, format): + """This writer supports all format-specific elements.""" + return 1 diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/__init__.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,337 @@ +# $Id: __init__.py 4883 2007-01-16 01:51:28Z wiemann $ +# Authors: Chris Liechti ; +# David Goodger +# Copyright: This module has been placed in the public domain. + +""" +S5/HTML Slideshow Writer. +""" + +__docformat__ = 'reStructuredText' + + +import sys +import os +import re +import docutils +from docutils import frontend, nodes, utils +from docutils.writers import html4css1 +from docutils.parsers.rst import directives + +themes_dir_path = utils.relative_path( + os.path.join(os.getcwd(), 'dummy'), + os.path.join(os.path.dirname(__file__), 'themes')) + +def find_theme(name): + # Where else to look for a theme? + # Check working dir? Destination dir? Config dir? Plugins dir? + path = os.path.join(themes_dir_path, name) + if not os.path.isdir(path): + raise docutils.ApplicationError( + 'Theme directory not found: %r (path: %r)' % (name, path)) + return path + + +class Writer(html4css1.Writer): + + settings_spec = html4css1.Writer.settings_spec + ( + 'S5 Slideshow Specific Options', + 'For the S5/HTML writer, the --no-toc-backlinks option ' + '(defined in General Docutils Options above) is the default, ' + 'and should not be changed.', + (('Specify an installed S5 theme by name. Overrides --theme-url. ' + 'The default theme name is "default". The theme files will be ' + 'copied into a "ui/" directory, in the same directory as the ' + 'destination file (output HTML). Note that existing theme files ' + 'will not be overwritten (unless --overwrite-theme-files is used).', + ['--theme'], + {'default': 'default', 'metavar': '', + 'overrides': 'theme_url'}), + ('Specify an S5 theme URL. The destination file (output HTML) will ' + 'link to this theme; nothing will be copied. Overrides --theme.', + ['--theme-url'], + {'metavar': '', 'overrides': 'theme'}), + ('Allow existing theme files in the ``ui/`` directory to be ' + 'overwritten. The default is not to overwrite theme files.', + ['--overwrite-theme-files'], + {'action': 'store_true', 'validator': frontend.validate_boolean}), + ('Keep existing theme files in the ``ui/`` directory; do not ' + 'overwrite any. This is the default.', + ['--keep-theme-files'], + {'dest': 'overwrite_theme_files', 'action': 'store_false'}), + ('Set the initial view mode to "slideshow" [default] or "outline".', + ['--view-mode'], + {'choices': ['slideshow', 'outline'], 'default': 'slideshow', + 'metavar': ''}), + ('Normally hide the presentation controls in slideshow mode. ' + 'This is the default.', + ['--hidden-controls'], + {'action': 'store_true', 'default': True, + 'validator': frontend.validate_boolean}), + ('Always show the presentation controls in slideshow mode. ' + 'The default is to hide the controls.', + ['--visible-controls'], + {'dest': 'hidden_controls', 'action': 'store_false'}), + ('Enable the current slide indicator ("1 / 15"). ' + 'The default is to disable it.', + ['--current-slide'], + {'action': 'store_true', 'validator': frontend.validate_boolean}), + ('Disable the current slide indicator. This is the default.', + ['--no-current-slide'], + {'dest': 'current_slide', 'action': 'store_false'}),)) + + settings_default_overrides = {'toc_backlinks': 0} + + config_section = 's5_html writer' + config_section_dependencies = ('writers', 'html4css1 writer') + + def __init__(self): + html4css1.Writer.__init__(self) + self.translator_class = S5HTMLTranslator + + +class S5HTMLTranslator(html4css1.HTMLTranslator): + + s5_stylesheet_template = """\ + + + + + + + + +\n""" + # The script element must go in front of the link elements to + # avoid a flash of unstyled content (FOUC), reproducible with + # Firefox. + + disable_current_slide = """ +\n""" + + layout_template = """\ +
    +
    +
    + + +
    \n""" +#
    +#
    +#
    +#
    + + default_theme = 'default' + """Name of the default theme.""" + + base_theme_file = '__base__' + """Name of the file containing the name of the base theme.""" + + direct_theme_files = ( + 'slides.css', 'outline.css', 'print.css', 'opera.css', 'slides.js') + """Names of theme files directly linked to in the output HTML""" + + indirect_theme_files = ( + 's5-core.css', 'framing.css', 'pretty.css', 'blank.gif', 'iepngfix.htc') + """Names of files used indirectly; imported or used by files in + `direct_theme_files`.""" + + required_theme_files = indirect_theme_files + direct_theme_files + """Names of mandatory theme files.""" + + def __init__(self, *args): + html4css1.HTMLTranslator.__init__(self, *args) + #insert S5-specific stylesheet and script stuff: + self.theme_file_path = None + self.setup_theme() + view_mode = self.document.settings.view_mode + control_visibility = ('visible', 'hidden')[self.document.settings + .hidden_controls] + self.stylesheet.append(self.s5_stylesheet_template + % {'path': self.theme_file_path, + 'view_mode': view_mode, + 'control_visibility': control_visibility}) + if not self.document.settings.current_slide: + self.stylesheet.append(self.disable_current_slide) + self.add_meta('\n') + self.s5_footer = [] + self.s5_header = [] + self.section_count = 0 + self.theme_files_copied = None + + def setup_theme(self): + if self.document.settings.theme: + self.copy_theme() + elif self.document.settings.theme_url: + self.theme_file_path = self.document.settings.theme_url + else: + raise docutils.ApplicationError( + 'No theme specified for S5/HTML writer.') + + def copy_theme(self): + """ + Locate & copy theme files. + + A theme may be explicitly based on another theme via a '__base__' + file. The default base theme is 'default'. Files are accumulated + from the specified theme, any base themes, and 'default'. + """ + settings = self.document.settings + path = find_theme(settings.theme) + theme_paths = [path] + self.theme_files_copied = {} + required_files_copied = {} + # This is a link (URL) in HTML, so we use "/", not os.sep: + self.theme_file_path = '%s/%s' % ('ui', settings.theme) + if settings._destination: + dest = os.path.join( + os.path.dirname(settings._destination), 'ui', settings.theme) + if not os.path.isdir(dest): + os.makedirs(dest) + else: + # no destination, so we can't copy the theme + return + default = 0 + while path: + for f in os.listdir(path): # copy all files from each theme + if f == self.base_theme_file: + continue # ... except the "__base__" file + if ( self.copy_file(f, path, dest) + and f in self.required_theme_files): + required_files_copied[f] = 1 + if default: + break # "default" theme has no base theme + # Find the "__base__" file in theme directory: + base_theme_file = os.path.join(path, self.base_theme_file) + # If it exists, read it and record the theme path: + if os.path.isfile(base_theme_file): + lines = open(base_theme_file).readlines() + for line in lines: + line = line.strip() + if line and not line.startswith('#'): + path = find_theme(line) + if path in theme_paths: # check for duplicates (cycles) + path = None # if found, use default base + else: + theme_paths.append(path) + break + else: # no theme name found + path = None # use default base + else: # no base theme file found + path = None # use default base + if not path: + path = find_theme(self.default_theme) + theme_paths.append(path) + default = 1 + if len(required_files_copied) != len(self.required_theme_files): + # Some required files weren't found & couldn't be copied. + required = list(self.required_theme_files) + for f in required_files_copied.keys(): + required.remove(f) + raise docutils.ApplicationError( + 'Theme files not found: %s' + % ', '.join(['%r' % f for f in required])) + + files_to_skip_pattern = re.compile(r'~$|\.bak$|#$|\.cvsignore$') + + def copy_file(self, name, source_dir, dest_dir): + """ + Copy file `name` from `source_dir` to `dest_dir`. + Return 1 if the file exists in either `source_dir` or `dest_dir`. + """ + source = os.path.join(source_dir, name) + dest = os.path.join(dest_dir, name) + if self.theme_files_copied.has_key(dest): + return 1 + else: + self.theme_files_copied[dest] = 1 + if os.path.isfile(source): + if self.files_to_skip_pattern.search(source): + return None + settings = self.document.settings + if os.path.exists(dest) and not settings.overwrite_theme_files: + settings.record_dependencies.add(dest) + else: + src_file = open(source, 'rb') + src_data = src_file.read() + src_file.close() + dest_file = open(dest, 'wb') + dest_dir = dest_dir.replace(os.sep, '/') + dest_file.write(src_data.replace( + 'ui/default', dest_dir[dest_dir.rfind('ui/'):])) + dest_file.close() + settings.record_dependencies.add(source) + return 1 + if os.path.isfile(dest): + return 1 + + def depart_document(self, node): + header = ''.join(self.s5_header) + footer = ''.join(self.s5_footer) + title = ''.join(self.html_title).replace('

    ', '

    ') + layout = self.layout_template % {'header': header, + 'title': title, + 'footer': footer} + self.fragment.extend(self.body) + self.body_prefix.extend(layout) + self.body_prefix.append('
    \n') + self.body_prefix.append( + self.starttag({'classes': ['slide'], 'ids': ['slide0']}, 'div')) + if not self.section_count: + self.body.append('
    \n') + self.body_suffix.insert(0, '

    \n') + # skip content-type meta tag with interpolated charset value: + self.html_head.extend(self.head[1:]) + self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo + + self.docinfo + self.body + + self.body_suffix[:-1]) + + def depart_footer(self, node): + start = self.context.pop() + self.s5_footer.append('

    ') + self.s5_footer.extend(self.body[start:]) + self.s5_footer.append('

    ') + del self.body[start:] + + def depart_header(self, node): + start = self.context.pop() + header = ['\n') + del self.body[start:] + self.s5_header.extend(header) + + def visit_section(self, node): + if not self.section_count: + self.body.append('\n\n') + self.section_count += 1 + self.section_level += 1 + if self.section_level > 1: + # dummy for matching div's + self.body.append(self.starttag(node, 'div', CLASS='section')) + else: + self.body.append(self.starttag(node, 'div', CLASS='slide')) + + def visit_subtitle(self, node): + if isinstance(node.parent, nodes.section): + level = self.section_level + self.initial_header_level - 1 + if level == 1: + level = 2 + tag = 'h%s' % level + self.body.append(self.starttag(node, tag, '')) + self.context.append('\n' % tag) + else: + html4css1.HTMLTranslator.visit_subtitle(self, node) + + def visit_title(self, node): + html4css1.HTMLTranslator.visit_title(self, node) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/README.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/README.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,6 @@ +Except where otherwise noted (default/iepngfix.htc), all files in this +directory have been released into the Public Domain. + +These files are based on files from S5 1.1, released into the Public +Domain by Eric Meyer. For further details, please see +http://www.meyerweb.com/eric/tools/s5/credits.html. diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/__base__ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/__base__ Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,2 @@ +# base theme of this theme: +big-white diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/framing.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/framing.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,25 @@ +/* The following styles size, place, and layer the slide components. + Edit these if you want to change the overall slide layout. + The commented lines can be uncommented (and modified, if necessary) + to help you with the rearrangement process. */ + +/* target = 1024x768 */ + +div#header, div#footer, .slide {width: 100%; top: 0; left: 0;} +div#header {top: 0; z-index: 1;} +div#footer {display:none;} +.slide {top: 0; width: 92%; padding: 0.1em 4% 4%; z-index: 2;} +/* list-style: none;} */ +div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0;} +#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; + z-index: 10;} +html>body #currentSlide {position: fixed;} + +/* +div#header {background: #FCC;} +div#footer {background: #CCF;} +div#controls {background: #BBD;} +div#currentSlide {background: #FFC;} +*/ diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/pretty.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/pretty.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,109 @@ +/* This file has been placed in the public domain. */ +/* Following are the presentation styles -- edit away! */ + +html, body {margin: 0; padding: 0;} +body {background: black; color: white;} +:link, :visited {text-decoration: none; color: cyan;} +#controls :active {color: #888 !important;} +#controls :focus {outline: 1px dotted #CCC;} + +blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;} +blockquote p {margin: 0;} + +kbd {font-weight: bold; font-size: 1em;} +sup {font-size: smaller; line-height: 1px;} + +.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;} +.slide ul ul li {list-style: square;} +.slide img.leader {display: block; margin: 0 auto;} +.slide tt {font-size: 90%;} + +.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;} +.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;} +.slide h2 {font-size: 110%;} +.slide h3 {font-size: 105%;} +h1 abbr {font-variant: small-caps;} + +div#controls {position: absolute; left: 50%; bottom: 0; + width: 50%; text-align: right; font: bold 0.9em sans-serif;} +html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0; padding: 0;} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + border: none; color: #888; cursor: pointer;} +#controls #navList {height: 1em;} +#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; + background: black; color: #CCC;} + +#currentSlide {text-align: center; font-size: 0.5em; color: #AAA; + font-family: sans-serif; font-weight: bold;} + +#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0; + font-size: 150%; white-space: normal; background: transparent;} +#slide0 h2 {font: 110%; font-style: italic; color: gray;} +#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;} +#slide0 h4 {margin-top: 0; font-size: 1em;} + +ul.urls {list-style: none; display: inline; margin: 0;} +.urls li {display: inline; margin: 0;} +.external {border-bottom: 1px dotted gray;} +html>body .external {border-bottom: none;} +.external:after {content: " \274F"; font-size: smaller; color: #FCC;} + +.incremental, .incremental *, .incremental *:after { + color: black; visibility: visible; border: 0;} +img.incremental {visibility: hidden;} +.slide .current {color: lime;} + +.slide-display {display: inline ! important;} + +.huge {font-size: 150%;} +.big {font-size: 120%;} +.small {font-size: 75%;} +.tiny {font-size: 50%;} +.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;} +.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;} + +.maroon {color: maroon;} +.red {color: red;} +.magenta {color: magenta;} +.fuchsia {color: fuchsia;} +.pink {color: #FAA;} +.orange {color: orange;} +.yellow {color: yellow;} +.lime {color: lime;} +.green {color: green;} +.olive {color: olive;} +.teal {color: teal;} +.cyan {color: cyan;} +.aqua {color: aqua;} +.blue {color: blue;} +.navy {color: navy;} +.purple {color: purple;} +.black {color: black;} +.gray {color: gray;} +.silver {color: silver;} +.white {color: white;} + +.left {text-align: left ! important;} +.center {text-align: center ! important;} +.right {text-align: right ! important;} + +.animation {position: relative; margin: 1em 0; padding: 0;} +.animation img {position: absolute;} + +/* Docutils-specific overrides */ + +.slide table.docinfo {margin: 0.5em 0 0.5em 1em;} + +div.sidebar {background-color: black;} + +pre.literal-block, pre.doctest-block {background-color: black;} + +tt.docutils {background-color: black;} + +/* diagnostics */ +/* +li:after {content: " [" attr(class) "]"; color: #F88;} +div:before {content: "[" attr(class) "]"; color: #F88;} +*/ diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/framing.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/framing.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,24 @@ +/* This file has been placed in the public domain. */ +/* The following styles size, place, and layer the slide components. + Edit these if you want to change the overall slide layout. + The commented lines can be uncommented (and modified, if necessary) + to help you with the rearrangement process. */ + +/* target = 1024x768 */ + +div#header, div#footer, .slide {width: 100%; top: 0; left: 0;} +div#footer {display:none;} +.slide {top: 0; width: 92%; padding: 0.25em 4% 4%; z-index: 2;} +div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0;} +#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; + z-index: 10;} +html>body #currentSlide {position: fixed;} + +/* +div#header {background: #FCC;} +div#footer {background: #CCF;} +div#controls {background: #BBD;} +div#currentSlide {background: #FFC;} +*/ diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/pretty.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/pretty.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,107 @@ +/* This file has been placed in the public domain. */ +/* Following are the presentation styles -- edit away! */ + +html, body {margin: 0; padding: 0;} +body {background: white; color: black;} +:link, :visited {text-decoration: none; color: #00C;} +#controls :active {color: #88A !important;} +#controls :focus {outline: 1px dotted #227;} + +blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;} +blockquote p {margin: 0;} + +kbd {font-weight: bold; font-size: 1em;} +sup {font-size: smaller; line-height: 1px;} + +.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;} +.slide ul ul li {list-style: square;} +.slide img.leader {display: block; margin: 0 auto;} +.slide tt {font-size: 90%;} + +.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;} +.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;} +.slide h2 {font-size: 110%;} +.slide h3 {font-size: 105%;} +h1 abbr {font-variant: small-caps;} + +div#controls {position: absolute; left: 50%; bottom: 0; + width: 50%; text-align: right; font: bold 0.9em sans-serif;} +html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0; padding: 0;} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + border: none; color: #005; cursor: pointer;} +#controls #navList {height: 1em;} +#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; + background: #DDD; color: #227;} + +#currentSlide {text-align: center; font-size: 0.5em; color: #444; + font-family: sans-serif; font-weight: bold;} + +#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0; + font-size: 150%; white-space: normal; background: transparent;} +#slide0 h2 {font: 110%; font-style: italic; color: gray;} +#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;} +#slide0 h4 {margin-top: 0; font-size: 1em;} + +ul.urls {list-style: none; display: inline; margin: 0;} +.urls li {display: inline; margin: 0;} +.external {border-bottom: 1px dotted gray;} +html>body .external {border-bottom: none;} +.external:after {content: " \274F"; font-size: smaller; color: #77B;} + +.incremental, .incremental *, .incremental *:after { + color: white; visibility: visible; border: 0;} +img.incremental {visibility: hidden;} +.slide .current {color: green;} + +.slide-display {display: inline ! important;} + +.huge {font-size: 150%;} +.big {font-size: 120%;} +.small {font-size: 75%;} +.tiny {font-size: 50%;} +.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;} +.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;} + +.maroon {color: maroon;} +.red {color: red;} +.magenta {color: magenta;} +.fuchsia {color: fuchsia;} +.pink {color: #FAA;} +.orange {color: orange;} +.yellow {color: yellow;} +.lime {color: lime;} +.green {color: green;} +.olive {color: olive;} +.teal {color: teal;} +.cyan {color: cyan;} +.aqua {color: aqua;} +.blue {color: blue;} +.navy {color: navy;} +.purple {color: purple;} +.black {color: black;} +.gray {color: gray;} +.silver {color: silver;} +.white {color: white;} + +.left {text-align: left ! important;} +.center {text-align: center ! important;} +.right {text-align: right ! important;} + +.animation {position: relative; margin: 1em 0; padding: 0;} +.animation img {position: absolute;} + +/* Docutils-specific overrides */ + +.slide table.docinfo {margin: 0.5em 0 0.5em 1em;} + +pre.literal-block, pre.doctest-block {background-color: white;} + +tt.docutils {background-color: white;} + +/* diagnostics */ +/* +li:after {content: " [" attr(class) "]"; color: #F88;} +div:before {content: "[" attr(class) "]"; color: #F88;} +*/ diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/blank.gif Binary file buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/blank.gif has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/framing.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/framing.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,25 @@ +/* This file has been placed in the public domain. */ +/* The following styles size, place, and layer the slide components. + Edit these if you want to change the overall slide layout. + The commented lines can be uncommented (and modified, if necessary) + to help you with the rearrangement process. */ + +/* target = 1024x768 */ + +div#header, div#footer, .slide {width: 100%; top: 0; left: 0;} +div#header {position: fixed; top: 0; height: 3em; z-index: 1;} +div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;} +.slide {top: 0; width: 92%; padding: 2.5em 4% 4%; z-index: 2;} +div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0;} +#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; + z-index: 10;} +html>body #currentSlide {position: fixed;} + +/* +div#header {background: #FCC;} +div#footer {background: #CCF;} +div#controls {background: #BBD;} +div#currentSlide {background: #FFC;} +*/ diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/iepngfix.htc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/iepngfix.htc Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,42 @@ + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/opera.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/opera.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,8 @@ +/* This file has been placed in the public domain. */ +/* DO NOT CHANGE THESE unless you really want to break Opera Show */ +.slide { + visibility: visible !important; + position: static !important; + page-break-before: always; +} +#slide0 {page-break-before: avoid;} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/outline.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/outline.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,16 @@ +/* This file has been placed in the public domain. */ +/* Don't change this unless you want the layout stuff to show up in the + outline view! */ + +.layout div, #footer *, #controlForm * {display: none;} +#footer, #controls, #controlForm, #navLinks, #toggle { + display: block; visibility: visible; margin: 0; padding: 0;} +#toggle {float: right; padding: 0.5em;} +html>body #toggle {position: fixed; top: 0; right: 0;} + +/* making the outline look pretty-ish */ + +#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;} +#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;} + +.outline {display: inline ! important;} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/pretty.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/pretty.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,120 @@ +/* This file has been placed in the public domain. */ +/* Following are the presentation styles -- edit away! */ + +html, body {margin: 0; padding: 0;} +body {background: white; color: black;} +/* Replace the background style above with the style below (and again for + div#header) for a graphic: */ +/* background: white url(bodybg.gif) -16px 0 no-repeat; */ +:link, :visited {text-decoration: none; color: #00C;} +#controls :active {color: #88A !important;} +#controls :focus {outline: 1px dotted #227;} +h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;} + +blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;} +blockquote p {margin: 0;} + +kbd {font-weight: bold; font-size: 1em;} +sup {font-size: smaller; line-height: 1px;} + +.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;} +.slide ul ul li {list-style: square;} +.slide img.leader {display: block; margin: 0 auto;} +.slide tt {font-size: 90%;} + +div#header, div#footer {background: #005; color: #AAB; font-family: sans-serif;} +/* background: #005 url(bodybg.gif) -16px 0 no-repeat; */ +div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;} +#footer h1 {display: block; padding: 0 1em;} +#footer h2 {display: block; padding: 0.8em 1em 0;} + +.slide {font-size: 1.2em;} +.slide h1 {position: absolute; top: 0.45em; z-index: 1; + margin: 0; padding-left: 0.7em; white-space: nowrap; + font: bold 150% sans-serif; color: #DDE; background: #005;} +.slide h2 {font: bold 120%/1em sans-serif; padding-top: 0.5em;} +.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;} +h1 abbr {font-variant: small-caps;} + +div#controls {position: absolute; left: 50%; bottom: 0; + width: 50%; text-align: right; font: bold 0.9em sans-serif;} +html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0; padding: 0;} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + background: #005; border: none; color: #779; cursor: pointer;} +#controls #navList {height: 1em;} +#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; + background: #DDD; color: #227;} + +#currentSlide {text-align: center; font-size: 0.5em; color: #449; + font-family: sans-serif; font-weight: bold;} + +#slide0 {padding-top: 1.5em} +#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; color: #000; + font: bold 2em sans-serif; white-space: normal; background: transparent;} +#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;} +#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;} +#slide0 h4 {margin-top: 0; font-size: 1em;} + +ul.urls {list-style: none; display: inline; margin: 0;} +.urls li {display: inline; margin: 0;} +.external {border-bottom: 1px dotted gray;} +html>body .external {border-bottom: none;} +.external:after {content: " \274F"; font-size: smaller; color: #77B;} + +.incremental, .incremental *, .incremental *:after {visibility: visible; + color: white; border: 0;} +img.incremental {visibility: hidden;} +.slide .current {color: green;} + +.slide-display {display: inline ! important;} + +.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;} +.big {font-family: sans-serif; font-weight: bold; font-size: 120%;} +.small {font-size: 75%;} +.tiny {font-size: 50%;} +.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;} +.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;} + +.maroon {color: maroon;} +.red {color: red;} +.magenta {color: magenta;} +.fuchsia {color: fuchsia;} +.pink {color: #FAA;} +.orange {color: orange;} +.yellow {color: yellow;} +.lime {color: lime;} +.green {color: green;} +.olive {color: olive;} +.teal {color: teal;} +.cyan {color: cyan;} +.aqua {color: aqua;} +.blue {color: blue;} +.navy {color: navy;} +.purple {color: purple;} +.black {color: black;} +.gray {color: gray;} +.silver {color: silver;} +.white {color: white;} + +.left {text-align: left ! important;} +.center {text-align: center ! important;} +.right {text-align: right ! important;} + +.animation {position: relative; margin: 1em 0; padding: 0;} +.animation img {position: absolute;} + +/* Docutils-specific overrides */ + +.slide table.docinfo {margin: 1em 0 0.5em 2em;} + +pre.literal-block, pre.doctest-block {background-color: white;} + +tt.docutils {background-color: white;} + +/* diagnostics */ +/* +li:after {content: " [" attr(class) "]"; color: #F88;} +div:before {content: "[" attr(class) "]"; color: #F88;} +*/ diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/print.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/print.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,24 @@ +/* This file has been placed in the public domain. */ +/* The following rule is necessary to have all slides appear in print! + DO NOT REMOVE IT! */ +.slide, ul {page-break-inside: avoid; visibility: visible !important;} +h1 {page-break-after: avoid;} + +body {font-size: 12pt; background: white;} +* {color: black;} + +#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;} +#slide0 h3 {margin: 0; padding: 0;} +#slide0 h4 {margin: 0 0 0.5em; padding: 0;} +#slide0 {margin-bottom: 3em;} + +#header {display: none;} +#footer h1 {margin: 0; border-bottom: 1px solid; color: gray; + font-style: italic;} +#footer h2, #controls {display: none;} + +.print {display: inline ! important;} + +/* The following rule keeps the layout stuff out of print. + Remove at your own risk! */ +.layout, .layout * {display: none !important;} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/s5-core.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/s5-core.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,11 @@ +/* This file has been placed in the public domain. */ +/* Do not edit or override these styles! + The system will likely break if you do. */ + +div#header, div#footer, div#controls, .slide {position: absolute;} +html>body div#header, html>body div#footer, + html>body div#controls, html>body .slide {position: fixed;} +.handout {display: none;} +.layout {display: block;} +.slide, .hideme, .incremental {visibility: hidden;} +#slide0 {visibility: visible;} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,10 @@ +/* This file has been placed in the public domain. */ + +/* required to make the slide show run at all */ +@import url(s5-core.css); + +/* sets basic placement and size of slide components */ +@import url(framing.css); + +/* styles that make the slides look good */ +@import url(pretty.css); diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/helium-antlib/doc/tools/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,558 @@ +// S5 v1.1 slides.js -- released into the Public Domain +// Modified for Docutils (http://docutils.sf.net) by David Goodger +// +// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for +// information about all the wonderful and talented contributors to this code! + +var undef; +var slideCSS = ''; +var snum = 0; +var smax = 1; +var slideIDs = new Array(); +var incpos = 0; +var number = undef; +var s5mode = true; +var defaultView = 'slideshow'; +var controlVis = 'visible'; + +var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0; +var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0; +var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0; + +function hasClass(object, className) { + if (!object.className) return false; + return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1); +} + +function hasValue(object, value) { + if (!object) return false; + return (object.search('(^|\\s)' + value + '(\\s|$)') != -1); +} + +function removeClass(object,className) { + if (!object) return; + object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2); +} + +function addClass(object,className) { + if (!object || hasClass(object, className)) return; + if (object.className) { + object.className += ' '+className; + } else { + object.className = className; + } +} + +function GetElementsWithClassName(elementName,className) { + var allElements = document.getElementsByTagName(elementName); + var elemColl = new Array(); + for (var i = 0; i< allElements.length; i++) { + if (hasClass(allElements[i], className)) { + elemColl[elemColl.length] = allElements[i]; + } + } + return elemColl; +} + +function isParentOrSelf(element, id) { + if (element == null || element.nodeName=='BODY') return false; + else if (element.id == id) return true; + else return isParentOrSelf(element.parentNode, id); +} + +function nodeValue(node) { + var result = ""; + if (node.nodeType == 1) { + var children = node.childNodes; + for (var i = 0; i < children.length; ++i) { + result += nodeValue(children[i]); + } + } + else if (node.nodeType == 3) { + result = node.nodeValue; + } + return(result); +} + +function slideLabel() { + var slideColl = GetElementsWithClassName('*','slide'); + var list = document.getElementById('jumplist'); + smax = slideColl.length; + for (var n = 0; n < smax; n++) { + var obj = slideColl[n]; + + var did = 'slide' + n.toString(); + if (obj.getAttribute('id')) { + slideIDs[n] = obj.getAttribute('id'); + } + else { + obj.setAttribute('id',did); + slideIDs[n] = did; + } + if (isOp) continue; + + var otext = ''; + var menu = obj.firstChild; + if (!menu) continue; // to cope with empty slides + while (menu && menu.nodeType == 3) { + menu = menu.nextSibling; + } + if (!menu) continue; // to cope with slides with only text nodes + + var menunodes = menu.childNodes; + for (var o = 0; o < menunodes.length; o++) { + otext += nodeValue(menunodes[o]); + } + list.options[list.length] = new Option(n + ' : ' + otext, n); + } +} + +function currentSlide() { + var cs; + var footer_nodes; + var vis = 'visible'; + if (document.getElementById) { + cs = document.getElementById('currentSlide'); + footer_nodes = document.getElementById('footer').childNodes; + } else { + cs = document.currentSlide; + footer = document.footer.childNodes; + } + cs.innerHTML = '' + snum + '<\/span> ' + + '\/<\/span> ' + + '' + (smax-1) + '<\/span>'; + if (snum == 0) { + vis = 'hidden'; + } + cs.style.visibility = vis; + for (var i = 0; i < footer_nodes.length; i++) { + if (footer_nodes[i].nodeType == 1) { + footer_nodes[i].style.visibility = vis; + } + } +} + +function go(step) { + if (document.getElementById('slideProj').disabled || step == 0) return; + var jl = document.getElementById('jumplist'); + var cid = slideIDs[snum]; + var ce = document.getElementById(cid); + if (incrementals[snum].length > 0) { + for (var i = 0; i < incrementals[snum].length; i++) { + removeClass(incrementals[snum][i], 'current'); + removeClass(incrementals[snum][i], 'incremental'); + } + } + if (step != 'j') { + snum += step; + lmax = smax - 1; + if (snum > lmax) snum = lmax; + if (snum < 0) snum = 0; + } else + snum = parseInt(jl.value); + var nid = slideIDs[snum]; + var ne = document.getElementById(nid); + if (!ne) { + ne = document.getElementById(slideIDs[0]); + snum = 0; + } + if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;} + if (incrementals[snum].length > 0 && incpos == 0) { + for (var i = 0; i < incrementals[snum].length; i++) { + if (hasClass(incrementals[snum][i], 'current')) + incpos = i + 1; + else + addClass(incrementals[snum][i], 'incremental'); + } + } + if (incrementals[snum].length > 0 && incpos > 0) + addClass(incrementals[snum][incpos - 1], 'current'); + ce.style.visibility = 'hidden'; + ne.style.visibility = 'visible'; + jl.selectedIndex = snum; + currentSlide(); + number = 0; +} + +function goTo(target) { + if (target >= smax || target == snum) return; + go(target - snum); +} + +function subgo(step) { + if (step > 0) { + removeClass(incrementals[snum][incpos - 1],'current'); + removeClass(incrementals[snum][incpos], 'incremental'); + addClass(incrementals[snum][incpos],'current'); + incpos++; + } else { + incpos--; + removeClass(incrementals[snum][incpos],'current'); + addClass(incrementals[snum][incpos], 'incremental'); + addClass(incrementals[snum][incpos - 1],'current'); + } +} + +function toggle() { + var slideColl = GetElementsWithClassName('*','slide'); + var slides = document.getElementById('slideProj'); + var outline = document.getElementById('outlineStyle'); + if (!slides.disabled) { + slides.disabled = true; + outline.disabled = false; + s5mode = false; + fontSize('1em'); + for (var n = 0; n < smax; n++) { + var slide = slideColl[n]; + slide.style.visibility = 'visible'; + } + } else { + slides.disabled = false; + outline.disabled = true; + s5mode = true; + fontScale(); + for (var n = 0; n < smax; n++) { + var slide = slideColl[n]; + slide.style.visibility = 'hidden'; + } + slideColl[snum].style.visibility = 'visible'; + } +} + +function showHide(action) { + var obj = GetElementsWithClassName('*','hideme')[0]; + switch (action) { + case 's': obj.style.visibility = 'visible'; break; + case 'h': obj.style.visibility = 'hidden'; break; + case 'k': + if (obj.style.visibility != 'visible') { + obj.style.visibility = 'visible'; + } else { + obj.style.visibility = 'hidden'; + } + break; + } +} + +// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/) +function keys(key) { + if (!key) { + key = event; + key.which = key.keyCode; + } + if (key.which == 84) { + toggle(); + return; + } + if (s5mode) { + switch (key.which) { + case 10: // return + case 13: // enter + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; + if (key.target && isParentOrSelf(key.target, 'controls')) return; + if(number != undef) { + goTo(number); + break; + } + case 32: // spacebar + case 34: // page down + case 39: // rightkey + case 40: // downkey + if(number != undef) { + go(number); + } else if (!incrementals[snum] || incpos >= incrementals[snum].length) { + go(1); + } else { + subgo(1); + } + break; + case 33: // page up + case 37: // leftkey + case 38: // upkey + if(number != undef) { + go(-1 * number); + } else if (!incrementals[snum] || incpos <= 0) { + go(-1); + } else { + subgo(-1); + } + break; + case 36: // home + goTo(0); + break; + case 35: // end + goTo(smax-1); + break; + case 67: // c + showHide('k'); + break; + } + if (key.which < 48 || key.which > 57) { + number = undef; + } else { + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; + if (key.target && isParentOrSelf(key.target, 'controls')) return; + number = (((number != undef) ? number : 0) * 10) + (key.which - 48); + } + } + return false; +} + +function clicker(e) { + number = undef; + var target; + if (window.event) { + target = window.event.srcElement; + e = window.event; + } else target = e.target; + if (target.href != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target, 'object')) return true; + if (!e.which || e.which == 1) { + if (!incrementals[snum] || incpos >= incrementals[snum].length) { + go(1); + } else { + subgo(1); + } + } +} + +function findSlide(hash) { + var target = document.getElementById(hash); + if (target) { + for (var i = 0; i < slideIDs.length; i++) { + if (target.id == slideIDs[i]) return i; + } + } + return null; +} + +function slideJump() { + if (window.location.hash == null || window.location.hash == '') { + currentSlide(); + return; + } + if (window.location.hash == null) return; + var dest = null; + dest = findSlide(window.location.hash.slice(1)); + if (dest == null) { + dest = 0; + } + go(dest - snum); +} + +function fixLinks() { + var thisUri = window.location.href; + thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length); + var aelements = document.getElementsByTagName('A'); + for (var i = 0; i < aelements.length; i++) { + var a = aelements[i].href; + var slideID = a.match('\#.+'); + if ((slideID) && (slideID[0].slice(0,1) == '#')) { + var dest = findSlide(slideID[0].slice(1)); + if (dest != null) { + if (aelements[i].addEventListener) { + aelements[i].addEventListener("click", new Function("e", + "if (document.getElementById('slideProj').disabled) return;" + + "go("+dest+" - snum); " + + "if (e.preventDefault) e.preventDefault();"), true); + } else if (aelements[i].attachEvent) { + aelements[i].attachEvent("onclick", new Function("", + "if (document.getElementById('slideProj').disabled) return;" + + "go("+dest+" - snum); " + + "event.returnValue = false;")); + } + } + } + } +} + +function externalLinks() { + if (!document.getElementsByTagName) return; + var anchors = document.getElementsByTagName('a'); + for (var i=0; i' + + '\n') + self.footer.extend(footer) + self.body_suffix[:0] = footer + del self.body[start:] + + def visit_footnote(self, node): + self.body.append(self.starttag(node, 'table', + CLASS='docutils footnote', + frame="void", rules="none")) + self.body.append('\n' + '\n' + '') + self.footnote_backrefs(node) + + def footnote_backrefs(self, node): + backlinks = [] + backrefs = node['backrefs'] + if self.settings.footnote_backlinks and backrefs: + if len(backrefs) == 1: + self.context.append('') + self.context.append('') + self.context.append('' + % backrefs[0]) + else: + i = 1 + for backref in backrefs: + backlinks.append('%s' + % (backref, i)) + i += 1 + self.context.append('(%s) ' % ', '.join(backlinks)) + self.context += ['', ''] + else: + self.context.append('') + self.context += ['', ''] + # If the node does not only consist of a label. + if len(node) > 1: + # If there are preceding backlinks, we do not set class + # 'first', because we need to retain the top-margin. + if not backlinks: + node[1]['classes'].append('first') + node[-1]['classes'].append('last') + + def depart_footnote(self, node): + self.body.append('\n' + '\n\n') + + def visit_footnote_reference(self, node): + href = '#' + node['refid'] + format = self.settings.footnote_references + if format == 'brackets': + suffix = '[' + self.context.append(']') + else: + assert format == 'superscript' + suffix = '' + self.context.append('') + self.body.append(self.starttag(node, 'a', suffix, + CLASS='footnote-reference', href=href)) + + def depart_footnote_reference(self, node): + self.body.append(self.context.pop() + '') + + def visit_generated(self, node): + pass + + def depart_generated(self, node): + pass + + def visit_header(self, node): + self.context.append(len(self.body)) + + def depart_header(self, node): + start = self.context.pop() + header = [self.starttag(node, 'div', CLASS='header')] + header.extend(self.body[start:]) + header.append('\n
    \n\n') + self.body_prefix.extend(header) + self.header.extend(header) + del self.body[start:] + + def visit_image(self, node): + atts = {} + atts['src'] = node['uri'] + if node.has_key('width'): + atts['width'] = node['width'] + if node.has_key('height'): + atts['height'] = node['height'] + if node.has_key('scale'): + if Image and not (node.has_key('width') + and node.has_key('height')): + try: + im = Image.open(str(atts['src'])) + except (IOError, # Source image can't be found or opened + UnicodeError): # PIL doesn't like Unicode paths. + pass + else: + if not atts.has_key('width'): + atts['width'] = str(im.size[0]) + if not atts.has_key('height'): + atts['height'] = str(im.size[1]) + del im + for att_name in 'width', 'height': + if atts.has_key(att_name): + match = re.match(r'([0-9.]+)(\S*)$', atts[att_name]) + assert match + atts[att_name] = '%s%s' % ( + float(match.group(1)) * (float(node['scale']) / 100), + match.group(2)) + style = [] + for att_name in 'width', 'height': + if atts.has_key(att_name): + if re.match(r'^[0-9.]+$', atts[att_name]): + # Interpret unitless values as pixels. + atts[att_name] += 'px' + style.append('%s: %s;' % (att_name, atts[att_name])) + del atts[att_name] + if style: + atts['style'] = ' '.join(style) + atts['alt'] = node.get('alt', atts['src']) + if (isinstance(node.parent, nodes.TextElement) or + (isinstance(node.parent, nodes.reference) and + not isinstance(node.parent.parent, nodes.TextElement))): + # Inline context or surrounded by .... + suffix = '' + else: + suffix = '\n' + if node.has_key('align'): + if node['align'] == 'center': + # "align" attribute is set in surrounding "div" element. + self.body.append('
    ') + self.context.append('
    \n') + suffix = '' + else: + # "align" attribute is set in "img" element. + atts['align'] = node['align'] + self.context.append('') + atts['class'] = 'align-%s' % node['align'] + else: + self.context.append('') + self.body.append(self.emptytag(node, 'img', suffix, **atts)) + + def depart_image(self, node): + self.body.append(self.context.pop()) + + def visit_inline(self, node): + self.body.append(self.starttag(node, 'span', '')) + + def depart_inline(self, node): + self.body.append('
    ') + + def visit_label(self, node): + # Context added in footnote_backrefs. + self.body.append(self.starttag(node, 'td', '%s[' % self.context.pop(), + CLASS='label')) + + def depart_label(self, node): + # Context added in footnote_backrefs. + self.body.append(']%s%s' % (self.context.pop(), self.context.pop())) + + def visit_legend(self, node): + self.body.append(self.starttag(node, 'div', CLASS='legend')) + + def depart_legend(self, node): + self.body.append('\n') + + def visit_line(self, node): + self.body.append(self.starttag(node, 'div', suffix='', CLASS='line')) + if not len(node): + self.body.append('
    ') + + def depart_line(self, node): + self.body.append('\n') + + def visit_line_block(self, node): + self.body.append(self.starttag(node, 'div', CLASS='line-block')) + + def depart_line_block(self, node): + self.body.append('\n') + + def visit_list_item(self, node): + self.body.append(self.starttag(node, 'li', '')) + if len(node): + node[0]['classes'].append('first') + + def depart_list_item(self, node): + self.body.append('\n') + + def visit_literal(self, node): + """Process text to prevent tokens from wrapping.""" + self.body.append( + self.starttag(node, 'tt', '', CLASS='docutils literal')) + text = node.astext() + for token in self.words_and_spaces.findall(text): + if token.strip(): + # Protect text like "--an-option" from bad line wrapping: + self.body.append('%s' + % self.encode(token)) + elif token in ('\n', ' '): + # Allow breaks at whitespace: + self.body.append(token) + else: + # Protect runs of multiple spaces; the last space can wrap: + self.body.append(' ' * (len(token) - 1) + ' ') + self.body.append('') + # Content already processed: + raise nodes.SkipNode + + def visit_literal_block(self, node): + self.body.append(self.starttag(node, 'pre', CLASS='literal-block')) + + def depart_literal_block(self, node): + self.body.append('\n\n') + + def visit_meta(self, node): + meta = self.emptytag(node, 'meta', **node.non_default_attributes()) + self.add_meta(meta) + + def depart_meta(self, node): + pass + + def add_meta(self, tag): + self.meta.append(tag) + self.head.append(tag) + + def visit_option(self, node): + if self.context[-1]: + self.body.append(', ') + self.body.append(self.starttag(node, 'span', '', CLASS='option')) + + def depart_option(self, node): + self.body.append('
    ') + self.context[-1] += 1 + + def visit_option_argument(self, node): + self.body.append(node.get('delimiter', ' ')) + self.body.append(self.starttag(node, 'var', '')) + + def depart_option_argument(self, node): + self.body.append('') + + def visit_option_group(self, node): + atts = {} + if ( self.settings.option_limit + and len(node.astext()) > self.settings.option_limit): + atts['colspan'] = 2 + self.context.append('\n ') + else: + self.context.append('') + self.body.append( + self.starttag(node, 'td', CLASS='option-group', **atts)) + self.body.append('') + self.context.append(0) # count number of options + + def depart_option_group(self, node): + self.context.pop() + self.body.append('\n') + self.body.append(self.context.pop()) + + def visit_option_list(self, node): + self.body.append( + self.starttag(node, 'table', CLASS='docutils option-list', + frame="void", rules="none")) + self.body.append('\n' + '\n' + '\n') + + def depart_option_list(self, node): + self.body.append('\n\n') + + def visit_option_list_item(self, node): + self.body.append(self.starttag(node, 'tr', '')) + + def depart_option_list_item(self, node): + self.body.append('\n') + + def visit_option_string(self, node): + pass + + def depart_option_string(self, node): + pass + + def visit_organization(self, node): + self.visit_docinfo_item(node, 'organization') + + def depart_organization(self, node): + self.depart_docinfo_item() + + def should_be_compact_paragraph(self, node): + """ + Determine if the

    tags around paragraph ``node`` can be omitted. + """ + if (isinstance(node.parent, nodes.document) or + isinstance(node.parent, nodes.compound)): + # Never compact paragraphs in document or compound. + return 0 + for key, value in node.attlist(): + if (node.is_not_default(key) and + not (key == 'classes' and value in + ([], ['first'], ['last'], ['first', 'last']))): + # Attribute which needs to survive. + return 0 + first = isinstance(node.parent[0], nodes.label) # skip label + for child in node.parent.children[first:]: + # only first paragraph can be compact + if isinstance(child, nodes.Invisible): + continue + if child is node: + break + return 0 + parent_length = len([n for n in node.parent if not isinstance( + n, (nodes.Invisible, nodes.label))]) + if ( self.compact_simple + or self.compact_field_list + or self.compact_p and parent_length == 1): + return 1 + return 0 + + def visit_paragraph(self, node): + if self.should_be_compact_paragraph(node): + self.context.append('') + else: + self.body.append(self.starttag(node, 'p', '')) + self.context.append('

    \n') + + def depart_paragraph(self, node): + self.body.append(self.context.pop()) + + def visit_problematic(self, node): + if node.hasattr('refid'): + self.body.append('' % node['refid']) + self.context.append('') + else: + self.context.append('') + self.body.append(self.starttag(node, 'span', '', CLASS='problematic')) + + def depart_problematic(self, node): + self.body.append('
    ') + self.body.append(self.context.pop()) + + def visit_raw(self, node): + if 'html' in node.get('format', '').split(): + t = isinstance(node.parent, nodes.TextElement) and 'span' or 'div' + if node['classes']: + self.body.append(self.starttag(node, t, suffix='')) + self.body.append(node.astext()) + if node['classes']: + self.body.append('' % t) + # Keep non-HTML raw text out of output: + raise nodes.SkipNode + + def visit_reference(self, node): + atts = {'class': 'reference'} + if node.has_key('refuri'): + atts['href'] = node['refuri'] + if ( self.settings.cloak_email_addresses + and atts['href'].startswith('mailto:')): + atts['href'] = self.cloak_mailto(atts['href']) + self.in_mailto = 1 + atts['class'] += ' external' + else: + assert node.has_key('refid'), \ + 'References must have "refuri" or "refid" attribute.' + atts['href'] = '#' + node['refid'] + atts['class'] += ' internal' + if not isinstance(node.parent, nodes.TextElement): + assert len(node) == 1 and isinstance(node[0], nodes.image) + atts['class'] += ' image-reference' + self.body.append(self.starttag(node, 'a', '', **atts)) + + def depart_reference(self, node): + self.body.append('') + if not isinstance(node.parent, nodes.TextElement): + self.body.append('\n') + self.in_mailto = 0 + + def visit_revision(self, node): + self.visit_docinfo_item(node, 'revision', meta=None) + + def depart_revision(self, node): + self.depart_docinfo_item() + + def visit_row(self, node): + self.body.append(self.starttag(node, 'tr', '')) + node.column = 0 + + def depart_row(self, node): + self.body.append('\n') + + def visit_rubric(self, node): + self.body.append(self.starttag(node, 'p', '', CLASS='rubric')) + + def depart_rubric(self, node): + self.body.append('

    \n') + + def visit_section(self, node): + self.section_level += 1 + self.body.append( + self.starttag(node, 'div', CLASS='section')) + + def depart_section(self, node): + self.section_level -= 1 + self.body.append('\n') + + def visit_sidebar(self, node): + self.body.append( + self.starttag(node, 'div', CLASS='sidebar')) + self.set_first_last(node) + self.in_sidebar = 1 + + def depart_sidebar(self, node): + self.body.append('\n') + self.in_sidebar = None + + def visit_status(self, node): + self.visit_docinfo_item(node, 'status', meta=None) + + def depart_status(self, node): + self.depart_docinfo_item() + + def visit_strong(self, node): + self.body.append('') + + def depart_strong(self, node): + self.body.append('') + + def visit_subscript(self, node): + self.body.append(self.starttag(node, 'sub', '')) + + def depart_subscript(self, node): + self.body.append('') + + def visit_substitution_definition(self, node): + """Internal only.""" + raise nodes.SkipNode + + def visit_substitution_reference(self, node): + self.unimplemented_visit(node) + + def visit_subtitle(self, node): + if isinstance(node.parent, nodes.sidebar): + self.body.append(self.starttag(node, 'p', '', + CLASS='sidebar-subtitle')) + self.context.append('

    \n') + elif isinstance(node.parent, nodes.document): + self.body.append(self.starttag(node, 'h2', '', CLASS='subtitle')) + self.context.append('\n') + self.in_document_title = len(self.body) + elif isinstance(node.parent, nodes.section): + tag = 'h%s' % (self.section_level + self.initial_header_level - 1) + self.body.append( + self.starttag(node, tag, '', CLASS='section-subtitle') + + self.starttag({}, 'span', '', CLASS='section-subtitle')) + self.context.append('\n' % tag) + + def depart_subtitle(self, node): + self.body.append(self.context.pop()) + if self.in_document_title: + self.subtitle = self.body[self.in_document_title:-1] + self.in_document_title = 0 + self.body_pre_docinfo.extend(self.body) + self.html_subtitle.extend(self.body) + del self.body[:] + + def visit_superscript(self, node): + self.body.append(self.starttag(node, 'sup', '')) + + def depart_superscript(self, node): + self.body.append('') + + def visit_system_message(self, node): + self.body.append(self.starttag(node, 'div', CLASS='system-message')) + self.body.append('

    ') + backref_text = '' + if len(node['backrefs']): + backrefs = node['backrefs'] + if len(backrefs) == 1: + backref_text = ('; backlink' + % backrefs[0]) + else: + i = 1 + backlinks = [] + for backref in backrefs: + backlinks.append('%s' % (backref, i)) + i += 1 + backref_text = ('; backlinks: %s' + % ', '.join(backlinks)) + if node.hasattr('line'): + line = ', line %s' % node['line'] + else: + line = '' + self.body.append('System Message: %s/%s ' + '(%s%s)%s

    \n' + % (node['type'], node['level'], + self.encode(node['source']), line, backref_text)) + + def depart_system_message(self, node): + self.body.append('\n') + + def visit_table(self, node): + self.body.append( + self.starttag(node, 'table', CLASS='docutils', border="1")) + + def depart_table(self, node): + self.body.append('\n') + + def visit_target(self, node): + if not (node.has_key('refuri') or node.has_key('refid') + or node.has_key('refname')): + self.body.append(self.starttag(node, 'span', '', CLASS='target')) + self.context.append('') + else: + self.context.append('') + + def depart_target(self, node): + self.body.append(self.context.pop()) + + def visit_tbody(self, node): + self.write_colspecs() + self.body.append(self.context.pop()) # '\n' or '' + self.body.append(self.starttag(node, 'tbody', valign='top')) + + def depart_tbody(self, node): + self.body.append('\n') + + def visit_term(self, node): + self.body.append(self.starttag(node, 'dt', '')) + + def depart_term(self, node): + """ + Leave the end tag to `self.visit_definition()`, in case there's a + classifier. + """ + pass + + def visit_tgroup(self, node): + # Mozilla needs : + self.body.append(self.starttag(node, 'colgroup')) + # Appended by thead or tbody: + self.context.append('\n') + node.stubs = [] + + def depart_tgroup(self, node): + pass + + def visit_thead(self, node): + self.write_colspecs() + self.body.append(self.context.pop()) # '\n' + # There may or may not be a ; this is for to use: + self.context.append('') + self.body.append(self.starttag(node, 'thead', valign='bottom')) + + def depart_thead(self, node): + self.body.append('\n') + + def visit_title(self, node): + """Only 6 section levels are supported by HTML.""" + check_id = 0 + close_tag = '

    \n' + if isinstance(node.parent, nodes.topic): + self.body.append( + self.starttag(node, 'p', '', CLASS='topic-title first')) + elif isinstance(node.parent, nodes.sidebar): + self.body.append( + self.starttag(node, 'p', '', CLASS='sidebar-title')) + elif isinstance(node.parent, nodes.Admonition): + self.body.append( + self.starttag(node, 'p', '', CLASS='admonition-title')) + elif isinstance(node.parent, nodes.table): + self.body.append( + self.starttag(node, 'caption', '')) + close_tag = '\n' + elif isinstance(node.parent, nodes.document): + self.body.append(self.starttag(node, 'h1', '', CLASS='title')) + close_tag = '\n' + self.in_document_title = len(self.body) + else: + assert isinstance(node.parent, nodes.section) + h_level = self.section_level + self.initial_header_level - 1 + atts = {} + if (len(node.parent) >= 2 and + isinstance(node.parent[1], nodes.subtitle)): + atts['CLASS'] = 'with-subtitle' + self.body.append( + self.starttag(node, 'h%s' % h_level, '', **atts)) + atts = {} + if node.hasattr('refid'): + atts['class'] = 'toc-backref' + atts['href'] = '#' + node['refid'] + if atts: + self.body.append(self.starttag({}, 'a', '', **atts)) + close_tag = '\n' % (h_level) + else: + close_tag = '\n' % (h_level) + self.context.append(close_tag) + + def depart_title(self, node): + self.body.append(self.context.pop()) + if self.in_document_title: + self.title = self.body[self.in_document_title:-1] + self.in_document_title = 0 + self.body_pre_docinfo.extend(self.body) + self.html_title.extend(self.body) + del self.body[:] + + def visit_title_reference(self, node): + self.body.append(self.starttag(node, 'cite', '')) + + def depart_title_reference(self, node): + self.body.append('') + + def visit_topic(self, node): + self.body.append(self.starttag(node, 'div', CLASS='topic')) + self.topic_classes = node['classes'] + + def depart_topic(self, node): + self.body.append('\n') + self.topic_classes = [] + + def visit_transition(self, node): + self.body.append(self.emptytag(node, 'hr', CLASS='docutils')) + + def depart_transition(self, node): + pass + + def visit_version(self, node): + self.visit_docinfo_item(node, 'version', meta=None) + + def depart_version(self, node): + self.depart_docinfo_item() + + def unimplemented_visit(self, node): + raise NotImplementedError('visiting unimplemented node type: %s' + % node.__class__.__name__) + + +class SimpleListChecker(nodes.GenericNodeVisitor): + + """ + Raise `nodes.NodeFound` if non-simple list item is encountered. + + Here "simple" means a list item containing nothing other than a single + paragraph, a simple list, or a paragraph followed by a simple list. + """ + + def default_visit(self, node): + raise nodes.NodeFound + + def visit_bullet_list(self, node): + pass + + def visit_enumerated_list(self, node): + pass + + def visit_list_item(self, node): + children = [] + for child in node.children: + if not isinstance(child, nodes.Invisible): + children.append(child) + if (children and isinstance(children[0], nodes.paragraph) + and (isinstance(children[-1], nodes.bullet_list) + or isinstance(children[-1], nodes.enumerated_list))): + children.pop() + if len(children) <= 1: + return + else: + raise nodes.NodeFound + + def visit_paragraph(self, node): + raise nodes.SkipNode + + def invisible_visit(self, node): + """Invisible nodes should be ignored.""" + raise nodes.SkipNode + + visit_comment = invisible_visit + visit_substitution_definition = invisible_visit + visit_target = invisible_visit + visit_pending = invisible_visit diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/html4css1.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/html4css1.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,273 @@ +/* +:Author: David Goodger (goodger@python.org) +:Id: $Id: html4css1.css 5196 2007-06-03 20:25:28Z wiemann $ +:Copyright: This stylesheet has been placed in the public domain. + +Default cascading style sheet for the HTML output of Docutils. + +See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to +customize this style sheet. +*/ + +/* used to remove borders from tables and images */ +.borderless, table.borderless td, table.borderless th { + border: 0 } + +table.borderless td, table.borderless th { + /* Override padding for "table.docutils td" with "! important". + The right padding separates the table cells. */ + padding: 0 0.5em 0 0 ! important } + +.first { + /* Override more specific margin styles with "! important". */ + margin-top: 0 ! important } + +.last, .with-subtitle { + margin-bottom: 0 ! important } + +.hidden { + display: none } + +a.toc-backref { + text-decoration: none ; + color: black } + +blockquote.epigraph { + margin: 2em 5em ; } + +dl.docutils dd { + margin-bottom: 0.5em } + +/* Uncomment (and remove this text!) to get bold-faced definition list terms +dl.docutils dt { + font-weight: bold } +*/ + +div.abstract { + margin: 2em 5em } + +div.abstract p.topic-title { + font-weight: bold ; + text-align: center } + +div.admonition, div.attention, div.caution, div.danger, div.error, +div.hint, div.important, div.note, div.tip, div.warning { + margin: 2em ; + border: medium outset ; + padding: 1em } + +div.admonition p.admonition-title, div.hint p.admonition-title, +div.important p.admonition-title, div.note p.admonition-title, +div.tip p.admonition-title { + font-weight: bold ; + font-family: sans-serif } + +div.attention p.admonition-title, div.caution p.admonition-title, +div.danger p.admonition-title, div.error p.admonition-title, +div.warning p.admonition-title { + color: red ; + font-weight: bold ; + font-family: sans-serif } + +/* Uncomment (and remove this text!) to get reduced vertical space in + compound paragraphs. +div.compound .compound-first, div.compound .compound-middle { + margin-bottom: 0.5em } + +div.compound .compound-last, div.compound .compound-middle { + margin-top: 0.5em } +*/ + +div.dedication { + margin: 2em 5em ; + text-align: center ; + font-style: italic } + +div.dedication p.topic-title { + font-weight: bold ; + font-style: normal } + +div.figure { + margin-left: 2em ; + margin-right: 2em } + +div.footer, div.header { + clear: both; + font-size: smaller } + +div.line-block { + display: block ; + margin-top: 1em ; + margin-bottom: 1em } + +div.line-block div.line-block { + margin-top: 0 ; + margin-bottom: 0 ; + margin-left: 1.5em } + +div.sidebar { + margin: 0 0 0.5em 1em ; + border: medium outset ; + padding: 1em ; + background-color: #ffffee ; + width: 40% ; + float: right ; + clear: right } + +div.sidebar p.rubric { + font-family: sans-serif ; + font-size: medium } + +div.system-messages { + margin: 5em } + +div.system-messages h1 { + color: red } + +div.system-message { + border: medium outset ; + padding: 1em } + +div.system-message p.system-message-title { + color: red ; + font-weight: bold } + +div.topic { + margin: 2em } + +h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, +h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { + margin-top: 0.4em } + +h1.title { + text-align: center } + +h2.subtitle { + text-align: center } + +hr.docutils { + width: 75% } + +img.align-left { + clear: left } + +img.align-right { + clear: right } + +ol.simple, ul.simple { + margin-bottom: 1em } + +ol.arabic { + list-style: decimal } + +ol.loweralpha { + list-style: lower-alpha } + +ol.upperalpha { + list-style: upper-alpha } + +ol.lowerroman { + list-style: lower-roman } + +ol.upperroman { + list-style: upper-roman } + +p.attribution { + text-align: right ; + margin-left: 50% } + +p.caption { + font-style: italic } + +p.credits { + font-style: italic ; + font-size: smaller } + +p.label { + white-space: nowrap } + +p.rubric { + font-weight: bold ; + font-size: larger ; + color: maroon ; + text-align: center } + +p.sidebar-title { + font-family: sans-serif ; + font-weight: bold ; + font-size: larger } + +p.sidebar-subtitle { + font-family: sans-serif ; + font-weight: bold } + +p.topic-title { + font-weight: bold } + +pre.address { + margin-bottom: 0 ; + margin-top: 0 ; + font-family: serif ; + font-size: 100% } + +pre.literal-block, pre.doctest-block { + margin-left: 2em ; + margin-right: 2em } + +span.classifier { + font-family: sans-serif ; + font-style: oblique } + +span.classifier-delimiter { + font-family: sans-serif ; + font-weight: bold } + +span.interpreted { + font-family: sans-serif } + +span.option { + white-space: nowrap } + +span.pre { + white-space: pre } + +span.problematic { + color: red } + +span.section-subtitle { + /* font-size relative to parent (h1..h6 element) */ + font-size: 80% } + +table.citation { + border-left: solid 1px gray; + margin-left: 1px } + +table.docinfo { + margin: 2em 4em } + +table.docutils { + margin-top: 0.5em ; + margin-bottom: 0.5em } + +table.footnote { + border-left: solid 1px black; + margin-left: 1px } + +table.docutils td, table.docutils th, +table.docinfo td, table.docinfo th { + padding-left: 0.5em ; + padding-right: 0.5em ; + vertical-align: top } + +table.docutils th.field-name, table.docinfo th.docinfo-name { + font-weight: bold ; + text-align: left ; + white-space: nowrap ; + padding-left: 0 } + +h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, +h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { + font-size: 100% } + +ul.auto-toc { + list-style-type: none } diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/template.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/html4css1/template.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,8 @@ +%(head_prefix)s +%(head)s +%(stylesheet)s +%(body_prefix)s +%(body_pre_docinfo)s +%(docinfo)s +%(body)s +%(body_suffix)s diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/latex2e/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/latex2e/__init__.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,2177 @@ +# $Id: __init__.py 5333 2007-07-10 17:31:28Z grubert $ +# Author: Engelbert Gruber +# Copyright: This module has been placed in the public domain. + +""" +LaTeX2e document tree Writer. +""" + +__docformat__ = 'reStructuredText' + +# code contributions from several people included, thanks to all. +# some named: David Abrahams, Julien Letessier, Lele Gaifax, and others. +# +# convention deactivate code by two # e.g. ##. + +import sys +import time +import re +import string +from types import ListType +from docutils import frontend, nodes, languages, writers, utils +from docutils.writers.newlatex2e import unicode_map + +from docutils.transforms.references import DanglingReferencesVisitor + +class Writer(writers.Writer): + + supported = ('latex','latex2e') + """Formats this writer supports.""" + + settings_spec = ( + 'LaTeX-Specific Options', + 'The LaTeX "--output-encoding" default is "latin-1:strict".', + (('Specify documentclass. Default is "article".', + ['--documentclass'], + {'default': 'article', }), + ('Specify document options. Multiple options can be given, ' + 'separated by commas. Default is "10pt,a4paper".', + ['--documentoptions'], + {'default': '10pt,a4paper', }), + ('Use LaTeX footnotes. LaTeX supports only numbered footnotes (does it?). ' + 'Default: no, uses figures.', + ['--use-latex-footnotes'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Format for footnote references: one of "superscript" or ' + '"brackets". Default is "superscript".', + ['--footnote-references'], + {'choices': ['superscript', 'brackets'], 'default': 'superscript', + 'metavar': '', + 'overrides': 'trim_footnote_reference_space'}), + ('Use LaTeX citations. ' + 'Default: no, uses figures which might get mixed with images.', + ['--use-latex-citations'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Format for block quote attributions: one of "dash" (em-dash ' + 'prefix), "parentheses"/"parens", or "none". Default is "dash".', + ['--attribution'], + {'choices': ['dash', 'parentheses', 'parens', 'none'], + 'default': 'dash', 'metavar': ''}), + ('Specify a stylesheet file. The file will be "input" by latex in ' + 'the document header. Default is no stylesheet (""). ' + 'Overrides --stylesheet-path.', + ['--stylesheet'], + {'default': '', 'metavar': '', + 'overrides': 'stylesheet_path'}), + ('Specify a stylesheet file, relative to the current working ' + 'directory. Overrides --stylesheet.', + ['--stylesheet-path'], + {'metavar': '', 'overrides': 'stylesheet'}), + ('Table of contents by docutils (default) or LaTeX. LaTeX (writer) ' + 'supports only one ToC per document, but docutils does not know of ' + 'pagenumbers. LaTeX table of contents also means LaTeX generates ' + 'sectionnumbers.', + ['--use-latex-toc'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Add parts on top of the section hierarchy.', + ['--use-part-section'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Let LaTeX print author and date, do not show it in docutils ' + 'document info.', + ['--use-latex-docinfo'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Use LaTeX abstract environment for the documents abstract.' + 'Per default the abstract is an unnumbered section.', + ['--use-latex-abstract'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Color of any hyperlinks embedded in text ' + '(default: "blue", "0" to disable).', + ['--hyperlink-color'], {'default': 'blue'}), + ('Enable compound enumerators for nested enumerated lists ' + '(e.g. "1.2.a.ii"). Default: disabled.', + ['--compound-enumerators'], + {'default': None, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Disable compound enumerators for nested enumerated lists. This is ' + 'the default.', + ['--no-compound-enumerators'], + {'action': 'store_false', 'dest': 'compound_enumerators'}), + ('Enable section ("." subsection ...) prefixes for compound ' + 'enumerators. This has no effect without --compound-enumerators. ' + 'Default: disabled.', + ['--section-prefix-for-enumerators'], + {'default': None, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Disable section prefixes for compound enumerators. ' + 'This is the default.', + ['--no-section-prefix-for-enumerators'], + {'action': 'store_false', 'dest': 'section_prefix_for_enumerators'}), + ('Set the separator between section number and enumerator ' + 'for compound enumerated lists. Default is "-".', + ['--section-enumerator-separator'], + {'default': '-', 'metavar': ''}), + ('When possibile, use verbatim for literal-blocks. ' + 'Default is to always use the mbox environment.', + ['--use-verbatim-when-possible'], + {'default': 0, 'action': 'store_true', + 'validator': frontend.validate_boolean}), + ('Table style. "standard" with horizontal and vertical lines, ' + '"booktabs" (LaTeX booktabs style) only horizontal lines ' + 'above and below the table and below the header or "nolines". ' + 'Default: "standard"', + ['--table-style'], + {'choices': ['standard', 'booktabs','nolines'], 'default': 'standard', + 'metavar': ''}), + ('LaTeX graphicx package option. ' + 'Possible values are "dvips", "pdftex". "auto" includes LaTeX code ' + 'to use "pdftex" if processing with pdf(la)tex and dvips otherwise. ' + 'Default is no option.', + ['--graphicx-option'], + {'default': ''}), + ('LaTeX font encoding. ' + 'Possible values are "T1", "OT1", "" or some other fontenc option. ' + 'The font encoding influences available symbols, e.g. "<<" as one ' + 'character. Default is "" which leads to package "ae" (a T1 ' + 'emulation using CM fonts).', + ['--font-encoding'], + {'default': ''}), + ('Per default the latex-writer puts the reference title into ' + 'hyperreferences. Specify "ref*" or "pageref*" to get the section ' + 'number or the page number.', + ['--reference-label'], + {'default': None, }), + ('Specify style and database for bibtex, for example ' + '"--use-bibtex=mystyle,mydb1,mydb2".', + ['--use-bibtex'], + {'default': None, }), + ),) + + settings_defaults = {'output_encoding': 'latin-1'} + + relative_path_settings = ('stylesheet_path',) + + config_section = 'latex2e writer' + config_section_dependencies = ('writers',) + + visitor_attributes = ("head_prefix", "head", + "body_prefix", "body", "body_suffix") + + output = None + """Final translated form of `document`.""" + + def __init__(self): + writers.Writer.__init__(self) + self.translator_class = LaTeXTranslator + + def translate(self): + visitor = self.translator_class(self.document) + self.document.walkabout(visitor) + self.output = visitor.astext() + # copy parts + for attr in self.visitor_attributes: + setattr(self, attr, getattr(visitor, attr)) + + def assemble_parts(self): + writers.Writer.assemble_parts(self) + for part in self.visitor_attributes: + self.parts[part] = ''.join(getattr(self, part)) + + +""" +Notes on LaTeX +-------------- + +* LaTeX does not support multiple tocs in one document. + (might be no limitation except for docutils documentation) + + The "minitoc" latex package can produce per-chapter tocs in + book and report document classes. + +* width + + * linewidth - width of a line in the local environment + * textwidth - the width of text on the page + + Maybe always use linewidth ? + + *Bug* inside a minipage a (e.g. Sidebar) the linewidth is + not changed, needs fix in docutils so that tables + are not too wide. + + So we add locallinewidth set it initially and + on entering sidebar and reset on exit. +""" + +class Babel: + """Language specifics for LaTeX.""" + # country code by a.schlock. + # partly manually converted from iso and babel stuff, dialects and some + _ISO639_TO_BABEL = { + 'no': 'norsk', #XXX added by hand ( forget about nynorsk?) + 'gd': 'scottish', #XXX added by hand + 'hu': 'magyar', #XXX added by hand + 'pt': 'portuguese',#XXX added by hand + 'sl': 'slovenian', + 'af': 'afrikaans', + 'bg': 'bulgarian', + 'br': 'breton', + 'ca': 'catalan', + 'cs': 'czech', + 'cy': 'welsh', + 'da': 'danish', + 'fr': 'french', + # french, francais, canadien, acadian + 'de': 'ngerman', #XXX rather than german + # ngerman, naustrian, german, germanb, austrian + 'el': 'greek', + 'en': 'english', + # english, USenglish, american, UKenglish, british, canadian + 'eo': 'esperanto', + 'es': 'spanish', + 'et': 'estonian', + 'eu': 'basque', + 'fi': 'finnish', + 'ga': 'irish', + 'gl': 'galician', + 'he': 'hebrew', + 'hr': 'croatian', + 'hu': 'hungarian', + 'is': 'icelandic', + 'it': 'italian', + 'la': 'latin', + 'nl': 'dutch', + 'pl': 'polish', + 'pt': 'portuguese', + 'ro': 'romanian', + 'ru': 'russian', + 'sk': 'slovak', + 'sr': 'serbian', + 'sv': 'swedish', + 'tr': 'turkish', + 'uk': 'ukrainian' + } + + def __init__(self,lang): + self.language = lang + # pdflatex does not produce double quotes for ngerman in tt. + self.double_quote_replacment = None + if re.search('^de',self.language): + #self.quotes = ("\"`", "\"'") + self.quotes = ('{\\glqq}', '{\\grqq}') + self.double_quote_replacment = "{\\dq}" + elif re.search('^it',self.language): + self.quotes = ("``", "''") + self.double_quote_replacment = r'{\char`\"}' + else: + self.quotes = ("``", "''") + self.quote_index = 0 + + def next_quote(self): + q = self.quotes[self.quote_index] + self.quote_index = (self.quote_index+1)%2 + return q + + def quote_quotes(self,text): + t = None + for part in text.split('"'): + if t == None: + t = part + else: + t += self.next_quote() + part + return t + + def double_quotes_in_tt (self,text): + if not self.double_quote_replacment: + return text + return text.replace('"', self.double_quote_replacment) + + def get_language(self): + if self._ISO639_TO_BABEL.has_key(self.language): + return self._ISO639_TO_BABEL[self.language] + else: + # support dialects. + l = self.language.split("_")[0] + if self._ISO639_TO_BABEL.has_key(l): + return self._ISO639_TO_BABEL[l] + return None + + +latex_headings = { + 'optionlist_environment' : [ + '\\newcommand{\\optionlistlabel}[1]{\\bf #1 \\hfill}\n' + '\\newenvironment{optionlist}[1]\n' + '{\\begin{list}{}\n' + ' {\\setlength{\\labelwidth}{#1}\n' + ' \\setlength{\\rightmargin}{1cm}\n' + ' \\setlength{\\leftmargin}{\\rightmargin}\n' + ' \\addtolength{\\leftmargin}{\\labelwidth}\n' + ' \\addtolength{\\leftmargin}{\\labelsep}\n' + ' \\renewcommand{\\makelabel}{\\optionlistlabel}}\n' + '}{\\end{list}}\n', + ], + 'lineblock_environment' : [ + '\\newlength{\\lineblockindentation}\n' + '\\setlength{\\lineblockindentation}{2.5em}\n' + '\\newenvironment{lineblock}[1]\n' + '{\\begin{list}{}\n' + ' {\\setlength{\\partopsep}{\\parskip}\n' + ' \\addtolength{\\partopsep}{\\baselineskip}\n' + ' \\topsep0pt\\itemsep0.15\\baselineskip\\parsep0pt\n' + ' \\leftmargin#1}\n' + ' \\raggedright}\n' + '{\\end{list}}\n' + ], + 'footnote_floats' : [ + '% begin: floats for footnotes tweaking.\n', + '\\setlength{\\floatsep}{0.5em}\n', + '\\setlength{\\textfloatsep}{\\fill}\n', + '\\addtolength{\\textfloatsep}{3em}\n', + '\\renewcommand{\\textfraction}{0.5}\n', + '\\renewcommand{\\topfraction}{0.5}\n', + '\\renewcommand{\\bottomfraction}{0.5}\n', + '\\setcounter{totalnumber}{50}\n', + '\\setcounter{topnumber}{50}\n', + '\\setcounter{bottomnumber}{50}\n', + '% end floats for footnotes\n', + ], + 'some_commands' : [ + '% some commands, that could be overwritten in the style file.\n' + '\\newcommand{\\rubric}[1]' + '{\\subsection*{~\\hfill {\\it #1} \\hfill ~}}\n' + '\\newcommand{\\titlereference}[1]{\\textsl{#1}}\n' + '% end of "some commands"\n', + ] + } + +class DocumentClass: + """Details of a LaTeX document class.""" + + def __init__(self, document_class, with_part=False): + self.document_class = document_class + self._with_part = with_part + + def section(self, level): + """ Return the section name at the given level for the specific + document class. + + Level is 1,2,3..., as level 0 is the title.""" + + sections = [ 'section', 'subsection', 'subsubsection', + 'paragraph', 'subparagraph' ] + if self.document_class in ('book', 'report', 'scrreprt', 'scrbook'): + sections.insert(0, 'chapter') + if self._with_part: + sections.insert(0, 'part') + if level <= len(sections): + return sections[level-1] + else: + return sections[-1] + +class Table: + """ Manage a table while traversing. + Maybe change to a mixin defining the visit/departs, but then + class Table internal variables are in the Translator. + + Table style might be + + * standard: horizontal and vertical lines + * booktabs (requires booktabs latex package): only horizontal lines + * nolines, borderless : no lines + """ + def __init__(self,latex_type,table_style): + self._latex_type = latex_type + self._table_style = table_style + self._open = 0 + # miscellaneous attributes + self._attrs = {} + self._col_width = [] + self._rowspan = [] + self.stubs = [] + + def open(self): + self._open = 1 + self._col_specs = [] + self.caption = None + self._attrs = {} + self._in_head = 0 # maybe context with search + def close(self): + self._open = 0 + self._col_specs = None + self.caption = None + self._attrs = {} + self.stubs = [] + def is_open(self): + return self._open + + def set_table_style(self, table_style): + if not table_style in ('standard','booktabs','borderless','nolines'): + return + self._table_style = table_style + + def used_packages(self): + if self._table_style == 'booktabs': + return '\\usepackage{booktabs}\n' + return '' + def get_latex_type(self): + return self._latex_type + + def set(self,attr,value): + self._attrs[attr] = value + def get(self,attr): + if self._attrs.has_key(attr): + return self._attrs[attr] + return None + def get_vertical_bar(self): + if self._table_style == 'standard': + return '|' + return '' + # horizontal lines are drawn below a row, because we. + def get_opening(self): + if self._latex_type == 'longtable': + # otherwise longtable might move before paragraph and subparagraph + prefix = '\\leavevmode\n' + else: + prefix = '' + return '%s\\begin{%s}[c]' % (prefix, self._latex_type) + def get_closing(self): + line = "" + if self._table_style == 'booktabs': + line = '\\bottomrule\n' + elif self._table_style == 'standard': + lines = '\\hline\n' + return '%s\\end{%s}' % (line,self._latex_type) + + def visit_colspec(self, node): + self._col_specs.append(node) + # "stubs" list is an attribute of the tgroup element: + self.stubs.append(node.attributes.get('stub')) + + def get_colspecs(self): + """ + Return column specification for longtable. + + Assumes reST line length being 80 characters. + Table width is hairy. + + === === + ABC DEF + === === + + usually gets to narrow, therefore we add 1 (fiddlefactor). + """ + width = 80 + + total_width = 0.0 + # first see if we get too wide. + for node in self._col_specs: + colwidth = float(node['colwidth']+1) / width + total_width += colwidth + self._col_width = [] + self._rowspan = [] + # donot make it full linewidth + factor = 0.93 + if total_width > 1.0: + factor /= total_width + bar = self.get_vertical_bar() + latex_table_spec = "" + for node in self._col_specs: + colwidth = factor * float(node['colwidth']+1) / width + self._col_width.append(colwidth+0.005) + self._rowspan.append(0) + latex_table_spec += "%sp{%.3f\\locallinewidth}" % (bar,colwidth+0.005) + return latex_table_spec+bar + + def get_column_width(self): + """ return columnwidth for current cell (not multicell) + """ + return "%.2f\\locallinewidth" % self._col_width[self._cell_in_row-1] + + def visit_thead(self): + self._in_thead = 1 + if self._table_style == 'standard': + return ['\\hline\n'] + elif self._table_style == 'booktabs': + return ['\\toprule\n'] + return [] + def depart_thead(self): + a = [] + #if self._table_style == 'standard': + # a.append('\\hline\n') + if self._table_style == 'booktabs': + a.append('\\midrule\n') + if self._latex_type == 'longtable': + a.append('\\endhead\n') + # for longtable one could add firsthead, foot and lastfoot + self._in_thead = 0 + return a + def visit_row(self): + self._cell_in_row = 0 + def depart_row(self): + res = [' \\\\\n'] + self._cell_in_row = None # remove cell counter + for i in range(len(self._rowspan)): + if (self._rowspan[i]>0): + self._rowspan[i] -= 1 + + if self._table_style == 'standard': + rowspans = [] + for i in range(len(self._rowspan)): + if (self._rowspan[i]<=0): + rowspans.append(i+1) + if len(rowspans)==len(self._rowspan): + res.append('\\hline\n') + else: + cline = '' + rowspans.reverse() + # TODO merge clines + while 1: + try: + c_start = rowspans.pop() + except: + break + cline += '\\cline{%d-%d}\n' % (c_start,c_start) + res.append(cline) + return res + + def set_rowspan(self,cell,value): + try: + self._rowspan[cell] = value + except: + pass + def get_rowspan(self,cell): + try: + return self._rowspan[cell] + except: + return 0 + def get_entry_number(self): + return self._cell_in_row + def visit_entry(self): + self._cell_in_row += 1 + def is_stub_column(self): + if len(self.stubs) >= self._cell_in_row: + return self.stubs[self._cell_in_row-1] + return False + + +class LaTeXTranslator(nodes.NodeVisitor): + + # When options are given to the documentclass, latex will pass them + # to other packages, as done with babel. + # Dummy settings might be taken from document settings + + # Templates + # --------- + + latex_head = '\\documentclass[%s]{%s}\n' + linking = '\\usepackage[colorlinks=%s,linkcolor=%s,urlcolor=%s]{hyperref}\n' + stylesheet = '\\input{%s}\n' + # add a generated on day , machine by user using docutils version. + generator = '% generated by Docutils \n' + # Config setting defaults + # ----------------------- + + # use latex tableofcontents or let docutils do it. + use_latex_toc = 0 + + # TODO: use mixins for different implementations. + # list environment for docinfo. else tabularx + use_optionlist_for_docinfo = 0 # NOT YET IN USE + + # Use compound enumerations (1.A.1.) + compound_enumerators = 0 + + # If using compound enumerations, include section information. + section_prefix_for_enumerators = 0 + + # This is the character that separates the section ("." subsection ...) + # prefix from the regular list enumerator. + section_enumerator_separator = '-' + + # default link color + hyperlink_color = "blue" + + def __init__(self, document): + nodes.NodeVisitor.__init__(self, document) + self.settings = settings = document.settings + self.latex_encoding = self.to_latex_encoding(settings.output_encoding) + self.use_latex_toc = settings.use_latex_toc + self.use_latex_docinfo = settings.use_latex_docinfo + self.use_latex_footnotes = settings.use_latex_footnotes + self._use_latex_citations = settings.use_latex_citations + self._reference_label = settings.reference_label + self.hyperlink_color = settings.hyperlink_color + self.compound_enumerators = settings.compound_enumerators + self.font_encoding = settings.font_encoding + self.section_prefix_for_enumerators = ( + settings.section_prefix_for_enumerators) + self.section_enumerator_separator = ( + settings.section_enumerator_separator.replace('_', '\\_')) + if self.hyperlink_color == '0': + self.hyperlink_color = 'black' + self.colorlinks = 'false' + else: + self.colorlinks = 'true' + + if self.settings.use_bibtex: + self.bibtex = self.settings.use_bibtex.split(",",1) + # TODO avoid errors on not declared citations. + else: + self.bibtex = None + # language: labels, bibliographic_fields, and author_separators. + # to allow writing labes for specific languages. + self.language = languages.get_language(settings.language_code) + self.babel = Babel(settings.language_code) + self.author_separator = self.language.author_separators[0] + self.d_options = self.settings.documentoptions + if self.babel.get_language(): + self.d_options += ',%s' % self.babel.get_language() + + self.d_class = DocumentClass(settings.documentclass, + settings.use_part_section) + # object for a table while proccessing. + self.table_stack = [] + self.active_table = Table('longtable',settings.table_style) + + # HACK. Should have more sophisticated typearea handling. + if settings.documentclass.find('scr') == -1: + self.typearea = '\\usepackage[DIV12]{typearea}\n' + else: + if self.d_options.find('DIV') == -1 and self.d_options.find('BCOR') == -1: + self.typearea = '\\typearea{12}\n' + else: + self.typearea = '' + + if self.font_encoding == 'OT1': + fontenc_header = '' + elif self.font_encoding == '': + fontenc_header = '\\usepackage{ae}\n\\usepackage{aeguill}\n' + else: + fontenc_header = '\\usepackage[%s]{fontenc}\n' % (self.font_encoding,) + if self.latex_encoding.startswith('utf8'): + input_encoding = '\\usepackage{ucs}\n\\usepackage[utf8x]{inputenc}\n' + else: + input_encoding = '\\usepackage[%s]{inputenc}\n' % self.latex_encoding + if self.settings.graphicx_option == '': + self.graphicx_package = '\\usepackage{graphicx}\n' + elif self.settings.graphicx_option.lower() == 'auto': + self.graphicx_package = '\n'.join( + ('%Check if we are compiling under latex or pdflatex', + '\\ifx\\pdftexversion\\undefined', + ' \\usepackage{graphicx}', + '\\else', + ' \\usepackage[pdftex]{graphicx}', + '\\fi\n')) + else: + self.graphicx_package = ( + '\\usepackage[%s]{graphicx}\n' % self.settings.graphicx_option) + + self.head_prefix = [ + self.latex_head % (self.d_options,self.settings.documentclass), + '\\usepackage{babel}\n', # language is in documents settings. + fontenc_header, + '\\usepackage{shortvrb}\n', # allows verb in footnotes. + input_encoding, + # * tabularx: for docinfo, automatic width of columns, always on one page. + '\\usepackage{tabularx}\n', + '\\usepackage{longtable}\n', + self.active_table.used_packages(), + # possible other packages. + # * fancyhdr + # * ltxtable is a combination of tabularx and longtable (pagebreaks). + # but ?? + # + # extra space between text in tables and the line above them + '\\setlength{\\extrarowheight}{2pt}\n', + '\\usepackage{amsmath}\n', # what fore amsmath. + self.graphicx_package, + '\\usepackage{color}\n', + '\\usepackage{multirow}\n', + '\\usepackage{ifthen}\n', # before hyperref! + self.linking % (self.colorlinks, self.hyperlink_color, self.hyperlink_color), + self.typearea, + self.generator, + # latex lengths + '\\newlength{\\admonitionwidth}\n', + '\\setlength{\\admonitionwidth}{0.9\\textwidth}\n' + # width for docinfo tablewidth + '\\newlength{\\docinfowidth}\n', + '\\setlength{\\docinfowidth}{0.9\\textwidth}\n' + # linewidth of current environment, so tables are not wider + # than the sidebar: using locallinewidth seems to defer evaluation + # of linewidth, this is fixing it. + '\\newlength{\\locallinewidth}\n', + # will be set later. + ] + self.head_prefix.extend( latex_headings['optionlist_environment'] ) + self.head_prefix.extend( latex_headings['lineblock_environment'] ) + self.head_prefix.extend( latex_headings['footnote_floats'] ) + self.head_prefix.extend( latex_headings['some_commands'] ) + ## stylesheet is last: so it might be possible to overwrite defaults. + stylesheet = utils.get_stylesheet_reference(settings) + if stylesheet: + settings.record_dependencies.add(stylesheet) + self.head_prefix.append(self.stylesheet % (stylesheet)) + + if self.linking: # and maybe check for pdf + self.pdfinfo = [ ] + self.pdfauthor = None + # pdftitle, pdfsubject, pdfauthor, pdfkeywords, + # pdfcreator, pdfproducer + else: + self.pdfinfo = None + # NOTE: Latex wants a date and an author, rst puts this into + # docinfo, so normally we do not want latex author/date handling. + # latex article has its own handling of date and author, deactivate. + # self.astext() adds \title{...} \author{...} \date{...}, even if the + # "..." are empty strings. + self.head = [ ] + # separate title, so we can appen subtitle. + self.title = '' + # if use_latex_docinfo: collects lists of author/organization/contact/address lines + self.author_stack = [] + self.date = '' + + self.body_prefix = ['\\raggedbottom\n'] + self.body = [] + self.body_suffix = ['\n'] + self.section_level = 0 + self.context = [] + self.topic_classes = [] + # column specification for tables + self.table_caption = None + + # Flags to encode + # --------------- + # verbatim: to tell encode not to encode. + self.verbatim = 0 + # insert_newline: to tell encode to replace blanks by "~". + self.insert_none_breaking_blanks = 0 + # insert_newline: to tell encode to add latex newline. + self.insert_newline = 0 + # mbox_newline: to tell encode to add mbox and newline. + self.mbox_newline = 0 + # inside citation reference labels underscores dont need to be escaped. + self.inside_citation_reference_label = 0 + + # Stack of section counters so that we don't have to use_latex_toc. + # This will grow and shrink as processing occurs. + # Initialized for potential first-level sections. + self._section_number = [0] + + # The current stack of enumerations so that we can expand + # them into a compound enumeration. + self._enumeration_counters = [] + + # The maximum number of enumeration counters we've used. + # If we go beyond this number, we need to create a new + # counter; otherwise, just reuse an old one. + self._max_enumeration_counters = 0 + + self._bibitems = [] + + # docinfo. + self.docinfo = None + # inside literal block: no quote mangling. + self.literal_block = 0 + self.literal_block_stack = [] + self.literal = 0 + # true when encoding in math mode + self.mathmode = 0 + + def to_latex_encoding(self,docutils_encoding): + """ + Translate docutils encoding name into latex's. + + Default fallback method is remove "-" and "_" chars from docutils_encoding. + + """ + tr = { "iso-8859-1": "latin1", # west european + "iso-8859-2": "latin2", # east european + "iso-8859-3": "latin3", # esperanto, maltese + "iso-8859-4": "latin4", # north european,scandinavian, baltic + "iso-8859-5": "iso88595", # cyrillic (ISO) + "iso-8859-9": "latin5", # turkish + "iso-8859-15": "latin9", # latin9, update to latin1. + "mac_cyrillic": "maccyr", # cyrillic (on Mac) + "windows-1251": "cp1251", # cyrillic (on Windows) + "koi8-r": "koi8-r", # cyrillic (Russian) + "koi8-u": "koi8-u", # cyrillic (Ukrainian) + "windows-1250": "cp1250", # + "windows-1252": "cp1252", # + "us-ascii": "ascii", # ASCII (US) + # unmatched encodings + #"": "applemac", + #"": "ansinew", # windows 3.1 ansi + #"": "ascii", # ASCII encoding for the range 32--127. + #"": "cp437", # dos latine us + #"": "cp850", # dos latin 1 + #"": "cp852", # dos latin 2 + #"": "decmulti", + #"": "latin10", + #"iso-8859-6": "" # arabic + #"iso-8859-7": "" # greek + #"iso-8859-8": "" # hebrew + #"iso-8859-10": "" # latin6, more complete iso-8859-4 + } + if tr.has_key(docutils_encoding.lower()): + return tr[docutils_encoding.lower()] + # convert: latin-1 and utf-8 and similar things + return docutils_encoding.replace("_", "").replace("-", "").lower() + + def language_label(self, docutil_label): + return self.language.labels[docutil_label] + + latex_equivalents = { + u'\u00A0' : '~', + u'\u2013' : '{--}', + u'\u2014' : '{---}', + u'\u2018' : '`', + u'\u2019' : '\'', + u'\u201A' : ',', + u'\u201C' : '``', + u'\u201D' : '\'\'', + u'\u201E' : ',,', + u'\u2020' : '{\\dag}', + u'\u2021' : '{\\ddag}', + u'\u2026' : '{\\dots}', + u'\u2122' : '{\\texttrademark}', + u'\u21d4' : '{$\\Leftrightarrow$}', + # greek alphabet ? + } + + def unicode_to_latex(self,text): + # see LaTeX codec + # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252124 + # Only some special chracters are translated, for documents with many + # utf-8 chars one should use the LaTeX unicode package. + for uchar in self.latex_equivalents.keys(): + text = text.replace(uchar,self.latex_equivalents[uchar]) + return text + + def ensure_math(self, text): + if not self.__dict__.has_key('ensure_math_re'): + chars = { + # lnot,pm,twosuperior,threesuperior,mu,onesuperior,times,div + 'latin1' : '\xac\xb1\xb2\xb3\xb5\xb9\xd7\xf7' , + # also latin5 and latin9 + } + self.ensure_math_re = re.compile('([%s])' % chars['latin1']) + text = self.ensure_math_re.sub(r'\\ensuremath{\1}', text) + return text + + def encode(self, text): + """ + Encode special characters (``# $ % & ~ _ ^ \ { }``) in `text` & return + """ + # Escaping with a backslash does not help with backslashes, ~ and ^. + + # < > are only available in math-mode or tt font. (really ?) + # $ starts math- mode. + # AND quotes + if self.verbatim: + return text + # compile the regexps once. do it here so one can see them. + # + # first the braces. + if not self.__dict__.has_key('encode_re_braces'): + self.encode_re_braces = re.compile(r'([{}])') + text = self.encode_re_braces.sub(r'{\\\1}',text) + if not self.__dict__.has_key('encode_re_bslash'): + # find backslash: except in the form '{\{}' or '{\}}'. + self.encode_re_bslash = re.compile(r'(?", '{\\textgreater}') + # then + text = text.replace("&", '{\\&}') + # the ^: + # * verb|^| does not work in mbox. + # * mathmode has wedge. hat{~} would also work. + # text = text.replace("^", '{\\ensuremath{^\\wedge}}') + text = text.replace("^", '{\\textasciicircum}') + text = text.replace("%", '{\\%}') + text = text.replace("#", '{\\#}') + text = text.replace("~", '{\\textasciitilde}') + # Separate compound characters, e.g. "--" to "-{}-". (The + # actual separation is done later; see below.) + separate_chars = '-' + if self.literal_block or self.literal: + # In monospace-font, we also separate ",,", "``" and "''" + # and some other characters which can't occur in + # non-literal text. + separate_chars += ',`\'"<>' + # pdflatex does not produce doublequotes for ngerman. + text = self.babel.double_quotes_in_tt(text) + if self.font_encoding == 'OT1': + # We're using OT1 font-encoding and have to replace + # underscore by underlined blank, because this has + # correct width. + text = text.replace('_', '{\\underline{ }}') + # And the tt-backslash doesn't work in OT1, so we use + # a mirrored slash. + text = text.replace('\\textbackslash', '\\reflectbox{/}') + else: + text = text.replace('_', '{\\_}') + else: + text = self.babel.quote_quotes(text) + if not self.inside_citation_reference_label: + text = text.replace("_", '{\\_}') + for char in separate_chars * 2: + # Do it twice ("* 2") becaues otherwise we would replace + # "---" by "-{}--". + text = text.replace(char + char, char + '{}' + char) + if self.insert_newline or self.literal_block: + # Insert a blank before the newline, to avoid + # ! LaTeX Error: There's no line here to end. + text = text.replace("\n", '~\\\\\n') + elif self.mbox_newline: + if self.literal_block: + closings = "}" * len(self.literal_block_stack) + openings = "".join(self.literal_block_stack) + else: + closings = "" + openings = "" + text = text.replace("\n", "%s}\\\\\n\\mbox{%s" % (closings,openings)) + text = text.replace('[', '{[}').replace(']', '{]}') + if self.insert_none_breaking_blanks: + text = text.replace(' ', '~') + if self.latex_encoding != 'utf8': + text = self.unicode_to_latex(text) + text = self.ensure_math(text) + return text + + def attval(self, text, + whitespace=re.compile('[\n\r\t\v\f]')): + """Cleanse, encode, and return attribute value text.""" + return self.encode(whitespace.sub(' ', text)) + + def astext(self): + if self.pdfinfo is not None and self.pdfauthor: + self.pdfinfo.append('pdfauthor={%s}' % self.pdfauthor) + if self.pdfinfo: + pdfinfo = '\\hypersetup{\n' + ',\n'.join(self.pdfinfo) + '\n}\n' + else: + pdfinfo = '' + head = '\\title{%s}\n\\author{%s}\n\\date{%s}\n' % \ + (self.title, + ' \\and\n'.join(['~\\\\\n'.join(author_lines) + for author_lines in self.author_stack]), + self.date) + return ''.join(self.head_prefix + [head] + self.head + [pdfinfo] + + self.body_prefix + self.body + self.body_suffix) + + def visit_Text(self, node): + self.body.append(self.encode(node.astext())) + + def depart_Text(self, node): + pass + + def visit_address(self, node): + self.visit_docinfo_item(node, 'address') + + def depart_address(self, node): + self.depart_docinfo_item(node) + + def visit_admonition(self, node, name=''): + self.body.append('\\begin{center}\\begin{sffamily}\n') + self.body.append('\\fbox{\\parbox{\\admonitionwidth}{\n') + if name: + self.body.append('\\textbf{\\large '+ self.language.labels[name] + '}\n'); + self.body.append('\\vspace{2mm}\n') + + + def depart_admonition(self, node=None): + self.body.append('}}\n') # end parbox fbox + self.body.append('\\end{sffamily}\n\\end{center}\n'); + + def visit_attention(self, node): + self.visit_admonition(node, 'attention') + + def depart_attention(self, node): + self.depart_admonition() + + def visit_author(self, node): + self.visit_docinfo_item(node, 'author') + + def depart_author(self, node): + self.depart_docinfo_item(node) + + def visit_authors(self, node): + # not used: visit_author is called anyway for each author. + pass + + def depart_authors(self, node): + pass + + def visit_block_quote(self, node): + self.body.append( '\\begin{quote}\n') + + def depart_block_quote(self, node): + self.body.append( '\\end{quote}\n') + + def visit_bullet_list(self, node): + if 'contents' in self.topic_classes: + if self.use_latex_toc: + raise nodes.SkipNode + self.body.append( '\\begin{list}{}{}\n' ) + else: + self.body.append( '\\begin{itemize}\n' ) + + def depart_bullet_list(self, node): + if 'contents' in self.topic_classes: + self.body.append( '\\end{list}\n' ) + else: + self.body.append( '\\end{itemize}\n' ) + + # Imperfect superscript/subscript handling: mathmode italicizes + # all letters by default. + def visit_superscript(self, node): + self.body.append('$^{') + self.mathmode = 1 + + def depart_superscript(self, node): + self.body.append('}$') + self.mathmode = 0 + + def visit_subscript(self, node): + self.body.append('$_{') + self.mathmode = 1 + + def depart_subscript(self, node): + self.body.append('}$') + self.mathmode = 0 + + def visit_caption(self, node): + self.body.append( '\\caption{' ) + + def depart_caption(self, node): + self.body.append('}') + + def visit_caution(self, node): + self.visit_admonition(node, 'caution') + + def depart_caution(self, node): + self.depart_admonition() + + def visit_title_reference(self, node): + self.body.append( '\\titlereference{' ) + + def depart_title_reference(self, node): + self.body.append( '}' ) + + def visit_citation(self, node): + # TODO maybe use cite bibitems + if self._use_latex_citations: + self.context.append(len(self.body)) + else: + self.body.append('\\begin{figure}[b]') + for id in node['ids']: + self.body.append('\\hypertarget{%s}' % id) + + def depart_citation(self, node): + if self._use_latex_citations: + size = self.context.pop() + label = self.body[size] + text = ''.join(self.body[size+1:]) + del self.body[size:] + self._bibitems.append([label, text]) + else: + self.body.append('\\end{figure}\n') + + def visit_citation_reference(self, node): + if self._use_latex_citations: + self.body.append('\\cite{') + self.inside_citation_reference_label = 1 + else: + href = '' + if node.has_key('refid'): + href = node['refid'] + elif node.has_key('refname'): + href = self.document.nameids[node['refname']] + self.body.append('[\\hyperlink{%s}{' % href) + + def depart_citation_reference(self, node): + if self._use_latex_citations: + self.body.append('}') + self.inside_citation_reference_label = 0 + else: + self.body.append('}]') + + def visit_classifier(self, node): + self.body.append( '(\\textbf{' ) + + def depart_classifier(self, node): + self.body.append( '})\n' ) + + def visit_colspec(self, node): + self.active_table.visit_colspec(node) + + def depart_colspec(self, node): + pass + + def visit_comment(self, node): + # Escape end of line by a new comment start in comment text. + self.body.append('%% %s \n' % node.astext().replace('\n', '\n% ')) + raise nodes.SkipNode + + def visit_compound(self, node): + pass + + def depart_compound(self, node): + pass + + def visit_contact(self, node): + self.visit_docinfo_item(node, 'contact') + + def depart_contact(self, node): + self.depart_docinfo_item(node) + + def visit_container(self, node): + pass + + def depart_container(self, node): + pass + + def visit_copyright(self, node): + self.visit_docinfo_item(node, 'copyright') + + def depart_copyright(self, node): + self.depart_docinfo_item(node) + + def visit_danger(self, node): + self.visit_admonition(node, 'danger') + + def depart_danger(self, node): + self.depart_admonition() + + def visit_date(self, node): + self.visit_docinfo_item(node, 'date') + + def depart_date(self, node): + self.depart_docinfo_item(node) + + def visit_decoration(self, node): + pass + + def depart_decoration(self, node): + pass + + def visit_definition(self, node): + pass + + def depart_definition(self, node): + self.body.append('\n') + + def visit_definition_list(self, node): + self.body.append( '\\begin{description}\n' ) + + def depart_definition_list(self, node): + self.body.append( '\\end{description}\n' ) + + def visit_definition_list_item(self, node): + pass + + def depart_definition_list_item(self, node): + pass + + def visit_description(self, node): + self.body.append( ' ' ) + + def depart_description(self, node): + pass + + def visit_docinfo(self, node): + self.docinfo = [] + self.docinfo.append('%' + '_'*75 + '\n') + self.docinfo.append('\\begin{center}\n') + self.docinfo.append('\\begin{tabularx}{\\docinfowidth}{lX}\n') + + def depart_docinfo(self, node): + self.docinfo.append('\\end{tabularx}\n') + self.docinfo.append('\\end{center}\n') + self.body = self.docinfo + self.body + # clear docinfo, so field names are no longer appended. + self.docinfo = None + + def visit_docinfo_item(self, node, name): + if name == 'author': + if not self.pdfinfo == None: + if not self.pdfauthor: + self.pdfauthor = self.attval(node.astext()) + else: + self.pdfauthor += self.author_separator + self.attval(node.astext()) + if self.use_latex_docinfo: + if name in ('author', 'organization', 'contact', 'address'): + # We attach these to the last author. If any of them precedes + # the first author, put them in a separate "author" group (for + # no better semantics). + if name == 'author' or not self.author_stack: + self.author_stack.append([]) + if name == 'address': # newlines are meaningful + self.insert_newline = 1 + text = self.encode(node.astext()) + self.insert_newline = 0 + else: + text = self.attval(node.astext()) + self.author_stack[-1].append(text) + raise nodes.SkipNode + elif name == 'date': + self.date = self.attval(node.astext()) + raise nodes.SkipNode + self.docinfo.append('\\textbf{%s}: &\n\t' % self.language_label(name)) + if name == 'address': + self.insert_newline = 1 + self.docinfo.append('{\\raggedright\n') + self.context.append(' } \\\\\n') + else: + self.context.append(' \\\\\n') + self.context.append(self.docinfo) + self.context.append(len(self.body)) + + def depart_docinfo_item(self, node): + size = self.context.pop() + dest = self.context.pop() + tail = self.context.pop() + tail = self.body[size:] + [tail] + del self.body[size:] + dest.extend(tail) + # for address we did set insert_newline + self.insert_newline = 0 + + def visit_doctest_block(self, node): + self.body.append( '\\begin{verbatim}' ) + self.verbatim = 1 + + def depart_doctest_block(self, node): + self.body.append( '\\end{verbatim}\n' ) + self.verbatim = 0 + + def visit_document(self, node): + self.body_prefix.append('\\begin{document}\n') + # titled document? + if self.use_latex_docinfo or len(node) and isinstance(node[0], nodes.title): + self.body_prefix.append('\\maketitle\n') + # alternative use titlepage environment. + # \begin{titlepage} + # ... + self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n') + + def depart_document(self, node): + # TODO insertion point of bibliography should none automatic. + if self._use_latex_citations and len(self._bibitems)>0: + if not self.bibtex: + widest_label = "" + for bi in self._bibitems: + if len(widest_label) self._max_enumeration_counters: + self._max_enumeration_counters = len(self._enumeration_counters) + self.body.append('\\newcounter{%s}\n' % counter_name) + else: + self.body.append('\\setcounter{%s}{0}\n' % counter_name) + + self.body.append('\\begin{list}{%s\\%s{%s}%s}\n' % \ + (enum_prefix,enum_type,counter_name,enum_suffix)) + self.body.append('{\n') + self.body.append('\\usecounter{%s}\n' % counter_name) + # set start after usecounter, because it initializes to zero. + if node.has_key('start'): + self.body.append('\\addtocounter{%s}{%d}\n' \ + % (counter_name,node['start']-1)) + ## set rightmargin equal to leftmargin + self.body.append('\\setlength{\\rightmargin}{\\leftmargin}\n') + self.body.append('}\n') + + def depart_enumerated_list(self, node): + self.body.append('\\end{list}\n') + self._enumeration_counters.pop() + + def visit_error(self, node): + self.visit_admonition(node, 'error') + + def depart_error(self, node): + self.depart_admonition() + + def visit_field(self, node): + # real output is done in siblings: _argument, _body, _name + pass + + def depart_field(self, node): + self.body.append('\n') + ##self.body.append('%[depart_field]\n') + + def visit_field_argument(self, node): + self.body.append('%[visit_field_argument]\n') + + def depart_field_argument(self, node): + self.body.append('%[depart_field_argument]\n') + + def visit_field_body(self, node): + # BUG by attach as text we loose references. + if self.docinfo: + self.docinfo.append('%s \\\\\n' % self.encode(node.astext())) + raise nodes.SkipNode + # BUG: what happens if not docinfo + + def depart_field_body(self, node): + self.body.append( '\n' ) + + def visit_field_list(self, node): + if not self.docinfo: + self.body.append('\\begin{quote}\n') + self.body.append('\\begin{description}\n') + + def depart_field_list(self, node): + if not self.docinfo: + self.body.append('\\end{description}\n') + self.body.append('\\end{quote}\n') + + def visit_field_name(self, node): + # BUG this duplicates docinfo_item + if self.docinfo: + self.docinfo.append('\\textbf{%s}: &\n\t' % self.encode(node.astext())) + raise nodes.SkipNode + else: + self.body.append('\\item [') + + def depart_field_name(self, node): + if not self.docinfo: + self.body.append(':]') + + def visit_figure(self, node): + if (not node.attributes.has_key('align') or + node.attributes['align'] == 'center'): + # centering does not add vertical space like center. + align = '\n\\centering' + align_end = '' + else: + # TODO non vertical space for other alignments. + align = '\\begin{flush%s}' % node.attributes['align'] + align_end = '\\end{flush%s}' % node.attributes['align'] + self.body.append( '\\begin{figure}[htbp]%s\n' % align ) + self.context.append( '%s\\end{figure}\n' % align_end ) + + def depart_figure(self, node): + self.body.append( self.context.pop() ) + + def visit_footer(self, node): + self.context.append(len(self.body)) + + def depart_footer(self, node): + start = self.context.pop() + footer = (['\n\\begin{center}\small\n'] + + self.body[start:] + ['\n\\end{center}\n']) + self.body_suffix[:0] = footer + del self.body[start:] + + def visit_footnote(self, node): + if self.use_latex_footnotes: + num,text = node.astext().split(None,1) + num = self.encode(num.strip()) + self.body.append('\\footnotetext['+num+']') + self.body.append('{') + else: + self.body.append('\\begin{figure}[b]') + for id in node['ids']: + self.body.append('\\hypertarget{%s}' % id) + + def depart_footnote(self, node): + if self.use_latex_footnotes: + self.body.append('}\n') + else: + self.body.append('\\end{figure}\n') + + def visit_footnote_reference(self, node): + if self.use_latex_footnotes: + self.body.append("\\footnotemark["+self.encode(node.astext())+"]") + raise nodes.SkipNode + href = '' + if node.has_key('refid'): + href = node['refid'] + elif node.has_key('refname'): + href = self.document.nameids[node['refname']] + format = self.settings.footnote_references + if format == 'brackets': + suffix = '[' + self.context.append(']') + elif format == 'superscript': + suffix = '\\raisebox{.5em}[0em]{\\scriptsize' + self.context.append('}') + else: # shouldn't happen + raise AssertionError('Illegal footnote reference format.') + self.body.append('%s\\hyperlink{%s}{' % (suffix,href)) + + def depart_footnote_reference(self, node): + if self.use_latex_footnotes: + return + self.body.append('}%s' % self.context.pop()) + + # footnote/citation label + def label_delim(self, node, bracket, superscript): + if isinstance(node.parent, nodes.footnote): + if self.use_latex_footnotes: + raise nodes.SkipNode + if self.settings.footnote_references == 'brackets': + self.body.append(bracket) + else: + self.body.append(superscript) + else: + assert isinstance(node.parent, nodes.citation) + if not self._use_latex_citations: + self.body.append(bracket) + + def visit_label(self, node): + self.label_delim(node, '[', '$^{') + + def depart_label(self, node): + self.label_delim(node, ']', '}$') + + # elements generated by the framework e.g. section numbers. + def visit_generated(self, node): + pass + + def depart_generated(self, node): + pass + + def visit_header(self, node): + self.context.append(len(self.body)) + + def depart_header(self, node): + start = self.context.pop() + self.body_prefix.append('\n\\verb|begin_header|\n') + self.body_prefix.extend(self.body[start:]) + self.body_prefix.append('\n\\verb|end_header|\n') + del self.body[start:] + + def visit_hint(self, node): + self.visit_admonition(node, 'hint') + + def depart_hint(self, node): + self.depart_admonition() + + def latex_image_length(self, width_str): + match = re.match('(\d*\.?\d*)\s*(\S*)', width_str) + if not match: + # fallback + return width_str + res = width_str + amount, unit = match.groups()[:2] + if unit == "px": + # LaTeX does not know pixels but points + res = "%spt" % amount + elif unit == "%": + res = "%.3f\\linewidth" % (float(amount)/100.0) + return res + + def visit_image(self, node): + attrs = node.attributes + # Add image URI to dependency list, assuming that it's + # referring to a local file. + self.settings.record_dependencies.add(attrs['uri']) + pre = [] # in reverse order + post = [] + include_graphics_options = [] + inline = isinstance(node.parent, nodes.TextElement) + if attrs.has_key('scale'): + # Could also be done with ``scale`` option to + # ``\includegraphics``; doing it this way for consistency. + pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,)) + post.append('}') + if attrs.has_key('width'): + include_graphics_options.append('width=%s' % ( + self.latex_image_length(attrs['width']), )) + if attrs.has_key('height'): + include_graphics_options.append('height=%s' % ( + self.latex_image_length(attrs['height']), )) + if attrs.has_key('align'): + align_prepost = { + # By default latex aligns the top of an image. + (1, 'top'): ('', ''), + (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'), + (1, 'bottom'): ('\\raisebox{-\\height}{', '}'), + (0, 'center'): ('{\\hfill', '\\hfill}'), + # These 2 don't exactly do the right thing. The image should + # be floated alongside the paragraph. See + # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG + (0, 'left'): ('{', '\\hfill}'), + (0, 'right'): ('{\\hfill', '}'),} + try: + pre.append(align_prepost[inline, attrs['align']][0]) + post.append(align_prepost[inline, attrs['align']][1]) + except KeyError: + pass # XXX complain here? + if not inline: + pre.append('\n') + post.append('\n') + pre.reverse() + self.body.extend( pre ) + options = '' + if len(include_graphics_options)>0: + options = '[%s]' % (','.join(include_graphics_options)) + self.body.append( '\\includegraphics%s{%s}' % ( + options, attrs['uri'] ) ) + self.body.extend( post ) + + def depart_image(self, node): + pass + + def visit_important(self, node): + self.visit_admonition(node, 'important') + + def depart_important(self, node): + self.depart_admonition() + + def visit_interpreted(self, node): + # @@@ Incomplete, pending a proper implementation on the + # Parser/Reader end. + self.visit_literal(node) + + def depart_interpreted(self, node): + self.depart_literal(node) + + def visit_legend(self, node): + self.body.append('{\\small ') + + def depart_legend(self, node): + self.body.append('}') + + def visit_line(self, node): + self.body.append('\item[] ') + + def depart_line(self, node): + self.body.append('\n') + + def visit_line_block(self, node): + if isinstance(node.parent, nodes.line_block): + self.body.append('\\item[] \n' + '\\begin{lineblock}{\\lineblockindentation}\n') + else: + self.body.append('\n\\begin{lineblock}{0em}\n') + + def depart_line_block(self, node): + self.body.append('\\end{lineblock}\n') + + def visit_list_item(self, node): + # Append "{}" in case the next character is "[", which would break + # LaTeX's list environment (no numbering and the "[" is not printed). + self.body.append('\\item {} ') + + def depart_list_item(self, node): + self.body.append('\n') + + def visit_literal(self, node): + self.literal = 1 + self.body.append('\\texttt{') + + def depart_literal(self, node): + self.body.append('}') + self.literal = 0 + + def visit_literal_block(self, node): + """ + Render a literal-block. + + Literal blocks are used for "::"-prefixed literal-indented + blocks of text, where the inline markup is not recognized, + but are also the product of the parsed-literal directive, + where the markup is respected. + """ + # In both cases, we want to use a typewriter/monospaced typeface. + # For "real" literal-blocks, we can use \verbatim, while for all + # the others we must use \mbox. + # + # We can distinguish between the two kinds by the number of + # siblings that compose this node: if it is composed by a + # single element, it's surely either a real one or a + # parsed-literal that does not contain any markup. + # + if not self.active_table.is_open(): + # no quote inside tables, to avoid vertical space between + # table border and literal block. + # BUG: fails if normal text preceeds the literal block. + self.body.append('\\begin{quote}') + self.context.append('\\end{quote}\n') + else: + self.body.append('\n') + self.context.append('\n') + if (self.settings.use_verbatim_when_possible and (len(node) == 1) + # in case of a parsed-literal containing just a "**bold**" word: + and isinstance(node[0], nodes.Text)): + self.verbatim = 1 + self.body.append('\\begin{verbatim}\n') + else: + self.literal_block = 1 + self.insert_none_breaking_blanks = 1 + self.body.append('{\\ttfamily \\raggedright \\noindent\n') + # * obey..: is from julien and never worked for me (grubert). + # self.body.append('{\\obeylines\\obeyspaces\\ttfamily\n') + + def depart_literal_block(self, node): + if self.verbatim: + self.body.append('\n\\end{verbatim}\n') + self.verbatim = 0 + else: + self.body.append('\n}') + self.insert_none_breaking_blanks = 0 + self.literal_block = 0 + # obey end: self.body.append('}\n') + self.body.append(self.context.pop()) + + def visit_meta(self, node): + self.body.append('[visit_meta]\n') + # BUG maybe set keywords for pdf + ##self.head.append(self.starttag(node, 'meta', **node.attributes)) + + def depart_meta(self, node): + self.body.append('[depart_meta]\n') + + def visit_note(self, node): + self.visit_admonition(node, 'note') + + def depart_note(self, node): + self.depart_admonition() + + def visit_option(self, node): + if self.context[-1]: + # this is not the first option + self.body.append(', ') + + def depart_option(self, node): + # flag tha the first option is done. + self.context[-1] += 1 + + def visit_option_argument(self, node): + """The delimiter betweeen an option and its argument.""" + self.body.append(node.get('delimiter', ' ')) + + def depart_option_argument(self, node): + pass + + def visit_option_group(self, node): + self.body.append('\\item [') + # flag for first option + self.context.append(0) + + def depart_option_group(self, node): + self.context.pop() # the flag + self.body.append('] ') + + def visit_option_list(self, node): + self.body.append('\\begin{optionlist}{3cm}\n') + + def depart_option_list(self, node): + self.body.append('\\end{optionlist}\n') + + def visit_option_list_item(self, node): + pass + + def depart_option_list_item(self, node): + pass + + def visit_option_string(self, node): + ##self.body.append(self.starttag(node, 'span', '', CLASS='option')) + pass + + def depart_option_string(self, node): + ##self.body.append('') + pass + + def visit_organization(self, node): + self.visit_docinfo_item(node, 'organization') + + def depart_organization(self, node): + self.depart_docinfo_item(node) + + def visit_paragraph(self, node): + index = node.parent.index(node) + if not ('contents' in self.topic_classes or + (isinstance(node.parent, nodes.compound) and + index > 0 and + not isinstance(node.parent[index - 1], nodes.paragraph) and + not isinstance(node.parent[index - 1], nodes.compound))): + self.body.append('\n') + + def depart_paragraph(self, node): + self.body.append('\n') + + def visit_problematic(self, node): + self.body.append('{\\color{red}\\bfseries{}') + + def depart_problematic(self, node): + self.body.append('}') + + def visit_raw(self, node): + if 'latex' in node.get('format', '').split(): + self.body.append(node.astext()) + raise nodes.SkipNode + + def visit_reference(self, node): + # BUG: hash_char "#" is trouble some in LaTeX. + # mbox and other environment do not like the '#'. + hash_char = '\\#' + if node.has_key('refuri'): + href = node['refuri'].replace('#',hash_char) + elif node.has_key('refid'): + href = hash_char + node['refid'] + elif node.has_key('refname'): + href = hash_char + self.document.nameids[node['refname']] + else: + raise AssertionError('Unknown reference.') + self.body.append('\\href{%s}{' % href) + if self._reference_label and not node.has_key('refuri'): + self.body.append('\\%s{%s}}' % (self._reference_label, + href.replace(hash_char, ''))) + raise nodes.SkipNode + + def depart_reference(self, node): + self.body.append('}') + + def visit_revision(self, node): + self.visit_docinfo_item(node, 'revision') + + def depart_revision(self, node): + self.depart_docinfo_item(node) + + def visit_section(self, node): + self.section_level += 1 + # Initialize counter for potential subsections: + self._section_number.append(0) + # Counter for this section's level (initialized by parent section): + self._section_number[self.section_level - 1] += 1 + + def depart_section(self, node): + # Remove counter for potential subsections: + self._section_number.pop() + self.section_level -= 1 + + def visit_sidebar(self, node): + # BUG: this is just a hack to make sidebars render something + self.body.append('\n\\setlength{\\locallinewidth}{0.9\\admonitionwidth}\n') + self.body.append('\\begin{center}\\begin{sffamily}\n') + self.body.append('\\fbox{\\colorbox[gray]{0.80}{\\parbox{\\admonitionwidth}{\n') + + def depart_sidebar(self, node): + self.body.append('}}}\n') # end parbox colorbox fbox + self.body.append('\\end{sffamily}\n\\end{center}\n'); + self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n') + + + attribution_formats = {'dash': ('---', ''), + 'parentheses': ('(', ')'), + 'parens': ('(', ')'), + 'none': ('', '')} + + def visit_attribution(self, node): + prefix, suffix = self.attribution_formats[self.settings.attribution] + self.body.append('\n\\begin{flushright}\n') + self.body.append(prefix) + self.context.append(suffix) + + def depart_attribution(self, node): + self.body.append(self.context.pop() + '\n') + self.body.append('\\end{flushright}\n') + + def visit_status(self, node): + self.visit_docinfo_item(node, 'status') + + def depart_status(self, node): + self.depart_docinfo_item(node) + + def visit_strong(self, node): + self.body.append('\\textbf{') + self.literal_block_stack.append('\\textbf{') + + def depart_strong(self, node): + self.body.append('}') + self.literal_block_stack.pop() + + def visit_substitution_definition(self, node): + raise nodes.SkipNode + + def visit_substitution_reference(self, node): + self.unimplemented_visit(node) + + def visit_subtitle(self, node): + if isinstance(node.parent, nodes.sidebar): + self.body.append('~\\\\\n\\textbf{') + self.context.append('}\n\\smallskip\n') + elif isinstance(node.parent, nodes.document): + self.title = self.title + \ + '\\\\\n\\large{%s}\n' % self.encode(node.astext()) + raise nodes.SkipNode + elif isinstance(node.parent, nodes.section): + self.body.append('\\textbf{') + self.context.append('}\\vspace{0.2cm}\n\n\\noindent ') + + def depart_subtitle(self, node): + self.body.append(self.context.pop()) + + def visit_system_message(self, node): + pass + + def depart_system_message(self, node): + self.body.append('\n') + + def visit_table(self, node): + if self.active_table.is_open(): + self.table_stack.append(self.active_table) + # nesting longtable does not work (e.g. 2007-04-18) + self.active_table = Table('tabular',self.settings.table_style) + self.active_table.open() + for cl in node['classes']: + self.active_table.set_table_style(cl) + self.body.append('\n' + self.active_table.get_opening()) + + def depart_table(self, node): + self.body.append(self.active_table.get_closing() + '\n') + self.active_table.close() + if len(self.table_stack)>0: + self.active_table = self.table_stack.pop() + else: + self.active_table.set_table_style(self.settings.table_style) + + def visit_target(self, node): + # BUG: why not (refuri or refid or refname) means not footnote ? + if not (node.has_key('refuri') or node.has_key('refid') + or node.has_key('refname')): + for id in node['ids']: + self.body.append('\\hypertarget{%s}{' % id) + self.context.append('}' * len(node['ids'])) + elif node.get("refid"): + self.body.append('\\hypertarget{%s}{' % node.get("refid")) + self.context.append('}') + else: + self.context.append('') + + def depart_target(self, node): + self.body.append(self.context.pop()) + + def visit_tbody(self, node): + # BUG write preamble if not yet done (colspecs not []) + # for tables without heads. + if not self.active_table.get('preamble written'): + self.visit_thead(None) + # self.depart_thead(None) + + def depart_tbody(self, node): + pass + + def visit_term(self, node): + self.body.append('\\item[{') + + def depart_term(self, node): + # definition list term. + # \leavevmode results in a line break if the term is followed by a item list. + self.body.append('}] \leavevmode ') + + def visit_tgroup(self, node): + #self.body.append(self.starttag(node, 'colgroup')) + #self.context.append('\n') + pass + + def depart_tgroup(self, node): + pass + + def visit_thead(self, node): + self.body.append('{%s}\n' % self.active_table.get_colspecs()) + if self.active_table.caption: + self.body.append('\\caption{%s}\\\\\n' % self.active_table.caption) + self.active_table.set('preamble written',1) + # TODO longtable supports firsthead and lastfoot too. + self.body.extend(self.active_table.visit_thead()) + + def depart_thead(self, node): + # the table header written should be on every page + # => \endhead + self.body.extend(self.active_table.depart_thead()) + # and the firsthead => \endfirsthead + # BUG i want a "continued from previous page" on every not + # firsthead, but then we need the header twice. + # + # there is a \endfoot and \endlastfoot too. + # but we need the number of columns to + # self.body.append('\\multicolumn{%d}{c}{"..."}\n' % number_of_columns) + # self.body.append('\\hline\n\\endfoot\n') + # self.body.append('\\hline\n') + # self.body.append('\\endlastfoot\n') + + def visit_tip(self, node): + self.visit_admonition(node, 'tip') + + def depart_tip(self, node): + self.depart_admonition() + + def bookmark(self, node): + """Append latex href and pdfbookmarks for titles. + """ + if node.parent['ids']: + for id in node.parent['ids']: + self.body.append('\\hypertarget{%s}{}\n' % id) + if not self.use_latex_toc: + # BUG level depends on style. pdflatex allows level 0 to 3 + # ToC would be the only on level 0 so i choose to decrement the rest. + # "Table of contents" bookmark to see the ToC. To avoid this + # we set all zeroes to one. + l = self.section_level + if l>0: + l = l-1 + # pdftex does not like "_" subscripts in titles + text = self.encode(node.astext()) + for id in node.parent['ids']: + self.body.append('\\pdfbookmark[%d]{%s}{%s}\n' % \ + (l, text, id)) + + def visit_title(self, node): + """Section and other titles.""" + + if isinstance(node.parent, nodes.topic): + # the table of contents. + self.bookmark(node) + if ('contents' in self.topic_classes + and self.use_latex_toc): + self.body.append('\\renewcommand{\\contentsname}{') + self.context.append('}\n\\tableofcontents\n\n\\bigskip\n') + elif ('abstract' in self.topic_classes + and self.settings.use_latex_abstract): + raise nodes.SkipNode + else: # or section titles before the table of contents. + # BUG: latex chokes on center environment with + # "perhaps a missing item", therefore we use hfill. + self.body.append('\\subsubsection*{~\\hfill ') + # the closing brace for subsection. + self.context.append('\\hfill ~}\n') + # TODO: for admonition titles before the first section + # either specify every possible node or ... ? + elif isinstance(node.parent, nodes.sidebar) \ + or isinstance(node.parent, nodes.admonition): + self.body.append('\\textbf{\\large ') + self.context.append('}\n\\smallskip\n') + elif isinstance(node.parent, nodes.table): + # caption must be written after column spec + self.active_table.caption = self.encode(node.astext()) + raise nodes.SkipNode + elif self.section_level == 0: + # document title + self.title = self.encode(node.astext()) + if not self.pdfinfo == None: + self.pdfinfo.append( 'pdftitle={%s}' % self.encode(node.astext()) ) + raise nodes.SkipNode + else: + self.body.append('\n\n') + self.body.append('%' + '_' * 75) + self.body.append('\n\n') + self.bookmark(node) + + if self.use_latex_toc: + section_star = "" + else: + section_star = "*" + + section_name = self.d_class.section(self.section_level) + self.body.append('\\%s%s{' % (section_name, section_star)) + # MAYBE postfix paragraph and subparagraph with \leavemode to + # ensure floatables stay in the section and text starts on a new line. + self.context.append('}\n') + + def depart_title(self, node): + self.body.append(self.context.pop()) + for id in node.parent['ids']: + self.body.append('\\label{%s}\n' % id) + + def visit_topic(self, node): + self.topic_classes = node['classes'] + if ('abstract' in self.topic_classes + and self.settings.use_latex_abstract): + self.body.append('\\begin{abstract}\n') + + def depart_topic(self, node): + if ('abstract' in self.topic_classes + and self.settings.use_latex_abstract): + self.body.append('\\end{abstract}\n') + self.topic_classes = [] + if 'contents' in node['classes'] and self.use_latex_toc: + pass + else: + self.body.append('\n') + + def visit_inline(self, node): # titlereference + classes = node.get('classes', ['Unknown', ]) + for cls in classes: + self.body.append( '\\docutilsrole%s{' % cls) + self.context.append('}'*len(classes)) + + def depart_inline(self, node): + self.body.append(self.context.pop()) + + def visit_rubric(self, node): + self.body.append('\\rubric{') + self.context.append('}\n') + + def depart_rubric(self, node): + self.body.append(self.context.pop()) + + def visit_transition(self, node): + self.body.append('\n\n') + self.body.append('%' + '_' * 75) + self.body.append('\n\\hspace*{\\fill}\\hrulefill\\hspace*{\\fill}') + self.body.append('\n\n') + + def depart_transition(self, node): + pass + + def visit_version(self, node): + self.visit_docinfo_item(node, 'version') + + def depart_version(self, node): + self.depart_docinfo_item(node) + + def visit_warning(self, node): + self.visit_admonition(node, 'warning') + + def depart_warning(self, node): + self.depart_admonition() + + def unimplemented_visit(self, node): + raise NotImplementedError('visiting unimplemented node type: %s' + % node.__class__.__name__) + +# def unknown_visit(self, node): +# def default_visit(self, node): + +# vim: set ts=4 et ai : diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/latex2e/latex2e.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/latex2e/latex2e.tex Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,74 @@ +% latex include file for docutils latex writer +% -------------------------------------------- +% +% CVS: $Id: latex2e.tex 4163 2005-12-09 04:21:34Z goodger $ +% +% This is included at the end of the latex header in the generated file, +% to allow overwriting defaults, although this could get hairy. +% Generated files should process well standalone too, LaTeX might give a +% message about a missing file. + +% donot indent first line of paragraph. +\setlength{\parindent}{0pt} +\setlength{\parskip}{5pt plus 2pt minus 1pt} + +% sloppy +% ------ +% Less strict (opposite to default fussy) space size between words. Therefore +% less hyphenation. +\sloppy + +% fonts +% ----- +% times for pdf generation, gives smaller pdf files. +% +% But in standard postscript fonts: courier and times/helvetica do not fit. +% Maybe use pslatex. +\usepackage{times} + +% pagestyle +% --------- +% headings might put section titles in the page heading, but not if +% the table of contents is done by docutils. +% If pagestyle{headings} is used, \geometry{headheight=10pt,headsep=1pt} +% should be set too. +%\pagestyle{plain} +% +% or use fancyhdr (untested !) +%\usepackage{fancyhdr} +%\pagestyle{fancy} +%\addtolength{\headheight}{\\baselineskip} +%\renewcommand{\sectionmark}[1]{\markboth{#1}{}} +%\renewcommand{\subsectionmark}[1]{\markright{#1}} +%\fancyhf{} +%\fancyhead[LE,RO]{\\bfseries\\textsf{\Large\\thepage}} +%\fancyhead[LO]{\\textsf{\\footnotesize\\rightmark}} +%\fancyhead[RE]{\\textsc{\\textsf{\\footnotesize\leftmark}}} +%\\fancyfoot[LE,RO]{\\bfseries\\textsf{\scriptsize Docutils}} +%\fancyfoot[RE,LO]{\\textsf{\scriptsize\\today}} + +% geometry +% -------- +% = papersizes and margins +%\geometry{a4paper,twoside,tmargin=1.5cm, +% headheight=1cm,headsep=0.75cm} + +% Do section number display +% ------------------------- +%\makeatletter +%\def\@seccntformat#1{} +%\makeatother +% no numbers in toc +%\renewcommand{\numberline}[1]{} + + +% change maketitle +% ---------------- +%\renewcommand{\maketitle}{ +% \begin{titlepage} +% \begin{center} +% \textsf{TITLE \@title} \\ +% Date: \today +% \end{center} +% \end{titlepage} +%} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/__init__.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,825 @@ +# $Id: __init__.py 5174 2007-05-31 00:01:52Z wiemann $ +# Author: Lea Wiemann +# Copyright: This module has been placed in the public domain. + +""" +LaTeX2e document tree Writer. +""" + +# Thanks to Engelbert Gruber and various contributors for the original +# LaTeX writer, some code and many ideas of which have been used for +# this writer. + +__docformat__ = 'reStructuredText' + + +import re +import os.path +from types import ListType + +import docutils +from docutils import nodes, writers, utils +from docutils.writers.newlatex2e import unicode_map +from docutils.transforms import writer_aux + + +class Writer(writers.Writer): + + supported = ('newlatex', 'newlatex2e') + """Formats this writer supports.""" + + default_stylesheet = 'base.tex' + + default_stylesheet_path = utils.relative_path( + os.path.join(os.getcwd(), 'dummy'), + os.path.join(os.path.dirname(__file__), default_stylesheet)) + + settings_spec = ( + 'LaTeX-Specific Options', + 'Note that this LaTeX writer is still EXPERIMENTAL and not ' + 'feature-complete. ', + (('Specify a stylesheet file. The path is used verbatim to include ' + 'the file. Overrides --stylesheet-path.', + ['--stylesheet'], + {'default': '', 'metavar': '', + 'overrides': 'stylesheet_path'}), + ('Specify a stylesheet file, relative to the current working ' + 'directory. Overrides --stylesheet. Default: "%s"' + % default_stylesheet_path, + ['--stylesheet-path'], + {'metavar': '', 'overrides': 'stylesheet', + 'default': default_stylesheet_path}), + ('Specify a user stylesheet file. See --stylesheet.', + ['--user-stylesheet'], + {'default': '', 'metavar': '', + 'overrides': 'user_stylesheet_path'}), + ('Specify a user stylesheet file. See --stylesheet-path.', + ['--user-stylesheet-path'], + {'metavar': '', 'overrides': 'user_stylesheet'}) + ),) + + settings_defaults = { + # Many Unicode characters are provided by unicode_map.py, so + # we can default to latin-1. + 'output_encoding': 'latin-1', + 'output_encoding_error_handler': 'strict', + # Since we are using superscript footnotes, it is necessary to + # trim whitespace in front of footnote references. + 'trim_footnote_reference_space': 1, + # Currently unsupported: + 'docinfo_xform': 0, + # During development: + 'traceback': 1 + } + + relative_path_settings = ('stylesheet_path', 'user_stylesheet_path') + + config_section = 'newlatex2e writer' + config_section_dependencies = ('writers',) + + output = None + """Final translated form of `document`.""" + + def get_transforms(self): + return writers.Writer.get_transforms(self) + [ + writer_aux.Compound, writer_aux.Admonitions] + + def __init__(self): + writers.Writer.__init__(self) + self.translator_class = LaTeXTranslator + + def translate(self): + visitor = self.translator_class(self.document) + self.document.walkabout(visitor) + assert not visitor.context, 'context not empty: %s' % visitor.context + self.output = visitor.astext() + self.head = visitor.header + self.body = visitor.body + + +class LaTeXException(Exception): + """ + Exception base class to for exceptions which influence the + automatic generation of LaTeX code. + """ + + +class SkipAttrParentLaTeX(LaTeXException): + """ + Do not generate ``\DECattr`` and ``\renewcommand{\DEVparent}{...}`` for this + node. + + To be raised from ``before_...`` methods. + """ + + +class SkipParentLaTeX(LaTeXException): + """ + Do not generate ``\renewcommand{\DEVparent}{...}`` for this node. + + To be raised from ``before_...`` methods. + """ + + +class LaTeXTranslator(nodes.SparseNodeVisitor): + + # Country code by a.schlock. + # Partly manually converted from iso and babel stuff. + iso639_to_babel = { + 'no': 'norsk', # added by hand + 'gd': 'scottish', # added by hand + 'sl': 'slovenian', + 'af': 'afrikaans', + 'bg': 'bulgarian', + 'br': 'breton', + 'ca': 'catalan', + 'cs': 'czech', + 'cy': 'welsh', + 'da': 'danish', + 'fr': 'french', + # french, francais, canadien, acadian + 'de': 'ngerman', + # ngerman, naustrian, german, germanb, austrian + 'el': 'greek', + 'en': 'english', + # english, USenglish, american, UKenglish, british, canadian + 'eo': 'esperanto', + 'es': 'spanish', + 'et': 'estonian', + 'eu': 'basque', + 'fi': 'finnish', + 'ga': 'irish', + 'gl': 'galician', + 'he': 'hebrew', + 'hr': 'croatian', + 'hu': 'hungarian', + 'is': 'icelandic', + 'it': 'italian', + 'la': 'latin', + 'nl': 'dutch', + 'pl': 'polish', + 'pt': 'portuguese', + 'ro': 'romanian', + 'ru': 'russian', + 'sk': 'slovak', + 'sr': 'serbian', + 'sv': 'swedish', + 'tr': 'turkish', + 'uk': 'ukrainian' + } + + # Start with left double quote. + left_quote = 1 + + def __init__(self, document): + nodes.NodeVisitor.__init__(self, document) + self.settings = document.settings + self.header = [] + self.body = [] + self.context = [] + self.stylesheet_path = utils.get_stylesheet_reference( + self.settings, os.path.join(os.getcwd(), 'dummy')) + if self.stylesheet_path: + self.settings.record_dependencies.add(self.stylesheet_path) + # This ugly hack will be cleaned up when refactoring the + # stylesheet mess. + self.settings.stylesheet = self.settings.user_stylesheet + self.settings.stylesheet_path = self.settings.user_stylesheet_path + self.user_stylesheet_path = utils.get_stylesheet_reference( + self.settings, os.path.join(os.getcwd(), 'dummy')) + if self.user_stylesheet_path: + self.settings.record_dependencies.add(self.user_stylesheet_path) + self.write_header() + + def write_header(self): + a = self.header.append + a('%% Generated by Docutils %s .' + % docutils.__version__) + a('') + a('% Docutils settings:') + lang = self.settings.language_code or '' + a(r'\providecommand{\DEVlanguageiso}{%s}' % lang) + a(r'\providecommand{\DEVlanguagebabel}{%s}' % self.iso639_to_babel.get( + lang, self.iso639_to_babel.get(lang.split('_')[0], ''))) + a('') + if self.user_stylesheet_path: + a('% User stylesheet:') + a(r'\input{%s}' % self.user_stylesheet_path) + a('% Docutils stylesheet:') + a(r'\input{%s}' % self.stylesheet_path) + a('') + a('% Default definitions for Docutils nodes:') + for node_name in nodes.node_class_names: + a(r'\providecommand{\DN%s}[1]{#1}' % node_name.replace('_', '')) + a('') + a('% Auxiliary definitions:') + for attr in (r'\DEVparent \DEVattrlen \DEVtitleastext ' + r'\DEVsinglebackref \DEVmultiplebackrefs' + ).split(): + # Later set using \renewcommand. + a(r'\providecommand{%s}{DOCUTILSUNINITIALIZEDVARIABLE}' % attr) + for attr in (r'\DEVparagraphindented \DEVhassubtitle').split(): + # Initialize as boolean variables. + a(r'\providecommand{%s}{false}' % attr) + a('\n\n') + + unicode_map = unicode_map.unicode_map # comprehensive Unicode map + # Fix problems with unimap.py. + unicode_map.update({ + # We have AE or T1 encoding, so "``" etc. work. The macros + # from unimap.py may *not* work. + u'\u201C': '{``}', + u'\u201D': "{''}", + u'\u201E': '{,,}', + }) + + character_map = { + '\\': r'{\textbackslash}', + '{': r'{\{}', + '}': r'{\}}', + '$': r'{\$}', + '&': r'{\&}', + '%': r'{\%}', + '#': r'{\#}', + '[': r'{[}', + ']': r'{]}', + '-': r'{-}', + '`': r'{`}', + "'": r"{'}", + ',': r'{,}', + '"': r'{"}', + '|': r'{\textbar}', + '<': r'{\textless}', + '>': r'{\textgreater}', + '^': r'{\textasciicircum}', + '~': r'{\textasciitilde}', + '_': r'{\DECtextunderscore}', + } + character_map.update(unicode_map) + #character_map.update(special_map) + + # `att_map` is for encoding attributes. According to + # , + # the following characters are special: # $ % & ~ _ ^ \ { } + # These work without special treatment in macro parameters: + # $, &, ~, _, ^ + att_map = {'#': '\\#', + '%': '\\%', + # We cannot do anything about backslashes. + '\\': '', + '{': '\\{', + '}': '\\}', + # The quotation mark may be redefined by babel. + '"': '"{}', + } + att_map.update(unicode_map) + + def encode(self, text, attval=None): + """ + Encode special characters in ``text`` and return it. + + If attval is true, preserve as much as possible verbatim (used + in attribute value encoding). If attval is 'width' or + 'height', `text` is interpreted as a length value. + """ + if attval in ('width', 'height'): + match = re.match(r'([0-9.]+)(\S*)$', text) + assert match, '%s="%s" must be a length' % (attval, text) + value, unit = match.groups() + if unit == '%': + value = str(float(value) / 100) + unit = r'\DECrelativeunit' + elif unit in ('', 'px'): + # If \DECpixelunit is "pt", this gives the same notion + # of pixels as graphicx. This is a bit of a hack. + value = str(float(value) * 0.75) + unit = '\DECpixelunit' + return '%s%s' % (value, unit) + if attval: + get = self.att_map.get + else: + get = self.character_map.get + text = ''.join([get(c, c) for c in text]) + if (self.literal_block or self.inline_literal) and not attval: + # NB: We can have inline literals within literal blocks. + # Shrink '\r\n'. + text = text.replace('\r\n', '\n') + # Convert space. If "{ }~~~~~" is wrapped (at the + # brace-enclosed space "{ }"), the following non-breaking + # spaces ("~~~~") do *not* wind up at the beginning of the + # next line. Also note that no hyphenation is done if the + # breaking space ("{ }") comes *after* the non-breaking + # spaces. + if self.literal_block: + # Replace newlines with real newlines. + text = text.replace('\n', '\mbox{}\\\\{}') + replace_fn = self.encode_replace_for_literal_block_spaces + else: + replace_fn = self.encode_replace_for_inline_literal_spaces + text = re.sub(r'\s+', replace_fn, text) + # Protect hyphens; if we don't, line breaks will be + # possible at the hyphens and even the \textnhtt macro + # from the hyphenat package won't change that. + text = text.replace('-', r'\mbox{-}') + text = text.replace("'", r'{\DECtextliteralsinglequote}') + return text + else: + if not attval: + # Replace space with single protected space. + text = re.sub(r'\s+', '{ }', text) + # Replace double quotes with macro calls. + L = [] + for part in text.split(self.character_map['"']): + if L: + # Insert quote. + L.append(self.left_quote and r'{\DECtextleftdblquote}' + or r'{\DECtextrightdblquote}') + self.left_quote = not self.left_quote + L.append(part) + return ''.join(L) + else: + return text + + def encode_replace_for_literal_block_spaces(self, match): + return '~' * len(match.group()) + + def encode_replace_for_inline_literal_spaces(self, match): + return '{ }' + '~' * (len(match.group()) - 1) + + def astext(self): + return '\n'.join(self.header) + (''.join(self.body)) + + def append(self, text, newline='%\n'): + """ + Append text, stripping newlines, producing nice LaTeX code. + """ + lines = [' ' * self.indentation_level + line + newline + for line in text.splitlines(0)] + self.body.append(''.join(lines)) + + def visit_Text(self, node): + self.append(self.encode(node.astext())) + + def depart_Text(self, node): + pass + + def is_indented(self, paragraph): + """Return true if `paragraph` should be first-line-indented.""" + assert isinstance(paragraph, nodes.paragraph) + siblings = [n for n in paragraph.parent if + self.is_visible(n) and not isinstance(n, nodes.Titular)] + index = siblings.index(paragraph) + if ('continued' in paragraph['classes'] or + index > 0 and isinstance(siblings[index-1], nodes.transition)): + return 0 + # Indent all but the first paragraphs. + return index > 0 + + def before_paragraph(self, node): + self.append(r'\renewcommand{\DEVparagraphindented}{%s}' + % (self.is_indented(node) and 'true' or 'false')) + + def before_title(self, node): + self.append(r'\renewcommand{\DEVtitleastext}{%s}' + % self.encode(node.astext())) + self.append(r'\renewcommand{\DEVhassubtitle}{%s}' + % ((len(node.parent) > 2 and + isinstance(node.parent[1], nodes.subtitle)) + and 'true' or 'false')) + + def before_generated(self, node): + if 'sectnum' in node['classes']: + node[0] = node[0].strip() + + literal_block = 0 + + def visit_literal_block(self, node): + self.literal_block = 1 + + def depart_literal_block(self, node): + self.literal_block = 0 + + visit_doctest_block = visit_literal_block + depart_doctest_block = depart_literal_block + + inline_literal = 0 + + def visit_literal(self, node): + self.inline_literal += 1 + + def depart_literal(self, node): + self.inline_literal -= 1 + + def _make_encodable(self, text): + """ + Return text (a unicode object) with all unencodable characters + replaced with '?'. + + Thus, the returned unicode string is guaranteed to be encodable. + """ + encoding = self.settings.output_encoding + return text.encode(encoding, 'replace').decode(encoding) + + def visit_comment(self, node): + """ + Insert the comment unchanged into the document, replacing + unencodable characters with '?'. + + (This is done in order not to fail if comments contain unencodable + characters, because our default encoding is not UTF-8.) + """ + self.append('\n'.join(['% ' + self._make_encodable(line) for line + in node.astext().splitlines(0)]), newline='\n') + raise nodes.SkipChildren + + def before_topic(self, node): + if 'contents' in node['classes']: + for bullet_list in list(node.traverse(nodes.bullet_list)): + p = bullet_list.parent + if isinstance(p, nodes.list_item): + p.parent.insert(p.parent.index(p) + 1, bullet_list) + del p[1] + for paragraph in node.traverse(nodes.paragraph): + paragraph.attributes.update(paragraph[0].attributes) + paragraph[:] = paragraph[0] + paragraph.parent['tocrefid'] = paragraph['refid'] + node['contents'] = 1 + else: + node['contents'] = 0 + + bullet_list_level = 0 + + def visit_bullet_list(self, node): + self.append(r'\DECsetbullet{\labelitem%s}' % + ['i', 'ii', 'iii', 'iv'][min(self.bullet_list_level, 3)]) + self.bullet_list_level += 1 + + def depart_bullet_list(self, node): + self.bullet_list_level -= 1 + + enum_styles = {'arabic': 'arabic', 'loweralpha': 'alph', 'upperalpha': + 'Alph', 'lowerroman': 'roman', 'upperroman': 'Roman'} + + enum_counter = 0 + + def visit_enumerated_list(self, node): + # We create our own enumeration list environment. This allows + # to set the style and starting value and unlimited nesting. + # Maybe the actual creation (\DEC) can be moved to the + # stylesheet? + self.enum_counter += 1 + enum_prefix = self.encode(node['prefix']) + enum_suffix = self.encode(node['suffix']) + enum_type = '\\' + self.enum_styles.get(node['enumtype'], r'arabic') + start = node.get('start', 1) - 1 + counter = 'Denumcounter%d' % self.enum_counter + self.append(r'\DECmakeenumeratedlist{%s}{%s}{%s}{%s}{%s}{' + % (enum_prefix, enum_type, enum_suffix, counter, start)) + # for Emacs: } + + def depart_enumerated_list(self, node): + self.append('}') # for Emacs: { + + def before_list_item(self, node): + # XXX needs cleanup. + if (len(node) and (isinstance(node[-1], nodes.TextElement) or + isinstance(node[-1], nodes.Text)) and + node.parent.index(node) == len(node.parent) - 1): + node['lastitem'] = 'true' + + before_line = before_list_item + + def before_raw(self, node): + if 'latex' in node.get('format', '').split(): + # We're inserting the text in before_raw and thus outside + # of \DN... and \DECattr in order to make grouping with + # curly brackets work. + self.append(node.astext()) + raise nodes.SkipChildren + + def process_backlinks(self, node, type): + """ + Add LaTeX handling code for backlinks of footnote or citation + node `node`. `type` is either 'footnote' or 'citation'. + """ + self.append(r'\renewcommand{\DEVsinglebackref}{}') + self.append(r'\renewcommand{\DEVmultiplebackrefs}{}') + if len(node['backrefs']) > 1: + refs = [] + for i in range(len(node['backrefs'])): + # \DECmulticitationbacklink or \DECmultifootnotebacklink. + refs.append(r'\DECmulti%sbacklink{%s}{%s}' + % (type, node['backrefs'][i], i + 1)) + self.append(r'\renewcommand{\DEVmultiplebackrefs}{(%s){ }}' + % ', '.join(refs)) + elif len(node['backrefs']) == 1: + self.append(r'\renewcommand{\DEVsinglebackref}{%s}' + % node['backrefs'][0]) + + def visit_footnote(self, node): + self.process_backlinks(node, 'footnote') + + def visit_citation(self, node): + self.process_backlinks(node, 'citation') + + def before_table(self, node): + # A table contains exactly one tgroup. See before_tgroup. + pass + + def before_tgroup(self, node): + widths = [] + total_width = 0 + for i in range(int(node['cols'])): + assert isinstance(node[i], nodes.colspec) + widths.append(int(node[i]['colwidth']) + 1) + total_width += widths[-1] + del node[:len(widths)] + tablespec = '|' + for w in widths: + # 0.93 is probably wrong in many cases. XXX Find a + # solution which works *always*. + tablespec += r'p{%s\textwidth}|' % (0.93 * w / + max(total_width, 60)) + self.append(r'\DECmaketable{%s}{' % tablespec) + self.context.append('}') + raise SkipAttrParentLaTeX + + def depart_tgroup(self, node): + self.append(self.context.pop()) + + def before_row(self, node): + raise SkipAttrParentLaTeX + + def before_thead(self, node): + raise SkipAttrParentLaTeX + + def before_tbody(self, node): + raise SkipAttrParentLaTeX + + def is_simply_entry(self, node): + return (len(node) == 1 and isinstance(node[0], nodes.paragraph) or + len(node) == 0) + + def before_entry(self, node): + is_leftmost = 0 + if node.hasattr('morerows'): + self.document.reporter.severe('Rowspans are not supported.') + # Todo: Add empty cells below rowspanning cell and issue + # warning instead of severe. + if node.hasattr('morecols'): + # The author got a headache trying to implement + # multicolumn support. + if not self.is_simply_entry(node): + self.document.reporter.severe( + 'Colspanning table cells may only contain one paragraph.') + # Todo: Same as above. + # The number of columns this entry spans (as a string). + colspan = int(node['morecols']) + 1 + del node['morecols'] + else: + colspan = 1 + # Macro to call -- \DECcolspan or \DECcolspanleft. + macro_name = r'\DECcolspan' + if node.parent.index(node) == 0: + # Leftmost column. + macro_name += 'left' + is_leftmost = 1 + if colspan > 1: + self.append('%s{%s}{' % (macro_name, colspan)) + self.context.append('}') + else: + # Do not add a multicolumn with colspan 1 beacuse we need + # at least one non-multicolumn cell per column to get the + # desired column widths, and we can only do colspans with + # cells consisting of only one paragraph. + if not is_leftmost: + self.append(r'\DECsubsequententry{') + self.context.append('}') + else: + self.context.append('') + if isinstance(node.parent.parent, nodes.thead): + node['tableheaderentry'] = 'true' + + # Don't add \renewcommand{\DEVparent}{...} because there must + # not be any non-expandable commands in front of \multicolumn. + raise SkipParentLaTeX + + def depart_entry(self, node): + self.append(self.context.pop()) + + def before_substitution_definition(self, node): + raise nodes.SkipNode + + indentation_level = 0 + + def node_name(self, node): + return node.__class__.__name__.replace('_', '') + + # Attribute propagation order. + attribute_order = ['align', 'classes', 'ids'] + + def attribute_cmp(self, a1, a2): + """ + Compare attribute names `a1` and `a2`. Used in + propagate_attributes to determine propagation order. + + See built-in function `cmp` for return value. + """ + if a1 in self.attribute_order and a2 in self.attribute_order: + return cmp(self.attribute_order.index(a1), + self.attribute_order.index(a2)) + if (a1 in self.attribute_order) != (a2 in self.attribute_order): + # Attributes not in self.attribute_order come last. + return a1 in self.attribute_order and -1 or 1 + else: + return cmp(a1, a2) + + def propagate_attributes(self, node): + # Propagate attributes using \DECattr macros. + node_name = self.node_name(node) + attlist = [] + if isinstance(node, nodes.Element): + attlist = node.attlist() + attlist.sort(lambda pair1, pair2: self.attribute_cmp(pair1[0], + pair2[0])) + # `numatts` may be greater than len(attlist) due to list + # attributes. + numatts = 0 + pass_contents = self.pass_contents(node) + for key, value in attlist: + if isinstance(value, ListType): + self.append(r'\renewcommand{\DEVattrlen}{%s}' % len(value)) + for i in range(len(value)): + self.append(r'\DECattr{%s}{%s}{%s}{%s}{' % + (i+1, key, self.encode(value[i], attval=key), + node_name)) + if not pass_contents: + self.append('}') + numatts += len(value) + else: + self.append(r'\DECattr{}{%s}{%s}{%s}{' % + (key, self.encode(unicode(value), attval=key), + node_name)) + if not pass_contents: + self.append('}') + numatts += 1 + if pass_contents: + self.context.append('}' * numatts) # for Emacs: { + else: + self.context.append('') + + def visit_docinfo(self, node): + raise NotImplementedError('Docinfo not yet implemented.') + + def visit_document(self, node): + document = node + # Move IDs into TextElements. This won't work for images. + # Need to review this. + for node in document.traverse(nodes.Element): + if node.has_key('ids') and not isinstance(node, + nodes.TextElement): + next_text_element = node.next_node(nodes.TextElement) + if next_text_element: + next_text_element['ids'].extend(node['ids']) + node['ids'] = [] + + def pass_contents(self, node): + r""" + Return True if the node contents should be passed in + \DN{} and \DECattr{}{}{}{}{}. + Return False if the node contents should be passed in + \DECvisit \DECdepart, and no + attribute handler should be called. + """ + # Passing the whole document or whole sections as parameters + # to \DN... or \DECattr causes LaTeX to run out of memory. + return not isinstance(node, (nodes.document, nodes.section)) + + def dispatch_visit(self, node): + skip_attr = skip_parent = 0 + # TreePruningException to be propagated. + tree_pruning_exception = None + if hasattr(self, 'before_' + node.__class__.__name__): + try: + getattr(self, 'before_' + node.__class__.__name__)(node) + except SkipParentLaTeX: + skip_parent = 1 + except SkipAttrParentLaTeX: + skip_attr = 1 + skip_parent = 1 + except nodes.SkipNode: + raise + except (nodes.SkipChildren, nodes.SkipSiblings), instance: + tree_pruning_exception = instance + except nodes.SkipDeparture: + raise NotImplementedError( + 'SkipDeparture not usable in LaTeX writer') + + if not isinstance(node, nodes.Text): + node_name = self.node_name(node) + # attribute_deleters will be appended to self.context. + attribute_deleters = [] + if not skip_parent and not isinstance(node, nodes.document): + self.append(r'\renewcommand{\DEVparent}{%s}' + % self.node_name(node.parent)) + for name, value in node.attlist(): + if not isinstance(value, ListType) and not ':' in name: + # For non-list and non-special (like + # 'xml:preserve') attributes, set + # \DEVcurrentNA to the + # attribute value, so that the value of the + # attribute is available in the node handler + # and all children. + macro = r'\DEVcurrentN%sA%s' % (node_name, name) + self.append(r'\def%s{%s}' % ( + macro, self.encode(unicode(value), attval=name))) + # Make the attribute undefined afterwards. + attribute_deleters.append(r'\let%s=\relax' % macro) + self.context.append('\n'.join(attribute_deleters)) + if self.pass_contents(node): + # Call \DN{}. + self.append(r'\DN%s{' % node_name) + self.context.append('}') + else: + # Call \DECvisit + # \DECdepart. (Maybe we should use LaTeX + # environments for this?) + self.append(r'\DECvisit%s' % node_name) + self.context.append(r'\DECdepart%s' % node_name) + self.indentation_level += 1 + if not skip_attr: + self.propagate_attributes(node) + else: + self.context.append('') + + if (isinstance(node, nodes.TextElement) and + not isinstance(node.parent, nodes.TextElement)): + # Reset current quote to left. + self.left_quote = 1 + + # Call visit_... method. + try: + nodes.SparseNodeVisitor.dispatch_visit(self, node) + except LaTeXException: + raise NotImplementedError( + 'visit_... methods must not raise LaTeXExceptions') + + if tree_pruning_exception: + # Propagate TreePruningException raised in before_... method. + raise tree_pruning_exception + + def is_invisible(self, node): + # Return true if node is invisible or moved away in the LaTeX + # rendering. + return (not isinstance(node, nodes.Text) and + (isinstance(node, nodes.Invisible) or + isinstance(node, nodes.footnote) or + isinstance(node, nodes.citation) or + # Assume raw nodes to be invisible. + isinstance(node, nodes.raw) or + # Floating image or figure. + node.get('align') in ('left', 'right'))) + + def is_visible(self, node): + return not self.is_invisible(node) + + def needs_space(self, node): + """Two nodes for which `needs_space` is true need auxiliary space.""" + # Return true if node is a visible block-level element. + return ((isinstance(node, nodes.Body) or + isinstance(node, nodes.topic)) and + not (self.is_invisible(node) or + isinstance(node.parent, nodes.TextElement))) + + def always_needs_space(self, node): + """ + Always add space around nodes for which `always_needs_space()` + is true, regardless of whether the other node needs space as + well. (E.g. transition next to section.) + """ + return isinstance(node, nodes.transition) + + def dispatch_departure(self, node): + # Call departure method. + nodes.SparseNodeVisitor.dispatch_departure(self, node) + + if not isinstance(node, nodes.Text): + # Close attribute and node handler call (\DN...{...}). + self.indentation_level -= 1 + self.append(self.context.pop() + self.context.pop()) + # Delete \DECcurrentN... attribute macros. + self.append(self.context.pop()) + # Get next sibling. + next_node = node.next_node( + ascend=0, siblings=1, descend=0, + condition=self.is_visible) + # Insert space if necessary. + if (self.needs_space(node) and self.needs_space(next_node) or + self.always_needs_space(node) or + self.always_needs_space(next_node)): + if isinstance(node, nodes.paragraph) and isinstance(next_node, nodes.paragraph): + # Space between paragraphs. + self.append(r'\DECparagraphspace') + else: + # One of the elements is not a paragraph. + self.append(r'\DECauxiliaryspace') diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/base.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/base.tex Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,1180 @@ +% System stylesheet for the new LaTeX writer, newlatex2e. + +% Major parts of the rendering are done in this stylesheet and not in the +% Python module. + +% For development notes, see notes.txt. + +% User documentation (in the stylesheet for now; that may change though): + +% Naming conventions: +% All uppercase letters in macro names have a specific meaning. +% \D...: All macros introduced by the Docutils LaTeX writer start with "D". +% \DS: Setup function (called at the bottom of this stylesheet). +% \DN{}: Handler for Docutils document tree node `node`; called by +% the Python module. +% \DEV: External variable, set by the Python module. +% \DEC: External command. It is called by the Python module and must be +% defined in this stylesheet. +% \DNA{}{}{}{}{}: +% Attribute handler for `attribute` set on nodes of type `nodename`. +% See below for a discussion of attribute handlers. +% \DA{}{}{}{}{}: +% Attribute handler for all `attribute`. Called only when no specific +% \DNA handler is defined. +% \DNC{}: +% Handler for `class`, when set on nodes of type `nodename`. +% \DC{}: +% Handler for `class`. Called only when no specific \DNC +% handler is defined. +% \D: Generic variable or function. + +% Attribute handlers: +% TODO + +% --------------------------------------------------------------------------- + +% Having to intersperse code with \makeatletter-\makeatother pairs is very +% annoying, so we call \makeatletter at the top and \makeatother at the +% bottom. Just be aware that you cannot use "@" as a text character inside +% this stylesheet. +\makeatletter + +% Print-mode (as opposed to online mode e.g. with Adobe Reader). +% This causes for example blue hyperlinks. +\providecommand{\Dprinting}{false} + +% \DSearly is called right after \documentclass. +\providecommand{\DSearly}{} +% \DSlate is called at the end of the stylesheet (right before the document +% tree). +\providecommand{\DSlate}{} + +% Use the KOMA script article class. +\providecommand{\Ddocumentclass}{scrartcl} +\providecommand{\Ddocumentoptions}{a4paper} +\providecommand{\DSdocumentclass}{ + \documentclass[\Ddocumentoptions]{\Ddocumentclass} } + +% Todo: This should be movable to the bottom, but it isn't as long as +% we use \usepackage commands at the top level of this stylesheet +% (which we shouldn't). +\DSdocumentclass + +\providecommand{\DSpackages}{ + % Load miscellaneous packages. + % Note 1: Many of the packages loaded here are used throughout this stylesheet. + % If one of these packages does not work on your system or in your scenario, + % please let us know, so we can consider making the package optional. + % Note 2: It would appear cleaner to load packages where they are used. + % However, since using a wrong package loading order can lead to *very* + % subtle bugs, we centralize the loading of most packages here. + \DSfontencoding % load font encoding packages + \DSlanguage % load babel + % Using \ifthenelse conditionals. + \usepackage{ifthen} % before hyperref (really!) + % There is not support for *not* using hyperref because it's used in many + % places. If this is a problem (e.g. because hyperref doesn't work on your + % system), please let us know. + \usepackage[colorlinks=false,pdfborder={0 0 0}]{hyperref} + % Get color, e.g. for links and system messages. + \usepackage{color} + % Get \textnhtt macro (non-hyphenating type writer). + \usepackage{hyphenat} + % For sidebars. + \usepackage{picins} + % We use longtable to create tables. + \usepackage{longtable} + % Images. + \usepackage{graphicx} + % These packages might be useful (some just add magic pixie dust), so + % evaluate them: + %\usepackage{fixmath} + %\usepackage{amsmath} + % Add some missing symbols like \textonehalf. + \usepackage{textcomp} +} + +\providecommand{\DSfontencoding}{ + % Set up font encoding. Called by \DSpackages. + % AE is a T1 emulation. It provides mostly the same characters and + % features as T1-encoded fonts but doesn't use bitmap fonts (which are + % unsuitable for online reading and subtle for printers). + \usepackage{ae} + % Provide the characters not contained in AE from EC bitmap fonts. + \usepackage{aecompl} + % Guillemets ("<<", ">>") in AE. + \usepackage{aeguill} +} + +\providecommand{\DSsymbols}{% + % Fix up symbols. + % The Euro symbol in Computer Modern looks, um, funny. Let's get a + % proper Euro symbol. + \usepackage{eurosym}% + \renewcommand{\texteuro}{\euro}% +} + +% Taken from +% +% and modified. Used with permission. +\providecommand{\Dprovidelength}[2]{% + \begingroup% + \escapechar\m@ne% + \xdef\@gtempa{{\string#1}}% + \endgroup% + \expandafter\@ifundefined\@gtempa% + {\newlength{#1}\setlength{#1}{#2}}% + {}% +} + +\providecommand{\Dprovidecounter}[2]{% + % Like \newcounter except that it doesn't crash if the counter + % already exists. + \@ifundefined{c@#1}{\newcounter{#1}\setcounter{#1}{#2}}{} +} + +\Dprovidelength{\Dboxparindent}{\parindent} + +\providecommand{\Dmakebox}[1]{% + % Make a centered, frameless box. Useful e.g. for block quotes. + % Do not use minipages here, but create pseudo-lists to allow + % page-breaking. (Don't use KOMA-script's addmargin environment + % because it messes up bullet lists.) + \Dmakelistenvironment{}{}{% + \setlength{\parskip}{0pt}% + \setlength{\parindent}{\Dboxparindent}% + \item{#1}% + }% +} + +\providecommand{\Dmakefbox}[1]{% + % Make a centered, framed box. Useful e.g. for admonitions. + \vspace{0.4\baselineskip}% + \begin{center}% + \fbox{% + \begin{minipage}[t]{0.9\linewidth}% + \setlength{\parindent}{\Dboxparindent}% + #1% + \end{minipage}% + }% + \end{center}% + \vspace{0.4\baselineskip}% +} + +% We do not currently recognize the difference between an end-sentence and a +% mid-sentence period (". " vs. ". " in plain text). So \frenchspacing is +% appropriate. +\providecommand{\DSfrenchspacing}{\frenchspacing} + + +\Dprovidelength{\Dblocklevelvspace}{% + % Space between block-level elements other than paragraphs. + 0.7\baselineskip plus 0.3\baselineskip minus 0.2\baselineskip% +} +\providecommand{\DECauxiliaryspace}{% + \ifthenelse{\equal{\Dneedvspace}{true}}{\vspace{\Dblocklevelvspace}}{}% + \par\noindent% +} +\providecommand{\DECparagraphspace}{\par} +\providecommand{\Dneedvspace}{true} + +\providecommand{\DSlanguage}{% + % Set up babel. + \usepackage[\DEVlanguagebabel]{babel} +} + +\providecommand{\Difdefined}[3]{\@ifundefined{#1}{#3}{#2}} + +% Handler for 'classes' attribute (called for each class attribute). +\providecommand{\DAclasses}[5]{% + % Dispatch to \DNC. + \Difdefined{DN#4C#3}{% + % Pass only contents, nothing else! + \csname DN#4C#3\endcsname{#5}% + }{% + % Otherwise, dispatch to \DC. + \Difdefined{DC#3}{% + \csname DC#3\endcsname{#5}% + }{% + #5% + }% + }% +} + +\providecommand{\DECattr}[5]{% + % Global attribute dispatcher, called inside the document tree. + % Parameters: + % 1. Attribute number. + % 2. Attribute name. + % 3. Attribute value. + % 4. Node name. + % 5. Node contents. + \Difdefined{DN#4A#2}{% + % Dispatch to \DNA. + \csname DN#4A#2\endcsname{#1}{#2}{#3}{#4}{#5}% + }{\Difdefined{DA#2}{% + % Otherwise dispatch to \DA. + \csname DA#2\endcsname{#1}{#2}{#3}{#4}{#5}% + }{% + % Otherwise simply run the contents without calling a handler. + #5% + }}% +} + +% ---------- Link handling ---------- +% Targets and references. + +\providecommand{\Draisedlink}[1]{% + % Anchors are placed on the base line by default. This is a bad thing for + % inline context, so we raise the anchor (normally by \baselineskip). + \Hy@raisedlink{#1}% +} + +% References. +% We're assuming here that the "refid" and "refuri" attributes occur +% only in inline context (in TextElements). +\providecommand{\DArefid}[5]{% + \ifthenelse{\equal{#4}{reference}}{% + \Dexplicitreference{\##3}{#5}% + }{% + % If this is not a target node (targets with refids are + % uninteresting and should be silently dropped). + \ifthenelse{\not\equal{#4}{target}}{% + % If this is a footnote reference, call special macro. + \ifthenelse{\equal{#4}{footnotereference}}{% + \Dimplicitfootnotereference{\##3}{#5}% + }{% + \ifthenelse{\equal{#4}{citationreference}}{% + \Dimplicitcitationreference{\##3}{#5}% + }{% + \Dimplicitreference{\##3}{#5}% + }% + }% + }{}% + }% +} +\providecommand{\DArefuri}[5]{% + \ifthenelse{\equal{#4}{target}}{% + % The node name is 'target', so this is a hyperlink target, like this: + % .. _mytarget: URI + % Hyperlink targets are ignored because they are invisible. + }{% + % If a non-target node has a refuri attribute, it must be an explicit URI + % reference (i.e. node name is 'reference'). + \Durireference{#3}{#5}% + }% +} +% Targets. +\providecommand{\DAids}[5]{% + \label{#3}% + \ifthenelse{\equal{#4}{footnotereference}}{% + {% + \renewcommand{\HyperRaiseLinkDefault}{% + % Dirty hack to make backrefs to footnote references work. + % For some reason, \baselineskip is 0pt in fn references. + 0.5\Doriginalbaselineskip% + }% + \Draisedlink{\hypertarget{#3}{}}#5% + }% + }{% + \Draisedlink{\hypertarget{#3}{}}#5% + }% +} +\providecommand{\Dimplicitreference}[2]{% + % Create implicit reference to ID. Implicit references occur + % e.g. in TOC-backlinks of section titles. Parameters: + % 1. Target. + % 2. Link text. + \href{#1}{#2}% +} +\providecommand{\Dimplicitfootnotereference}[2]{% + % Ditto, but for the special case of footnotes. + % We want them to be rendered like explicit references. + \Dexplicitreference{#1}{#2}% +} +\providecommand{\Dimplicitcitationreference}[2]{% + % Ditto for citation references. + \Dimplicitfootnotereference{#1}{#2}% +} +\providecommand{\Dcolorexplicitreference}{% + \ifthenelse{\equal{\Dprinting}{true}}{\color{black}}{\color{blue}}% +} +\providecommand{\Dexplicitreference}[2]{% + % Create explicit reference to ID, e.g. created with "foo_". + % Parameters: + % 1. Target. + % 2. Link text. + \href{#1}{{\Dcolorexplicitreference#2}}% +} +\providecommand{\Dcolorurireference}{\Dcolorexplicitreference} +\providecommand{\Durireference}[2]{% + % Create reference to URI. Parameters: + % 1. Target. + % 2. Link text. + \href{#1}{{\Dcolorurireference#2}}% +} + +\Dprovidecounter{Dpdfbookmarkid}{0}% +\providecommand{\Dpdfbookmark}[1]{% + % Temporarily decrement Desctionlevel counter. + \addtocounter{Dsectionlevel}{-1}% + %\typeout{\arabic{Dsectionlevel}}% + %\typeout{#1}% + %\typeout{docutils\roman{Dpdfbookmarkid}}% + %\typeout{}% + \pdfbookmark[\arabic{Dsectionlevel}]{#1}{docutils\arabic{Dpdfbookmarkid}}% + \addtocounter{Dsectionlevel}{1}% + \addtocounter{Dpdfbookmarkid}{1}% +} +% ---------- End of Link Handling ---------- + +\providecommand{\DNparagraph}[1]{% + \ifthenelse{\equal{\DEVparagraphindented}{true}}{\indent}{\noindent}% + #1% +} +\providecommand{\Dformatboxtitle}[1]{{\Large\textbf{#1}}} +\providecommand{\Dformatboxsubtitle}[1]{{\large\textbf{#1}}} +\providecommand{\Dtopictitle}[1]{% + \Difinsidetoc{\vspace{1em}\par}{}% + \noindent\Dformatboxtitle{#1}% + \ifthenelse{\equal{\DEVhassubtitle}{false}}{\vspace{1em}}{\vspace{0.5em}}% + \par% +} +\providecommand{\Dadmonitiontitle}[1]{% + \Dtopictitle{#1}% +} +\providecommand{\Dtopicsubtitle}[1]{% + \noindent\Dformatboxsubtitle{#1}% + \vspace{1em}% + \par% +} +\providecommand{\Dsidebartitle}[1]{\Dtopictitle{#1}} +\providecommand{\Dsidebarsubtitle}[1]{\Dtopicsubtitle{#1}} +\providecommand{\Ddocumenttitle}[1]{% + \begin{center}{\Huge#1}\end{center}% + \ifthenelse{\equal{\DEVhassubtitle}{true}}{\vspace{0.1cm}}{\vspace{1cm}}% +} +\providecommand{\Ddocumentsubtitle}[1]{% + \begin{center}{\huge#1}\end{center}% + \vspace{1cm}% +} +% Can be overwritten by user stylesheet. +\providecommand{\Dformatsectiontitle}[1]{#1} +\providecommand{\Dformatsectionsubtitle}[1]{\Dformatsectiontitle{#1}} +\providecommand{\Dbookmarksectiontitle}[1]{% + % Return text suitable for use in \section*, \subsection*, etc., + % containing a PDF bookmark. Parameter: The title (as node tree). + \Draisedlink{\Dpdfbookmark{\DEVtitleastext}}% + #1% +} +\providecommand{\Dsectiontitlehook}[1]{#1} +\providecommand{\Dsectiontitle}[1]{% + \Dsectiontitlehook{% + \Ddispatchsectiontitle{\Dbookmarksectiontitle{\Dformatsectiontitle{#1}}}% + }% +} +\providecommand{\Ddispatchsectiontitle}[1]{% + \@ifundefined{Dsectiontitle\roman{Dsectionlevel}}{% + \Ddeepsectiontitle{#1}% + }{% + \csname Dsectiontitle\roman{Dsectionlevel}\endcsname{#1}% + }% +} +\providecommand{\Ddispatchsectionsubtitle}[1]{% + \Ddispatchsectiontitle{#1}% +} +\providecommand{\Dsectiontitlei}[1]{\section*{#1}} +\providecommand{\Dsectiontitleii}[1]{\subsection*{#1}} +\providecommand{\Ddeepsectiontitle}[1]{% + % Anything below \subsubsection (like \paragraph or \subparagraph) + % is useless because it uses the same font. The only way to + % (visually) distinguish such deeply nested sections is to use + % section numbering. + \subsubsection*{#1}% +} +\providecommand{\Dsectionsubtitlehook}[1]{#1} +\Dprovidelength{\Dsectionsubtitleraisedistance}{0.7em} +\providecommand{\Dsectionsubtitlescaling}{0.85} +\providecommand{\Dsectionsubtitle}[1]{% + \Dsectionsubtitlehook{% + % Move the subtitle nearer to the title. + \vspace{-\Dsectionsubtitleraisedistance}% + % Don't create a PDF bookmark. + \Ddispatchsectionsubtitle{% + \Dformatsectionsubtitle{\scalebox{\Dsectionsubtitlescaling}{#1}}% + }% + }% +} +\providecommand{\DNtitle}[1]{% + % Dispatch to \Dtitle. + \csname D\DEVparent title\endcsname{#1}% +} +\providecommand{\DNsubtitle}[1]{% + % Dispatch to \Dsubtitle. + \csname D\DEVparent subtitle\endcsname{#1}% +} + +\providecommand{\DNliteralblock}[1]{% + \Dmakelistenvironment{}{% + \ifthenelse{\equal{\Dinsidetabular}{true}}{% + \setlength{\leftmargin}{0pt}% + }{}% + \setlength{\rightmargin}{0pt}% + }{% + \raggedright\item\noindent\nohyphens{\textnhtt{#1\Dfinalstrut}}% + }% +} +\providecommand{\DNdoctestblock}[1]{\DNliteralblock{#1}} +\providecommand{\DNliteral}[1]{\textnhtt{#1}} +\providecommand{\DNemphasis}[1]{\emph{#1}} +\providecommand{\DNstrong}[1]{\textbf{#1}} +\providecommand{\DECvisitdocument}{\begin{document}\noindent} +\providecommand{\DECdepartdocument}{\end{document}} +\providecommand{\DNtopic}[1]{% + \ifthenelse{\equal{\DEVcurrentNtopicAcontents}{1}}{% + \addtocounter{Dtoclevel}{1}% + \par\noindent% + #1% + \addtocounter{Dtoclevel}{-1}% + }{% + \par\noindent% + \Dmakebox{#1}% + }% +} +\providecommand{\DNadmonition}[1]{% + \DNtopic{#1}% +} +\providecommand{\Dformatrubric}[1]{\textbf{#1}} +\Dprovidelength{\Dprerubricspace}{0.3em} +\providecommand{\DNrubric}[1]{% + \vspace{\Dprerubricspace}\par\noindent\Dformatrubric{#1}\par% +} + +\providecommand{\Dbullet}{} +\providecommand{\DECsetbullet}[1]{\renewcommand{\Dbullet}{#1}} +\providecommand{\DNbulletlist}[1]{% + \Difinsidetoc{% + \Dtocbulletlist{#1}% + }{% + \Dmakelistenvironment{\Dbullet}{}{#1}% + }% +} +% Todo: So what on earth is @pnumwidth? +\renewcommand{\@pnumwidth}{2.2em} +\providecommand{\DNlistitem}[1]{% + \Difinsidetoc{% + \ifthenelse{\equal{\theDtoclevel}{1}\and\equal{\Dlocaltoc}{false}}{% + {% + \par\addvspace{1em}\noindent% + \sectfont% + #1\hfill\pageref{\DEVcurrentNlistitemAtocrefid}% + }% + }{% + \@dottedtocline{0}{\Dtocindent}{0em}{#1}{% + \pageref{\DEVcurrentNlistitemAtocrefid}% + }% + }% + }{% + \item{#1}% + }% +} +\providecommand{\DNenumeratedlist}[1]{#1} +\Dprovidecounter{Dsectionlevel}{0} +\providecommand{\Dvisitsectionhook}{} +\providecommand{\Ddepartsectionhook}{} +\providecommand{\DECvisitsection}{% + \addtocounter{Dsectionlevel}{1}% + \Dvisitsectionhook% +} +\providecommand{\DECdepartsection}{% + \Ddepartsectionhook% + \addtocounter{Dsectionlevel}{-1}% +} + +% Using \_ will cause hyphenation after _ even in \textnhtt-typewriter +% because the hyphenat package redefines \_. So we use +% \textunderscore here. +\providecommand{\DECtextunderscore}{\textunderscore} + +\providecommand{\Dtextinlineliteralfirstspace}{{ }} +\providecommand{\Dtextinlineliteralsecondspace}{{~}} + +\Dprovidelength{\Dlistspacing}{0.8\baselineskip} + +\providecommand{\Dsetlistrightmargin}{% + \ifthenelse{\lengthtest{\linewidth>12em}}{% + % Equal margins. + \setlength{\rightmargin}{\leftmargin}% + }{% + % If the line is narrower than 10em, we don't remove any further + % space from the right. + \setlength{\rightmargin}{0pt}% + }% +} +\providecommand{\Dresetlistdepth}{false} +\Dprovidelength{\Doriginallabelsep}{\labelsep} +\providecommand{\Dmakelistenvironment}[3]{% + % Make list environment with support for unlimited nesting and with + % reasonable default lengths. Parameters: + % 1. Label (same as in list environment). + % 2. Spacing (same as in list environment). + % 3. List contents (contents of list environment). + \ifthenelse{\equal{\Dinsidetabular}{true}}{% + % Unfortunately, vertical spacing doesn't work correctly when + % using lists inside tabular environments, so we use a minipage. + \begin{minipage}[t]{\linewidth}% + }{}% + {% + \renewcommand{\Dneedvspace}{false}% + % \parsep0.5\baselineskip + \renewcommand{\Dresetlistdepth}{false}% + \ifnum \@listdepth>5% + \protect\renewcommand{\Dresetlistdepth}{true}% + \@listdepth=5% + \fi% + \begin{list}{% + #1% + }{% + \setlength{\itemsep}{0pt}% + \setlength{\partopsep}{0pt}% + \setlength{\topsep}{0pt}% + % List should take 90% of total width. + \setlength{\leftmargin}{0.05\linewidth}% + \ifthenelse{\lengthtest{\leftmargin<1.8em}}{% + \setlength{\leftmargin}{1.8em}% + }{}% + \setlength{\labelsep}{\Doriginallabelsep}% + \Dsetlistrightmargin% + #2% + }{% + #3% + }% + \end{list}% + \ifthenelse{\equal{\Dresetlistdepth}{true}}{\@listdepth=5}{}% + }% + \ifthenelse{\equal{\Dinsidetabular}{true}}{\end{minipage}}{}% +} +\providecommand{\Dfinalstrut}{\@finalstrut\@arstrutbox} +\providecommand{\DAlastitem}[5]{#5\Dfinalstrut} + +\Dprovidelength{\Ditemsep}{0pt} +\providecommand{\DECmakeenumeratedlist}[6]{% + % Make enumerated list. + % Parameters: + % - prefix + % - type (\arabic, \roman, ...) + % - suffix + % - suggested counter name + % - start number - 1 + % - list contents + \newcounter{#4}% + \Dmakelistenvironment{#1#2{#4}#3}{% + % Use as much space as needed for the label. + \setlength{\labelwidth}{10em}% + % Reserve enough space so that the label doesn't go beyond the + % left margin of preceding paragraphs. Like that: + % + % A paragraph. + % + % 1. First item. + \setlength{\leftmargin}{2.5em}% + \Dsetlistrightmargin% + \setlength{\itemsep}{\Ditemsep}% + % Use counter recommended by Python module. + \usecounter{#4}% + % Set start value. + \addtocounter{#4}{#5}% + }{% + % The list contents. + #6% + }% +} + + +% Single quote in literal mode. \textquotesingle from package +% textcomp has wrong width when using package ae, so we use a normal +% single curly quote here. +\providecommand{\DECtextliteralsinglequote}{'} + + +% "Tabular lists" are field lists and options lists (not definition +% lists because there the term always appears on its own line). We'll +% use the terminology of field lists now ("field", "field name", +% "field body"), but the same is also analogously applicable to option +% lists. +% +% We want these lists to be breakable across pages. We cannot +% automatically get the narrowest possible size for the left column +% (i.e. the field names or option groups) because tabularx does not +% support multi-page tables, ltxtable needs to have the table in an +% external file and we don't want to clutter the user's directories +% with auxiliary files created by the filecontents environment, and +% ltablex is not included in teTeX. +% +% Thus we set a fixed length for the left column and use list +% environments. This also has the nice side effect that breaking is +% now possible anywhere, not just between fields. +% +% Note that we are creating a distinct list environment for each +% field. There is no macro for a whole tabular list! +\Dprovidelength{\Dtabularlistfieldnamewidth}{6em} +\Dprovidelength{\Dtabularlistfieldnamesep}{0.5em} +\providecommand{\Dinsidetabular}{false} +\providecommand{\Dsavefieldname}{} +\providecommand{\Dsavefieldbody}{} +\Dprovidelength{\Dusedfieldnamewidth}{0pt} +\Dprovidelength{\Drealfieldnamewidth}{0pt} +\providecommand{\Dtabularlistfieldname}[1]{\renewcommand{\Dsavefieldname}{#1}} +\providecommand{\Dtabularlistfieldbody}[1]{\renewcommand{\Dsavefieldbody}{#1}} +\Dprovidelength{\Dparskiptemp}{0pt} +\providecommand{\Dtabularlistfield}[1]{% + {% + % This only saves field name and field body in \Dsavefieldname and + % \Dsavefieldbody, resp. It does not insert any text into the + % document. + #1% + % Recalculate the real field name width everytime we encounter a + % tabular list field because it may have been changed using a + % "raw" node. + \setlength{\Drealfieldnamewidth}{\Dtabularlistfieldnamewidth}% + \addtolength{\Drealfieldnamewidth}{\Dtabularlistfieldnamesep}% + \Dmakelistenvironment{% + \makebox[\Drealfieldnamewidth][l]{\Dsavefieldname}% + }{% + \setlength{\labelwidth}{\Drealfieldnamewidth}% + \setlength{\leftmargin}{\Drealfieldnamewidth}% + \setlength{\rightmargin}{0pt}% + \setlength{\labelsep}{0pt}% + }{% + \item% + \settowidth{\Dusedfieldnamewidth}{\Dsavefieldname}% + \setlength{\Dparskiptemp}{\parskip}% + \ifthenelse{% + \lengthtest{\Dusedfieldnamewidth>\Dtabularlistfieldnamewidth}% + }{% + \mbox{}\par% + \setlength{\parskip}{0pt}% + }{}% + \Dsavefieldbody% + \setlength{\parskip}{\Dparskiptemp}% + %XXX Why did we need this? + %\@finalstrut\@arstrutbox% + }% + \par% + }% +} + +\providecommand{\Dformatfieldname}[1]{\textbf{#1:}} +\providecommand{\DNfieldlist}[1]{#1} +\providecommand{\DNfield}[1]{\Dtabularlistfield{#1}} +\providecommand{\DNfieldname}[1]{% + \Dtabularlistfieldname{% + \Dformatfieldname{#1}% + }% +} +\providecommand{\DNfieldbody}[1]{\Dtabularlistfieldbody{#1}} + +\providecommand{\Dformatoptiongroup}[1]{% + % Format option group, e.g. "-f file, --input file". + \texttt{#1}% +} +\providecommand{\Dformatoption}[1]{% + % Format option, e.g. "-f file". + % Put into mbox to avoid line-breaking at spaces. + \mbox{#1}% +} +\providecommand{\Dformatoptionstring}[1]{% + % Format option string, e.g. "-f". + #1% +} +\providecommand{\Dformatoptionargument}[1]{% + % Format option argument, e.g. "file". + \textsl{#1}% +} +\providecommand{\Dformatoptiondescription}[1]{% + % Format option description, e.g. + % "\DNparagraph{Read input data from file.}" + #1% +} +\providecommand{\DNoptionlist}[1]{#1} +\providecommand{\Doptiongroupjoiner}{,{ }} +\providecommand{\Disfirstoption}{% + % Auxiliary macro indicating if a given option is the first child + % of its option group (if it's not, it has to preceded by + % \Doptiongroupjoiner). + false% +} +\providecommand{\DNoptionlistitem}[1]{% + \Dtabularlistfield{#1}% +} +\providecommand{\DNoptiongroup}[1]{% + \renewcommand{\Disfirstoption}{true}% + \Dtabularlistfieldname{\Dformatoptiongroup{#1}}% +} +\providecommand{\DNoption}[1]{% + % If this is not the first option in this option group, add a + % joiner. + \ifthenelse{\equal{\Disfirstoption}{true}}{% + \renewcommand{\Disfirstoption}{false}% + }{% + \Doptiongroupjoiner% + }% + \Dformatoption{#1}% +} +\providecommand{\DNoptionstring}[1]{\Dformatoptionstring{#1}} +\providecommand{\DNoptionargument}[1]{{ }\Dformatoptionargument{#1}} +\providecommand{\DNdescription}[1]{% + \Dtabularlistfieldbody{\Dformatoptiondescription{#1}}% +} + +\providecommand{\DNdefinitionlist}[1]{% + \begin{description}% + \parskip0pt% + #1% + \end{description}% +} +\providecommand{\DNdefinitionlistitem}[1]{% + % LaTeX expects the label in square brackets; we provide an empty + % label. + \item[]#1% +} +\providecommand{\Dformatterm}[1]{#1} +\providecommand{\DNterm}[1]{\hspace{-5pt}\Dformatterm{#1}} +% I'm still not sure what's the best rendering for classifiers. The +% colon syntax is used by reStructuredText, so it's at least WYSIWYG. +% Use slanted text because italic would cause too much emphasis. +\providecommand{\Dformatclassifier}[1]{\textsl{#1}} +\providecommand{\DNclassifier}[1]{~:~\Dformatclassifier{#1}} +\providecommand{\Dformatdefinition}[1]{#1} +\providecommand{\DNdefinition}[1]{\par\Dformatdefinition{#1}} + +\providecommand{\Dlineblockindentation}{2.5em} +\providecommand{\DNlineblock}[1]{% + \Dmakelistenvironment{}{% + \ifthenelse{\equal{\DEVparent}{lineblock}}{% + % Parent is a line block, so indent. + \setlength{\leftmargin}{\Dlineblockindentation}% + }{% + % At top level; don't indent. + \setlength{\leftmargin}{0pt}% + }% + \setlength{\rightmargin}{0pt}% + \setlength{\parsep}{0pt}% + }{% + #1% + }% +} +\providecommand{\DNline}[1]{\item#1} + +\providecommand{\DNtransition}{% + \raisebox{0.25em}{\parbox{\linewidth}{\hspace*{\fill}\hrulefill\hrulefill\hspace*{\fill}}}% +} + +\providecommand{\Dformatblockquote}[1]{% + % Format contents of block quote. + % This occurs in block-level context, so we cannot use \textsl. + {\slshape#1}% +} +\providecommand{\Dformatattribution}[1]{---\textup{#1}} +\providecommand{\DNblockquote}[1]{% + \Dmakebox{% + \Dformatblockquote{#1} + }% +} +\providecommand{\DNattribution}[1]{% + \par% + \begin{flushright}\Dformatattribution{#1}\end{flushright}% +} + + +% Sidebars: +% Vertical and horizontal margins. +\Dprovidelength{\Dsidebarvmargin}{0.5em} +\Dprovidelength{\Dsidebarhmargin}{1em} +% Padding (space between contents and frame). +\Dprovidelength{\Dsidebarpadding}{1em} +% Frame width. +\Dprovidelength{\Dsidebarframewidth}{2\fboxrule} +% Position ("l" or "r"). +\providecommand{\Dsidebarposition}{r} +% Width. +\Dprovidelength{\Dsidebarwidth}{0.45\linewidth} +\providecommand{\DNsidebar}[1]{ + \parpic[\Dsidebarposition]{% + \begin{minipage}[t]{\Dsidebarwidth}% + % Doing this with nested minipages is ugly, but I haven't found + % another way to place vertical space before and after the fbox. + \vspace{\Dsidebarvmargin}% + {% + \setlength{\fboxrule}{\Dsidebarframewidth}% + \setlength{\fboxsep}{\Dsidebarpadding}% + \fbox{% + \begin{minipage}[t]{\linewidth}% + \setlength{\parindent}{\Dboxparindent}% + #1% + \end{minipage}% + }% + }% + \vspace{\Dsidebarvmargin}% + \end{minipage}% + }% +} + + +% Citations and footnotes. +\providecommand{\Dformatfootnote}[1]{% + % Format footnote. + {% + \footnotesize#1% + % \par is necessary for LaTeX to adjust baselineskip to the + % changed font size. + \par% + }% +} +\providecommand{\Dformatcitation}[1]{\Dformatfootnote{#1}} +\Dprovidelength{\Doriginalbaselineskip}{0pt} +\providecommand{\DNfootnotereference}[1]{% + {% + % \baselineskip is 0pt in \textsuperscript, so we save it here. + \setlength{\Doriginalbaselineskip}{\baselineskip}% + \textsuperscript{#1}% + }% +} +\providecommand{\DNcitationreference}[1]{{[}#1{]}} +\Dprovidelength{\Dfootnotesep}{3.5pt} +\providecommand{\Dsetfootnotespacing}{% + % Spacing commands executed at the beginning of footnotes. + \setlength{\parindent}{0pt}% + \hspace{1em}% +} +\providecommand{\DNfootnote}[1]{% + % See ltfloat.dtx for details. + {% + \insert\footins{% + % BUG: This is too small if the user adds + % \onehalfspacing or \doublespace. + \vspace{\Dfootnotesep}% + \Dsetfootnotespacing% + \Dformatfootnote{#1}% + }% + }% +} +\providecommand{\DNcitation}[1]{\DNfootnote{#1}} +\providecommand{\Dformatfootnotelabel}[1]{% + % Keep \footnotesize in footnote labels (\textsuperscript would + % reduce the font size even more). + \textsuperscript{\footnotesize#1{ }}% +} +\providecommand{\Dformatcitationlabel}[1]{{[}#1{]}{ }} +\providecommand{\Dformatmultiplebackrefs}[1]{% + % If in printing mode, do not write out multiple backrefs. + \ifthenelse{\equal{\Dprinting}{true}}{}{\textsl{#1}}% +} +\providecommand{\Dthislabel}{} +\providecommand{\DNlabel}[1]{% + % Footnote or citatation label. + \renewcommand{\Dthislabel}{#1}% + \ifthenelse{\not\equal{\DEVsinglebackref}{}}{% + \let\Doriginallabel=\Dthislabel% + \def\Dthislabel{% + \Dsinglefootnotebacklink{\DEVsinglebackref}{\Doriginallabel}% + }% + }{}% + \ifthenelse{\equal{\DEVparent}{footnote}}{% + % Footnote label. + \Dformatfootnotelabel{\Dthislabel}% + }{% + \ifthenelse{\equal{\DEVparent}{citation}}{% + % Citation label. + \Dformatcitationlabel{\Dthislabel}% + }{}% + }% + % If there are multiple backrefs, add them now. + \Dformatmultiplebackrefs{\DEVmultiplebackrefs}% +} +\providecommand{\Dsinglefootnotebacklink}[2]{% + % Create normal backlink of a footnote label. Parameters: + % 1. ID. + % 2. Link text. + % Treat like a footnote reference. + \Dimplicitfootnotereference{\##1}{#2}% +} +\providecommand{\DECmultifootnotebacklink}[2]{% + % Create generated backlink, as in (1, 2). Parameters: + % 1. ID. + % 2. Link text. + % Treat like a footnote reference. + \Dimplicitfootnotereference{\##1}{#2}% +} +\providecommand{\Dsinglecitationbacklink}[2]{\Dsinglefootnotebacklink{#1}{#2}} +\providecommand{\DECmulticitationbacklink}[2]{\DECmultifootnotebacklink{#1}{#2}} + + +\providecommand{\DECmaketable}[2]{% + % Make table. Parameters: + % 1. Table spec (like "|p|p|"). + % 2. Table contents. + {% + \ifthenelse{\equal{\Dinsidetabular}{true}}{% + % Inside longtable; we cannot have nested longtables. + \begin{tabular}{#1}% + \hline% + #2% + \end{tabular}% + }{% + \renewcommand{\Dinsidetabular}{true}% + \begin{longtable}{#1}% + \hline% + #2% + \end{longtable}% + }% + }% +} +\providecommand{\DNthead}[1]{% + #1% + \endhead% +} +\providecommand{\DNrow}[1]{% + #1\tabularnewline% + \hline% +} +\providecommand{\Dinsidemulticolumn}{false} +\providecommand{\Dcompensatingmulticol}[3]{% + \multicolumn{#1}{#2}{% + {% + \renewcommand{\Dinsidemulticolumn}{true}% + % Compensate for weird missing vertical space at top of paragraph. + \raisebox{-2.5pt}{#3}% + }% + }% +} +\providecommand{\DECcolspan}[2]{% + % Take care of the morecols attribute (but incremented by 1). + &% + \Dcompensatingmulticol{#1}{l|}{#2}% +} +\providecommand{\DECcolspanleft}[2]{% + % Like \Dmorecols, but called for the leftmost entries in a table + % row. + \Dcompensatingmulticol{#1}{|l|}{#2}% +} +\providecommand{\DECsubsequententry}[1]{% + % +} +\providecommand{\DNentry}[1]{% + % The following sequence adds minimal vertical space above the top + % lines of the first cell paragraph, so that vertical space is + % balanced at the top and bottom of table cells. + \ifthenelse{\equal{\Dinsidemulticolumn}{false}}{% + \vspace{-1em}\vspace{-\parskip}\par% + }{}% + #1% + % No need to add an ampersand ("&"); that's done by \DECsubsequententry. +} +\providecommand{\DAtableheaderentry}[5]{\Dformattableheaderentry{#5}} +\providecommand{\Dformattableheaderentry}[1]{{\bfseries#1}} + + +\providecommand{\DNsystemmessage}[1]{% + {% + \ifthenelse{\equal{\Dprinting}{false}}{\color{red}}{}% + \bfseries% + #1% + }% +} + + +\providecommand{\Dinsidehalign}{false} +\newsavebox{\Dalignedimagebox} +\Dprovidelength{\Dalignedimagewidth}{0pt} +\providecommand{\Dhalign}[2]{% + % Horizontally align the contents to the left or right so that the + % text flows around it. + % Parameters: + % 1. l or r + % 2. Contents. + \renewcommand{\Dinsidehalign}{true}% + % For some obscure reason \parpic consumes some vertical space. + \vspace{-3pt}% + % Now we do something *really* ugly, but this enables us to wrap the + % image in a minipage while still allowing tight frames when + % class=border (see \DNimageCborder). + \sbox{\Dalignedimagebox}{#2}% + \settowidth{\Dalignedimagewidth}{\usebox{\Dalignedimagebox}}% + \parpic[#1]{% + \begin{minipage}[b]{\Dalignedimagewidth}% + % Compensate for previously added space, but not entirely. + \vspace*{2.0pt}% + \vspace*{\Dfloatimagetopmargin}% + \usebox{\Dalignedimagebox}% + \vspace*{1.5pt}% + \vspace*{\Dfloatimagebottommargin}% + \end{minipage}% + }% + \renewcommand{\Dinsidehalign}{false}% +} + + +% Maximum width of an image. +\providecommand{\Dimagemaxwidth}{\linewidth} +\providecommand{\Dfloatimagemaxwidth}{0.5\linewidth} +% Auxiliary variable. +\Dprovidelength{\Dcurrentimagewidth}{0pt} +\providecommand{\DNimageAalign}[5]{% + \ifthenelse{\equal{#3}{left}}{% + \Dhalign{l}{#5}% + }{% + \ifthenelse{\equal{#3}{right}}{% + \Dhalign{r}{#5}% + }{% + \ifthenelse{\equal{#3}{center}}{% + % Text floating around centered figures is a bad idea. Thus + % we use a center environment. Note that no extra space is + % added by the writer, so the space added by the center + % environment is fine. + \begin{center}#5\end{center}% + }{% + #5% + }% + }% + }% +} +% Base path for images. +\providecommand{\Dimagebase}{} +% Auxiliary command. Current image path. +\providecommand{\Dimagepath}{} +\providecommand{\DNimageAuri}[5]{% + % Insert image. We treat the URI like a path here. + \renewcommand{\Dimagepath}{\Dimagebase#3}% + \Difdefined{DcurrentNimageAwidth}{% + \Dwidthimage{\DEVcurrentNimageAwidth}{\Dimagepath}% + }{% + \Dsimpleimage{\Dimagepath}% + }% +} +\Dprovidelength{\Dfloatimagevmargin}{0pt} +\providecommand{\Dfloatimagetopmargin}{\Dfloatimagevmargin} +\providecommand{\Dfloatimagebottommargin}{\Dfloatimagevmargin} +\providecommand{\Dwidthimage}[2]{% + % Image with specified width. + % Parameters: + % 1. Image width. + % 2. Image path. + % Need to make bottom-alignment dependent on align attribute (add + % functional test first). Need to observe height attribute. + %\begin{minipage}[b]{#1}% + \includegraphics[width=#1,height=\textheight,keepaspectratio]{#2}% + %\end{minipage}% +} +\providecommand{\Dcurrentimagemaxwidth}{} +\providecommand{\Dsimpleimage}[1]{% + % Insert image, without much parametrization. + \settowidth{\Dcurrentimagewidth}{\includegraphics{#1}}% + \ifthenelse{\equal{\Dinsidehalign}{true}}{% + \renewcommand{\Dcurrentimagemaxwidth}{\Dfloatimagemaxwidth}% + }{% + \renewcommand{\Dcurrentimagemaxwidth}{\Dimagemaxwidth}% + }% + \ifthenelse{\lengthtest{\Dcurrentimagewidth>\Dcurrentimagemaxwidth}}{% + \Dwidthimage{\Dcurrentimagemaxwidth}{#1}% + }{% + \Dwidthimage{\Dcurrentimagewidth}{#1}% + }% +} +\providecommand{\Dwidthimage}[2]{% + % Image with specified width. + % Parameters: + % 1. Image width. + % 2. Image path. + \Dwidthimage{#1}{#2}% +} + +% Figures. +\providecommand{\DNfigureAalign}[5]{% + % Hack to make it work Right Now. + %\def\DEVcurrentNimageAwidth{\DEVcurrentNfigureAwidth}% + % + %\def\DEVcurrentNimageAwidth{\linewidth}% + \DNimageAalign{#1}{#2}{#3}{#4}{% + \begin{minipage}[b]{0.4\linewidth}#5\end{minipage}}% + %\let\DEVcurrentNimageAwidth=\relax% + % + %\let\DEVcurrentNimageAwidth=\relax% +} +\providecommand{\DNcaption}[1]{\par\noindent{\slshape#1}} +\providecommand{\DNlegend}[1]{\DECauxiliaryspace#1} + +\providecommand{\DCborder}[1]{\fbox{#1}} +% No padding between image and border. +\providecommand{\DNimageCborder}[1]{\frame{#1}} + + +% Need to replace with language-specific stuff. Maybe look at +% csquotes.sty and ask the author for permission to use parts of it. +\providecommand{\DECtextleftdblquote}{``} +\providecommand{\DECtextrightdblquote}{''} + +% Table of contents: +\Dprovidelength{\Dtocininitialsectnumwidth}{2.4em} +\Dprovidelength{\Dtocadditionalsectnumwidth}{0.7em} +% Level inside a table of contents. While this is at -1, we are not +% inside a TOC. +\Dprovidecounter{Dtoclevel}{-1}% +\providecommand{\Dlocaltoc}{false}% +\providecommand{\DNtopicClocal}[1]{% + \renewcommand{\Dlocaltoc}{true}% + \addtolength{\Dtocsectnumwidth}{2\Dtocadditionalsectnumwidth}% + \addtolength{\Dtocindent}{-2\Dtocadditionalsectnumwidth}% + #1% + \addtolength{\Dtocindent}{2\Dtocadditionalsectnumwidth}% + \addtolength{\Dtocsectnumwidth}{-2\Dtocadditionalsectnumwidth}% + \renewcommand{\Dlocaltoc}{false}% +} +\Dprovidelength{\Dtocindent}{0pt}% +\Dprovidelength{\Dtocsectnumwidth}{\Dtocininitialsectnumwidth} +% Compensate for one additional TOC indentation space so that the +% top-level is unindented. +\addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth} +\addtolength{\Dtocindent}{-\Dtocsectnumwidth} +\providecommand{\Difinsidetoc}[2]{% + \ifthenelse{\not\equal{\theDtoclevel}{-1}}{#1}{#2}% +} +\providecommand{\DNgeneratedCsectnum}[1]{% + \Difinsidetoc{% + % Section number inside TOC. + \makebox[\Dtocsectnumwidth][l]{#1}% + }{% + % Section number inside section title. + #1\quad% + }% +} +\providecommand{\Dtocbulletlist}[1]{% + \addtocounter{Dtoclevel}{1}% + \addtolength{\Dtocindent}{\Dtocsectnumwidth}% + \addtolength{\Dtocsectnumwidth}{\Dtocadditionalsectnumwidth}% + #1% + \addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}% + \addtolength{\Dtocindent}{-\Dtocsectnumwidth}% + \addtocounter{Dtoclevel}{-1}% +} + + +% For \DECpixelunit, the length value is pre-multiplied with 0.75, so by +% specifying "pt" we get the same notion of "pixel" as graphicx. +\providecommand{\DECpixelunit}{pt} +% Normally lengths are relative to the current linewidth. +\providecommand{\DECrelativeunit}{\linewidth} + + +% ACTION: These commands actually *do* something. +% Ultimately, everything should be done here, and no active content should be +% above (not even \usepackage). + +\DSearly +\DSpackages +\DSfrenchspacing +\DSsymbols +\DSlate + +\makeatother diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/unicode_map.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/newlatex2e/unicode_map.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,2369 @@ +# $Id$ +# Author: Lea Wiemann +# Copyright: This file has been placed in the public domain. + +# This is a mapping of Unicode characters to LaTeX equivalents. +# The information has been extracted from +# , written by +# David Carlisle and Sebastian Rahtz. +# +# The extraction has been done by the "create_unimap.py" script +# located at . + +unicode_map = {u'\xa0': '$~$', +u'\xa1': '{\\textexclamdown}', +u'\xa2': '{\\textcent}', +u'\xa3': '{\\textsterling}', +u'\xa4': '{\\textcurrency}', +u'\xa5': '{\\textyen}', +u'\xa6': '{\\textbrokenbar}', +u'\xa7': '{\\textsection}', +u'\xa8': '{\\textasciidieresis}', +u'\xa9': '{\\textcopyright}', +u'\xaa': '{\\textordfeminine}', +u'\xab': '{\\guillemotleft}', +u'\xac': '$\\lnot$', +u'\xad': '$\\-$', +u'\xae': '{\\textregistered}', +u'\xaf': '{\\textasciimacron}', +u'\xb0': '{\\textdegree}', +u'\xb1': '$\\pm$', +u'\xb2': '${^2}$', +u'\xb3': '${^3}$', +u'\xb4': '{\\textasciiacute}', +u'\xb5': '$\\mathrm{\\mu}$', +u'\xb6': '{\\textparagraph}', +u'\xb7': '$\\cdot$', +u'\xb8': '{\\c{}}', +u'\xb9': '${^1}$', +u'\xba': '{\\textordmasculine}', +u'\xbb': '{\\guillemotright}', +u'\xbc': '{\\textonequarter}', +u'\xbd': '{\\textonehalf}', +u'\xbe': '{\\textthreequarters}', +u'\xbf': '{\\textquestiondown}', +u'\xc0': '{\\`{A}}', +u'\xc1': "{\\'{A}}", +u'\xc2': '{\\^{A}}', +u'\xc3': '{\\~{A}}', +u'\xc4': '{\\"{A}}', +u'\xc5': '{\\AA}', +u'\xc6': '{\\AE}', +u'\xc7': '{\\c{C}}', +u'\xc8': '{\\`{E}}', +u'\xc9': "{\\'{E}}", +u'\xca': '{\\^{E}}', +u'\xcb': '{\\"{E}}', +u'\xcc': '{\\`{I}}', +u'\xcd': "{\\'{I}}", +u'\xce': '{\\^{I}}', +u'\xcf': '{\\"{I}}', +u'\xd0': '{\\DH}', +u'\xd1': '{\\~{N}}', +u'\xd2': '{\\`{O}}', +u'\xd3': "{\\'{O}}", +u'\xd4': '{\\^{O}}', +u'\xd5': '{\\~{O}}', +u'\xd6': '{\\"{O}}', +u'\xd7': '{\\texttimes}', +u'\xd8': '{\\O}', +u'\xd9': '{\\`{U}}', +u'\xda': "{\\'{U}}", +u'\xdb': '{\\^{U}}', +u'\xdc': '{\\"{U}}', +u'\xdd': "{\\'{Y}}", +u'\xde': '{\\TH}', +u'\xdf': '{\\ss}', +u'\xe0': '{\\`{a}}', +u'\xe1': "{\\'{a}}", +u'\xe2': '{\\^{a}}', +u'\xe3': '{\\~{a}}', +u'\xe4': '{\\"{a}}', +u'\xe5': '{\\aa}', +u'\xe6': '{\\ae}', +u'\xe7': '{\\c{c}}', +u'\xe8': '{\\`{e}}', +u'\xe9': "{\\'{e}}", +u'\xea': '{\\^{e}}', +u'\xeb': '{\\"{e}}', +u'\xec': '{\\`{\\i}}', +u'\xed': "{\\'{\\i}}", +u'\xee': '{\\^{\\i}}', +u'\xef': '{\\"{\\i}}', +u'\xf0': '{\\dh}', +u'\xf1': '{\\~{n}}', +u'\xf2': '{\\`{o}}', +u'\xf3': "{\\'{o}}", +u'\xf4': '{\\^{o}}', +u'\xf5': '{\\~{o}}', +u'\xf6': '{\\"{o}}', +u'\xf7': '$\\div$', +u'\xf8': '{\\o}', +u'\xf9': '{\\`{u}}', +u'\xfa': "{\\'{u}}", +u'\xfb': '{\\^{u}}', +u'\xfc': '{\\"{u}}', +u'\xfd': "{\\'{y}}", +u'\xfe': '{\\th}', +u'\xff': '{\\"{y}}', +u'\u0100': '{\\={A}}', +u'\u0101': '{\\={a}}', +u'\u0102': '{\\u{A}}', +u'\u0103': '{\\u{a}}', +u'\u0104': '{\\k{A}}', +u'\u0105': '{\\k{a}}', +u'\u0106': "{\\'{C}}", +u'\u0107': "{\\'{c}}", +u'\u0108': '{\\^{C}}', +u'\u0109': '{\\^{c}}', +u'\u010a': '{\\.{C}}', +u'\u010b': '{\\.{c}}', +u'\u010c': '{\\v{C}}', +u'\u010d': '{\\v{c}}', +u'\u010e': '{\\v{D}}', +u'\u010f': '{\\v{d}}', +u'\u0110': '{\\DJ}', +u'\u0111': '{\\dj}', +u'\u0112': '{\\={E}}', +u'\u0113': '{\\={e}}', +u'\u0114': '{\\u{E}}', +u'\u0115': '{\\u{e}}', +u'\u0116': '{\\.{E}}', +u'\u0117': '{\\.{e}}', +u'\u0118': '{\\k{E}}', +u'\u0119': '{\\k{e}}', +u'\u011a': '{\\v{E}}', +u'\u011b': '{\\v{e}}', +u'\u011c': '{\\^{G}}', +u'\u011d': '{\\^{g}}', +u'\u011e': '{\\u{G}}', +u'\u011f': '{\\u{g}}', +u'\u0120': '{\\.{G}}', +u'\u0121': '{\\.{g}}', +u'\u0122': '{\\c{G}}', +u'\u0123': '{\\c{g}}', +u'\u0124': '{\\^{H}}', +u'\u0125': '{\\^{h}}', +u'\u0126': '{{\\fontencoding{LELA}\\selectfont\\char40}}', +u'\u0127': '$\\Elzxh$', +u'\u0128': '{\\~{I}}', +u'\u0129': '{\\~{\\i}}', +u'\u012a': '{\\={I}}', +u'\u012b': '{\\={\\i}}', +u'\u012c': '{\\u{I}}', +u'\u012d': '{\\u{\\i}}', +u'\u012e': '{\\k{I}}', +u'\u012f': '{\\k{i}}', +u'\u0130': '{\\.{I}}', +u'\u0131': '{\\i}', +u'\u0132': '{IJ}', +u'\u0133': '{ij}', +u'\u0134': '{\\^{J}}', +u'\u0135': '{\\^{\\j}}', +u'\u0136': '{\\c{K}}', +u'\u0137': '{\\c{k}}', +u'\u0138': '{{\\fontencoding{LELA}\\selectfont\\char91}}', +u'\u0139': "{\\'{L}}", +u'\u013a': "{\\'{l}}", +u'\u013b': '{\\c{L}}', +u'\u013c': '{\\c{l}}', +u'\u013d': '{\\v{L}}', +u'\u013e': '{\\v{l}}', +u'\u013f': '{{\\fontencoding{LELA}\\selectfont\\char201}}', +u'\u0140': '{{\\fontencoding{LELA}\\selectfont\\char202}}', +u'\u0141': '{\\L}', +u'\u0142': '{\\l}', +u'\u0143': "{\\'{N}}", +u'\u0144': "{\\'{n}}", +u'\u0145': '{\\c{N}}', +u'\u0146': '{\\c{n}}', +u'\u0147': '{\\v{N}}', +u'\u0148': '{\\v{n}}', +u'\u0149': "{'n}", +u'\u014a': '{\\NG}', +u'\u014b': '{\\ng}', +u'\u014c': '{\\={O}}', +u'\u014d': '{\\={o}}', +u'\u014e': '{\\u{O}}', +u'\u014f': '{\\u{o}}', +u'\u0150': '{\\H{O}}', +u'\u0151': '{\\H{o}}', +u'\u0152': '{\\OE}', +u'\u0153': '{\\oe}', +u'\u0154': "{\\'{R}}", +u'\u0155': "{\\'{r}}", +u'\u0156': '{\\c{R}}', +u'\u0157': '{\\c{r}}', +u'\u0158': '{\\v{R}}', +u'\u0159': '{\\v{r}}', +u'\u015a': "{\\'{S}}", +u'\u015b': "{\\'{s}}", +u'\u015c': '{\\^{S}}', +u'\u015d': '{\\^{s}}', +u'\u015e': '{\\c{S}}', +u'\u015f': '{\\c{s}}', +u'\u0160': '{\\v{S}}', +u'\u0161': '{\\v{s}}', +u'\u0162': '{\\c{T}}', +u'\u0163': '{\\c{t}}', +u'\u0164': '{\\v{T}}', +u'\u0165': '{\\v{t}}', +u'\u0166': '{{\\fontencoding{LELA}\\selectfont\\char47}}', +u'\u0167': '{{\\fontencoding{LELA}\\selectfont\\char63}}', +u'\u0168': '{\\~{U}}', +u'\u0169': '{\\~{u}}', +u'\u016a': '{\\={U}}', +u'\u016b': '{\\={u}}', +u'\u016c': '{\\u{U}}', +u'\u016d': '{\\u{u}}', +u'\u016e': '{\\r{U}}', +u'\u016f': '{\\r{u}}', +u'\u0170': '{\\H{U}}', +u'\u0171': '{\\H{u}}', +u'\u0172': '{\\k{U}}', +u'\u0173': '{\\k{u}}', +u'\u0174': '{\\^{W}}', +u'\u0175': '{\\^{w}}', +u'\u0176': '{\\^{Y}}', +u'\u0177': '{\\^{y}}', +u'\u0178': '{\\"{Y}}', +u'\u0179': "{\\'{Z}}", +u'\u017a': "{\\'{z}}", +u'\u017b': '{\\.{Z}}', +u'\u017c': '{\\.{z}}', +u'\u017d': '{\\v{Z}}', +u'\u017e': '{\\v{z}}', +u'\u0192': '$f$', +u'\u0195': '{\\texthvlig}', +u'\u019e': '{\\textnrleg}', +u'\u01aa': '$\\eth$', +u'\u01ba': '{{\\fontencoding{LELA}\\selectfont\\char195}}', +u'\u01c2': '{\\textdoublepipe}', +u'\u01f5': "{\\'{g}}", +u'\u0250': '$\\Elztrna$', +u'\u0252': '$\\Elztrnsa$', +u'\u0254': '$\\Elzopeno$', +u'\u0256': '$\\Elzrtld$', +u'\u0258': '{{\\fontencoding{LEIP}\\selectfont\\char61}}', +u'\u0259': '$\\Elzschwa$', +u'\u025b': '$\\varepsilon$', +u'\u0261': '{g}', +u'\u0263': '$\\Elzpgamma$', +u'\u0264': '$\\Elzpbgam$', +u'\u0265': '$\\Elztrnh$', +u'\u026c': '$\\Elzbtdl$', +u'\u026d': '$\\Elzrtll$', +u'\u026f': '$\\Elztrnm$', +u'\u0270': '$\\Elztrnmlr$', +u'\u0271': '$\\Elzltlmr$', +u'\u0272': '{\\Elzltln}', +u'\u0273': '$\\Elzrtln$', +u'\u0277': '$\\Elzclomeg$', +u'\u0278': '{\\textphi}', +u'\u0279': '$\\Elztrnr$', +u'\u027a': '$\\Elztrnrl$', +u'\u027b': '$\\Elzrttrnr$', +u'\u027c': '$\\Elzrl$', +u'\u027d': '$\\Elzrtlr$', +u'\u027e': '$\\Elzfhr$', +u'\u027f': '{{\\fontencoding{LEIP}\\selectfont\\char202}}', +u'\u0282': '$\\Elzrtls$', +u'\u0283': '$\\Elzesh$', +u'\u0287': '$\\Elztrnt$', +u'\u0288': '$\\Elzrtlt$', +u'\u028a': '$\\Elzpupsil$', +u'\u028b': '$\\Elzpscrv$', +u'\u028c': '$\\Elzinvv$', +u'\u028d': '$\\Elzinvw$', +u'\u028e': '$\\Elztrny$', +u'\u0290': '$\\Elzrtlz$', +u'\u0292': '$\\Elzyogh$', +u'\u0294': '$\\Elzglst$', +u'\u0295': '$\\Elzreglst$', +u'\u0296': '$\\Elzinglst$', +u'\u029e': '{\\textturnk}', +u'\u02a4': '$\\Elzdyogh$', +u'\u02a7': '$\\Elztesh$', +u'\u02bc': "{'}", +u'\u02c7': '{\\textasciicaron}', +u'\u02c8': '$\\Elzverts$', +u'\u02cc': '$\\Elzverti$', +u'\u02d0': '$\\Elzlmrk$', +u'\u02d1': '$\\Elzhlmrk$', +u'\u02d2': '$\\Elzsbrhr$', +u'\u02d3': '$\\Elzsblhr$', +u'\u02d4': '$\\Elzrais$', +u'\u02d5': '$\\Elzlow$', +u'\u02d8': '{\\textasciibreve}', +u'\u02d9': '{\\textperiodcentered}', +u'\u02da': '{\\r{}}', +u'\u02db': '{\\k{}}', +u'\u02dc': '{\\texttildelow}', +u'\u02dd': '{\\H{}}', +u'\u02e5': '{\\tone{55}}', +u'\u02e6': '{\\tone{44}}', +u'\u02e7': '{\\tone{33}}', +u'\u02e8': '{\\tone{22}}', +u'\u02e9': '{\\tone{11}}', +u'\u0300': '{\\`}', +u'\u0301': "{\\'}", +u'\u0302': '{\\^}', +u'\u0303': '{\\~}', +u'\u0304': '{\\=}', +u'\u0306': '{\\u}', +u'\u0307': '{\\.}', +u'\u0308': '{\\"}', +u'\u030a': '{\\r}', +u'\u030b': '{\\H}', +u'\u030c': '{\\v}', +u'\u030f': '{\\cyrchar\\C}', +u'\u0311': '{{\\fontencoding{LECO}\\selectfont\\char177}}', +u'\u0318': '{{\\fontencoding{LECO}\\selectfont\\char184}}', +u'\u0319': '{{\\fontencoding{LECO}\\selectfont\\char185}}', +u'\u0321': '$\\Elzpalh$', +u'\u0322': '{\\Elzrh}', +u'\u0327': '{\\c}', +u'\u0328': '{\\k}', +u'\u032a': '$\\Elzsbbrg$', +u'\u032b': '{{\\fontencoding{LECO}\\selectfont\\char203}}', +u'\u032f': '{{\\fontencoding{LECO}\\selectfont\\char207}}', +u'\u0335': '{\\Elzxl}', +u'\u0336': '{\\Elzbar}', +u'\u0337': '{{\\fontencoding{LECO}\\selectfont\\char215}}', +u'\u0338': '{{\\fontencoding{LECO}\\selectfont\\char216}}', +u'\u033a': '{{\\fontencoding{LECO}\\selectfont\\char218}}', +u'\u033b': '{{\\fontencoding{LECO}\\selectfont\\char219}}', +u'\u033c': '{{\\fontencoding{LECO}\\selectfont\\char220}}', +u'\u033d': '{{\\fontencoding{LECO}\\selectfont\\char221}}', +u'\u0361': '{{\\fontencoding{LECO}\\selectfont\\char225}}', +u'\u0386': "{\\'{A}}", +u'\u0388': "{\\'{E}}", +u'\u0389': "{\\'{H}}", +u'\u038a': "{\\'{}{I}}", +u'\u038c': "{\\'{}O}", +u'\u038e': "$\\mathrm{'Y}$", +u'\u038f': "$\\mathrm{'\\Omega}$", +u'\u0390': '$\\acute{\\ddot{\\iota}}$', +u'\u0391': '$\\Alpha$', +u'\u0392': '$\\Beta$', +u'\u0393': '$\\Gamma$', +u'\u0394': '$\\Delta$', +u'\u0395': '$\\Epsilon$', +u'\u0396': '$\\Zeta$', +u'\u0397': '$\\Eta$', +u'\u0398': '$\\Theta$', +u'\u0399': '$\\Iota$', +u'\u039a': '$\\Kappa$', +u'\u039b': '$\\Lambda$', +u'\u039c': '$M$', +u'\u039d': '$N$', +u'\u039e': '$\\Xi$', +u'\u039f': '$O$', +u'\u03a0': '$\\Pi$', +u'\u03a1': '$\\Rho$', +u'\u03a3': '$\\Sigma$', +u'\u03a4': '$\\Tau$', +u'\u03a5': '$\\Upsilon$', +u'\u03a6': '$\\Phi$', +u'\u03a7': '$\\Chi$', +u'\u03a8': '$\\Psi$', +u'\u03a9': '$\\Omega$', +u'\u03aa': '$\\mathrm{\\ddot{I}}$', +u'\u03ab': '$\\mathrm{\\ddot{Y}}$', +u'\u03ac': "{\\'{$\\alpha$}}", +u'\u03ad': '$\\acute{\\epsilon}$', +u'\u03ae': '$\\acute{\\eta}$', +u'\u03af': '$\\acute{\\iota}$', +u'\u03b0': '$\\acute{\\ddot{\\upsilon}}$', +u'\u03b1': '$\\alpha$', +u'\u03b2': '$\\beta$', +u'\u03b3': '$\\gamma$', +u'\u03b4': '$\\delta$', +u'\u03b5': '$\\epsilon$', +u'\u03b6': '$\\zeta$', +u'\u03b7': '$\\eta$', +u'\u03b8': '{\\texttheta}', +u'\u03b9': '$\\iota$', +u'\u03ba': '$\\kappa$', +u'\u03bb': '$\\lambda$', +u'\u03bc': '$\\mu$', +u'\u03bd': '$\\nu$', +u'\u03be': '$\\xi$', +u'\u03bf': '$o$', +u'\u03c0': '$\\pi$', +u'\u03c1': '$\\rho$', +u'\u03c2': '$\\varsigma$', +u'\u03c3': '$\\sigma$', +u'\u03c4': '$\\tau$', +u'\u03c5': '$\\upsilon$', +u'\u03c6': '$\\varphi$', +u'\u03c7': '$\\chi$', +u'\u03c8': '$\\psi$', +u'\u03c9': '$\\omega$', +u'\u03ca': '$\\ddot{\\iota}$', +u'\u03cb': '$\\ddot{\\upsilon}$', +u'\u03cc': "{\\'{o}}", +u'\u03cd': '$\\acute{\\upsilon}$', +u'\u03ce': '$\\acute{\\omega}$', +u'\u03d0': '{\\Pisymbol{ppi022}{87}}', +u'\u03d1': '{\\textvartheta}', +u'\u03d2': '$\\Upsilon$', +u'\u03d5': '$\\phi$', +u'\u03d6': '$\\varpi$', +u'\u03da': '$\\Stigma$', +u'\u03dc': '$\\Digamma$', +u'\u03dd': '$\\digamma$', +u'\u03de': '$\\Koppa$', +u'\u03e0': '$\\Sampi$', +u'\u03f0': '$\\varkappa$', +u'\u03f1': '$\\varrho$', +u'\u03f4': '{\\textTheta}', +u'\u03f6': '$\\backepsilon$', +u'\u0401': '{\\cyrchar\\CYRYO}', +u'\u0402': '{\\cyrchar\\CYRDJE}', +u'\u0403': "{\\cyrchar{\\'\\CYRG}}", +u'\u0404': '{\\cyrchar\\CYRIE}', +u'\u0405': '{\\cyrchar\\CYRDZE}', +u'\u0406': '{\\cyrchar\\CYRII}', +u'\u0407': '{\\cyrchar\\CYRYI}', +u'\u0408': '{\\cyrchar\\CYRJE}', +u'\u0409': '{\\cyrchar\\CYRLJE}', +u'\u040a': '{\\cyrchar\\CYRNJE}', +u'\u040b': '{\\cyrchar\\CYRTSHE}', +u'\u040c': "{\\cyrchar{\\'\\CYRK}}", +u'\u040e': '{\\cyrchar\\CYRUSHRT}', +u'\u040f': '{\\cyrchar\\CYRDZHE}', +u'\u0410': '{\\cyrchar\\CYRA}', +u'\u0411': '{\\cyrchar\\CYRB}', +u'\u0412': '{\\cyrchar\\CYRV}', +u'\u0413': '{\\cyrchar\\CYRG}', +u'\u0414': '{\\cyrchar\\CYRD}', +u'\u0415': '{\\cyrchar\\CYRE}', +u'\u0416': '{\\cyrchar\\CYRZH}', +u'\u0417': '{\\cyrchar\\CYRZ}', +u'\u0418': '{\\cyrchar\\CYRI}', +u'\u0419': '{\\cyrchar\\CYRISHRT}', +u'\u041a': '{\\cyrchar\\CYRK}', +u'\u041b': '{\\cyrchar\\CYRL}', +u'\u041c': '{\\cyrchar\\CYRM}', +u'\u041d': '{\\cyrchar\\CYRN}', +u'\u041e': '{\\cyrchar\\CYRO}', +u'\u041f': '{\\cyrchar\\CYRP}', +u'\u0420': '{\\cyrchar\\CYRR}', +u'\u0421': '{\\cyrchar\\CYRS}', +u'\u0422': '{\\cyrchar\\CYRT}', +u'\u0423': '{\\cyrchar\\CYRU}', +u'\u0424': '{\\cyrchar\\CYRF}', +u'\u0425': '{\\cyrchar\\CYRH}', +u'\u0426': '{\\cyrchar\\CYRC}', +u'\u0427': '{\\cyrchar\\CYRCH}', +u'\u0428': '{\\cyrchar\\CYRSH}', +u'\u0429': '{\\cyrchar\\CYRSHCH}', +u'\u042a': '{\\cyrchar\\CYRHRDSN}', +u'\u042b': '{\\cyrchar\\CYRERY}', +u'\u042c': '{\\cyrchar\\CYRSFTSN}', +u'\u042d': '{\\cyrchar\\CYREREV}', +u'\u042e': '{\\cyrchar\\CYRYU}', +u'\u042f': '{\\cyrchar\\CYRYA}', +u'\u0430': '{\\cyrchar\\cyra}', +u'\u0431': '{\\cyrchar\\cyrb}', +u'\u0432': '{\\cyrchar\\cyrv}', +u'\u0433': '{\\cyrchar\\cyrg}', +u'\u0434': '{\\cyrchar\\cyrd}', +u'\u0435': '{\\cyrchar\\cyre}', +u'\u0436': '{\\cyrchar\\cyrzh}', +u'\u0437': '{\\cyrchar\\cyrz}', +u'\u0438': '{\\cyrchar\\cyri}', +u'\u0439': '{\\cyrchar\\cyrishrt}', +u'\u043a': '{\\cyrchar\\cyrk}', +u'\u043b': '{\\cyrchar\\cyrl}', +u'\u043c': '{\\cyrchar\\cyrm}', +u'\u043d': '{\\cyrchar\\cyrn}', +u'\u043e': '{\\cyrchar\\cyro}', +u'\u043f': '{\\cyrchar\\cyrp}', +u'\u0440': '{\\cyrchar\\cyrr}', +u'\u0441': '{\\cyrchar\\cyrs}', +u'\u0442': '{\\cyrchar\\cyrt}', +u'\u0443': '{\\cyrchar\\cyru}', +u'\u0444': '{\\cyrchar\\cyrf}', +u'\u0445': '{\\cyrchar\\cyrh}', +u'\u0446': '{\\cyrchar\\cyrc}', +u'\u0447': '{\\cyrchar\\cyrch}', +u'\u0448': '{\\cyrchar\\cyrsh}', +u'\u0449': '{\\cyrchar\\cyrshch}', +u'\u044a': '{\\cyrchar\\cyrhrdsn}', +u'\u044b': '{\\cyrchar\\cyrery}', +u'\u044c': '{\\cyrchar\\cyrsftsn}', +u'\u044d': '{\\cyrchar\\cyrerev}', +u'\u044e': '{\\cyrchar\\cyryu}', +u'\u044f': '{\\cyrchar\\cyrya}', +u'\u0451': '{\\cyrchar\\cyryo}', +u'\u0452': '{\\cyrchar\\cyrdje}', +u'\u0453': "{\\cyrchar{\\'\\cyrg}}", +u'\u0454': '{\\cyrchar\\cyrie}', +u'\u0455': '{\\cyrchar\\cyrdze}', +u'\u0456': '{\\cyrchar\\cyrii}', +u'\u0457': '{\\cyrchar\\cyryi}', +u'\u0458': '{\\cyrchar\\cyrje}', +u'\u0459': '{\\cyrchar\\cyrlje}', +u'\u045a': '{\\cyrchar\\cyrnje}', +u'\u045b': '{\\cyrchar\\cyrtshe}', +u'\u045c': "{\\cyrchar{\\'\\cyrk}}", +u'\u045e': '{\\cyrchar\\cyrushrt}', +u'\u045f': '{\\cyrchar\\cyrdzhe}', +u'\u0460': '{\\cyrchar\\CYROMEGA}', +u'\u0461': '{\\cyrchar\\cyromega}', +u'\u0462': '{\\cyrchar\\CYRYAT}', +u'\u0464': '{\\cyrchar\\CYRIOTE}', +u'\u0465': '{\\cyrchar\\cyriote}', +u'\u0466': '{\\cyrchar\\CYRLYUS}', +u'\u0467': '{\\cyrchar\\cyrlyus}', +u'\u0468': '{\\cyrchar\\CYRIOTLYUS}', +u'\u0469': '{\\cyrchar\\cyriotlyus}', +u'\u046a': '{\\cyrchar\\CYRBYUS}', +u'\u046c': '{\\cyrchar\\CYRIOTBYUS}', +u'\u046d': '{\\cyrchar\\cyriotbyus}', +u'\u046e': '{\\cyrchar\\CYRKSI}', +u'\u046f': '{\\cyrchar\\cyrksi}', +u'\u0470': '{\\cyrchar\\CYRPSI}', +u'\u0471': '{\\cyrchar\\cyrpsi}', +u'\u0472': '{\\cyrchar\\CYRFITA}', +u'\u0474': '{\\cyrchar\\CYRIZH}', +u'\u0478': '{\\cyrchar\\CYRUK}', +u'\u0479': '{\\cyrchar\\cyruk}', +u'\u047a': '{\\cyrchar\\CYROMEGARND}', +u'\u047b': '{\\cyrchar\\cyromegarnd}', +u'\u047c': '{\\cyrchar\\CYROMEGATITLO}', +u'\u047d': '{\\cyrchar\\cyromegatitlo}', +u'\u047e': '{\\cyrchar\\CYROT}', +u'\u047f': '{\\cyrchar\\cyrot}', +u'\u0480': '{\\cyrchar\\CYRKOPPA}', +u'\u0481': '{\\cyrchar\\cyrkoppa}', +u'\u0482': '{\\cyrchar\\cyrthousands}', +u'\u0488': '{\\cyrchar\\cyrhundredthousands}', +u'\u0489': '{\\cyrchar\\cyrmillions}', +u'\u048c': '{\\cyrchar\\CYRSEMISFTSN}', +u'\u048d': '{\\cyrchar\\cyrsemisftsn}', +u'\u048e': '{\\cyrchar\\CYRRTICK}', +u'\u048f': '{\\cyrchar\\cyrrtick}', +u'\u0490': '{\\cyrchar\\CYRGUP}', +u'\u0491': '{\\cyrchar\\cyrgup}', +u'\u0492': '{\\cyrchar\\CYRGHCRS}', +u'\u0493': '{\\cyrchar\\cyrghcrs}', +u'\u0494': '{\\cyrchar\\CYRGHK}', +u'\u0495': '{\\cyrchar\\cyrghk}', +u'\u0496': '{\\cyrchar\\CYRZHDSC}', +u'\u0497': '{\\cyrchar\\cyrzhdsc}', +u'\u0498': '{\\cyrchar\\CYRZDSC}', +u'\u0499': '{\\cyrchar\\cyrzdsc}', +u'\u049a': '{\\cyrchar\\CYRKDSC}', +u'\u049b': '{\\cyrchar\\cyrkdsc}', +u'\u049c': '{\\cyrchar\\CYRKVCRS}', +u'\u049d': '{\\cyrchar\\cyrkvcrs}', +u'\u049e': '{\\cyrchar\\CYRKHCRS}', +u'\u049f': '{\\cyrchar\\cyrkhcrs}', +u'\u04a0': '{\\cyrchar\\CYRKBEAK}', +u'\u04a1': '{\\cyrchar\\cyrkbeak}', +u'\u04a2': '{\\cyrchar\\CYRNDSC}', +u'\u04a3': '{\\cyrchar\\cyrndsc}', +u'\u04a4': '{\\cyrchar\\CYRNG}', +u'\u04a5': '{\\cyrchar\\cyrng}', +u'\u04a6': '{\\cyrchar\\CYRPHK}', +u'\u04a7': '{\\cyrchar\\cyrphk}', +u'\u04a8': '{\\cyrchar\\CYRABHHA}', +u'\u04a9': '{\\cyrchar\\cyrabhha}', +u'\u04aa': '{\\cyrchar\\CYRSDSC}', +u'\u04ab': '{\\cyrchar\\cyrsdsc}', +u'\u04ac': '{\\cyrchar\\CYRTDSC}', +u'\u04ad': '{\\cyrchar\\cyrtdsc}', +u'\u04ae': '{\\cyrchar\\CYRY}', +u'\u04af': '{\\cyrchar\\cyry}', +u'\u04b0': '{\\cyrchar\\CYRYHCRS}', +u'\u04b1': '{\\cyrchar\\cyryhcrs}', +u'\u04b2': '{\\cyrchar\\CYRHDSC}', +u'\u04b3': '{\\cyrchar\\cyrhdsc}', +u'\u04b4': '{\\cyrchar\\CYRTETSE}', +u'\u04b5': '{\\cyrchar\\cyrtetse}', +u'\u04b6': '{\\cyrchar\\CYRCHRDSC}', +u'\u04b7': '{\\cyrchar\\cyrchrdsc}', +u'\u04b8': '{\\cyrchar\\CYRCHVCRS}', +u'\u04b9': '{\\cyrchar\\cyrchvcrs}', +u'\u04ba': '{\\cyrchar\\CYRSHHA}', +u'\u04bb': '{\\cyrchar\\cyrshha}', +u'\u04bc': '{\\cyrchar\\CYRABHCH}', +u'\u04bd': '{\\cyrchar\\cyrabhch}', +u'\u04be': '{\\cyrchar\\CYRABHCHDSC}', +u'\u04bf': '{\\cyrchar\\cyrabhchdsc}', +u'\u04c0': '{\\cyrchar\\CYRpalochka}', +u'\u04c3': '{\\cyrchar\\CYRKHK}', +u'\u04c4': '{\\cyrchar\\cyrkhk}', +u'\u04c7': '{\\cyrchar\\CYRNHK}', +u'\u04c8': '{\\cyrchar\\cyrnhk}', +u'\u04cb': '{\\cyrchar\\CYRCHLDSC}', +u'\u04cc': '{\\cyrchar\\cyrchldsc}', +u'\u04d4': '{\\cyrchar\\CYRAE}', +u'\u04d5': '{\\cyrchar\\cyrae}', +u'\u04d8': '{\\cyrchar\\CYRSCHWA}', +u'\u04d9': '{\\cyrchar\\cyrschwa}', +u'\u04e0': '{\\cyrchar\\CYRABHDZE}', +u'\u04e1': '{\\cyrchar\\cyrabhdze}', +u'\u04e8': '{\\cyrchar\\CYROTLD}', +u'\u04e9': '{\\cyrchar\\cyrotld}', +u'\u2002': '{\\hspace{0.6em}}', +u'\u2003': '{\\hspace{1em}}', +u'\u2004': '{\\hspace{0.33em}}', +u'\u2005': '{\\hspace{0.25em}}', +u'\u2006': '{\\hspace{0.166em}}', +u'\u2007': '{\\hphantom{0}}', +u'\u2008': '{\\hphantom{,}}', +u'\u2009': '{\\hspace{0.167em}}', +u'\u200a': '$\\mkern1mu$', +u'\u2010': '{-}', +u'\u2013': '{\\textendash}', +u'\u2014': '{\\textemdash}', +u'\u2015': '{\\rule{1em}{1pt}}', +u'\u2016': '$\\Vert$', +u'\u2018': '{`}', +u'\u2019': "{'}", +u'\u201a': '{,}', +u'\u201b': '$\\Elzreapos$', +u'\u201c': '{\\textquotedblleft}', +u'\u201d': '{\\textquotedblright}', +u'\u201e': '{,,}', +u'\u2020': '{\\textdagger}', +u'\u2021': '{\\textdaggerdbl}', +u'\u2022': '{\\textbullet}', +u'\u2024': '{.}', +u'\u2025': '{..}', +u'\u2026': '{\\ldots}', +u'\u2030': '{\\textperthousand}', +u'\u2031': '{\\textpertenthousand}', +u'\u2032': "${'}$", +u'\u2033': "${''}$", +u'\u2034': "${'''}$", +u'\u2035': '$\\backprime$', +u'\u2039': '{\\guilsinglleft}', +u'\u203a': '{\\guilsinglright}', +u'\u2057': "$''''$", +u'\u205f': '{\\mkern4mu}', +u'\u2060': '{\\nolinebreak}', +u'\u20a7': '{\\ensuremath{\\Elzpes}}', +u'\u20ac': '{\\mbox{\\texteuro}}', +u'\u20db': '$\\dddot$', +u'\u20dc': '$\\ddddot$', +u'\u2102': '$\\mathbb{C}$', +u'\u210a': '{\\mathscr{g}}', +u'\u210b': '$\\mathscr{H}$', +u'\u210c': '$\\mathfrak{H}$', +u'\u210d': '$\\mathbb{H}$', +u'\u210f': '$\\hslash$', +u'\u2110': '$\\mathscr{I}$', +u'\u2111': '$\\mathfrak{I}$', +u'\u2112': '$\\mathscr{L}$', +u'\u2113': '$\\mathscr{l}$', +u'\u2115': '$\\mathbb{N}$', +u'\u2116': '{\\cyrchar\\textnumero}', +u'\u2118': '$\\wp$', +u'\u2119': '$\\mathbb{P}$', +u'\u211a': '$\\mathbb{Q}$', +u'\u211b': '$\\mathscr{R}$', +u'\u211c': '$\\mathfrak{R}$', +u'\u211d': '$\\mathbb{R}$', +u'\u211e': '$\\Elzxrat$', +u'\u2122': '{\\texttrademark}', +u'\u2124': '$\\mathbb{Z}$', +u'\u2126': '$\\Omega$', +u'\u2127': '$\\mho$', +u'\u2128': '$\\mathfrak{Z}$', +u'\u2129': '$\\ElsevierGlyph{2129}$', +u'\u212b': '{\\AA}', +u'\u212c': '$\\mathscr{B}$', +u'\u212d': '$\\mathfrak{C}$', +u'\u212f': '$\\mathscr{e}$', +u'\u2130': '$\\mathscr{E}$', +u'\u2131': '$\\mathscr{F}$', +u'\u2133': '$\\mathscr{M}$', +u'\u2134': '$\\mathscr{o}$', +u'\u2135': '$\\aleph$', +u'\u2136': '$\\beth$', +u'\u2137': '$\\gimel$', +u'\u2138': '$\\daleth$', +u'\u2153': '$\\textfrac{1}{3}$', +u'\u2154': '$\\textfrac{2}{3}$', +u'\u2155': '$\\textfrac{1}{5}$', +u'\u2156': '$\\textfrac{2}{5}$', +u'\u2157': '$\\textfrac{3}{5}$', +u'\u2158': '$\\textfrac{4}{5}$', +u'\u2159': '$\\textfrac{1}{6}$', +u'\u215a': '$\\textfrac{5}{6}$', +u'\u215b': '$\\textfrac{1}{8}$', +u'\u215c': '$\\textfrac{3}{8}$', +u'\u215d': '$\\textfrac{5}{8}$', +u'\u215e': '$\\textfrac{7}{8}$', +u'\u2190': '$\\leftarrow$', +u'\u2191': '$\\uparrow$', +u'\u2192': '$\\rightarrow$', +u'\u2193': '$\\downarrow$', +u'\u2194': '$\\leftrightarrow$', +u'\u2195': '$\\updownarrow$', +u'\u2196': '$\\nwarrow$', +u'\u2197': '$\\nearrow$', +u'\u2198': '$\\searrow$', +u'\u2199': '$\\swarrow$', +u'\u219a': '$\\nleftarrow$', +u'\u219b': '$\\nrightarrow$', +u'\u219c': '$\\arrowwaveright$', +u'\u219d': '$\\arrowwaveright$', +u'\u219e': '$\\twoheadleftarrow$', +u'\u21a0': '$\\twoheadrightarrow$', +u'\u21a2': '$\\leftarrowtail$', +u'\u21a3': '$\\rightarrowtail$', +u'\u21a6': '$\\mapsto$', +u'\u21a9': '$\\hookleftarrow$', +u'\u21aa': '$\\hookrightarrow$', +u'\u21ab': '$\\looparrowleft$', +u'\u21ac': '$\\looparrowright$', +u'\u21ad': '$\\leftrightsquigarrow$', +u'\u21ae': '$\\nleftrightarrow$', +u'\u21b0': '$\\Lsh$', +u'\u21b1': '$\\Rsh$', +u'\u21b3': '$\\ElsevierGlyph{21B3}$', +u'\u21b6': '$\\curvearrowleft$', +u'\u21b7': '$\\curvearrowright$', +u'\u21ba': '$\\circlearrowleft$', +u'\u21bb': '$\\circlearrowright$', +u'\u21bc': '$\\leftharpoonup$', +u'\u21bd': '$\\leftharpoondown$', +u'\u21be': '$\\upharpoonright$', +u'\u21bf': '$\\upharpoonleft$', +u'\u21c0': '$\\rightharpoonup$', +u'\u21c1': '$\\rightharpoondown$', +u'\u21c2': '$\\downharpoonright$', +u'\u21c3': '$\\downharpoonleft$', +u'\u21c4': '$\\rightleftarrows$', +u'\u21c5': '$\\dblarrowupdown$', +u'\u21c6': '$\\leftrightarrows$', +u'\u21c7': '$\\leftleftarrows$', +u'\u21c8': '$\\upuparrows$', +u'\u21c9': '$\\rightrightarrows$', +u'\u21ca': '$\\downdownarrows$', +u'\u21cb': '$\\leftrightharpoons$', +u'\u21cc': '$\\rightleftharpoons$', +u'\u21cd': '$\\nLeftarrow$', +u'\u21ce': '$\\nLeftrightarrow$', +u'\u21cf': '$\\nRightarrow$', +u'\u21d0': '$\\Leftarrow$', +u'\u21d1': '$\\Uparrow$', +u'\u21d2': '$\\Rightarrow$', +u'\u21d3': '$\\Downarrow$', +u'\u21d4': '$\\Leftrightarrow$', +u'\u21d5': '$\\Updownarrow$', +u'\u21da': '$\\Lleftarrow$', +u'\u21db': '$\\Rrightarrow$', +u'\u21dd': '$\\rightsquigarrow$', +u'\u21f5': '$\\DownArrowUpArrow$', +u'\u2200': '$\\forall$', +u'\u2201': '$\\complement$', +u'\u2202': '$\\partial$', +u'\u2203': '$\\exists$', +u'\u2204': '$\\nexists$', +u'\u2205': '$\\varnothing$', +u'\u2207': '$\\nabla$', +u'\u2208': '$\\in$', +u'\u2209': '$\\not\\in$', +u'\u220b': '$\\ni$', +u'\u220c': '$\\not\\ni$', +u'\u220f': '$\\prod$', +u'\u2210': '$\\coprod$', +u'\u2211': '$\\sum$', +u'\u2212': '{-}', +u'\u2213': '$\\mp$', +u'\u2214': '$\\dotplus$', +u'\u2216': '$\\setminus$', +u'\u2217': '${_\\ast}$', +u'\u2218': '$\\circ$', +u'\u2219': '$\\bullet$', +u'\u221a': '$\\surd$', +u'\u221d': '$\\propto$', +u'\u221e': '$\\infty$', +u'\u221f': '$\\rightangle$', +u'\u2220': '$\\angle$', +u'\u2221': '$\\measuredangle$', +u'\u2222': '$\\sphericalangle$', +u'\u2223': '$\\mid$', +u'\u2224': '$\\nmid$', +u'\u2225': '$\\parallel$', +u'\u2226': '$\\nparallel$', +u'\u2227': '$\\wedge$', +u'\u2228': '$\\vee$', +u'\u2229': '$\\cap$', +u'\u222a': '$\\cup$', +u'\u222b': '$\\int$', +u'\u222c': '$\\int\\!\\int$', +u'\u222d': '$\\int\\!\\int\\!\\int$', +u'\u222e': '$\\oint$', +u'\u222f': '$\\surfintegral$', +u'\u2230': '$\\volintegral$', +u'\u2231': '$\\clwintegral$', +u'\u2232': '$\\ElsevierGlyph{2232}$', +u'\u2233': '$\\ElsevierGlyph{2233}$', +u'\u2234': '$\\therefore$', +u'\u2235': '$\\because$', +u'\u2237': '$\\Colon$', +u'\u2238': '$\\ElsevierGlyph{2238}$', +u'\u223a': '$\\mathbin{{:}\\!\\!{-}\\!\\!{:}}$', +u'\u223b': '$\\homothetic$', +u'\u223c': '$\\sim$', +u'\u223d': '$\\backsim$', +u'\u223e': '$\\lazysinv$', +u'\u2240': '$\\wr$', +u'\u2241': '$\\not\\sim$', +u'\u2242': '$\\ElsevierGlyph{2242}$', +u'\u2243': '$\\simeq$', +u'\u2244': '$\\not\\simeq$', +u'\u2245': '$\\cong$', +u'\u2246': '$\\approxnotequal$', +u'\u2247': '$\\not\\cong$', +u'\u2248': '$\\approx$', +u'\u2249': '$\\not\\approx$', +u'\u224a': '$\\approxeq$', +u'\u224b': '$\\tildetrpl$', +u'\u224c': '$\\allequal$', +u'\u224d': '$\\asymp$', +u'\u224e': '$\\Bumpeq$', +u'\u224f': '$\\bumpeq$', +u'\u2250': '$\\doteq$', +u'\u2251': '$\\doteqdot$', +u'\u2252': '$\\fallingdotseq$', +u'\u2253': '$\\risingdotseq$', +u'\u2254': '{:=}', +u'\u2255': '$=:$', +u'\u2256': '$\\eqcirc$', +u'\u2257': '$\\circeq$', +u'\u2259': '$\\estimates$', +u'\u225a': '$\\ElsevierGlyph{225A}$', +u'\u225b': '$\\starequal$', +u'\u225c': '$\\triangleq$', +u'\u225f': '$\\ElsevierGlyph{225F}$', +u'\u2260': '$\\not =$', +u'\u2261': '$\\equiv$', +u'\u2262': '$\\not\\equiv$', +u'\u2264': '$\\leq$', +u'\u2265': '$\\geq$', +u'\u2266': '$\\leqq$', +u'\u2267': '$\\geqq$', +u'\u2268': '$\\lneqq$', +u'\u2269': '$\\gneqq$', +u'\u226a': '$\\ll$', +u'\u226b': '$\\gg$', +u'\u226c': '$\\between$', +u'\u226d': '$\\not\\kern-0.3em\\times$', +u'\u226e': '$\\not<$', +u'\u226f': '$\\not>$', +u'\u2270': '$\\not\\leq$', +u'\u2271': '$\\not\\geq$', +u'\u2272': '$\\lessequivlnt$', +u'\u2273': '$\\greaterequivlnt$', +u'\u2274': '$\\ElsevierGlyph{2274}$', +u'\u2275': '$\\ElsevierGlyph{2275}$', +u'\u2276': '$\\lessgtr$', +u'\u2277': '$\\gtrless$', +u'\u2278': '$\\notlessgreater$', +u'\u2279': '$\\notgreaterless$', +u'\u227a': '$\\prec$', +u'\u227b': '$\\succ$', +u'\u227c': '$\\preccurlyeq$', +u'\u227d': '$\\succcurlyeq$', +u'\u227e': '$\\precapprox$', +u'\u227f': '$\\succapprox$', +u'\u2280': '$\\not\\prec$', +u'\u2281': '$\\not\\succ$', +u'\u2282': '$\\subset$', +u'\u2283': '$\\supset$', +u'\u2284': '$\\not\\subset$', +u'\u2285': '$\\not\\supset$', +u'\u2286': '$\\subseteq$', +u'\u2287': '$\\supseteq$', +u'\u2288': '$\\not\\subseteq$', +u'\u2289': '$\\not\\supseteq$', +u'\u228a': '$\\subsetneq$', +u'\u228b': '$\\supsetneq$', +u'\u228e': '$\\uplus$', +u'\u228f': '$\\sqsubset$', +u'\u2290': '$\\sqsupset$', +u'\u2291': '$\\sqsubseteq$', +u'\u2292': '$\\sqsupseteq$', +u'\u2293': '$\\sqcap$', +u'\u2294': '$\\sqcup$', +u'\u2295': '$\\oplus$', +u'\u2296': '$\\ominus$', +u'\u2297': '$\\otimes$', +u'\u2298': '$\\oslash$', +u'\u2299': '$\\odot$', +u'\u229a': '$\\circledcirc$', +u'\u229b': '$\\circledast$', +u'\u229d': '$\\circleddash$', +u'\u229e': '$\\boxplus$', +u'\u229f': '$\\boxminus$', +u'\u22a0': '$\\boxtimes$', +u'\u22a1': '$\\boxdot$', +u'\u22a2': '$\\vdash$', +u'\u22a3': '$\\dashv$', +u'\u22a4': '$\\top$', +u'\u22a5': '$\\perp$', +u'\u22a7': '$\\truestate$', +u'\u22a8': '$\\forcesextra$', +u'\u22a9': '$\\Vdash$', +u'\u22aa': '$\\Vvdash$', +u'\u22ab': '$\\VDash$', +u'\u22ac': '$\\nvdash$', +u'\u22ad': '$\\nvDash$', +u'\u22ae': '$\\nVdash$', +u'\u22af': '$\\nVDash$', +u'\u22b2': '$\\vartriangleleft$', +u'\u22b3': '$\\vartriangleright$', +u'\u22b4': '$\\trianglelefteq$', +u'\u22b5': '$\\trianglerighteq$', +u'\u22b6': '$\\original$', +u'\u22b7': '$\\image$', +u'\u22b8': '$\\multimap$', +u'\u22b9': '$\\hermitconjmatrix$', +u'\u22ba': '$\\intercal$', +u'\u22bb': '$\\veebar$', +u'\u22be': '$\\rightanglearc$', +u'\u22c0': '$\\ElsevierGlyph{22C0}$', +u'\u22c1': '$\\ElsevierGlyph{22C1}$', +u'\u22c2': '$\\bigcap$', +u'\u22c3': '$\\bigcup$', +u'\u22c4': '$\\diamond$', +u'\u22c5': '$\\cdot$', +u'\u22c6': '$\\star$', +u'\u22c7': '$\\divideontimes$', +u'\u22c8': '$\\bowtie$', +u'\u22c9': '$\\ltimes$', +u'\u22ca': '$\\rtimes$', +u'\u22cb': '$\\leftthreetimes$', +u'\u22cc': '$\\rightthreetimes$', +u'\u22cd': '$\\backsimeq$', +u'\u22ce': '$\\curlyvee$', +u'\u22cf': '$\\curlywedge$', +u'\u22d0': '$\\Subset$', +u'\u22d1': '$\\Supset$', +u'\u22d2': '$\\Cap$', +u'\u22d3': '$\\Cup$', +u'\u22d4': '$\\pitchfork$', +u'\u22d6': '$\\lessdot$', +u'\u22d7': '$\\gtrdot$', +u'\u22d8': '$\\verymuchless$', +u'\u22d9': '$\\verymuchgreater$', +u'\u22da': '$\\lesseqgtr$', +u'\u22db': '$\\gtreqless$', +u'\u22de': '$\\curlyeqprec$', +u'\u22df': '$\\curlyeqsucc$', +u'\u22e2': '$\\not\\sqsubseteq$', +u'\u22e3': '$\\not\\sqsupseteq$', +u'\u22e5': '$\\Elzsqspne$', +u'\u22e6': '$\\lnsim$', +u'\u22e7': '$\\gnsim$', +u'\u22e8': '$\\precedesnotsimilar$', +u'\u22e9': '$\\succnsim$', +u'\u22ea': '$\\ntriangleleft$', +u'\u22eb': '$\\ntriangleright$', +u'\u22ec': '$\\ntrianglelefteq$', +u'\u22ed': '$\\ntrianglerighteq$', +u'\u22ee': '$\\vdots$', +u'\u22ef': '$\\cdots$', +u'\u22f0': '$\\upslopeellipsis$', +u'\u22f1': '$\\downslopeellipsis$', +u'\u2305': '{\\barwedge}', +u'\u2306': '$\\perspcorrespond$', +u'\u2308': '$\\lceil$', +u'\u2309': '$\\rceil$', +u'\u230a': '$\\lfloor$', +u'\u230b': '$\\rfloor$', +u'\u2315': '$\\recorder$', +u'\u2316': '$\\mathchar"2208$', +u'\u231c': '$\\ulcorner$', +u'\u231d': '$\\urcorner$', +u'\u231e': '$\\llcorner$', +u'\u231f': '$\\lrcorner$', +u'\u2322': '$\\frown$', +u'\u2323': '$\\smile$', +u'\u2329': '$\\langle$', +u'\u232a': '$\\rangle$', +u'\u233d': '$\\ElsevierGlyph{E838}$', +u'\u23a3': '$\\Elzdlcorn$', +u'\u23b0': '$\\lmoustache$', +u'\u23b1': '$\\rmoustache$', +u'\u2423': '{\\textvisiblespace}', +u'\u2460': '{\\ding{172}}', +u'\u2461': '{\\ding{173}}', +u'\u2462': '{\\ding{174}}', +u'\u2463': '{\\ding{175}}', +u'\u2464': '{\\ding{176}}', +u'\u2465': '{\\ding{177}}', +u'\u2466': '{\\ding{178}}', +u'\u2467': '{\\ding{179}}', +u'\u2468': '{\\ding{180}}', +u'\u2469': '{\\ding{181}}', +u'\u24c8': '$\\circledS$', +u'\u2506': '$\\Elzdshfnc$', +u'\u2519': '$\\Elzsqfnw$', +u'\u2571': '$\\diagup$', +u'\u25a0': '{\\ding{110}}', +u'\u25a1': '$\\square$', +u'\u25aa': '$\\blacksquare$', +u'\u25ad': '$\\fbox{~~}$', +u'\u25af': '$\\Elzvrecto$', +u'\u25b1': '$\\ElsevierGlyph{E381}$', +u'\u25b2': '{\\ding{115}}', +u'\u25b3': '$\\bigtriangleup$', +u'\u25b4': '$\\blacktriangle$', +u'\u25b5': '$\\vartriangle$', +u'\u25b8': '$\\blacktriangleright$', +u'\u25b9': '$\\triangleright$', +u'\u25bc': '{\\ding{116}}', +u'\u25bd': '$\\bigtriangledown$', +u'\u25be': '$\\blacktriangledown$', +u'\u25bf': '$\\triangledown$', +u'\u25c2': '$\\blacktriangleleft$', +u'\u25c3': '$\\triangleleft$', +u'\u25c6': '{\\ding{117}}', +u'\u25ca': '$\\lozenge$', +u'\u25cb': '$\\bigcirc$', +u'\u25cf': '{\\ding{108}}', +u'\u25d0': '$\\Elzcirfl$', +u'\u25d1': '$\\Elzcirfr$', +u'\u25d2': '$\\Elzcirfb$', +u'\u25d7': '{\\ding{119}}', +u'\u25d8': '$\\Elzrvbull$', +u'\u25e7': '$\\Elzsqfl$', +u'\u25e8': '$\\Elzsqfr$', +u'\u25ea': '$\\Elzsqfse$', +u'\u25ef': '$\\bigcirc$', +u'\u2605': '{\\ding{72}}', +u'\u2606': '{\\ding{73}}', +u'\u260e': '{\\ding{37}}', +u'\u261b': '{\\ding{42}}', +u'\u261e': '{\\ding{43}}', +u'\u263e': '{\\rightmoon}', +u'\u263f': '{\\mercury}', +u'\u2640': '{\\venus}', +u'\u2642': '{\\male}', +u'\u2643': '{\\jupiter}', +u'\u2644': '{\\saturn}', +u'\u2645': '{\\uranus}', +u'\u2646': '{\\neptune}', +u'\u2647': '{\\pluto}', +u'\u2648': '{\\aries}', +u'\u2649': '{\\taurus}', +u'\u264a': '{\\gemini}', +u'\u264b': '{\\cancer}', +u'\u264c': '{\\leo}', +u'\u264d': '{\\virgo}', +u'\u264e': '{\\libra}', +u'\u264f': '{\\scorpio}', +u'\u2650': '{\\sagittarius}', +u'\u2651': '{\\capricornus}', +u'\u2652': '{\\aquarius}', +u'\u2653': '{\\pisces}', +u'\u2660': '{\\ding{171}}', +u'\u2662': '$\\diamond$', +u'\u2663': '{\\ding{168}}', +u'\u2665': '{\\ding{170}}', +u'\u2666': '{\\ding{169}}', +u'\u2669': '{\\quarternote}', +u'\u266a': '{\\eighthnote}', +u'\u266d': '$\\flat$', +u'\u266e': '$\\natural$', +u'\u266f': '$\\sharp$', +u'\u2701': '{\\ding{33}}', +u'\u2702': '{\\ding{34}}', +u'\u2703': '{\\ding{35}}', +u'\u2704': '{\\ding{36}}', +u'\u2706': '{\\ding{38}}', +u'\u2707': '{\\ding{39}}', +u'\u2708': '{\\ding{40}}', +u'\u2709': '{\\ding{41}}', +u'\u270c': '{\\ding{44}}', +u'\u270d': '{\\ding{45}}', +u'\u270e': '{\\ding{46}}', +u'\u270f': '{\\ding{47}}', +u'\u2710': '{\\ding{48}}', +u'\u2711': '{\\ding{49}}', +u'\u2712': '{\\ding{50}}', +u'\u2713': '{\\ding{51}}', +u'\u2714': '{\\ding{52}}', +u'\u2715': '{\\ding{53}}', +u'\u2716': '{\\ding{54}}', +u'\u2717': '{\\ding{55}}', +u'\u2718': '{\\ding{56}}', +u'\u2719': '{\\ding{57}}', +u'\u271a': '{\\ding{58}}', +u'\u271b': '{\\ding{59}}', +u'\u271c': '{\\ding{60}}', +u'\u271d': '{\\ding{61}}', +u'\u271e': '{\\ding{62}}', +u'\u271f': '{\\ding{63}}', +u'\u2720': '{\\ding{64}}', +u'\u2721': '{\\ding{65}}', +u'\u2722': '{\\ding{66}}', +u'\u2723': '{\\ding{67}}', +u'\u2724': '{\\ding{68}}', +u'\u2725': '{\\ding{69}}', +u'\u2726': '{\\ding{70}}', +u'\u2727': '{\\ding{71}}', +u'\u2729': '{\\ding{73}}', +u'\u272a': '{\\ding{74}}', +u'\u272b': '{\\ding{75}}', +u'\u272c': '{\\ding{76}}', +u'\u272d': '{\\ding{77}}', +u'\u272e': '{\\ding{78}}', +u'\u272f': '{\\ding{79}}', +u'\u2730': '{\\ding{80}}', +u'\u2731': '{\\ding{81}}', +u'\u2732': '{\\ding{82}}', +u'\u2733': '{\\ding{83}}', +u'\u2734': '{\\ding{84}}', +u'\u2735': '{\\ding{85}}', +u'\u2736': '{\\ding{86}}', +u'\u2737': '{\\ding{87}}', +u'\u2738': '{\\ding{88}}', +u'\u2739': '{\\ding{89}}', +u'\u273a': '{\\ding{90}}', +u'\u273b': '{\\ding{91}}', +u'\u273c': '{\\ding{92}}', +u'\u273d': '{\\ding{93}}', +u'\u273e': '{\\ding{94}}', +u'\u273f': '{\\ding{95}}', +u'\u2740': '{\\ding{96}}', +u'\u2741': '{\\ding{97}}', +u'\u2742': '{\\ding{98}}', +u'\u2743': '{\\ding{99}}', +u'\u2744': '{\\ding{100}}', +u'\u2745': '{\\ding{101}}', +u'\u2746': '{\\ding{102}}', +u'\u2747': '{\\ding{103}}', +u'\u2748': '{\\ding{104}}', +u'\u2749': '{\\ding{105}}', +u'\u274a': '{\\ding{106}}', +u'\u274b': '{\\ding{107}}', +u'\u274d': '{\\ding{109}}', +u'\u274f': '{\\ding{111}}', +u'\u2750': '{\\ding{112}}', +u'\u2751': '{\\ding{113}}', +u'\u2752': '{\\ding{114}}', +u'\u2756': '{\\ding{118}}', +u'\u2758': '{\\ding{120}}', +u'\u2759': '{\\ding{121}}', +u'\u275a': '{\\ding{122}}', +u'\u275b': '{\\ding{123}}', +u'\u275c': '{\\ding{124}}', +u'\u275d': '{\\ding{125}}', +u'\u275e': '{\\ding{126}}', +u'\u2761': '{\\ding{161}}', +u'\u2762': '{\\ding{162}}', +u'\u2763': '{\\ding{163}}', +u'\u2764': '{\\ding{164}}', +u'\u2765': '{\\ding{165}}', +u'\u2766': '{\\ding{166}}', +u'\u2767': '{\\ding{167}}', +u'\u2776': '{\\ding{182}}', +u'\u2777': '{\\ding{183}}', +u'\u2778': '{\\ding{184}}', +u'\u2779': '{\\ding{185}}', +u'\u277a': '{\\ding{186}}', +u'\u277b': '{\\ding{187}}', +u'\u277c': '{\\ding{188}}', +u'\u277d': '{\\ding{189}}', +u'\u277e': '{\\ding{190}}', +u'\u277f': '{\\ding{191}}', +u'\u2780': '{\\ding{192}}', +u'\u2781': '{\\ding{193}}', +u'\u2782': '{\\ding{194}}', +u'\u2783': '{\\ding{195}}', +u'\u2784': '{\\ding{196}}', +u'\u2785': '{\\ding{197}}', +u'\u2786': '{\\ding{198}}', +u'\u2787': '{\\ding{199}}', +u'\u2788': '{\\ding{200}}', +u'\u2789': '{\\ding{201}}', +u'\u278a': '{\\ding{202}}', +u'\u278b': '{\\ding{203}}', +u'\u278c': '{\\ding{204}}', +u'\u278d': '{\\ding{205}}', +u'\u278e': '{\\ding{206}}', +u'\u278f': '{\\ding{207}}', +u'\u2790': '{\\ding{208}}', +u'\u2791': '{\\ding{209}}', +u'\u2792': '{\\ding{210}}', +u'\u2793': '{\\ding{211}}', +u'\u2794': '{\\ding{212}}', +u'\u2798': '{\\ding{216}}', +u'\u2799': '{\\ding{217}}', +u'\u279a': '{\\ding{218}}', +u'\u279b': '{\\ding{219}}', +u'\u279c': '{\\ding{220}}', +u'\u279d': '{\\ding{221}}', +u'\u279e': '{\\ding{222}}', +u'\u279f': '{\\ding{223}}', +u'\u27a0': '{\\ding{224}}', +u'\u27a1': '{\\ding{225}}', +u'\u27a2': '{\\ding{226}}', +u'\u27a3': '{\\ding{227}}', +u'\u27a4': '{\\ding{228}}', +u'\u27a5': '{\\ding{229}}', +u'\u27a6': '{\\ding{230}}', +u'\u27a7': '{\\ding{231}}', +u'\u27a8': '{\\ding{232}}', +u'\u27a9': '{\\ding{233}}', +u'\u27aa': '{\\ding{234}}', +u'\u27ab': '{\\ding{235}}', +u'\u27ac': '{\\ding{236}}', +u'\u27ad': '{\\ding{237}}', +u'\u27ae': '{\\ding{238}}', +u'\u27af': '{\\ding{239}}', +u'\u27b1': '{\\ding{241}}', +u'\u27b2': '{\\ding{242}}', +u'\u27b3': '{\\ding{243}}', +u'\u27b4': '{\\ding{244}}', +u'\u27b5': '{\\ding{245}}', +u'\u27b6': '{\\ding{246}}', +u'\u27b7': '{\\ding{247}}', +u'\u27b8': '{\\ding{248}}', +u'\u27b9': '{\\ding{249}}', +u'\u27ba': '{\\ding{250}}', +u'\u27bb': '{\\ding{251}}', +u'\u27bc': '{\\ding{252}}', +u'\u27bd': '{\\ding{253}}', +u'\u27be': '{\\ding{254}}', +u'\u27f5': '$\\longleftarrow$', +u'\u27f6': '$\\longrightarrow$', +u'\u27f7': '$\\longleftrightarrow$', +u'\u27f8': '$\\Longleftarrow$', +u'\u27f9': '$\\Longrightarrow$', +u'\u27fa': '$\\Longleftrightarrow$', +u'\u27fc': '$\\longmapsto$', +u'\u27ff': '$\\sim\\joinrel\\leadsto$', +u'\u2905': '$\\ElsevierGlyph{E212}$', +u'\u2912': '$\\UpArrowBar$', +u'\u2913': '$\\DownArrowBar$', +u'\u2923': '$\\ElsevierGlyph{E20C}$', +u'\u2924': '$\\ElsevierGlyph{E20D}$', +u'\u2925': '$\\ElsevierGlyph{E20B}$', +u'\u2926': '$\\ElsevierGlyph{E20A}$', +u'\u2927': '$\\ElsevierGlyph{E211}$', +u'\u2928': '$\\ElsevierGlyph{E20E}$', +u'\u2929': '$\\ElsevierGlyph{E20F}$', +u'\u292a': '$\\ElsevierGlyph{E210}$', +u'\u2933': '$\\ElsevierGlyph{E21C}$', +u'\u2936': '$\\ElsevierGlyph{E21A}$', +u'\u2937': '$\\ElsevierGlyph{E219}$', +u'\u2940': '$\\Elolarr$', +u'\u2941': '$\\Elorarr$', +u'\u2942': '$\\ElzRlarr$', +u'\u2944': '$\\ElzrLarr$', +u'\u2947': '$\\Elzrarrx$', +u'\u294e': '$\\LeftRightVector$', +u'\u294f': '$\\RightUpDownVector$', +u'\u2950': '$\\DownLeftRightVector$', +u'\u2951': '$\\LeftUpDownVector$', +u'\u2952': '$\\LeftVectorBar$', +u'\u2953': '$\\RightVectorBar$', +u'\u2954': '$\\RightUpVectorBar$', +u'\u2955': '$\\RightDownVectorBar$', +u'\u2956': '$\\DownLeftVectorBar$', +u'\u2957': '$\\DownRightVectorBar$', +u'\u2958': '$\\LeftUpVectorBar$', +u'\u2959': '$\\LeftDownVectorBar$', +u'\u295a': '$\\LeftTeeVector$', +u'\u295b': '$\\RightTeeVector$', +u'\u295c': '$\\RightUpTeeVector$', +u'\u295d': '$\\RightDownTeeVector$', +u'\u295e': '$\\DownLeftTeeVector$', +u'\u295f': '$\\DownRightTeeVector$', +u'\u2960': '$\\LeftUpTeeVector$', +u'\u2961': '$\\LeftDownTeeVector$', +u'\u296e': '$\\UpEquilibrium$', +u'\u296f': '$\\ReverseUpEquilibrium$', +u'\u2970': '$\\RoundImplies$', +u'\u297c': '$\\ElsevierGlyph{E214}$', +u'\u297d': '$\\ElsevierGlyph{E215}$', +u'\u2980': '$\\Elztfnc$', +u'\u2985': '$\\ElsevierGlyph{3018}$', +u'\u2986': '$\\Elroang$', +u'\u2993': '$<\\kern-0.58em($', +u'\u2994': '$\\ElsevierGlyph{E291}$', +u'\u2999': '$\\Elzddfnc$', +u'\u299c': '$\\Angle$', +u'\u29a0': '$\\Elzlpargt$', +u'\u29b5': '$\\ElsevierGlyph{E260}$', +u'\u29b6': '$\\ElsevierGlyph{E61B}$', +u'\u29ca': '$\\ElzLap$', +u'\u29cb': '$\\Elzdefas$', +u'\u29cf': '$\\LeftTriangleBar$', +u'\u29d0': '$\\RightTriangleBar$', +u'\u29dc': '$\\ElsevierGlyph{E372}$', +u'\u29eb': '$\\blacklozenge$', +u'\u29f4': '$\\RuleDelayed$', +u'\u2a04': '$\\Elxuplus$', +u'\u2a05': '$\\ElzThr$', +u'\u2a06': '$\\Elxsqcup$', +u'\u2a07': '$\\ElzInf$', +u'\u2a08': '$\\ElzSup$', +u'\u2a0d': '$\\ElzCint$', +u'\u2a0f': '$\\clockoint$', +u'\u2a10': '$\\ElsevierGlyph{E395}$', +u'\u2a16': '$\\sqrint$', +u'\u2a25': '$\\ElsevierGlyph{E25A}$', +u'\u2a2a': '$\\ElsevierGlyph{E25B}$', +u'\u2a2d': '$\\ElsevierGlyph{E25C}$', +u'\u2a2e': '$\\ElsevierGlyph{E25D}$', +u'\u2a2f': '$\\ElzTimes$', +u'\u2a34': '$\\ElsevierGlyph{E25E}$', +u'\u2a35': '$\\ElsevierGlyph{E25E}$', +u'\u2a3c': '$\\ElsevierGlyph{E259}$', +u'\u2a3f': '$\\amalg$', +u'\u2a53': '$\\ElzAnd$', +u'\u2a54': '$\\ElzOr$', +u'\u2a55': '$\\ElsevierGlyph{E36E}$', +u'\u2a56': '$\\ElOr$', +u'\u2a5e': '$\\perspcorrespond$', +u'\u2a5f': '$\\Elzminhat$', +u'\u2a63': '$\\ElsevierGlyph{225A}$', +u'\u2a6e': '$\\stackrel{*}{=}$', +u'\u2a75': '$\\Equal$', +u'\u2a7d': '$\\leqslant$', +u'\u2a7e': '$\\geqslant$', +u'\u2a85': '$\\lessapprox$', +u'\u2a86': '$\\gtrapprox$', +u'\u2a87': '$\\lneq$', +u'\u2a88': '$\\gneq$', +u'\u2a89': '$\\lnapprox$', +u'\u2a8a': '$\\gnapprox$', +u'\u2a8b': '$\\lesseqqgtr$', +u'\u2a8c': '$\\gtreqqless$', +u'\u2a95': '$\\eqslantless$', +u'\u2a96': '$\\eqslantgtr$', +u'\u2a9d': '$\\Pisymbol{ppi020}{117}$', +u'\u2a9e': '$\\Pisymbol{ppi020}{105}$', +u'\u2aa1': '$\\NestedLessLess$', +u'\u2aa2': '$\\NestedGreaterGreater$', +u'\u2aaf': '$\\preceq$', +u'\u2ab0': '$\\succeq$', +u'\u2ab5': '$\\precneqq$', +u'\u2ab6': '$\\succneqq$', +u'\u2ab7': '$\\precapprox$', +u'\u2ab8': '$\\succapprox$', +u'\u2ab9': '$\\precnapprox$', +u'\u2aba': '$\\succnapprox$', +u'\u2ac5': '$\\subseteqq$', +u'\u2ac6': '$\\supseteqq$', +u'\u2acb': '$\\subsetneqq$', +u'\u2acc': '$\\supsetneqq$', +u'\u2aeb': '$\\ElsevierGlyph{E30D}$', +u'\u2af6': '$\\Elztdcol$', +u'\u2afd': '${{/}\\!\\!{/}}$', +u'\u300a': '$\\ElsevierGlyph{300A}$', +u'\u300b': '$\\ElsevierGlyph{300B}$', +u'\u3018': '$\\ElsevierGlyph{3018}$', +u'\u3019': '$\\ElsevierGlyph{3019}$', +u'\u301a': '$\\openbracketleft$', +u'\u301b': '$\\openbracketright$', +u'\ufb00': '{ff}', +u'\ufb01': '{fi}', +u'\ufb02': '{fl}', +u'\ufb03': '{ffi}', +u'\ufb04': '{ffl}', +u'\U0001d400': '$\\mathbf{A}$', +u'\U0001d401': '$\\mathbf{B}$', +u'\U0001d402': '$\\mathbf{C}$', +u'\U0001d403': '$\\mathbf{D}$', +u'\U0001d404': '$\\mathbf{E}$', +u'\U0001d405': '$\\mathbf{F}$', +u'\U0001d406': '$\\mathbf{G}$', +u'\U0001d407': '$\\mathbf{H}$', +u'\U0001d408': '$\\mathbf{I}$', +u'\U0001d409': '$\\mathbf{J}$', +u'\U0001d40a': '$\\mathbf{K}$', +u'\U0001d40b': '$\\mathbf{L}$', +u'\U0001d40c': '$\\mathbf{M}$', +u'\U0001d40d': '$\\mathbf{N}$', +u'\U0001d40e': '$\\mathbf{O}$', +u'\U0001d40f': '$\\mathbf{P}$', +u'\U0001d410': '$\\mathbf{Q}$', +u'\U0001d411': '$\\mathbf{R}$', +u'\U0001d412': '$\\mathbf{S}$', +u'\U0001d413': '$\\mathbf{T}$', +u'\U0001d414': '$\\mathbf{U}$', +u'\U0001d415': '$\\mathbf{V}$', +u'\U0001d416': '$\\mathbf{W}$', +u'\U0001d417': '$\\mathbf{X}$', +u'\U0001d418': '$\\mathbf{Y}$', +u'\U0001d419': '$\\mathbf{Z}$', +u'\U0001d41a': '$\\mathbf{a}$', +u'\U0001d41b': '$\\mathbf{b}$', +u'\U0001d41c': '$\\mathbf{c}$', +u'\U0001d41d': '$\\mathbf{d}$', +u'\U0001d41e': '$\\mathbf{e}$', +u'\U0001d41f': '$\\mathbf{f}$', +u'\U0001d420': '$\\mathbf{g}$', +u'\U0001d421': '$\\mathbf{h}$', +u'\U0001d422': '$\\mathbf{i}$', +u'\U0001d423': '$\\mathbf{j}$', +u'\U0001d424': '$\\mathbf{k}$', +u'\U0001d425': '$\\mathbf{l}$', +u'\U0001d426': '$\\mathbf{m}$', +u'\U0001d427': '$\\mathbf{n}$', +u'\U0001d428': '$\\mathbf{o}$', +u'\U0001d429': '$\\mathbf{p}$', +u'\U0001d42a': '$\\mathbf{q}$', +u'\U0001d42b': '$\\mathbf{r}$', +u'\U0001d42c': '$\\mathbf{s}$', +u'\U0001d42d': '$\\mathbf{t}$', +u'\U0001d42e': '$\\mathbf{u}$', +u'\U0001d42f': '$\\mathbf{v}$', +u'\U0001d430': '$\\mathbf{w}$', +u'\U0001d431': '$\\mathbf{x}$', +u'\U0001d432': '$\\mathbf{y}$', +u'\U0001d433': '$\\mathbf{z}$', +u'\U0001d434': '$\\mathsl{A}$', +u'\U0001d435': '$\\mathsl{B}$', +u'\U0001d436': '$\\mathsl{C}$', +u'\U0001d437': '$\\mathsl{D}$', +u'\U0001d438': '$\\mathsl{E}$', +u'\U0001d439': '$\\mathsl{F}$', +u'\U0001d43a': '$\\mathsl{G}$', +u'\U0001d43b': '$\\mathsl{H}$', +u'\U0001d43c': '$\\mathsl{I}$', +u'\U0001d43d': '$\\mathsl{J}$', +u'\U0001d43e': '$\\mathsl{K}$', +u'\U0001d43f': '$\\mathsl{L}$', +u'\U0001d440': '$\\mathsl{M}$', +u'\U0001d441': '$\\mathsl{N}$', +u'\U0001d442': '$\\mathsl{O}$', +u'\U0001d443': '$\\mathsl{P}$', +u'\U0001d444': '$\\mathsl{Q}$', +u'\U0001d445': '$\\mathsl{R}$', +u'\U0001d446': '$\\mathsl{S}$', +u'\U0001d447': '$\\mathsl{T}$', +u'\U0001d448': '$\\mathsl{U}$', +u'\U0001d449': '$\\mathsl{V}$', +u'\U0001d44a': '$\\mathsl{W}$', +u'\U0001d44b': '$\\mathsl{X}$', +u'\U0001d44c': '$\\mathsl{Y}$', +u'\U0001d44d': '$\\mathsl{Z}$', +u'\U0001d44e': '$\\mathsl{a}$', +u'\U0001d44f': '$\\mathsl{b}$', +u'\U0001d450': '$\\mathsl{c}$', +u'\U0001d451': '$\\mathsl{d}$', +u'\U0001d452': '$\\mathsl{e}$', +u'\U0001d453': '$\\mathsl{f}$', +u'\U0001d454': '$\\mathsl{g}$', +u'\U0001d456': '$\\mathsl{i}$', +u'\U0001d457': '$\\mathsl{j}$', +u'\U0001d458': '$\\mathsl{k}$', +u'\U0001d459': '$\\mathsl{l}$', +u'\U0001d45a': '$\\mathsl{m}$', +u'\U0001d45b': '$\\mathsl{n}$', +u'\U0001d45c': '$\\mathsl{o}$', +u'\U0001d45d': '$\\mathsl{p}$', +u'\U0001d45e': '$\\mathsl{q}$', +u'\U0001d45f': '$\\mathsl{r}$', +u'\U0001d460': '$\\mathsl{s}$', +u'\U0001d461': '$\\mathsl{t}$', +u'\U0001d462': '$\\mathsl{u}$', +u'\U0001d463': '$\\mathsl{v}$', +u'\U0001d464': '$\\mathsl{w}$', +u'\U0001d465': '$\\mathsl{x}$', +u'\U0001d466': '$\\mathsl{y}$', +u'\U0001d467': '$\\mathsl{z}$', +u'\U0001d468': '$\\mathbit{A}$', +u'\U0001d469': '$\\mathbit{B}$', +u'\U0001d46a': '$\\mathbit{C}$', +u'\U0001d46b': '$\\mathbit{D}$', +u'\U0001d46c': '$\\mathbit{E}$', +u'\U0001d46d': '$\\mathbit{F}$', +u'\U0001d46e': '$\\mathbit{G}$', +u'\U0001d46f': '$\\mathbit{H}$', +u'\U0001d470': '$\\mathbit{I}$', +u'\U0001d471': '$\\mathbit{J}$', +u'\U0001d472': '$\\mathbit{K}$', +u'\U0001d473': '$\\mathbit{L}$', +u'\U0001d474': '$\\mathbit{M}$', +u'\U0001d475': '$\\mathbit{N}$', +u'\U0001d476': '$\\mathbit{O}$', +u'\U0001d477': '$\\mathbit{P}$', +u'\U0001d478': '$\\mathbit{Q}$', +u'\U0001d479': '$\\mathbit{R}$', +u'\U0001d47a': '$\\mathbit{S}$', +u'\U0001d47b': '$\\mathbit{T}$', +u'\U0001d47c': '$\\mathbit{U}$', +u'\U0001d47d': '$\\mathbit{V}$', +u'\U0001d47e': '$\\mathbit{W}$', +u'\U0001d47f': '$\\mathbit{X}$', +u'\U0001d480': '$\\mathbit{Y}$', +u'\U0001d481': '$\\mathbit{Z}$', +u'\U0001d482': '$\\mathbit{a}$', +u'\U0001d483': '$\\mathbit{b}$', +u'\U0001d484': '$\\mathbit{c}$', +u'\U0001d485': '$\\mathbit{d}$', +u'\U0001d486': '$\\mathbit{e}$', +u'\U0001d487': '$\\mathbit{f}$', +u'\U0001d488': '$\\mathbit{g}$', +u'\U0001d489': '$\\mathbit{h}$', +u'\U0001d48a': '$\\mathbit{i}$', +u'\U0001d48b': '$\\mathbit{j}$', +u'\U0001d48c': '$\\mathbit{k}$', +u'\U0001d48d': '$\\mathbit{l}$', +u'\U0001d48e': '$\\mathbit{m}$', +u'\U0001d48f': '$\\mathbit{n}$', +u'\U0001d490': '$\\mathbit{o}$', +u'\U0001d491': '$\\mathbit{p}$', +u'\U0001d492': '$\\mathbit{q}$', +u'\U0001d493': '$\\mathbit{r}$', +u'\U0001d494': '$\\mathbit{s}$', +u'\U0001d495': '$\\mathbit{t}$', +u'\U0001d496': '$\\mathbit{u}$', +u'\U0001d497': '$\\mathbit{v}$', +u'\U0001d498': '$\\mathbit{w}$', +u'\U0001d499': '$\\mathbit{x}$', +u'\U0001d49a': '$\\mathbit{y}$', +u'\U0001d49b': '$\\mathbit{z}$', +u'\U0001d49c': '$\\mathscr{A}$', +u'\U0001d49e': '$\\mathscr{C}$', +u'\U0001d49f': '$\\mathscr{D}$', +u'\U0001d4a2': '$\\mathscr{G}$', +u'\U0001d4a5': '$\\mathscr{J}$', +u'\U0001d4a6': '$\\mathscr{K}$', +u'\U0001d4a9': '$\\mathscr{N}$', +u'\U0001d4aa': '$\\mathscr{O}$', +u'\U0001d4ab': '$\\mathscr{P}$', +u'\U0001d4ac': '$\\mathscr{Q}$', +u'\U0001d4ae': '$\\mathscr{S}$', +u'\U0001d4af': '$\\mathscr{T}$', +u'\U0001d4b0': '$\\mathscr{U}$', +u'\U0001d4b1': '$\\mathscr{V}$', +u'\U0001d4b2': '$\\mathscr{W}$', +u'\U0001d4b3': '$\\mathscr{X}$', +u'\U0001d4b4': '$\\mathscr{Y}$', +u'\U0001d4b5': '$\\mathscr{Z}$', +u'\U0001d4b6': '$\\mathscr{a}$', +u'\U0001d4b7': '$\\mathscr{b}$', +u'\U0001d4b8': '$\\mathscr{c}$', +u'\U0001d4b9': '$\\mathscr{d}$', +u'\U0001d4bb': '$\\mathscr{f}$', +u'\U0001d4bd': '$\\mathscr{h}$', +u'\U0001d4be': '$\\mathscr{i}$', +u'\U0001d4bf': '$\\mathscr{j}$', +u'\U0001d4c0': '$\\mathscr{k}$', +u'\U0001d4c1': '$\\mathscr{l}$', +u'\U0001d4c2': '$\\mathscr{m}$', +u'\U0001d4c3': '$\\mathscr{n}$', +u'\U0001d4c5': '$\\mathscr{p}$', +u'\U0001d4c6': '$\\mathscr{q}$', +u'\U0001d4c7': '$\\mathscr{r}$', +u'\U0001d4c8': '$\\mathscr{s}$', +u'\U0001d4c9': '$\\mathscr{t}$', +u'\U0001d4ca': '$\\mathscr{u}$', +u'\U0001d4cb': '$\\mathscr{v}$', +u'\U0001d4cc': '$\\mathscr{w}$', +u'\U0001d4cd': '$\\mathscr{x}$', +u'\U0001d4ce': '$\\mathscr{y}$', +u'\U0001d4cf': '$\\mathscr{z}$', +u'\U0001d4d0': '$\\mathmit{A}$', +u'\U0001d4d1': '$\\mathmit{B}$', +u'\U0001d4d2': '$\\mathmit{C}$', +u'\U0001d4d3': '$\\mathmit{D}$', +u'\U0001d4d4': '$\\mathmit{E}$', +u'\U0001d4d5': '$\\mathmit{F}$', +u'\U0001d4d6': '$\\mathmit{G}$', +u'\U0001d4d7': '$\\mathmit{H}$', +u'\U0001d4d8': '$\\mathmit{I}$', +u'\U0001d4d9': '$\\mathmit{J}$', +u'\U0001d4da': '$\\mathmit{K}$', +u'\U0001d4db': '$\\mathmit{L}$', +u'\U0001d4dc': '$\\mathmit{M}$', +u'\U0001d4dd': '$\\mathmit{N}$', +u'\U0001d4de': '$\\mathmit{O}$', +u'\U0001d4df': '$\\mathmit{P}$', +u'\U0001d4e0': '$\\mathmit{Q}$', +u'\U0001d4e1': '$\\mathmit{R}$', +u'\U0001d4e2': '$\\mathmit{S}$', +u'\U0001d4e3': '$\\mathmit{T}$', +u'\U0001d4e4': '$\\mathmit{U}$', +u'\U0001d4e5': '$\\mathmit{V}$', +u'\U0001d4e6': '$\\mathmit{W}$', +u'\U0001d4e7': '$\\mathmit{X}$', +u'\U0001d4e8': '$\\mathmit{Y}$', +u'\U0001d4e9': '$\\mathmit{Z}$', +u'\U0001d4ea': '$\\mathmit{a}$', +u'\U0001d4eb': '$\\mathmit{b}$', +u'\U0001d4ec': '$\\mathmit{c}$', +u'\U0001d4ed': '$\\mathmit{d}$', +u'\U0001d4ee': '$\\mathmit{e}$', +u'\U0001d4ef': '$\\mathmit{f}$', +u'\U0001d4f0': '$\\mathmit{g}$', +u'\U0001d4f1': '$\\mathmit{h}$', +u'\U0001d4f2': '$\\mathmit{i}$', +u'\U0001d4f3': '$\\mathmit{j}$', +u'\U0001d4f4': '$\\mathmit{k}$', +u'\U0001d4f5': '$\\mathmit{l}$', +u'\U0001d4f6': '$\\mathmit{m}$', +u'\U0001d4f7': '$\\mathmit{n}$', +u'\U0001d4f8': '$\\mathmit{o}$', +u'\U0001d4f9': '$\\mathmit{p}$', +u'\U0001d4fa': '$\\mathmit{q}$', +u'\U0001d4fb': '$\\mathmit{r}$', +u'\U0001d4fc': '$\\mathmit{s}$', +u'\U0001d4fd': '$\\mathmit{t}$', +u'\U0001d4fe': '$\\mathmit{u}$', +u'\U0001d4ff': '$\\mathmit{v}$', +u'\U0001d500': '$\\mathmit{w}$', +u'\U0001d501': '$\\mathmit{x}$', +u'\U0001d502': '$\\mathmit{y}$', +u'\U0001d503': '$\\mathmit{z}$', +u'\U0001d504': '$\\mathfrak{A}$', +u'\U0001d505': '$\\mathfrak{B}$', +u'\U0001d507': '$\\mathfrak{D}$', +u'\U0001d508': '$\\mathfrak{E}$', +u'\U0001d509': '$\\mathfrak{F}$', +u'\U0001d50a': '$\\mathfrak{G}$', +u'\U0001d50d': '$\\mathfrak{J}$', +u'\U0001d50e': '$\\mathfrak{K}$', +u'\U0001d50f': '$\\mathfrak{L}$', +u'\U0001d510': '$\\mathfrak{M}$', +u'\U0001d511': '$\\mathfrak{N}$', +u'\U0001d512': '$\\mathfrak{O}$', +u'\U0001d513': '$\\mathfrak{P}$', +u'\U0001d514': '$\\mathfrak{Q}$', +u'\U0001d516': '$\\mathfrak{S}$', +u'\U0001d517': '$\\mathfrak{T}$', +u'\U0001d518': '$\\mathfrak{U}$', +u'\U0001d519': '$\\mathfrak{V}$', +u'\U0001d51a': '$\\mathfrak{W}$', +u'\U0001d51b': '$\\mathfrak{X}$', +u'\U0001d51c': '$\\mathfrak{Y}$', +u'\U0001d51e': '$\\mathfrak{a}$', +u'\U0001d51f': '$\\mathfrak{b}$', +u'\U0001d520': '$\\mathfrak{c}$', +u'\U0001d521': '$\\mathfrak{d}$', +u'\U0001d522': '$\\mathfrak{e}$', +u'\U0001d523': '$\\mathfrak{f}$', +u'\U0001d524': '$\\mathfrak{g}$', +u'\U0001d525': '$\\mathfrak{h}$', +u'\U0001d526': '$\\mathfrak{i}$', +u'\U0001d527': '$\\mathfrak{j}$', +u'\U0001d528': '$\\mathfrak{k}$', +u'\U0001d529': '$\\mathfrak{l}$', +u'\U0001d52a': '$\\mathfrak{m}$', +u'\U0001d52b': '$\\mathfrak{n}$', +u'\U0001d52c': '$\\mathfrak{o}$', +u'\U0001d52d': '$\\mathfrak{p}$', +u'\U0001d52e': '$\\mathfrak{q}$', +u'\U0001d52f': '$\\mathfrak{r}$', +u'\U0001d530': '$\\mathfrak{s}$', +u'\U0001d531': '$\\mathfrak{t}$', +u'\U0001d532': '$\\mathfrak{u}$', +u'\U0001d533': '$\\mathfrak{v}$', +u'\U0001d534': '$\\mathfrak{w}$', +u'\U0001d535': '$\\mathfrak{x}$', +u'\U0001d536': '$\\mathfrak{y}$', +u'\U0001d537': '$\\mathfrak{z}$', +u'\U0001d538': '$\\mathbb{A}$', +u'\U0001d539': '$\\mathbb{B}$', +u'\U0001d53b': '$\\mathbb{D}$', +u'\U0001d53c': '$\\mathbb{E}$', +u'\U0001d53d': '$\\mathbb{F}$', +u'\U0001d53e': '$\\mathbb{G}$', +u'\U0001d540': '$\\mathbb{I}$', +u'\U0001d541': '$\\mathbb{J}$', +u'\U0001d542': '$\\mathbb{K}$', +u'\U0001d543': '$\\mathbb{L}$', +u'\U0001d544': '$\\mathbb{M}$', +u'\U0001d546': '$\\mathbb{O}$', +u'\U0001d54a': '$\\mathbb{S}$', +u'\U0001d54b': '$\\mathbb{T}$', +u'\U0001d54c': '$\\mathbb{U}$', +u'\U0001d54d': '$\\mathbb{V}$', +u'\U0001d54e': '$\\mathbb{W}$', +u'\U0001d54f': '$\\mathbb{X}$', +u'\U0001d550': '$\\mathbb{Y}$', +u'\U0001d552': '$\\mathbb{a}$', +u'\U0001d553': '$\\mathbb{b}$', +u'\U0001d554': '$\\mathbb{c}$', +u'\U0001d555': '$\\mathbb{d}$', +u'\U0001d556': '$\\mathbb{e}$', +u'\U0001d557': '$\\mathbb{f}$', +u'\U0001d558': '$\\mathbb{g}$', +u'\U0001d559': '$\\mathbb{h}$', +u'\U0001d55a': '$\\mathbb{i}$', +u'\U0001d55b': '$\\mathbb{j}$', +u'\U0001d55c': '$\\mathbb{k}$', +u'\U0001d55d': '$\\mathbb{l}$', +u'\U0001d55e': '$\\mathbb{m}$', +u'\U0001d55f': '$\\mathbb{n}$', +u'\U0001d560': '$\\mathbb{o}$', +u'\U0001d561': '$\\mathbb{p}$', +u'\U0001d562': '$\\mathbb{q}$', +u'\U0001d563': '$\\mathbb{r}$', +u'\U0001d564': '$\\mathbb{s}$', +u'\U0001d565': '$\\mathbb{t}$', +u'\U0001d566': '$\\mathbb{u}$', +u'\U0001d567': '$\\mathbb{v}$', +u'\U0001d568': '$\\mathbb{w}$', +u'\U0001d569': '$\\mathbb{x}$', +u'\U0001d56a': '$\\mathbb{y}$', +u'\U0001d56b': '$\\mathbb{z}$', +u'\U0001d56c': '$\\mathslbb{A}$', +u'\U0001d56d': '$\\mathslbb{B}$', +u'\U0001d56e': '$\\mathslbb{C}$', +u'\U0001d56f': '$\\mathslbb{D}$', +u'\U0001d570': '$\\mathslbb{E}$', +u'\U0001d571': '$\\mathslbb{F}$', +u'\U0001d572': '$\\mathslbb{G}$', +u'\U0001d573': '$\\mathslbb{H}$', +u'\U0001d574': '$\\mathslbb{I}$', +u'\U0001d575': '$\\mathslbb{J}$', +u'\U0001d576': '$\\mathslbb{K}$', +u'\U0001d577': '$\\mathslbb{L}$', +u'\U0001d578': '$\\mathslbb{M}$', +u'\U0001d579': '$\\mathslbb{N}$', +u'\U0001d57a': '$\\mathslbb{O}$', +u'\U0001d57b': '$\\mathslbb{P}$', +u'\U0001d57c': '$\\mathslbb{Q}$', +u'\U0001d57d': '$\\mathslbb{R}$', +u'\U0001d57e': '$\\mathslbb{S}$', +u'\U0001d57f': '$\\mathslbb{T}$', +u'\U0001d580': '$\\mathslbb{U}$', +u'\U0001d581': '$\\mathslbb{V}$', +u'\U0001d582': '$\\mathslbb{W}$', +u'\U0001d583': '$\\mathslbb{X}$', +u'\U0001d584': '$\\mathslbb{Y}$', +u'\U0001d585': '$\\mathslbb{Z}$', +u'\U0001d586': '$\\mathslbb{a}$', +u'\U0001d587': '$\\mathslbb{b}$', +u'\U0001d588': '$\\mathslbb{c}$', +u'\U0001d589': '$\\mathslbb{d}$', +u'\U0001d58a': '$\\mathslbb{e}$', +u'\U0001d58b': '$\\mathslbb{f}$', +u'\U0001d58c': '$\\mathslbb{g}$', +u'\U0001d58d': '$\\mathslbb{h}$', +u'\U0001d58e': '$\\mathslbb{i}$', +u'\U0001d58f': '$\\mathslbb{j}$', +u'\U0001d590': '$\\mathslbb{k}$', +u'\U0001d591': '$\\mathslbb{l}$', +u'\U0001d592': '$\\mathslbb{m}$', +u'\U0001d593': '$\\mathslbb{n}$', +u'\U0001d594': '$\\mathslbb{o}$', +u'\U0001d595': '$\\mathslbb{p}$', +u'\U0001d596': '$\\mathslbb{q}$', +u'\U0001d597': '$\\mathslbb{r}$', +u'\U0001d598': '$\\mathslbb{s}$', +u'\U0001d599': '$\\mathslbb{t}$', +u'\U0001d59a': '$\\mathslbb{u}$', +u'\U0001d59b': '$\\mathslbb{v}$', +u'\U0001d59c': '$\\mathslbb{w}$', +u'\U0001d59d': '$\\mathslbb{x}$', +u'\U0001d59e': '$\\mathslbb{y}$', +u'\U0001d59f': '$\\mathslbb{z}$', +u'\U0001d5a0': '$\\mathsf{A}$', +u'\U0001d5a1': '$\\mathsf{B}$', +u'\U0001d5a2': '$\\mathsf{C}$', +u'\U0001d5a3': '$\\mathsf{D}$', +u'\U0001d5a4': '$\\mathsf{E}$', +u'\U0001d5a5': '$\\mathsf{F}$', +u'\U0001d5a6': '$\\mathsf{G}$', +u'\U0001d5a7': '$\\mathsf{H}$', +u'\U0001d5a8': '$\\mathsf{I}$', +u'\U0001d5a9': '$\\mathsf{J}$', +u'\U0001d5aa': '$\\mathsf{K}$', +u'\U0001d5ab': '$\\mathsf{L}$', +u'\U0001d5ac': '$\\mathsf{M}$', +u'\U0001d5ad': '$\\mathsf{N}$', +u'\U0001d5ae': '$\\mathsf{O}$', +u'\U0001d5af': '$\\mathsf{P}$', +u'\U0001d5b0': '$\\mathsf{Q}$', +u'\U0001d5b1': '$\\mathsf{R}$', +u'\U0001d5b2': '$\\mathsf{S}$', +u'\U0001d5b3': '$\\mathsf{T}$', +u'\U0001d5b4': '$\\mathsf{U}$', +u'\U0001d5b5': '$\\mathsf{V}$', +u'\U0001d5b6': '$\\mathsf{W}$', +u'\U0001d5b7': '$\\mathsf{X}$', +u'\U0001d5b8': '$\\mathsf{Y}$', +u'\U0001d5b9': '$\\mathsf{Z}$', +u'\U0001d5ba': '$\\mathsf{a}$', +u'\U0001d5bb': '$\\mathsf{b}$', +u'\U0001d5bc': '$\\mathsf{c}$', +u'\U0001d5bd': '$\\mathsf{d}$', +u'\U0001d5be': '$\\mathsf{e}$', +u'\U0001d5bf': '$\\mathsf{f}$', +u'\U0001d5c0': '$\\mathsf{g}$', +u'\U0001d5c1': '$\\mathsf{h}$', +u'\U0001d5c2': '$\\mathsf{i}$', +u'\U0001d5c3': '$\\mathsf{j}$', +u'\U0001d5c4': '$\\mathsf{k}$', +u'\U0001d5c5': '$\\mathsf{l}$', +u'\U0001d5c6': '$\\mathsf{m}$', +u'\U0001d5c7': '$\\mathsf{n}$', +u'\U0001d5c8': '$\\mathsf{o}$', +u'\U0001d5c9': '$\\mathsf{p}$', +u'\U0001d5ca': '$\\mathsf{q}$', +u'\U0001d5cb': '$\\mathsf{r}$', +u'\U0001d5cc': '$\\mathsf{s}$', +u'\U0001d5cd': '$\\mathsf{t}$', +u'\U0001d5ce': '$\\mathsf{u}$', +u'\U0001d5cf': '$\\mathsf{v}$', +u'\U0001d5d0': '$\\mathsf{w}$', +u'\U0001d5d1': '$\\mathsf{x}$', +u'\U0001d5d2': '$\\mathsf{y}$', +u'\U0001d5d3': '$\\mathsf{z}$', +u'\U0001d5d4': '$\\mathsfbf{A}$', +u'\U0001d5d5': '$\\mathsfbf{B}$', +u'\U0001d5d6': '$\\mathsfbf{C}$', +u'\U0001d5d7': '$\\mathsfbf{D}$', +u'\U0001d5d8': '$\\mathsfbf{E}$', +u'\U0001d5d9': '$\\mathsfbf{F}$', +u'\U0001d5da': '$\\mathsfbf{G}$', +u'\U0001d5db': '$\\mathsfbf{H}$', +u'\U0001d5dc': '$\\mathsfbf{I}$', +u'\U0001d5dd': '$\\mathsfbf{J}$', +u'\U0001d5de': '$\\mathsfbf{K}$', +u'\U0001d5df': '$\\mathsfbf{L}$', +u'\U0001d5e0': '$\\mathsfbf{M}$', +u'\U0001d5e1': '$\\mathsfbf{N}$', +u'\U0001d5e2': '$\\mathsfbf{O}$', +u'\U0001d5e3': '$\\mathsfbf{P}$', +u'\U0001d5e4': '$\\mathsfbf{Q}$', +u'\U0001d5e5': '$\\mathsfbf{R}$', +u'\U0001d5e6': '$\\mathsfbf{S}$', +u'\U0001d5e7': '$\\mathsfbf{T}$', +u'\U0001d5e8': '$\\mathsfbf{U}$', +u'\U0001d5e9': '$\\mathsfbf{V}$', +u'\U0001d5ea': '$\\mathsfbf{W}$', +u'\U0001d5eb': '$\\mathsfbf{X}$', +u'\U0001d5ec': '$\\mathsfbf{Y}$', +u'\U0001d5ed': '$\\mathsfbf{Z}$', +u'\U0001d5ee': '$\\mathsfbf{a}$', +u'\U0001d5ef': '$\\mathsfbf{b}$', +u'\U0001d5f0': '$\\mathsfbf{c}$', +u'\U0001d5f1': '$\\mathsfbf{d}$', +u'\U0001d5f2': '$\\mathsfbf{e}$', +u'\U0001d5f3': '$\\mathsfbf{f}$', +u'\U0001d5f4': '$\\mathsfbf{g}$', +u'\U0001d5f5': '$\\mathsfbf{h}$', +u'\U0001d5f6': '$\\mathsfbf{i}$', +u'\U0001d5f7': '$\\mathsfbf{j}$', +u'\U0001d5f8': '$\\mathsfbf{k}$', +u'\U0001d5f9': '$\\mathsfbf{l}$', +u'\U0001d5fa': '$\\mathsfbf{m}$', +u'\U0001d5fb': '$\\mathsfbf{n}$', +u'\U0001d5fc': '$\\mathsfbf{o}$', +u'\U0001d5fd': '$\\mathsfbf{p}$', +u'\U0001d5fe': '$\\mathsfbf{q}$', +u'\U0001d5ff': '$\\mathsfbf{r}$', +u'\U0001d600': '$\\mathsfbf{s}$', +u'\U0001d601': '$\\mathsfbf{t}$', +u'\U0001d602': '$\\mathsfbf{u}$', +u'\U0001d603': '$\\mathsfbf{v}$', +u'\U0001d604': '$\\mathsfbf{w}$', +u'\U0001d605': '$\\mathsfbf{x}$', +u'\U0001d606': '$\\mathsfbf{y}$', +u'\U0001d607': '$\\mathsfbf{z}$', +u'\U0001d608': '$\\mathsfsl{A}$', +u'\U0001d609': '$\\mathsfsl{B}$', +u'\U0001d60a': '$\\mathsfsl{C}$', +u'\U0001d60b': '$\\mathsfsl{D}$', +u'\U0001d60c': '$\\mathsfsl{E}$', +u'\U0001d60d': '$\\mathsfsl{F}$', +u'\U0001d60e': '$\\mathsfsl{G}$', +u'\U0001d60f': '$\\mathsfsl{H}$', +u'\U0001d610': '$\\mathsfsl{I}$', +u'\U0001d611': '$\\mathsfsl{J}$', +u'\U0001d612': '$\\mathsfsl{K}$', +u'\U0001d613': '$\\mathsfsl{L}$', +u'\U0001d614': '$\\mathsfsl{M}$', +u'\U0001d615': '$\\mathsfsl{N}$', +u'\U0001d616': '$\\mathsfsl{O}$', +u'\U0001d617': '$\\mathsfsl{P}$', +u'\U0001d618': '$\\mathsfsl{Q}$', +u'\U0001d619': '$\\mathsfsl{R}$', +u'\U0001d61a': '$\\mathsfsl{S}$', +u'\U0001d61b': '$\\mathsfsl{T}$', +u'\U0001d61c': '$\\mathsfsl{U}$', +u'\U0001d61d': '$\\mathsfsl{V}$', +u'\U0001d61e': '$\\mathsfsl{W}$', +u'\U0001d61f': '$\\mathsfsl{X}$', +u'\U0001d620': '$\\mathsfsl{Y}$', +u'\U0001d621': '$\\mathsfsl{Z}$', +u'\U0001d622': '$\\mathsfsl{a}$', +u'\U0001d623': '$\\mathsfsl{b}$', +u'\U0001d624': '$\\mathsfsl{c}$', +u'\U0001d625': '$\\mathsfsl{d}$', +u'\U0001d626': '$\\mathsfsl{e}$', +u'\U0001d627': '$\\mathsfsl{f}$', +u'\U0001d628': '$\\mathsfsl{g}$', +u'\U0001d629': '$\\mathsfsl{h}$', +u'\U0001d62a': '$\\mathsfsl{i}$', +u'\U0001d62b': '$\\mathsfsl{j}$', +u'\U0001d62c': '$\\mathsfsl{k}$', +u'\U0001d62d': '$\\mathsfsl{l}$', +u'\U0001d62e': '$\\mathsfsl{m}$', +u'\U0001d62f': '$\\mathsfsl{n}$', +u'\U0001d630': '$\\mathsfsl{o}$', +u'\U0001d631': '$\\mathsfsl{p}$', +u'\U0001d632': '$\\mathsfsl{q}$', +u'\U0001d633': '$\\mathsfsl{r}$', +u'\U0001d634': '$\\mathsfsl{s}$', +u'\U0001d635': '$\\mathsfsl{t}$', +u'\U0001d636': '$\\mathsfsl{u}$', +u'\U0001d637': '$\\mathsfsl{v}$', +u'\U0001d638': '$\\mathsfsl{w}$', +u'\U0001d639': '$\\mathsfsl{x}$', +u'\U0001d63a': '$\\mathsfsl{y}$', +u'\U0001d63b': '$\\mathsfsl{z}$', +u'\U0001d63c': '$\\mathsfbfsl{A}$', +u'\U0001d63d': '$\\mathsfbfsl{B}$', +u'\U0001d63e': '$\\mathsfbfsl{C}$', +u'\U0001d63f': '$\\mathsfbfsl{D}$', +u'\U0001d640': '$\\mathsfbfsl{E}$', +u'\U0001d641': '$\\mathsfbfsl{F}$', +u'\U0001d642': '$\\mathsfbfsl{G}$', +u'\U0001d643': '$\\mathsfbfsl{H}$', +u'\U0001d644': '$\\mathsfbfsl{I}$', +u'\U0001d645': '$\\mathsfbfsl{J}$', +u'\U0001d646': '$\\mathsfbfsl{K}$', +u'\U0001d647': '$\\mathsfbfsl{L}$', +u'\U0001d648': '$\\mathsfbfsl{M}$', +u'\U0001d649': '$\\mathsfbfsl{N}$', +u'\U0001d64a': '$\\mathsfbfsl{O}$', +u'\U0001d64b': '$\\mathsfbfsl{P}$', +u'\U0001d64c': '$\\mathsfbfsl{Q}$', +u'\U0001d64d': '$\\mathsfbfsl{R}$', +u'\U0001d64e': '$\\mathsfbfsl{S}$', +u'\U0001d64f': '$\\mathsfbfsl{T}$', +u'\U0001d650': '$\\mathsfbfsl{U}$', +u'\U0001d651': '$\\mathsfbfsl{V}$', +u'\U0001d652': '$\\mathsfbfsl{W}$', +u'\U0001d653': '$\\mathsfbfsl{X}$', +u'\U0001d654': '$\\mathsfbfsl{Y}$', +u'\U0001d655': '$\\mathsfbfsl{Z}$', +u'\U0001d656': '$\\mathsfbfsl{a}$', +u'\U0001d657': '$\\mathsfbfsl{b}$', +u'\U0001d658': '$\\mathsfbfsl{c}$', +u'\U0001d659': '$\\mathsfbfsl{d}$', +u'\U0001d65a': '$\\mathsfbfsl{e}$', +u'\U0001d65b': '$\\mathsfbfsl{f}$', +u'\U0001d65c': '$\\mathsfbfsl{g}$', +u'\U0001d65d': '$\\mathsfbfsl{h}$', +u'\U0001d65e': '$\\mathsfbfsl{i}$', +u'\U0001d65f': '$\\mathsfbfsl{j}$', +u'\U0001d660': '$\\mathsfbfsl{k}$', +u'\U0001d661': '$\\mathsfbfsl{l}$', +u'\U0001d662': '$\\mathsfbfsl{m}$', +u'\U0001d663': '$\\mathsfbfsl{n}$', +u'\U0001d664': '$\\mathsfbfsl{o}$', +u'\U0001d665': '$\\mathsfbfsl{p}$', +u'\U0001d666': '$\\mathsfbfsl{q}$', +u'\U0001d667': '$\\mathsfbfsl{r}$', +u'\U0001d668': '$\\mathsfbfsl{s}$', +u'\U0001d669': '$\\mathsfbfsl{t}$', +u'\U0001d66a': '$\\mathsfbfsl{u}$', +u'\U0001d66b': '$\\mathsfbfsl{v}$', +u'\U0001d66c': '$\\mathsfbfsl{w}$', +u'\U0001d66d': '$\\mathsfbfsl{x}$', +u'\U0001d66e': '$\\mathsfbfsl{y}$', +u'\U0001d66f': '$\\mathsfbfsl{z}$', +u'\U0001d670': '$\\mathtt{A}$', +u'\U0001d671': '$\\mathtt{B}$', +u'\U0001d672': '$\\mathtt{C}$', +u'\U0001d673': '$\\mathtt{D}$', +u'\U0001d674': '$\\mathtt{E}$', +u'\U0001d675': '$\\mathtt{F}$', +u'\U0001d676': '$\\mathtt{G}$', +u'\U0001d677': '$\\mathtt{H}$', +u'\U0001d678': '$\\mathtt{I}$', +u'\U0001d679': '$\\mathtt{J}$', +u'\U0001d67a': '$\\mathtt{K}$', +u'\U0001d67b': '$\\mathtt{L}$', +u'\U0001d67c': '$\\mathtt{M}$', +u'\U0001d67d': '$\\mathtt{N}$', +u'\U0001d67e': '$\\mathtt{O}$', +u'\U0001d67f': '$\\mathtt{P}$', +u'\U0001d680': '$\\mathtt{Q}$', +u'\U0001d681': '$\\mathtt{R}$', +u'\U0001d682': '$\\mathtt{S}$', +u'\U0001d683': '$\\mathtt{T}$', +u'\U0001d684': '$\\mathtt{U}$', +u'\U0001d685': '$\\mathtt{V}$', +u'\U0001d686': '$\\mathtt{W}$', +u'\U0001d687': '$\\mathtt{X}$', +u'\U0001d688': '$\\mathtt{Y}$', +u'\U0001d689': '$\\mathtt{Z}$', +u'\U0001d68a': '$\\mathtt{a}$', +u'\U0001d68b': '$\\mathtt{b}$', +u'\U0001d68c': '$\\mathtt{c}$', +u'\U0001d68d': '$\\mathtt{d}$', +u'\U0001d68e': '$\\mathtt{e}$', +u'\U0001d68f': '$\\mathtt{f}$', +u'\U0001d690': '$\\mathtt{g}$', +u'\U0001d691': '$\\mathtt{h}$', +u'\U0001d692': '$\\mathtt{i}$', +u'\U0001d693': '$\\mathtt{j}$', +u'\U0001d694': '$\\mathtt{k}$', +u'\U0001d695': '$\\mathtt{l}$', +u'\U0001d696': '$\\mathtt{m}$', +u'\U0001d697': '$\\mathtt{n}$', +u'\U0001d698': '$\\mathtt{o}$', +u'\U0001d699': '$\\mathtt{p}$', +u'\U0001d69a': '$\\mathtt{q}$', +u'\U0001d69b': '$\\mathtt{r}$', +u'\U0001d69c': '$\\mathtt{s}$', +u'\U0001d69d': '$\\mathtt{t}$', +u'\U0001d69e': '$\\mathtt{u}$', +u'\U0001d69f': '$\\mathtt{v}$', +u'\U0001d6a0': '$\\mathtt{w}$', +u'\U0001d6a1': '$\\mathtt{x}$', +u'\U0001d6a2': '$\\mathtt{y}$', +u'\U0001d6a3': '$\\mathtt{z}$', +u'\U0001d6a8': '$\\mathbf{\\Alpha}$', +u'\U0001d6a9': '$\\mathbf{\\Beta}$', +u'\U0001d6aa': '$\\mathbf{\\Gamma}$', +u'\U0001d6ab': '$\\mathbf{\\Delta}$', +u'\U0001d6ac': '$\\mathbf{\\Epsilon}$', +u'\U0001d6ad': '$\\mathbf{\\Zeta}$', +u'\U0001d6ae': '$\\mathbf{\\Eta}$', +u'\U0001d6af': '$\\mathbf{\\Theta}$', +u'\U0001d6b0': '$\\mathbf{\\Iota}$', +u'\U0001d6b1': '$\\mathbf{\\Kappa}$', +u'\U0001d6b2': '$\\mathbf{\\Lambda}$', +u'\U0001d6b3': '$M$', +u'\U0001d6b4': '$N$', +u'\U0001d6b5': '$\\mathbf{\\Xi}$', +u'\U0001d6b6': '$O$', +u'\U0001d6b7': '$\\mathbf{\\Pi}$', +u'\U0001d6b8': '$\\mathbf{\\Rho}$', +u'\U0001d6b9': '{\\mathbf{\\vartheta}}', +u'\U0001d6ba': '$\\mathbf{\\Sigma}$', +u'\U0001d6bb': '$\\mathbf{\\Tau}$', +u'\U0001d6bc': '$\\mathbf{\\Upsilon}$', +u'\U0001d6bd': '$\\mathbf{\\Phi}$', +u'\U0001d6be': '$\\mathbf{\\Chi}$', +u'\U0001d6bf': '$\\mathbf{\\Psi}$', +u'\U0001d6c0': '$\\mathbf{\\Omega}$', +u'\U0001d6c1': '$\\mathbf{\\nabla}$', +u'\U0001d6c2': '$\\mathbf{\\Alpha}$', +u'\U0001d6c3': '$\\mathbf{\\Beta}$', +u'\U0001d6c4': '$\\mathbf{\\Gamma}$', +u'\U0001d6c5': '$\\mathbf{\\Delta}$', +u'\U0001d6c6': '$\\mathbf{\\Epsilon}$', +u'\U0001d6c7': '$\\mathbf{\\Zeta}$', +u'\U0001d6c8': '$\\mathbf{\\Eta}$', +u'\U0001d6c9': '$\\mathbf{\\theta}$', +u'\U0001d6ca': '$\\mathbf{\\Iota}$', +u'\U0001d6cb': '$\\mathbf{\\Kappa}$', +u'\U0001d6cc': '$\\mathbf{\\Lambda}$', +u'\U0001d6cd': '$M$', +u'\U0001d6ce': '$N$', +u'\U0001d6cf': '$\\mathbf{\\Xi}$', +u'\U0001d6d0': '$O$', +u'\U0001d6d1': '$\\mathbf{\\Pi}$', +u'\U0001d6d2': '$\\mathbf{\\Rho}$', +u'\U0001d6d3': '$\\mathbf{\\varsigma}$', +u'\U0001d6d4': '$\\mathbf{\\Sigma}$', +u'\U0001d6d5': '$\\mathbf{\\Tau}$', +u'\U0001d6d6': '$\\mathbf{\\Upsilon}$', +u'\U0001d6d7': '$\\mathbf{\\Phi}$', +u'\U0001d6d8': '$\\mathbf{\\Chi}$', +u'\U0001d6d9': '$\\mathbf{\\Psi}$', +u'\U0001d6da': '$\\mathbf{\\Omega}$', +u'\U0001d6db': '$\\partial$', +u'\U0001d6dc': '$\\in$', +u'\U0001d6dd': '{\\mathbf{\\vartheta}}', +u'\U0001d6de': '{\\mathbf{\\varkappa}}', +u'\U0001d6df': '{\\mathbf{\\phi}}', +u'\U0001d6e0': '{\\mathbf{\\varrho}}', +u'\U0001d6e1': '{\\mathbf{\\varpi}}', +u'\U0001d6e2': '$\\mathsl{\\Alpha}$', +u'\U0001d6e3': '$\\mathsl{\\Beta}$', +u'\U0001d6e4': '$\\mathsl{\\Gamma}$', +u'\U0001d6e5': '$\\mathsl{\\Delta}$', +u'\U0001d6e6': '$\\mathsl{\\Epsilon}$', +u'\U0001d6e7': '$\\mathsl{\\Zeta}$', +u'\U0001d6e8': '$\\mathsl{\\Eta}$', +u'\U0001d6e9': '$\\mathsl{\\Theta}$', +u'\U0001d6ea': '$\\mathsl{\\Iota}$', +u'\U0001d6eb': '$\\mathsl{\\Kappa}$', +u'\U0001d6ec': '$\\mathsl{\\Lambda}$', +u'\U0001d6ed': '$M$', +u'\U0001d6ee': '$N$', +u'\U0001d6ef': '$\\mathsl{\\Xi}$', +u'\U0001d6f0': '$O$', +u'\U0001d6f1': '$\\mathsl{\\Pi}$', +u'\U0001d6f2': '$\\mathsl{\\Rho}$', +u'\U0001d6f3': '{\\mathsl{\\vartheta}}', +u'\U0001d6f4': '$\\mathsl{\\Sigma}$', +u'\U0001d6f5': '$\\mathsl{\\Tau}$', +u'\U0001d6f6': '$\\mathsl{\\Upsilon}$', +u'\U0001d6f7': '$\\mathsl{\\Phi}$', +u'\U0001d6f8': '$\\mathsl{\\Chi}$', +u'\U0001d6f9': '$\\mathsl{\\Psi}$', +u'\U0001d6fa': '$\\mathsl{\\Omega}$', +u'\U0001d6fb': '$\\mathsl{\\nabla}$', +u'\U0001d6fc': '$\\mathsl{\\Alpha}$', +u'\U0001d6fd': '$\\mathsl{\\Beta}$', +u'\U0001d6fe': '$\\mathsl{\\Gamma}$', +u'\U0001d6ff': '$\\mathsl{\\Delta}$', +u'\U0001d700': '$\\mathsl{\\Epsilon}$', +u'\U0001d701': '$\\mathsl{\\Zeta}$', +u'\U0001d702': '$\\mathsl{\\Eta}$', +u'\U0001d703': '$\\mathsl{\\Theta}$', +u'\U0001d704': '$\\mathsl{\\Iota}$', +u'\U0001d705': '$\\mathsl{\\Kappa}$', +u'\U0001d706': '$\\mathsl{\\Lambda}$', +u'\U0001d707': '$M$', +u'\U0001d708': '$N$', +u'\U0001d709': '$\\mathsl{\\Xi}$', +u'\U0001d70a': '$O$', +u'\U0001d70b': '$\\mathsl{\\Pi}$', +u'\U0001d70c': '$\\mathsl{\\Rho}$', +u'\U0001d70d': '$\\mathsl{\\varsigma}$', +u'\U0001d70e': '$\\mathsl{\\Sigma}$', +u'\U0001d70f': '$\\mathsl{\\Tau}$', +u'\U0001d710': '$\\mathsl{\\Upsilon}$', +u'\U0001d711': '$\\mathsl{\\Phi}$', +u'\U0001d712': '$\\mathsl{\\Chi}$', +u'\U0001d713': '$\\mathsl{\\Psi}$', +u'\U0001d714': '$\\mathsl{\\Omega}$', +u'\U0001d715': '$\\partial$', +u'\U0001d716': '$\\in$', +u'\U0001d717': '{\\mathsl{\\vartheta}}', +u'\U0001d718': '{\\mathsl{\\varkappa}}', +u'\U0001d719': '{\\mathsl{\\phi}}', +u'\U0001d71a': '{\\mathsl{\\varrho}}', +u'\U0001d71b': '{\\mathsl{\\varpi}}', +u'\U0001d71c': '$\\mathbit{\\Alpha}$', +u'\U0001d71d': '$\\mathbit{\\Beta}$', +u'\U0001d71e': '$\\mathbit{\\Gamma}$', +u'\U0001d71f': '$\\mathbit{\\Delta}$', +u'\U0001d720': '$\\mathbit{\\Epsilon}$', +u'\U0001d721': '$\\mathbit{\\Zeta}$', +u'\U0001d722': '$\\mathbit{\\Eta}$', +u'\U0001d723': '$\\mathbit{\\Theta}$', +u'\U0001d724': '$\\mathbit{\\Iota}$', +u'\U0001d725': '$\\mathbit{\\Kappa}$', +u'\U0001d726': '$\\mathbit{\\Lambda}$', +u'\U0001d727': '$M$', +u'\U0001d728': '$N$', +u'\U0001d729': '$\\mathbit{\\Xi}$', +u'\U0001d72a': '$O$', +u'\U0001d72b': '$\\mathbit{\\Pi}$', +u'\U0001d72c': '$\\mathbit{\\Rho}$', +u'\U0001d72d': '{\\mathbit{O}}', +u'\U0001d72e': '$\\mathbit{\\Sigma}$', +u'\U0001d72f': '$\\mathbit{\\Tau}$', +u'\U0001d730': '$\\mathbit{\\Upsilon}$', +u'\U0001d731': '$\\mathbit{\\Phi}$', +u'\U0001d732': '$\\mathbit{\\Chi}$', +u'\U0001d733': '$\\mathbit{\\Psi}$', +u'\U0001d734': '$\\mathbit{\\Omega}$', +u'\U0001d735': '$\\mathbit{\\nabla}$', +u'\U0001d736': '$\\mathbit{\\Alpha}$', +u'\U0001d737': '$\\mathbit{\\Beta}$', +u'\U0001d738': '$\\mathbit{\\Gamma}$', +u'\U0001d739': '$\\mathbit{\\Delta}$', +u'\U0001d73a': '$\\mathbit{\\Epsilon}$', +u'\U0001d73b': '$\\mathbit{\\Zeta}$', +u'\U0001d73c': '$\\mathbit{\\Eta}$', +u'\U0001d73d': '$\\mathbit{\\Theta}$', +u'\U0001d73e': '$\\mathbit{\\Iota}$', +u'\U0001d73f': '$\\mathbit{\\Kappa}$', +u'\U0001d740': '$\\mathbit{\\Lambda}$', +u'\U0001d741': '$M$', +u'\U0001d742': '$N$', +u'\U0001d743': '$\\mathbit{\\Xi}$', +u'\U0001d744': '$O$', +u'\U0001d745': '$\\mathbit{\\Pi}$', +u'\U0001d746': '$\\mathbit{\\Rho}$', +u'\U0001d747': '$\\mathbit{\\varsigma}$', +u'\U0001d748': '$\\mathbit{\\Sigma}$', +u'\U0001d749': '$\\mathbit{\\Tau}$', +u'\U0001d74a': '$\\mathbit{\\Upsilon}$', +u'\U0001d74b': '$\\mathbit{\\Phi}$', +u'\U0001d74c': '$\\mathbit{\\Chi}$', +u'\U0001d74d': '$\\mathbit{\\Psi}$', +u'\U0001d74e': '$\\mathbit{\\Omega}$', +u'\U0001d74f': '$\\partial$', +u'\U0001d750': '$\\in$', +u'\U0001d751': '{\\mathbit{\\vartheta}}', +u'\U0001d752': '{\\mathbit{\\varkappa}}', +u'\U0001d753': '{\\mathbit{\\phi}}', +u'\U0001d754': '{\\mathbit{\\varrho}}', +u'\U0001d755': '{\\mathbit{\\varpi}}', +u'\U0001d756': '$\\mathsfbf{\\Alpha}$', +u'\U0001d757': '$\\mathsfbf{\\Beta}$', +u'\U0001d758': '$\\mathsfbf{\\Gamma}$', +u'\U0001d759': '$\\mathsfbf{\\Delta}$', +u'\U0001d75a': '$\\mathsfbf{\\Epsilon}$', +u'\U0001d75b': '$\\mathsfbf{\\Zeta}$', +u'\U0001d75c': '$\\mathsfbf{\\Eta}$', +u'\U0001d75d': '$\\mathsfbf{\\Theta}$', +u'\U0001d75e': '$\\mathsfbf{\\Iota}$', +u'\U0001d75f': '$\\mathsfbf{\\Kappa}$', +u'\U0001d760': '$\\mathsfbf{\\Lambda}$', +u'\U0001d761': '$M$', +u'\U0001d762': '$N$', +u'\U0001d763': '$\\mathsfbf{\\Xi}$', +u'\U0001d764': '$O$', +u'\U0001d765': '$\\mathsfbf{\\Pi}$', +u'\U0001d766': '$\\mathsfbf{\\Rho}$', +u'\U0001d767': '{\\mathsfbf{\\vartheta}}', +u'\U0001d768': '$\\mathsfbf{\\Sigma}$', +u'\U0001d769': '$\\mathsfbf{\\Tau}$', +u'\U0001d76a': '$\\mathsfbf{\\Upsilon}$', +u'\U0001d76b': '$\\mathsfbf{\\Phi}$', +u'\U0001d76c': '$\\mathsfbf{\\Chi}$', +u'\U0001d76d': '$\\mathsfbf{\\Psi}$', +u'\U0001d76e': '$\\mathsfbf{\\Omega}$', +u'\U0001d76f': '$\\mathsfbf{\\nabla}$', +u'\U0001d770': '$\\mathsfbf{\\Alpha}$', +u'\U0001d771': '$\\mathsfbf{\\Beta}$', +u'\U0001d772': '$\\mathsfbf{\\Gamma}$', +u'\U0001d773': '$\\mathsfbf{\\Delta}$', +u'\U0001d774': '$\\mathsfbf{\\Epsilon}$', +u'\U0001d775': '$\\mathsfbf{\\Zeta}$', +u'\U0001d776': '$\\mathsfbf{\\Eta}$', +u'\U0001d777': '$\\mathsfbf{\\Theta}$', +u'\U0001d778': '$\\mathsfbf{\\Iota}$', +u'\U0001d779': '$\\mathsfbf{\\Kappa}$', +u'\U0001d77a': '$\\mathsfbf{\\Lambda}$', +u'\U0001d77b': '$M$', +u'\U0001d77c': '$N$', +u'\U0001d77d': '$\\mathsfbf{\\Xi}$', +u'\U0001d77e': '$O$', +u'\U0001d77f': '$\\mathsfbf{\\Pi}$', +u'\U0001d780': '$\\mathsfbf{\\Rho}$', +u'\U0001d781': '$\\mathsfbf{\\varsigma}$', +u'\U0001d782': '$\\mathsfbf{\\Sigma}$', +u'\U0001d783': '$\\mathsfbf{\\Tau}$', +u'\U0001d784': '$\\mathsfbf{\\Upsilon}$', +u'\U0001d785': '$\\mathsfbf{\\Phi}$', +u'\U0001d786': '$\\mathsfbf{\\Chi}$', +u'\U0001d787': '$\\mathsfbf{\\Psi}$', +u'\U0001d788': '$\\mathsfbf{\\Omega}$', +u'\U0001d789': '$\\partial$', +u'\U0001d78a': '$\\in$', +u'\U0001d78b': '{\\mathsfbf{\\vartheta}}', +u'\U0001d78c': '{\\mathsfbf{\\varkappa}}', +u'\U0001d78d': '{\\mathsfbf{\\phi}}', +u'\U0001d78e': '{\\mathsfbf{\\varrho}}', +u'\U0001d78f': '{\\mathsfbf{\\varpi}}', +u'\U0001d790': '$\\mathsfbfsl{\\Alpha}$', +u'\U0001d791': '$\\mathsfbfsl{\\Beta}$', +u'\U0001d792': '$\\mathsfbfsl{\\Gamma}$', +u'\U0001d793': '$\\mathsfbfsl{\\Delta}$', +u'\U0001d794': '$\\mathsfbfsl{\\Epsilon}$', +u'\U0001d795': '$\\mathsfbfsl{\\Zeta}$', +u'\U0001d796': '$\\mathsfbfsl{\\Eta}$', +u'\U0001d797': '$\\mathsfbfsl{\\vartheta}$', +u'\U0001d798': '$\\mathsfbfsl{\\Iota}$', +u'\U0001d799': '$\\mathsfbfsl{\\Kappa}$', +u'\U0001d79a': '$\\mathsfbfsl{\\Lambda}$', +u'\U0001d79b': '$M$', +u'\U0001d79c': '$N$', +u'\U0001d79d': '$\\mathsfbfsl{\\Xi}$', +u'\U0001d79e': '$O$', +u'\U0001d79f': '$\\mathsfbfsl{\\Pi}$', +u'\U0001d7a0': '$\\mathsfbfsl{\\Rho}$', +u'\U0001d7a1': '{\\mathsfbfsl{\\vartheta}}', +u'\U0001d7a2': '$\\mathsfbfsl{\\Sigma}$', +u'\U0001d7a3': '$\\mathsfbfsl{\\Tau}$', +u'\U0001d7a4': '$\\mathsfbfsl{\\Upsilon}$', +u'\U0001d7a5': '$\\mathsfbfsl{\\Phi}$', +u'\U0001d7a6': '$\\mathsfbfsl{\\Chi}$', +u'\U0001d7a7': '$\\mathsfbfsl{\\Psi}$', +u'\U0001d7a8': '$\\mathsfbfsl{\\Omega}$', +u'\U0001d7a9': '$\\mathsfbfsl{\\nabla}$', +u'\U0001d7aa': '$\\mathsfbfsl{\\Alpha}$', +u'\U0001d7ab': '$\\mathsfbfsl{\\Beta}$', +u'\U0001d7ac': '$\\mathsfbfsl{\\Gamma}$', +u'\U0001d7ad': '$\\mathsfbfsl{\\Delta}$', +u'\U0001d7ae': '$\\mathsfbfsl{\\Epsilon}$', +u'\U0001d7af': '$\\mathsfbfsl{\\Zeta}$', +u'\U0001d7b0': '$\\mathsfbfsl{\\Eta}$', +u'\U0001d7b1': '$\\mathsfbfsl{\\vartheta}$', +u'\U0001d7b2': '$\\mathsfbfsl{\\Iota}$', +u'\U0001d7b3': '$\\mathsfbfsl{\\Kappa}$', +u'\U0001d7b4': '$\\mathsfbfsl{\\Lambda}$', +u'\U0001d7b5': '$M$', +u'\U0001d7b6': '$N$', +u'\U0001d7b7': '$\\mathsfbfsl{\\Xi}$', +u'\U0001d7b8': '$O$', +u'\U0001d7b9': '$\\mathsfbfsl{\\Pi}$', +u'\U0001d7ba': '$\\mathsfbfsl{\\Rho}$', +u'\U0001d7bb': '$\\mathsfbfsl{\\varsigma}$', +u'\U0001d7bc': '$\\mathsfbfsl{\\Sigma}$', +u'\U0001d7bd': '$\\mathsfbfsl{\\Tau}$', +u'\U0001d7be': '$\\mathsfbfsl{\\Upsilon}$', +u'\U0001d7bf': '$\\mathsfbfsl{\\Phi}$', +u'\U0001d7c0': '$\\mathsfbfsl{\\Chi}$', +u'\U0001d7c1': '$\\mathsfbfsl{\\Psi}$', +u'\U0001d7c2': '$\\mathsfbfsl{\\Omega}$', +u'\U0001d7c3': '$\\partial$', +u'\U0001d7c4': '$\\in$', +u'\U0001d7c5': '{\\mathsfbfsl{\\vartheta}}', +u'\U0001d7c6': '{\\mathsfbfsl{\\varkappa}}', +u'\U0001d7c7': '{\\mathsfbfsl{\\phi}}', +u'\U0001d7c8': '{\\mathsfbfsl{\\varrho}}', +u'\U0001d7c9': '{\\mathsfbfsl{\\varpi}}', +u'\U0001d7ce': '$\\mathbf{0}$', +u'\U0001d7cf': '$\\mathbf{1}$', +u'\U0001d7d0': '$\\mathbf{2}$', +u'\U0001d7d1': '$\\mathbf{3}$', +u'\U0001d7d2': '$\\mathbf{4}$', +u'\U0001d7d3': '$\\mathbf{5}$', +u'\U0001d7d4': '$\\mathbf{6}$', +u'\U0001d7d5': '$\\mathbf{7}$', +u'\U0001d7d6': '$\\mathbf{8}$', +u'\U0001d7d7': '$\\mathbf{9}$', +u'\U0001d7d8': '$\\mathbb{0}$', +u'\U0001d7d9': '$\\mathbb{1}$', +u'\U0001d7da': '$\\mathbb{2}$', +u'\U0001d7db': '$\\mathbb{3}$', +u'\U0001d7dc': '$\\mathbb{4}$', +u'\U0001d7dd': '$\\mathbb{5}$', +u'\U0001d7de': '$\\mathbb{6}$', +u'\U0001d7df': '$\\mathbb{7}$', +u'\U0001d7e0': '$\\mathbb{8}$', +u'\U0001d7e1': '$\\mathbb{9}$', +u'\U0001d7e2': '$\\mathsf{0}$', +u'\U0001d7e3': '$\\mathsf{1}$', +u'\U0001d7e4': '$\\mathsf{2}$', +u'\U0001d7e5': '$\\mathsf{3}$', +u'\U0001d7e6': '$\\mathsf{4}$', +u'\U0001d7e7': '$\\mathsf{5}$', +u'\U0001d7e8': '$\\mathsf{6}$', +u'\U0001d7e9': '$\\mathsf{7}$', +u'\U0001d7ea': '$\\mathsf{8}$', +u'\U0001d7eb': '$\\mathsf{9}$', +u'\U0001d7ec': '$\\mathsfbf{0}$', +u'\U0001d7ed': '$\\mathsfbf{1}$', +u'\U0001d7ee': '$\\mathsfbf{2}$', +u'\U0001d7ef': '$\\mathsfbf{3}$', +u'\U0001d7f0': '$\\mathsfbf{4}$', +u'\U0001d7f1': '$\\mathsfbf{5}$', +u'\U0001d7f2': '$\\mathsfbf{6}$', +u'\U0001d7f3': '$\\mathsfbf{7}$', +u'\U0001d7f4': '$\\mathsfbf{8}$', +u'\U0001d7f5': '$\\mathsfbf{9}$', +u'\U0001d7f6': '$\\mathtt{0}$', +u'\U0001d7f7': '$\\mathtt{1}$', +u'\U0001d7f8': '$\\mathtt{2}$', +u'\U0001d7f9': '$\\mathtt{3}$', +u'\U0001d7fa': '$\\mathtt{4}$', +u'\U0001d7fb': '$\\mathtt{5}$', +u'\U0001d7fc': '$\\mathtt{6}$', +u'\U0001d7fd': '$\\mathtt{7}$', +u'\U0001d7fe': '$\\mathtt{8}$', +u'\U0001d7ff': '$\\mathtt{9}$'} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/null.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/null.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,21 @@ +# $Id: null.py 4564 2006-05-21 20:44:42Z wiemann $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +A do-nothing Writer. +""" + +from docutils import writers + + +class Writer(writers.UnfilteredWriter): + + supported = ('null',) + """Formats this writer supports.""" + + config_section = 'null writer' + config_section_dependencies = ('writers',) + + def translate(self): + pass diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/__init__.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,105 @@ +# $Id: __init__.py 4564 2006-05-21 20:44:42Z wiemann $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +PEP HTML Writer. +""" + +__docformat__ = 'reStructuredText' + + +import sys +import os +import os.path +import codecs +import docutils +from docutils import frontend, nodes, utils, writers +from docutils.writers import html4css1 + + +class Writer(html4css1.Writer): + + default_stylesheet = 'pep.css' + + default_stylesheet_path = utils.relative_path( + os.path.join(os.getcwd(), 'dummy'), + os.path.join(os.path.dirname(__file__), default_stylesheet)) + + default_template = 'template.txt' + + default_template_path = utils.relative_path( + os.path.join(os.getcwd(), 'dummy'), + os.path.join(os.path.dirname(__file__), default_template)) + + settings_spec = html4css1.Writer.settings_spec + ( + 'PEP/HTML-Specific Options', + 'For the PEP/HTML writer, the default value for the --stylesheet-path ' + 'option is "%s", and the default value for --template is "%s". ' + 'See HTML-Specific Options above.' + % (default_stylesheet_path, default_template_path), + (('Python\'s home URL. Default is "http://www.python.org".', + ['--python-home'], + {'default': 'http://www.python.org', 'metavar': ''}), + ('Home URL prefix for PEPs. Default is "." (current directory).', + ['--pep-home'], + {'default': '.', 'metavar': ''}), + # For testing. + (frontend.SUPPRESS_HELP, + ['--no-random'], + {'action': 'store_true', 'validator': frontend.validate_boolean}),)) + + settings_default_overrides = {'stylesheet_path': default_stylesheet_path, + 'template': default_template_path,} + + relative_path_settings = (html4css1.Writer.relative_path_settings + + ('template',)) + + config_section = 'pep_html writer' + config_section_dependencies = ('writers', 'html4css1 writer') + + def __init__(self): + html4css1.Writer.__init__(self) + self.translator_class = HTMLTranslator + + def interpolation_dict(self): + subs = html4css1.Writer.interpolation_dict(self) + settings = self.document.settings + pyhome = settings.python_home + subs['pyhome'] = pyhome + subs['pephome'] = settings.pep_home + if pyhome == '..': + subs['pepindex'] = '.' + else: + subs['pepindex'] = pyhome + '/dev/peps' + index = self.document.first_child_matching_class(nodes.field_list) + header = self.document[index] + self.pepnum = header[0][1].astext() + subs['pep'] = self.pepnum + if settings.no_random: + subs['banner'] = 0 + else: + import random + subs['banner'] = random.randrange(64) + try: + subs['pepnum'] = '%04i' % int(self.pepnum) + except ValueError: + subs['pepnum'] = pepnum + self.title = header[1][1].astext() + subs['title'] = self.title + subs['body'] = ''.join( + self.body_pre_docinfo + self.docinfo + self.body) + return subs + + def assemble_parts(self): + html4css1.Writer.assemble_parts(self) + self.parts['title'] = [self.title] + self.parts['pepnum'] = self.pepnum + + +class HTMLTranslator(html4css1.HTMLTranslator): + + def depart_field_list(self, node): + html4css1.HTMLTranslator.depart_field_list(self, node) + if 'rfc2822' in node['classes']: + self.body.append('
    \n') diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/pep.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/pep.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,344 @@ +/* +:Author: David Goodger +:Contact: goodger@python.org +:date: $Date: 2006-05-21 22:44:42 +0200 (Sun, 21 May 2006) $ +:version: $Revision: 4564 $ +:copyright: This stylesheet has been placed in the public domain. + +Default cascading style sheet for the PEP HTML output of Docutils. +*/ + +/* "! important" is used here to override other ``margin-top`` and + ``margin-bottom`` styles that are later in the stylesheet or + more specific. See http://www.w3.org/TR/CSS1#the-cascade */ +.first { + margin-top: 0 ! important } + +.last, .with-subtitle { + margin-bottom: 0 ! important } + +.hidden { + display: none } + +.navigation { + width: 100% ; + background: #99ccff ; + margin-top: 0px ; + margin-bottom: 0px } + +.navigation .navicon { + width: 150px ; + height: 35px } + +.navigation .textlinks { + padding-left: 1em ; + text-align: left } + +.navigation td, .navigation th { + padding-left: 0em ; + padding-right: 0em ; + vertical-align: middle } + +.rfc2822 { + margin-top: 0.5em ; + margin-left: 0.5em ; + margin-right: 0.5em ; + margin-bottom: 0em } + +.rfc2822 td { + text-align: left } + +.rfc2822 th.field-name { + text-align: right ; + font-family: sans-serif ; + padding-right: 0.5em ; + font-weight: bold ; + margin-bottom: 0em } + +a.toc-backref { + text-decoration: none ; + color: black } + +blockquote.epigraph { + margin: 2em 5em ; } + +body { + margin: 0px ; + margin-bottom: 1em ; + padding: 0px } + +dl.docutils dd { + margin-bottom: 0.5em } + +div.section { + margin-left: 1em ; + margin-right: 1em ; + margin-bottom: 1.5em } + +div.section div.section { + margin-left: 0em ; + margin-right: 0em ; + margin-top: 1.5em } + +div.abstract { + margin: 2em 5em } + +div.abstract p.topic-title { + font-weight: bold ; + text-align: center } + +div.admonition, div.attention, div.caution, div.danger, div.error, +div.hint, div.important, div.note, div.tip, div.warning { + margin: 2em ; + border: medium outset ; + padding: 1em } + +div.admonition p.admonition-title, div.hint p.admonition-title, +div.important p.admonition-title, div.note p.admonition-title, +div.tip p.admonition-title { + font-weight: bold ; + font-family: sans-serif } + +div.attention p.admonition-title, div.caution p.admonition-title, +div.danger p.admonition-title, div.error p.admonition-title, +div.warning p.admonition-title { + color: red ; + font-weight: bold ; + font-family: sans-serif } + +/* Uncomment (and remove this text!) to get reduced vertical space in + compound paragraphs. +div.compound .compound-first, div.compound .compound-middle { + margin-bottom: 0.5em } + +div.compound .compound-last, div.compound .compound-middle { + margin-top: 0.5em } +*/ + +div.dedication { + margin: 2em 5em ; + text-align: center ; + font-style: italic } + +div.dedication p.topic-title { + font-weight: bold ; + font-style: normal } + +div.figure { + margin-left: 2em ; + margin-right: 2em } + +div.footer, div.header { + clear: both; + font-size: smaller } + +div.footer { + margin-left: 1em ; + margin-right: 1em } + +div.line-block { + display: block ; + margin-top: 1em ; + margin-bottom: 1em } + +div.line-block div.line-block { + margin-top: 0 ; + margin-bottom: 0 ; + margin-left: 1.5em } + +div.sidebar { + margin-left: 1em ; + border: medium outset ; + padding: 1em ; + background-color: #ffffee ; + width: 40% ; + float: right ; + clear: right } + +div.sidebar p.rubric { + font-family: sans-serif ; + font-size: medium } + +div.system-messages { + margin: 5em } + +div.system-messages h1 { + color: red } + +div.system-message { + border: medium outset ; + padding: 1em } + +div.system-message p.system-message-title { + color: red ; + font-weight: bold } + +div.topic { + margin: 2em } + +h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, +h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { + margin-top: 0.4em } + +h1 { + font-family: sans-serif ; + font-size: large } + +h2 { + font-family: sans-serif ; + font-size: medium } + +h3 { + font-family: sans-serif ; + font-size: small } + +h4 { + font-family: sans-serif ; + font-style: italic ; + font-size: small } + +h5 { + font-family: sans-serif; + font-size: x-small } + +h6 { + font-family: sans-serif; + font-style: italic ; + font-size: x-small } + +hr.docutils { + width: 75% } + +img.align-left { + clear: left } + +img.align-right { + clear: right } + +img.borderless { + border: 0 } + +ol.simple, ul.simple { + margin-bottom: 1em } + +ol.arabic { + list-style: decimal } + +ol.loweralpha { + list-style: lower-alpha } + +ol.upperalpha { + list-style: upper-alpha } + +ol.lowerroman { + list-style: lower-roman } + +ol.upperroman { + list-style: upper-roman } + +p.attribution { + text-align: right ; + margin-left: 50% } + +p.caption { + font-style: italic } + +p.credits { + font-style: italic ; + font-size: smaller } + +p.label { + white-space: nowrap } + +p.rubric { + font-weight: bold ; + font-size: larger ; + color: maroon ; + text-align: center } + +p.sidebar-title { + font-family: sans-serif ; + font-weight: bold ; + font-size: larger } + +p.sidebar-subtitle { + font-family: sans-serif ; + font-weight: bold } + +p.topic-title { + font-family: sans-serif ; + font-weight: bold } + +pre.address { + margin-bottom: 0 ; + margin-top: 0 ; + font-family: serif ; + font-size: 100% } + +pre.literal-block, pre.doctest-block { + margin-left: 2em ; + margin-right: 2em } + +span.classifier { + font-family: sans-serif ; + font-style: oblique } + +span.classifier-delimiter { + font-family: sans-serif ; + font-weight: bold } + +span.interpreted { + font-family: sans-serif } + +span.option { + white-space: nowrap } + +span.option-argument { + font-style: italic } + +span.pre { + white-space: pre } + +span.problematic { + color: red } + +span.section-subtitle { + /* font-size relative to parent (h1..h6 element) */ + font-size: 80% } + +table.citation { + border-left: solid 1px gray; + margin-left: 1px } + +table.docinfo { + margin: 2em 4em } + +table.docutils { + margin-top: 0.5em ; + margin-bottom: 0.5em } + +table.footnote { + border-left: solid 1px black; + margin-left: 1px } + +table.docutils td, table.docutils th, +table.docinfo td, table.docinfo th { + padding-left: 0.5em ; + padding-right: 0.5em ; + vertical-align: top } + +td.num { + text-align: right } + +th.field-name { + font-weight: bold ; + text-align: left ; + white-space: nowrap ; + padding-left: 0 } + +h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, +h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { + font-size: 100% } + +ul.auto-toc { + list-style-type: none } diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/template.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pep_html/template.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,29 @@ + + + + + + + + PEP %(pep)s -- %(title)s + %(stylesheet)s + + + + + +
    +%(body)s +%(body_suffix)s diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pseudoxml.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/pseudoxml.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,31 @@ +# $Id: pseudoxml.py 4564 2006-05-21 20:44:42Z wiemann $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +Simple internal document tree Writer, writes indented pseudo-XML. +""" + +__docformat__ = 'reStructuredText' + + +from docutils import writers + + +class Writer(writers.Writer): + + supported = ('pprint', 'pformat', 'pseudoxml') + """Formats this writer supports.""" + + config_section = 'pseudoxml writer' + config_section_dependencies = ('writers',) + + output = None + """Final translated form of `document`.""" + + def translate(self): + self.output = self.document.pformat() + + def supports(self, format): + """This writer supports all format-specific elements.""" + return 1 diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/__init__.py Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,337 @@ +# $Id: __init__.py 4883 2007-01-16 01:51:28Z wiemann $ +# Authors: Chris Liechti ; +# David Goodger +# Copyright: This module has been placed in the public domain. + +""" +S5/HTML Slideshow Writer. +""" + +__docformat__ = 'reStructuredText' + + +import sys +import os +import re +import docutils +from docutils import frontend, nodes, utils +from docutils.writers import html4css1 +from docutils.parsers.rst import directives + +themes_dir_path = utils.relative_path( + os.path.join(os.getcwd(), 'dummy'), + os.path.join(os.path.dirname(__file__), 'themes')) + +def find_theme(name): + # Where else to look for a theme? + # Check working dir? Destination dir? Config dir? Plugins dir? + path = os.path.join(themes_dir_path, name) + if not os.path.isdir(path): + raise docutils.ApplicationError( + 'Theme directory not found: %r (path: %r)' % (name, path)) + return path + + +class Writer(html4css1.Writer): + + settings_spec = html4css1.Writer.settings_spec + ( + 'S5 Slideshow Specific Options', + 'For the S5/HTML writer, the --no-toc-backlinks option ' + '(defined in General Docutils Options above) is the default, ' + 'and should not be changed.', + (('Specify an installed S5 theme by name. Overrides --theme-url. ' + 'The default theme name is "default". The theme files will be ' + 'copied into a "ui/" directory, in the same directory as the ' + 'destination file (output HTML). Note that existing theme files ' + 'will not be overwritten (unless --overwrite-theme-files is used).', + ['--theme'], + {'default': 'default', 'metavar': '', + 'overrides': 'theme_url'}), + ('Specify an S5 theme URL. The destination file (output HTML) will ' + 'link to this theme; nothing will be copied. Overrides --theme.', + ['--theme-url'], + {'metavar': '', 'overrides': 'theme'}), + ('Allow existing theme files in the ``ui/`` directory to be ' + 'overwritten. The default is not to overwrite theme files.', + ['--overwrite-theme-files'], + {'action': 'store_true', 'validator': frontend.validate_boolean}), + ('Keep existing theme files in the ``ui/`` directory; do not ' + 'overwrite any. This is the default.', + ['--keep-theme-files'], + {'dest': 'overwrite_theme_files', 'action': 'store_false'}), + ('Set the initial view mode to "slideshow" [default] or "outline".', + ['--view-mode'], + {'choices': ['slideshow', 'outline'], 'default': 'slideshow', + 'metavar': ''}), + ('Normally hide the presentation controls in slideshow mode. ' + 'This is the default.', + ['--hidden-controls'], + {'action': 'store_true', 'default': True, + 'validator': frontend.validate_boolean}), + ('Always show the presentation controls in slideshow mode. ' + 'The default is to hide the controls.', + ['--visible-controls'], + {'dest': 'hidden_controls', 'action': 'store_false'}), + ('Enable the current slide indicator ("1 / 15"). ' + 'The default is to disable it.', + ['--current-slide'], + {'action': 'store_true', 'validator': frontend.validate_boolean}), + ('Disable the current slide indicator. This is the default.', + ['--no-current-slide'], + {'dest': 'current_slide', 'action': 'store_false'}),)) + + settings_default_overrides = {'toc_backlinks': 0} + + config_section = 's5_html writer' + config_section_dependencies = ('writers', 'html4css1 writer') + + def __init__(self): + html4css1.Writer.__init__(self) + self.translator_class = S5HTMLTranslator + + +class S5HTMLTranslator(html4css1.HTMLTranslator): + + s5_stylesheet_template = """\ + + + + + + + + +\n""" + # The script element must go in front of the link elements to + # avoid a flash of unstyled content (FOUC), reproducible with + # Firefox. + + disable_current_slide = """ +\n""" + + layout_template = """\ +
    +
    +
    + + +
    \n""" +#
    +#
    +#
    +#
    + + default_theme = 'default' + """Name of the default theme.""" + + base_theme_file = '__base__' + """Name of the file containing the name of the base theme.""" + + direct_theme_files = ( + 'slides.css', 'outline.css', 'print.css', 'opera.css', 'slides.js') + """Names of theme files directly linked to in the output HTML""" + + indirect_theme_files = ( + 's5-core.css', 'framing.css', 'pretty.css', 'blank.gif', 'iepngfix.htc') + """Names of files used indirectly; imported or used by files in + `direct_theme_files`.""" + + required_theme_files = indirect_theme_files + direct_theme_files + """Names of mandatory theme files.""" + + def __init__(self, *args): + html4css1.HTMLTranslator.__init__(self, *args) + #insert S5-specific stylesheet and script stuff: + self.theme_file_path = None + self.setup_theme() + view_mode = self.document.settings.view_mode + control_visibility = ('visible', 'hidden')[self.document.settings + .hidden_controls] + self.stylesheet.append(self.s5_stylesheet_template + % {'path': self.theme_file_path, + 'view_mode': view_mode, + 'control_visibility': control_visibility}) + if not self.document.settings.current_slide: + self.stylesheet.append(self.disable_current_slide) + self.add_meta('\n') + self.s5_footer = [] + self.s5_header = [] + self.section_count = 0 + self.theme_files_copied = None + + def setup_theme(self): + if self.document.settings.theme: + self.copy_theme() + elif self.document.settings.theme_url: + self.theme_file_path = self.document.settings.theme_url + else: + raise docutils.ApplicationError( + 'No theme specified for S5/HTML writer.') + + def copy_theme(self): + """ + Locate & copy theme files. + + A theme may be explicitly based on another theme via a '__base__' + file. The default base theme is 'default'. Files are accumulated + from the specified theme, any base themes, and 'default'. + """ + settings = self.document.settings + path = find_theme(settings.theme) + theme_paths = [path] + self.theme_files_copied = {} + required_files_copied = {} + # This is a link (URL) in HTML, so we use "/", not os.sep: + self.theme_file_path = '%s/%s' % ('ui', settings.theme) + if settings._destination: + dest = os.path.join( + os.path.dirname(settings._destination), 'ui', settings.theme) + if not os.path.isdir(dest): + os.makedirs(dest) + else: + # no destination, so we can't copy the theme + return + default = 0 + while path: + for f in os.listdir(path): # copy all files from each theme + if f == self.base_theme_file: + continue # ... except the "__base__" file + if ( self.copy_file(f, path, dest) + and f in self.required_theme_files): + required_files_copied[f] = 1 + if default: + break # "default" theme has no base theme + # Find the "__base__" file in theme directory: + base_theme_file = os.path.join(path, self.base_theme_file) + # If it exists, read it and record the theme path: + if os.path.isfile(base_theme_file): + lines = open(base_theme_file).readlines() + for line in lines: + line = line.strip() + if line and not line.startswith('#'): + path = find_theme(line) + if path in theme_paths: # check for duplicates (cycles) + path = None # if found, use default base + else: + theme_paths.append(path) + break + else: # no theme name found + path = None # use default base + else: # no base theme file found + path = None # use default base + if not path: + path = find_theme(self.default_theme) + theme_paths.append(path) + default = 1 + if len(required_files_copied) != len(self.required_theme_files): + # Some required files weren't found & couldn't be copied. + required = list(self.required_theme_files) + for f in required_files_copied.keys(): + required.remove(f) + raise docutils.ApplicationError( + 'Theme files not found: %s' + % ', '.join(['%r' % f for f in required])) + + files_to_skip_pattern = re.compile(r'~$|\.bak$|#$|\.cvsignore$') + + def copy_file(self, name, source_dir, dest_dir): + """ + Copy file `name` from `source_dir` to `dest_dir`. + Return 1 if the file exists in either `source_dir` or `dest_dir`. + """ + source = os.path.join(source_dir, name) + dest = os.path.join(dest_dir, name) + if self.theme_files_copied.has_key(dest): + return 1 + else: + self.theme_files_copied[dest] = 1 + if os.path.isfile(source): + if self.files_to_skip_pattern.search(source): + return None + settings = self.document.settings + if os.path.exists(dest) and not settings.overwrite_theme_files: + settings.record_dependencies.add(dest) + else: + src_file = open(source, 'rb') + src_data = src_file.read() + src_file.close() + dest_file = open(dest, 'wb') + dest_dir = dest_dir.replace(os.sep, '/') + dest_file.write(src_data.replace( + 'ui/default', dest_dir[dest_dir.rfind('ui/'):])) + dest_file.close() + settings.record_dependencies.add(source) + return 1 + if os.path.isfile(dest): + return 1 + + def depart_document(self, node): + header = ''.join(self.s5_header) + footer = ''.join(self.s5_footer) + title = ''.join(self.html_title).replace('

    ', '

    ') + layout = self.layout_template % {'header': header, + 'title': title, + 'footer': footer} + self.fragment.extend(self.body) + self.body_prefix.extend(layout) + self.body_prefix.append('
    \n') + self.body_prefix.append( + self.starttag({'classes': ['slide'], 'ids': ['slide0']}, 'div')) + if not self.section_count: + self.body.append('
    \n') + self.body_suffix.insert(0, '

    \n') + # skip content-type meta tag with interpolated charset value: + self.html_head.extend(self.head[1:]) + self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo + + self.docinfo + self.body + + self.body_suffix[:-1]) + + def depart_footer(self, node): + start = self.context.pop() + self.s5_footer.append('

    ') + self.s5_footer.extend(self.body[start:]) + self.s5_footer.append('

    ') + del self.body[start:] + + def depart_header(self, node): + start = self.context.pop() + header = ['\n') + del self.body[start:] + self.s5_header.extend(header) + + def visit_section(self, node): + if not self.section_count: + self.body.append('\n\n') + self.section_count += 1 + self.section_level += 1 + if self.section_level > 1: + # dummy for matching div's + self.body.append(self.starttag(node, 'div', CLASS='section')) + else: + self.body.append(self.starttag(node, 'div', CLASS='slide')) + + def visit_subtitle(self, node): + if isinstance(node.parent, nodes.section): + level = self.section_level + self.initial_header_level - 1 + if level == 1: + level = 2 + tag = 'h%s' % level + self.body.append(self.starttag(node, tag, '')) + self.context.append('\n' % tag) + else: + html4css1.HTMLTranslator.visit_subtitle(self, node) + + def visit_title(self, node): + html4css1.HTMLTranslator.visit_title(self, node) diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/README.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/README.txt Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,6 @@ +Except where otherwise noted (default/iepngfix.htc), all files in this +directory have been released into the Public Domain. + +These files are based on files from S5 1.1, released into the Public +Domain by Eric Meyer. For further details, please see +http://www.meyerweb.com/eric/tools/s5/credits.html. diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/__base__ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/__base__ Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,2 @@ +# base theme of this theme: +big-white diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/framing.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/framing.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,25 @@ +/* The following styles size, place, and layer the slide components. + Edit these if you want to change the overall slide layout. + The commented lines can be uncommented (and modified, if necessary) + to help you with the rearrangement process. */ + +/* target = 1024x768 */ + +div#header, div#footer, .slide {width: 100%; top: 0; left: 0;} +div#header {top: 0; z-index: 1;} +div#footer {display:none;} +.slide {top: 0; width: 92%; padding: 0.1em 4% 4%; z-index: 2;} +/* list-style: none;} */ +div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0;} +#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; + z-index: 10;} +html>body #currentSlide {position: fixed;} + +/* +div#header {background: #FCC;} +div#footer {background: #CCF;} +div#controls {background: #BBD;} +div#currentSlide {background: #FFC;} +*/ diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/pretty.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-black/pretty.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,109 @@ +/* This file has been placed in the public domain. */ +/* Following are the presentation styles -- edit away! */ + +html, body {margin: 0; padding: 0;} +body {background: black; color: white;} +:link, :visited {text-decoration: none; color: cyan;} +#controls :active {color: #888 !important;} +#controls :focus {outline: 1px dotted #CCC;} + +blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;} +blockquote p {margin: 0;} + +kbd {font-weight: bold; font-size: 1em;} +sup {font-size: smaller; line-height: 1px;} + +.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;} +.slide ul ul li {list-style: square;} +.slide img.leader {display: block; margin: 0 auto;} +.slide tt {font-size: 90%;} + +.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;} +.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;} +.slide h2 {font-size: 110%;} +.slide h3 {font-size: 105%;} +h1 abbr {font-variant: small-caps;} + +div#controls {position: absolute; left: 50%; bottom: 0; + width: 50%; text-align: right; font: bold 0.9em sans-serif;} +html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0; padding: 0;} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + border: none; color: #888; cursor: pointer;} +#controls #navList {height: 1em;} +#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; + background: black; color: #CCC;} + +#currentSlide {text-align: center; font-size: 0.5em; color: #AAA; + font-family: sans-serif; font-weight: bold;} + +#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0; + font-size: 150%; white-space: normal; background: transparent;} +#slide0 h2 {font: 110%; font-style: italic; color: gray;} +#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;} +#slide0 h4 {margin-top: 0; font-size: 1em;} + +ul.urls {list-style: none; display: inline; margin: 0;} +.urls li {display: inline; margin: 0;} +.external {border-bottom: 1px dotted gray;} +html>body .external {border-bottom: none;} +.external:after {content: " \274F"; font-size: smaller; color: #FCC;} + +.incremental, .incremental *, .incremental *:after { + color: black; visibility: visible; border: 0;} +img.incremental {visibility: hidden;} +.slide .current {color: lime;} + +.slide-display {display: inline ! important;} + +.huge {font-size: 150%;} +.big {font-size: 120%;} +.small {font-size: 75%;} +.tiny {font-size: 50%;} +.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;} +.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;} + +.maroon {color: maroon;} +.red {color: red;} +.magenta {color: magenta;} +.fuchsia {color: fuchsia;} +.pink {color: #FAA;} +.orange {color: orange;} +.yellow {color: yellow;} +.lime {color: lime;} +.green {color: green;} +.olive {color: olive;} +.teal {color: teal;} +.cyan {color: cyan;} +.aqua {color: aqua;} +.blue {color: blue;} +.navy {color: navy;} +.purple {color: purple;} +.black {color: black;} +.gray {color: gray;} +.silver {color: silver;} +.white {color: white;} + +.left {text-align: left ! important;} +.center {text-align: center ! important;} +.right {text-align: right ! important;} + +.animation {position: relative; margin: 1em 0; padding: 0;} +.animation img {position: absolute;} + +/* Docutils-specific overrides */ + +.slide table.docinfo {margin: 0.5em 0 0.5em 1em;} + +div.sidebar {background-color: black;} + +pre.literal-block, pre.doctest-block {background-color: black;} + +tt.docutils {background-color: black;} + +/* diagnostics */ +/* +li:after {content: " [" attr(class) "]"; color: #F88;} +div:before {content: "[" attr(class) "]"; color: #F88;} +*/ diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/framing.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/framing.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,24 @@ +/* This file has been placed in the public domain. */ +/* The following styles size, place, and layer the slide components. + Edit these if you want to change the overall slide layout. + The commented lines can be uncommented (and modified, if necessary) + to help you with the rearrangement process. */ + +/* target = 1024x768 */ + +div#header, div#footer, .slide {width: 100%; top: 0; left: 0;} +div#footer {display:none;} +.slide {top: 0; width: 92%; padding: 0.25em 4% 4%; z-index: 2;} +div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0;} +#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; + z-index: 10;} +html>body #currentSlide {position: fixed;} + +/* +div#header {background: #FCC;} +div#footer {background: #CCF;} +div#controls {background: #BBD;} +div#currentSlide {background: #FFC;} +*/ diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/pretty.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/big-white/pretty.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,107 @@ +/* This file has been placed in the public domain. */ +/* Following are the presentation styles -- edit away! */ + +html, body {margin: 0; padding: 0;} +body {background: white; color: black;} +:link, :visited {text-decoration: none; color: #00C;} +#controls :active {color: #88A !important;} +#controls :focus {outline: 1px dotted #227;} + +blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;} +blockquote p {margin: 0;} + +kbd {font-weight: bold; font-size: 1em;} +sup {font-size: smaller; line-height: 1px;} + +.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;} +.slide ul ul li {list-style: square;} +.slide img.leader {display: block; margin: 0 auto;} +.slide tt {font-size: 90%;} + +.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;} +.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;} +.slide h2 {font-size: 110%;} +.slide h3 {font-size: 105%;} +h1 abbr {font-variant: small-caps;} + +div#controls {position: absolute; left: 50%; bottom: 0; + width: 50%; text-align: right; font: bold 0.9em sans-serif;} +html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0; padding: 0;} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + border: none; color: #005; cursor: pointer;} +#controls #navList {height: 1em;} +#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; + background: #DDD; color: #227;} + +#currentSlide {text-align: center; font-size: 0.5em; color: #444; + font-family: sans-serif; font-weight: bold;} + +#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0; + font-size: 150%; white-space: normal; background: transparent;} +#slide0 h2 {font: 110%; font-style: italic; color: gray;} +#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;} +#slide0 h4 {margin-top: 0; font-size: 1em;} + +ul.urls {list-style: none; display: inline; margin: 0;} +.urls li {display: inline; margin: 0;} +.external {border-bottom: 1px dotted gray;} +html>body .external {border-bottom: none;} +.external:after {content: " \274F"; font-size: smaller; color: #77B;} + +.incremental, .incremental *, .incremental *:after { + color: white; visibility: visible; border: 0;} +img.incremental {visibility: hidden;} +.slide .current {color: green;} + +.slide-display {display: inline ! important;} + +.huge {font-size: 150%;} +.big {font-size: 120%;} +.small {font-size: 75%;} +.tiny {font-size: 50%;} +.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;} +.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;} + +.maroon {color: maroon;} +.red {color: red;} +.magenta {color: magenta;} +.fuchsia {color: fuchsia;} +.pink {color: #FAA;} +.orange {color: orange;} +.yellow {color: yellow;} +.lime {color: lime;} +.green {color: green;} +.olive {color: olive;} +.teal {color: teal;} +.cyan {color: cyan;} +.aqua {color: aqua;} +.blue {color: blue;} +.navy {color: navy;} +.purple {color: purple;} +.black {color: black;} +.gray {color: gray;} +.silver {color: silver;} +.white {color: white;} + +.left {text-align: left ! important;} +.center {text-align: center ! important;} +.right {text-align: right ! important;} + +.animation {position: relative; margin: 1em 0; padding: 0;} +.animation img {position: absolute;} + +/* Docutils-specific overrides */ + +.slide table.docinfo {margin: 0.5em 0 0.5em 1em;} + +pre.literal-block, pre.doctest-block {background-color: white;} + +tt.docutils {background-color: white;} + +/* diagnostics */ +/* +li:after {content: " [" attr(class) "]"; color: #F88;} +div:before {content: "[" attr(class) "]"; color: #F88;} +*/ diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/blank.gif Binary file buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/blank.gif has changed diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/framing.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/framing.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,25 @@ +/* This file has been placed in the public domain. */ +/* The following styles size, place, and layer the slide components. + Edit these if you want to change the overall slide layout. + The commented lines can be uncommented (and modified, if necessary) + to help you with the rearrangement process. */ + +/* target = 1024x768 */ + +div#header, div#footer, .slide {width: 100%; top: 0; left: 0;} +div#header {position: fixed; top: 0; height: 3em; z-index: 1;} +div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;} +.slide {top: 0; width: 92%; padding: 2.5em 4% 4%; z-index: 2;} +div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0;} +#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; + z-index: 10;} +html>body #currentSlide {position: fixed;} + +/* +div#header {background: #FCC;} +div#footer {background: #CCF;} +div#controls {background: #BBD;} +div#currentSlide {background: #FFC;} +*/ diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/iepngfix.htc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/iepngfix.htc Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,42 @@ + + + + + \ No newline at end of file diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/opera.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/opera.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,8 @@ +/* This file has been placed in the public domain. */ +/* DO NOT CHANGE THESE unless you really want to break Opera Show */ +.slide { + visibility: visible !important; + position: static !important; + page-break-before: always; +} +#slide0 {page-break-before: avoid;} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/outline.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/outline.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,16 @@ +/* This file has been placed in the public domain. */ +/* Don't change this unless you want the layout stuff to show up in the + outline view! */ + +.layout div, #footer *, #controlForm * {display: none;} +#footer, #controls, #controlForm, #navLinks, #toggle { + display: block; visibility: visible; margin: 0; padding: 0;} +#toggle {float: right; padding: 0.5em;} +html>body #toggle {position: fixed; top: 0; right: 0;} + +/* making the outline look pretty-ish */ + +#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;} +#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;} + +.outline {display: inline ! important;} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/pretty.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/pretty.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,120 @@ +/* This file has been placed in the public domain. */ +/* Following are the presentation styles -- edit away! */ + +html, body {margin: 0; padding: 0;} +body {background: white; color: black;} +/* Replace the background style above with the style below (and again for + div#header) for a graphic: */ +/* background: white url(bodybg.gif) -16px 0 no-repeat; */ +:link, :visited {text-decoration: none; color: #00C;} +#controls :active {color: #88A !important;} +#controls :focus {outline: 1px dotted #227;} +h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;} + +blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;} +blockquote p {margin: 0;} + +kbd {font-weight: bold; font-size: 1em;} +sup {font-size: smaller; line-height: 1px;} + +.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;} +.slide ul ul li {list-style: square;} +.slide img.leader {display: block; margin: 0 auto;} +.slide tt {font-size: 90%;} + +div#header, div#footer {background: #005; color: #AAB; font-family: sans-serif;} +/* background: #005 url(bodybg.gif) -16px 0 no-repeat; */ +div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;} +#footer h1 {display: block; padding: 0 1em;} +#footer h2 {display: block; padding: 0.8em 1em 0;} + +.slide {font-size: 1.2em;} +.slide h1 {position: absolute; top: 0.45em; z-index: 1; + margin: 0; padding-left: 0.7em; white-space: nowrap; + font: bold 150% sans-serif; color: #DDE; background: #005;} +.slide h2 {font: bold 120%/1em sans-serif; padding-top: 0.5em;} +.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;} +h1 abbr {font-variant: small-caps;} + +div#controls {position: absolute; left: 50%; bottom: 0; + width: 50%; text-align: right; font: bold 0.9em sans-serif;} +html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0; padding: 0;} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + background: #005; border: none; color: #779; cursor: pointer;} +#controls #navList {height: 1em;} +#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; + background: #DDD; color: #227;} + +#currentSlide {text-align: center; font-size: 0.5em; color: #449; + font-family: sans-serif; font-weight: bold;} + +#slide0 {padding-top: 1.5em} +#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; color: #000; + font: bold 2em sans-serif; white-space: normal; background: transparent;} +#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;} +#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;} +#slide0 h4 {margin-top: 0; font-size: 1em;} + +ul.urls {list-style: none; display: inline; margin: 0;} +.urls li {display: inline; margin: 0;} +.external {border-bottom: 1px dotted gray;} +html>body .external {border-bottom: none;} +.external:after {content: " \274F"; font-size: smaller; color: #77B;} + +.incremental, .incremental *, .incremental *:after {visibility: visible; + color: white; border: 0;} +img.incremental {visibility: hidden;} +.slide .current {color: green;} + +.slide-display {display: inline ! important;} + +.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;} +.big {font-family: sans-serif; font-weight: bold; font-size: 120%;} +.small {font-size: 75%;} +.tiny {font-size: 50%;} +.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;} +.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;} + +.maroon {color: maroon;} +.red {color: red;} +.magenta {color: magenta;} +.fuchsia {color: fuchsia;} +.pink {color: #FAA;} +.orange {color: orange;} +.yellow {color: yellow;} +.lime {color: lime;} +.green {color: green;} +.olive {color: olive;} +.teal {color: teal;} +.cyan {color: cyan;} +.aqua {color: aqua;} +.blue {color: blue;} +.navy {color: navy;} +.purple {color: purple;} +.black {color: black;} +.gray {color: gray;} +.silver {color: silver;} +.white {color: white;} + +.left {text-align: left ! important;} +.center {text-align: center ! important;} +.right {text-align: right ! important;} + +.animation {position: relative; margin: 1em 0; padding: 0;} +.animation img {position: absolute;} + +/* Docutils-specific overrides */ + +.slide table.docinfo {margin: 1em 0 0.5em 2em;} + +pre.literal-block, pre.doctest-block {background-color: white;} + +tt.docutils {background-color: white;} + +/* diagnostics */ +/* +li:after {content: " [" attr(class) "]"; color: #F88;} +div:before {content: "[" attr(class) "]"; color: #F88;} +*/ diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/print.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/print.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,24 @@ +/* This file has been placed in the public domain. */ +/* The following rule is necessary to have all slides appear in print! + DO NOT REMOVE IT! */ +.slide, ul {page-break-inside: avoid; visibility: visible !important;} +h1 {page-break-after: avoid;} + +body {font-size: 12pt; background: white;} +* {color: black;} + +#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;} +#slide0 h3 {margin: 0; padding: 0;} +#slide0 h4 {margin: 0 0 0.5em; padding: 0;} +#slide0 {margin-bottom: 3em;} + +#header {display: none;} +#footer h1 {margin: 0; border-bottom: 1px solid; color: gray; + font-style: italic;} +#footer h2, #controls {display: none;} + +.print {display: inline ! important;} + +/* The following rule keeps the layout stuff out of print. + Remove at your own risk! */ +.layout, .layout * {display: none !important;} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/s5-core.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/s5-core.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,11 @@ +/* This file has been placed in the public domain. */ +/* Do not edit or override these styles! + The system will likely break if you do. */ + +div#header, div#footer, div#controls, .slide {position: absolute;} +html>body div#header, html>body div#footer, + html>body div#controls, html>body .slide {position: fixed;} +.handout {display: none;} +.layout {display: block;} +.slide, .hideme, .incremental {visibility: hidden;} +#slide0 {visibility: visible;} diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.css Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,10 @@ +/* This file has been placed in the public domain. */ + +/* required to make the slide show run at all */ +@import url(s5-core.css); + +/* sets basic placement and size of slide components */ +@import url(framing.css); + +/* styles that make the slides look good */ +@import url(pretty.css); diff -r 044383f39525 -r be27ed110b50 buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildframework/helium/external/python/lib/2.5/docutils-0.5-py2.5.egg/docutils/writers/s5_html/themes/default/slides.js Wed Oct 28 14:39:48 2009 +0000 @@ -0,0 +1,558 @@ +// S5 v1.1 slides.js -- released into the Public Domain +// Modified for Docutils (http://docutils.sf.net) by David Goodger +// +// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for +// information about all the wonderful and talented contributors to this code! + +var undef; +var slideCSS = ''; +var snum = 0; +var smax = 1; +var slideIDs = new Array(); +var incpos = 0; +var number = undef; +var s5mode = true; +var defaultView = 'slideshow'; +var controlVis = 'visible'; + +var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0; +var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0; +var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0; + +function hasClass(object, className) { + if (!object.className) return false; + return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1); +} + +function hasValue(object, value) { + if (!object) return false; + return (object.search('(^|\\s)' + value + '(\\s|$)') != -1); +} + +function removeClass(object,className) { + if (!object) return; + object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2); +} + +function addClass(object,className) { + if (!object || hasClass(object, className)) return; + if (object.className) { + object.className += ' '+className; + } else { + object.className = className; + } +} + +function GetElementsWithClassName(elementName,className) { + var allElements = document.getElementsByTagName(elementName); + var elemColl = new Array(); + for (var i = 0; i< allElements.length; i++) { + if (hasClass(allElements[i], className)) { + elemColl[elemColl.length] = allElements[i]; + } + } + return elemColl; +} + +function isParentOrSelf(element, id) { + if (element == null || element.nodeName=='BODY') return false; + else if (element.id == id) return true; + else return isParentOrSelf(element.parentNode, id); +} + +function nodeValue(node) { + var result = ""; + if (node.nodeType == 1) { + var children = node.childNodes; + for (var i = 0; i < children.length; ++i) { + result += nodeValue(children[i]); + } + } + else if (node.nodeType == 3) { + result = node.nodeValue; + } + return(result); +} + +function slideLabel() { + var slideColl = GetElementsWithClassName('*','slide'); + var list = document.getElementById('jumplist'); + smax = slideColl.length; + for (var n = 0; n < smax; n++) { + var obj = slideColl[n]; + + var did = 'slide' + n.toString(); + if (obj.getAttribute('id')) { + slideIDs[n] = obj.getAttribute('id'); + } + else { + obj.setAttribute('id',did); + slideIDs[n] = did; + } + if (isOp) continue; + + var otext = ''; + var menu = obj.firstChild; + if (!menu) continue; // to cope with empty slides + while (menu && menu.nodeType == 3) { + menu = menu.nextSibling; + } + if (!menu) continue; // to cope with slides with only text nodes + + var menunodes = menu.childNodes; + for (var o = 0; o < menunodes.length; o++) { + otext += nodeValue(menunodes[o]); + } + list.options[list.length] = new Option(n + ' : ' + otext, n); + } +} + +function currentSlide() { + var cs; + var footer_nodes; + var vis = 'visible'; + if (document.getElementById) { + cs = document.getElementById('currentSlide'); + footer_nodes = document.getElementById('footer').childNodes; + } else { + cs = document.currentSlide; + footer = document.footer.childNodes; + } + cs.innerHTML = '' + snum + '<\/span> ' + + '\/<\/span> ' + + '' + (smax-1) + '<\/span>'; + if (snum == 0) { + vis = 'hidden'; + } + cs.style.visibility = vis; + for (var i = 0; i < footer_nodes.length; i++) { + if (footer_nodes[i].nodeType == 1) { + footer_nodes[i].style.visibility = vis; + } + } +} + +function go(step) { + if (document.getElementById('slideProj').disabled || step == 0) return; + var jl = document.getElementById('jumplist'); + var cid = slideIDs[snum]; + var ce = document.getElementById(cid); + if (incrementals[snum].length > 0) { + for (var i = 0; i < incrementals[snum].length; i++) { + removeClass(incrementals[snum][i], 'current'); + removeClass(incrementals[snum][i], 'incremental'); + } + } + if (step != 'j') { + snum += step; + lmax = smax - 1; + if (snum > lmax) snum = lmax; + if (snum < 0) snum = 0; + } else + snum = parseInt(jl.value); + var nid = slideIDs[snum]; + var ne = document.getElementById(nid); + if (!ne) { + ne = document.getElementById(slideIDs[0]); + snum = 0; + } + if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;} + if (incrementals[snum].length > 0 && incpos == 0) { + for (var i = 0; i < incrementals[snum].length; i++) { + if (hasClass(incrementals[snum][i], 'current')) + incpos = i + 1; + else + addClass(incrementals[snum][i], 'incremental'); + } + } + if (incrementals[snum].length > 0 && incpos > 0) + addClass(incrementals[snum][incpos - 1], 'current'); + ce.style.visibility = 'hidden'; + ne.style.visibility = 'visible'; + jl.selectedIndex = snum; + currentSlide(); + number = 0; +} + +function goTo(target) { + if (target >= smax || target == snum) return; + go(target - snum); +} + +function subgo(step) { + if (step > 0) { + removeClass(incrementals[snum][incpos - 1],'current'); + removeClass(incrementals[snum][incpos], 'incremental'); + addClass(incrementals[snum][incpos],'current'); + incpos++; + } else { + incpos--; + removeClass(incrementals[snum][incpos],'current'); + addClass(incrementals[snum][incpos], 'incremental'); + addClass(incrementals[snum][incpos - 1],'current'); + } +} + +function toggle() { + var slideColl = GetElementsWithClassName('*','slide'); + var slides = document.getElementById('slideProj'); + var outline = document.getElementById('outlineStyle'); + if (!slides.disabled) { + slides.disabled = true; + outline.disabled = false; + s5mode = false; + fontSize('1em'); + for (var n = 0; n < smax; n++) { + var slide = slideColl[n]; + slide.style.visibility = 'visible'; + } + } else { + slides.disabled = false; + outline.disabled = true; + s5mode = true; + fontScale(); + for (var n = 0; n < smax; n++) { + var slide = slideColl[n]; + slide.style.visibility = 'hidden'; + } + slideColl[snum].style.visibility = 'visible'; + } +} + +function showHide(action) { + var obj = GetElementsWithClassName('*','hideme')[0]; + switch (action) { + case 's': obj.style.visibility = 'visible'; break; + case 'h': obj.style.visibility = 'hidden'; break; + case 'k': + if (obj.style.visibility != 'visible') { + obj.style.visibility = 'visible'; + } else { + obj.style.visibility = 'hidden'; + } + break; + } +} + +// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/) +function keys(key) { + if (!key) { + key = event; + key.which = key.keyCode; + } + if (key.which == 84) { + toggle(); + return; + } + if (s5mode) { + switch (key.which) { + case 10: // return + case 13: // enter + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; + if (key.target && isParentOrSelf(key.target, 'controls')) return; + if(number != undef) { + goTo(number); + break; + } + case 32: // spacebar + case 34: // page down + case 39: // rightkey + case 40: // downkey + if(number != undef) { + go(number); + } else if (!incrementals[snum] || incpos >= incrementals[snum].length) { + go(1); + } else { + subgo(1); + } + break; + case 33: // page up + case 37: // leftkey + case 38: // upkey + if(number != undef) { + go(-1 * number); + } else if (!incrementals[snum] || incpos <= 0) { + go(-1); + } else { + subgo(-1); + } + break; + case 36: // home + goTo(0); + break; + case 35: // end + goTo(smax-1); + break; + case 67: // c + showHide('k'); + break; + } + if (key.which < 48 || key.which > 57) { + number = undef; + } else { + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; + if (key.target && isParentOrSelf(key.target, 'controls')) return; + number = (((number != undef) ? number : 0) * 10) + (key.which - 48); + } + } + return false; +} + +function clicker(e) { + number = undef; + var target; + if (window.event) { + target = window.event.srcElement; + e = window.event; + } else target = e.target; + if (target.href != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target, 'object')) return true; + if (!e.which || e.which == 1) { + if (!incrementals[snum] || incpos >= incrementals[snum].length) { + go(1); + } else { + subgo(1); + } + } +} + +function findSlide(hash) { + var target = document.getElementById(hash); + if (target) { + for (var i = 0; i < slideIDs.length; i++) { + if (target.id == slideIDs[i]) return i; + } + } + return null; +} + +function slideJump() { + if (window.location.hash == null || window.location.hash == '') { + currentSlide(); + return; + } + if (window.location.hash == null) return; + var dest = null; + dest = findSlide(window.location.hash.slice(1)); + if (dest == null) { + dest = 0; + } + go(dest - snum); +} + +function fixLinks() { + var thisUri = window.location.href; + thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length); + var aelements = document.getElementsByTagName('A'); + for (var i = 0; i < aelements.length; i++) { + var a = aelements[i].href; + var slideID = a.match('\#.+'); + if ((slideID) && (slideID[0].slice(0,1) == '#')) { + var dest = findSlide(slideID[0].slice(1)); + if (dest != null) { + if (aelements[i].addEventListener) { + aelements[i].addEventListener("click", new Function("e", + "if (document.getElementById('slideProj').disabled) return;" + + "go("+dest+" - snum); " + + "if (e.preventDefault) e.preventDefault();"), true); + } else if (aelements[i].attachEvent) { + aelements[i].attachEvent("onclick", new Function("", + "if (document.getElementById('slideProj').disabled) return;" + + "go("+dest+" - snum); " + + "event.returnValue = false;")); + } + } + } + } +} + +function externalLinks() { + if (!document.getElementsByTagName) return; + var anchors = document.getElementsByTagName('a'); + for (var i=0; i' + + '