diff --git a/cmake/modules/ECMKDE4Macros.cmake b/cmake/modules/ECMKDE4Macros.cmake index 5acb536d8..ea4ab07b2 100644 --- a/cmake/modules/ECMKDE4Macros.cmake +++ b/cmake/modules/ECMKDE4Macros.cmake @@ -1,128 +1,134 @@ # # ecm compatible build system wrapper for KDE4 # macro(ki18n_wrap_ui) kde4_add_ui_files(${ARGN}) endmacro(ki18n_wrap_ui) macro(kconfig_add_kcfg_files) kde4_add_kcfg_files(${ARGN}) endmacro(kconfig_add_kcfg_files) macro(ecm_optional_add_subdirectory) add_subdirectory(${ARGN}) endmacro(ecm_optional_add_subdirectory) macro(ecm_add_test) set(sources) set(libs) set(name_prefix) set(test_name) set(mode 0) set(guimode "NOGUI") foreach(a ${ARGN}) if(a STREQUAL "LINK_LIBRARIES") set(mode 1) elseif(a STREQUAL "NAME_PREFIX") set(mode 2) elseif(a STREQUAL "GUI") set(guimode "GUI") set(mode 3) elseif(a STREQUAL "TEST_NAME") set(mode 4) elseif (mode EQUAL 0) list(APPEND sources ${a}) elseif(mode EQUAL 1) list(APPEND libs ${a}) elseif(mode EQUAL 2) set(name_prefix ${a}) elseif(mode EQUAL 4) set(test_name ${a}) endif() endforeach(a) set(targetname ${test_name}) if(name_prefix) set(testname ${name_prefix}-${targetname}) else() set(testname ${targetname}) endif() kde4_add_unit_test(${targetname} TESTNAME ${testname} ${guimode} ${sources}) target_link_libraries(${targetname} ${libs}) endmacro(ecm_add_test) macro(add_executable) # avoid recursive loops + if(NOT DEFINED in_add_executable) + set(in_add_executable 0) + endif() math(EXPR in_add_executable "${in_add_executable} + 1") if(${in_find_package} OR ${in_add_executable} GREATER 1) _add_executable(${ARGV}) else() kde4_add_executable(${ARGV}) endif() math(EXPR in_add_executable "${in_add_executable} - 1") endmacro(add_executable) macro(ecm_mark_nongui_executable) foreach(_target ${ARGN}) set_target_properties(${_target} PROPERTIES WIN32_EXECUTABLE FALSE MACOSX_BUNDLE FALSE ) endforeach() endmacro(ecm_mark_nongui_executable) macro(kdoctools_create_handbook) set(KDOCTOOLS_CUSTOMIZATION_DIR "${KDE4_DATA_INSTALL_DIR}/ksgmltools2/customization") set(KDEX_DTD ${KDE4_DATA_DIR}/ksgmltools2/customization/dtd/kdex.dtd) set(kdedbx45_dtd " %kdexDTD; ") set(CUSTOM_DTD ${CMAKE_CURRENT_SOURCE_DIR}/dtd/kdedbx45.dtd) if (NOT EXISTS ${CUSTOM_DTD}) file(WRITE ${CUSTOM_DTD} "${kdedbx45_dtd}") endif() kde4_create_handbook(${ARGN}) endmacro() macro(ecm_install_icons) kde4_install_icons(${ICON_INSTALL_DIR}) endmacro() macro(find_package package) # avoid recursive loops + if(NOT DEFINED in_find_package) + set(in_find_package 0) + endif() math(EXPR in_find_package "${in_find_package} + 1") #message("-- ${ARGV} --") if("${package}" MATCHES "^(Qt5)") #message("-- replaced by finding Qt4 --") _find_package(Qt4 4.4.3 REQUIRED QtCore QtGui QtXml QtTest QtWebKit) elseif("${package}" MATCHES "^(KF5)$") #message("-- replaced by finding KDE4 --") _find_package(KDE4 REQUIRED) include(KDE4Defaults) include(MacroLibrary) # The FindKDE4.cmake module sets _KDE4_PLATFORM_DEFINITIONS with # definitions like _GNU_SOURCE that are needed on each platform. set(CMAKE_REQUIRED_DEFINITIONS ${_KDE4_PLATFORM_DEFINITIONS} -DQT_STRICT_ITERATORS) add_definitions (${KDE4_DEFINITIONS}) include_directories(${KDE4_INCLUDES}) if(KDE4_BUILD_TESTS) enable_testing() set(BUILD_UNITTESTS 1) endif() elseif("${package}" MATCHES "^(KDevPlatform)$") _find_package(${ARGV}) if ("${KDevPlatform_VERSION_MAJOR}" STREQUAL "5") message(FATAL_ERROR "Could not compile with KF5 based kdevplatform. Please uninstall or specify -DDISABLE_PHP_IMPORT=1") endif() else() _find_package(${ARGV}) endif() math(EXPR in_find_package "${in_find_package} - 1") endmacro() diff --git a/test/import/python/method-parameters.py b/test/import/python/method-parameters.py new file mode 100644 index 000000000..70cd06270 --- /dev/null +++ b/test/import/python/method-parameters.py @@ -0,0 +1,22 @@ + +class TestMethodParameters(): + def method(self): + pass + + def method_params(self,a,b): + pass + + def method_params_simple_default_values(self,a=0,a=-1,b=None,c="str",d=0.1): + pass + + def method_params_dict(self,a={} b={'a':1,'b':2}): + pass + + def method_params_dict_nested(self,a={} b={'a':1,'b':{'a':1,'b':2}}): + pass + + def method_params_list(self,a=[], b=[1,2]): + pass + + def method_params_tuple(self,a=(), b=(1,2)): + pass diff --git a/test/import/python/types.py b/test/import/python/types.py index 5203f90fa..2290f8299 100644 --- a/test/import/python/types.py +++ b/test/import/python/types.py @@ -1,32 +1,50 @@ # coding=UTF-8 # see https://docs.python.org/3/tutorial/classes.html#class-and-instance-variables +class ReferencedType(): + def __init__(self, a=0, b=0): + pass + +myobject = ReferencedType() + class Types(): class_variable_bool_true=True class_variable_bool_false=False class_variable_int=3 class_variable_negative_int=-54341 class_variable_float=3.12334 class_variable_negative_float=-1.0876544 class_variable_string="1234" class_variable_list=[] + class_variable_list_params=[1,2] class_variable_dict={} - class_variable_object=bpy.types.render + class_variable_dict_params={'a':1, 'b':2} + class_variable_tuple=() + class_variable_tuple_params=(1,2,3) + class_variable_object=myobject + class_variable_object_type=ReferencedType() + class_variable_object_type_params=ReferencedType(1,2) # We import instance variables only from __init__() def __init__(): self.instance_variable_bool_true=True self.instance_variable_bool_false=False self.instance_variable_int=3 self.instance_variable_negative_int=-54341 self.instance_variable_float=3.12334 self.instance_variable_negative_float=-1.9876 self.test() # should be ignored self.instance_variable_string="1234" self.instance_variable_list=[] + self.instance_variable_list_params=[1,2] self.instance_variable_dict={} - self.instance_variable_object=bpy.types.render + self.instance_variable_dict_params={'a':1, 'b':2} + self.instance_variable_tuples=() + self.instance_variable_tuple_params=(1,2,3) + self.instance_variable_object=myobject + self.instance_variable_object_type=ReferencedType() + self.instance_variable_object_type_params=ReferencedType(1,2) def test(): - pass \ No newline at end of file + pass diff --git a/test/import/python/visibility.py b/test/import/python/visibility.py index 3aab16043..02cc5a901 100644 --- a/test/import/python/visibility.py +++ b/test/import/python/visibility.py @@ -1,19 +1,23 @@ # coding=UTF-8 class Visibility(): __private=0 _protected=0 public=0 + # public by default + def __init__(self): + pass + def public(self): pass def _protected(self): pass def __private(self): pass diff --git a/umbrello/CMakeLists.txt b/umbrello/CMakeLists.txt index 82e39959d..357d0bfe8 100644 --- a/umbrello/CMakeLists.txt +++ b/umbrello/CMakeLists.txt @@ -1,679 +1,673 @@ add_subdirectory( headings ) +add_subdirectory(docgenerators) if(ENABLE_OBJECT_DIAGRAM) set(ACTION_NEW_OBJECT_DIAGRAM "") endif() configure_file(umbrelloui.rc.cmake ${CMAKE_CURRENT_BINARY_DIR}/umbrelloui.rc @ONLY) if(BUILD_KF5) configure_file(ui.qrc.cmake ${CMAKE_CURRENT_BINARY_DIR}/ui.qrc @ONLY) endif() ########### set variables ############# # php import support requires kdevplatform and kdev-php # which does not compile without NO_CAST_XX_ASCII if(NOT BUILD_PHP_IMPORT) add_definitions(-DQT_NO_CAST_TO_ASCII) add_definitions(-DQT_NO_CAST_FROM_ASCII) endif() # Some definitions for experimental code or debugging # TODO migrate debug settings to DEBUG_REGISTER macro #add_definitions(-DXMI_FLAT_PACKAGES) # umlobject #add_definitions(-DDEBUG_LVITEM_INSERTION_ORDER) # umllistviewitem #add_definitions(-DTRY_BUGFIX_120682) # model_utils #add_definitions(-DVERBOSE_DEBUGGING) # listpopupmenu, association, petaltree2uml, # umlobject, umldoc, classifierlistpage if(UNIX) add_definitions(-D_GLIBCXX_PERMIT_BACKWARD_HASH) endif() add_definitions(-DCMAKE_BINARY_DIR="${CMAKE_BINARY_DIR}") add_definitions(-DDOCGENERATORS_DIR="${CMAKE_SOURCE_DIR}/umbrello/docgenerators") add_definitions(-DUMBRELLOUI_RC="${CMAKE_CURRENT_BINARY_DIR}/umbrelloui.rc") include_directories( ${LIBXML2_INCLUDE_DIR} ${LIBXSLT_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/ ${CMAKE_CURRENT_SOURCE_DIR}/clipboard/ ${CMAKE_CURRENT_SOURCE_DIR}/cmds ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/ada/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/as/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/cpp/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/csharp/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/d/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/idl/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/java/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/js/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/pascal/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/perl/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/php/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/python/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/ruby/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/sql/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/tcl/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/vala/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/xml/ ${CMAKE_CURRENT_SOURCE_DIR}/codegenwizard/ ${CMAKE_CURRENT_SOURCE_DIR}/codeimport/ ${CMAKE_CURRENT_SOURCE_DIR}/codeimport/csharp/ ${CMAKE_CURRENT_SOURCE_DIR}/codeimpwizard/ ${CMAKE_CURRENT_SOURCE_DIR}/debug/ ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/ ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/pages/ ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/widgets/ ${CMAKE_CURRENT_SOURCE_DIR}/docgenerators/ ${CMAKE_CURRENT_SOURCE_DIR}/finder/ ${CMAKE_CURRENT_SOURCE_DIR}/refactoring/ ${CMAKE_CURRENT_SOURCE_DIR}/uml1model/ ${CMAKE_CURRENT_SOURCE_DIR}/umlwidgets/ ${CMAKE_CURRENT_SOURCE_DIR}/menus ${CMAKE_SOURCE_DIR}/lib/cppparser/ ${CMAKE_SOURCE_DIR}/lib/interfaces/ ) set(libdebug_SRCS debug/debug_utils.cpp ) set(libcodegenerator_SRCS codegenerators/advancedcodegenerator.cpp codegenerators/classifiercodedocument.cpp codegenerators/codeaccessormethod.cpp codegenerators/codeblock.cpp codegenerators/codeblockwithcomments.cpp codegenerators/codeclassfield.cpp codegenerators/codeclassfielddeclarationblock.cpp codegenerators/codecomment.cpp codegenerators/codedocument.cpp codegenerators/codegenerationpolicy.cpp codegenerators/codegenerator.cpp codegenerators/codegenfactory.cpp codegenerators/codegenobjectwithtextblocks.cpp codegenerators/codegenpolicyext.cpp codegenerators/codegen_utils.cpp codegenerators/codemethodblock.cpp codegenerators/codeoperation.cpp codegenerators/codeparameter.cpp codegenerators/ada/adawriter.cpp codegenerators/as/aswriter.cpp codegenerators/cpp/cppcodeclassfield.cpp codegenerators/cpp/cppcodecomment.cpp codegenerators/cpp/cppcodedocumentation.cpp codegenerators/cpp/cppcodegenerationform.cpp codegenerators/cpp/cppcodegenerationpolicy.cpp codegenerators/cpp/cppcodegenerationpolicypage.cpp codegenerators/cpp/cppcodegenerator.cpp codegenerators/cpp/cppheaderclassdeclarationblock.cpp codegenerators/cpp/cppheadercodeaccessormethod.cpp codegenerators/cpp/cppheadercodeclassfielddeclarationblock.cpp codegenerators/cpp/cppheadercodedocument.cpp codegenerators/cpp/cppheadercodeoperation.cpp codegenerators/cpp/cppmakecodedocument.cpp codegenerators/cpp/cppsourcecodeaccessormethod.cpp codegenerators/cpp/cppsourcecodeclassfielddeclarationblock.cpp codegenerators/cpp/cppsourcecodedocument.cpp codegenerators/cpp/cppsourcecodeoperation.cpp codegenerators/cpp/cppwriter.cpp codegenerators/csharp/csharpwriter.cpp codegenerators/d/dclassdeclarationblock.cpp codegenerators/d/dclassifiercodedocument.cpp codegenerators/d/dcodeaccessormethod.cpp codegenerators/d/dcodeclassfield.cpp codegenerators/d/dcodeclassfielddeclarationblock.cpp codegenerators/d/dcodecomment.cpp codegenerators/d/dcodedocumentation.cpp codegenerators/d/dcodegenerationpolicy.cpp codegenerators/d/dcodegenerationpolicypage.cpp codegenerators/d/dcodegenerator.cpp codegenerators/d/dcodeoperation.cpp codegenerators/d/dwriter.cpp codegenerators/hierarchicalcodeblock.cpp codegenerators/idl/idlwriter.cpp codegenerators/java/javaantcodedocument.cpp codegenerators/java/javaclassdeclarationblock.cpp codegenerators/java/javaclassifiercodedocument.cpp codegenerators/java/javacodeaccessormethod.cpp codegenerators/java/javacodeclassfield.cpp codegenerators/java/javacodeclassfielddeclarationblock.cpp codegenerators/java/javacodecomment.cpp codegenerators/java/javacodedocumentation.cpp codegenerators/java/javacodegenerationpolicy.cpp codegenerators/java/javacodegenerationpolicypage.cpp codegenerators/java/javacodegenerator.cpp codegenerators/java/javacodeoperation.cpp codegenerators/java/javawriter.cpp codegenerators/js/jswriter.cpp codegenerators/ownedcodeblock.cpp codegenerators/ownedhierarchicalcodeblock.cpp codegenerators/pascal/pascalwriter.cpp codegenerators/perl/perlwriter.cpp codegenerators/php/php5writer.cpp codegenerators/php/phpwriter.cpp codegenerators/python/pythonwriter.cpp codegenerators/ruby/rubyclassdeclarationblock.cpp codegenerators/ruby/rubyclassifiercodedocument.cpp codegenerators/ruby/rubycodeaccessormethod.cpp codegenerators/ruby/rubycodeclassfield.cpp codegenerators/ruby/rubycodeclassfielddeclarationblock.cpp codegenerators/ruby/rubycodecomment.cpp codegenerators/ruby/rubycodedocumentation.cpp codegenerators/ruby/rubycodegenerationpolicy.cpp codegenerators/ruby/rubycodegenerationpolicypage.cpp codegenerators/ruby/rubycodegenerator.cpp codegenerators/ruby/rubycodeoperation.cpp codegenerators/ruby/rubywriter.cpp codegenerators/simplecodegenerator.cpp codegenerators/sql/mysqlwriter.cpp codegenerators/sql/postgresqlwriter.cpp codegenerators/sql/sqlwriter.cpp codegenerators/tcl/tclwriter.cpp codegenerators/textblock.cpp codegenerators/vala/valawriter.cpp codegenerators/xml/xmlcodecomment.cpp codegenerators/xml/xmlelementcodeblock.cpp codegenerators/xml/xmlschemawriter.cpp ) ki18n_wrap_ui( libcodegenerator_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/cpp/cppcodegenerationformbase.ui ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/d/dcodegenerationformbase.ui ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/java/javacodegenerationformbase.ui ${CMAKE_CURRENT_SOURCE_DIR}/codegenerators/ruby/rubycodegenerationformbase.ui ) set(libdocgenerator_SRCS docgenerators/docbook2xhtmlgeneratorjob.cpp docgenerators/docbookgenerator.cpp docgenerators/docbookgeneratorjob.cpp docgenerators/xhtmlgenerator.cpp ) set(libdialogs_SRCS dialogs/activitydialog.cpp dialogs/associationpropertiesdialog.cpp dialogs/classpropertiesdialog.cpp dialogs/classwizard.cpp dialogs/codeeditor.cpp dialogs/codetextedit.cpp dialogs/codetexthighlighter.cpp dialogs/codeviewerdialog.cpp dialogs/diagramselectiondialog.cpp dialogs/dialog_utils.cpp dialogs/dontaskagain.cpp dialogs/exportallviewsdialog.cpp dialogs/finddialog.cpp dialogs/messagewidgetpropertiesdialog.cpp dialogs/multipagedialogbase.cpp dialogs/notedialog.cpp dialogs/objectnodedialog.cpp dialogs/overwritedialog.cpp dialogs/parameterpropertiesdialog.cpp dialogs/selectoperationdialog.cpp dialogs/settingsdialog.cpp dialogs/singlepagedialogbase.cpp dialogs/statedialog.cpp dialogs/umlattributedialog.cpp dialogs/umlinstanceattributedialog.cpp dialogs/umlcheckconstraintdialog.cpp dialogs/umlentityattributedialog.cpp dialogs/umlenumliteraldialog.cpp dialogs/umlfiledialog.cpp dialogs/umlforeignkeyconstraintdialog.cpp dialogs/umloperationdialog.cpp dialogs/umlroledialog.cpp dialogs/umltemplatedialog.cpp dialogs/umluniqueconstraintdialog.cpp dialogs/umlviewdialog.cpp dialogs/pages/activitypage.cpp dialogs/pages/notepage.cpp dialogs/pages/associationgeneralpage.cpp dialogs/pages/associationrolepage.cpp dialogs/pages/autolayoutoptionpage.cpp dialogs/pages/classassociationspage.cpp dialogs/pages/classgeneralpage.cpp dialogs/pages/classifierlistpage.cpp dialogs/pages/classoptionspage.cpp dialogs/pages/codegenerationpolicypage.cpp dialogs/pages/codeimportoptionspage.cpp dialogs/pages/codevieweroptionspage.cpp dialogs/pages/constraintlistpage.cpp dialogs/pages/defaultcodegenpolicypage.cpp dialogs/pages/diagramprintpage.cpp dialogs/pages/diagrampropertiespage.cpp dialogs/pages/dialogpagebase.cpp dialogs/pages/generaloptionpage.cpp dialogs/pages/packagecontentspage.cpp dialogs/pages/selectoperationpage.cpp dialogs/pages/uioptionspage.cpp dialogs/pages/umlroleproperties.cpp dialogs/pages/umlwidgetstylepage.cpp dialogs/widgets/documentationwidget.cpp dialogs/widgets/imagetypewidget.cpp dialogs/widgets/resolutionwidget.cpp dialogs/widgets/umlartifacttypewidget.cpp dialogs/widgets/umldatatypewidget.cpp dialogs/widgets/defaultvaluewidget.cpp dialogs/widgets/umlobjectnamewidget.cpp dialogs/widgets/umlpackagewidget.cpp dialogs/widgets/umlstereotypewidget.cpp dialogs/widgets/visibilityenumwidget.cpp ) ki18n_wrap_ui( libdialogs_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/codeviewerdialogbase.ui ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/codevieweroptionsbase.ui ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/exportallviewsdialogbase.ui ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/finddialog.ui ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/pages/autolayoutoptionpage.ui ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/pages/codeimportoptionspage.ui ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/pages/diagrampropertiespage.ui ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/pages/umlrolepropertiesbase.ui ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/umlinstanceattributedialog.ui ) set(librefactoring_SRCS refactoring/refactoringassistant.cpp ) set(libcodegenwizard_SRCS codegenwizard/codegenerationwizard.cpp codegenwizard/codegenoptionspage.cpp codegenwizard/codegenselectpage.cpp codegenwizard/codegenstatuspage.cpp ) ki18n_wrap_ui( libcodegenwizard_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/codegenwizard/codegenoptionspage.ui ${CMAKE_CURRENT_SOURCE_DIR}/codegenwizard/codegenselectpage.ui ${CMAKE_CURRENT_SOURCE_DIR}/codegenwizard/codegenstatuspage.ui ) set(libcodeimpwizard_SRCS codeimpwizard/codeimportingwizard.cpp codeimpwizard/codeimpselectpage.cpp codeimpwizard/codeimpstatuspage.cpp codeimpwizard/codeimpthread.cpp ) ki18n_wrap_ui( libcodeimpwizard_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/codeimpwizard/codeimpselectpage.ui ${CMAKE_CURRENT_SOURCE_DIR}/codeimpwizard/codeimpstatuspage.ui ) set(libcodeimport_SRCS codeimport/adaimport.cpp codeimport/classimport.cpp codeimport/idlimport.cpp codeimport/import_utils.cpp codeimport/javaimport.cpp codeimport/nativeimportbase.cpp codeimport/pascalimport.cpp codeimport/pythonimport.cpp codeimport/sqlimport.cpp codeimport/csharp/csharpimport.cpp ) if(BUILD_PHP_IMPORT) list(APPEND libcodeimport_SRCS codeimport/phpimport.cpp ) endif() list(APPEND libcodeimport_SRCS codeimport/cppimport.cpp ) set(libkdevcppparser_SRCS ${CMAKE_SOURCE_DIR}/lib/cppparser/ast.cpp ${CMAKE_SOURCE_DIR}/lib/cppparser/ast_utils.cpp ${CMAKE_SOURCE_DIR}/lib/cppparser/cachemanager.cpp ${CMAKE_SOURCE_DIR}/lib/cppparser/driver.cpp ${CMAKE_SOURCE_DIR}/lib/cppparser/errors.cpp ${CMAKE_SOURCE_DIR}/lib/cppparser/lexer.cpp ${CMAKE_SOURCE_DIR}/lib/cppparser/lexercache.cpp ${CMAKE_SOURCE_DIR}/lib/cppparser/lookup.cpp ${CMAKE_SOURCE_DIR}/lib/cppparser/parser.cpp ${CMAKE_SOURCE_DIR}/lib/cppparser/tree_parser.cpp ${CMAKE_SOURCE_DIR}/lib/interfaces/hashedstring.cpp codeimport/kdevcppparser/cpptree2uml.cpp ) set(libclipboard_SRCS clipboard/idchangelog.cpp clipboard/umlclipboard.cpp clipboard/umldragdata.cpp ) set(libcmds_SRCS cmds/cmdbaseobjectcommand.cpp cmds/cmdcreatediagram.cpp cmds/cmdhandlerename.cpp cmds/cmdremovediagram.cpp cmds/cmdsetstereotype.cpp cmds/cmdsetvisibility.cpp cmds/generic/cmdrenameumlinstancetype.cpp cmds/generic/cmdcreateumlobject.cpp cmds/generic/cmdremoveumlobject.cpp cmds/generic/cmdrenameumlobject.cpp cmds/widget/cmdbasewidgetcommand.cpp cmds/widget/cmdchangefont.cpp cmds/widget/cmdchangetextcolor.cpp cmds/widget/cmdchangelinecolor.cpp cmds/widget/cmdchangelinewidth.cpp cmds/widget/cmdchangefillcolor.cpp cmds/widget/cmdchangeusefillcolor.cpp cmds/widget/cmdchangemultiplicity.cpp cmds/widget/cmdchangevisualproperty.cpp cmds/widget/cmdcreatewidget.cpp cmds/widget/cmdmovewidget.cpp cmds/widget/cmdresizewidget.cpp cmds/widget/cmdremovewidget.cpp cmds/widget/cmdsetname.cpp cmds/widget/cmdsettxt.cpp ) set(libmenus_SRCS menus/listpopupmenu.cpp menus/umllistviewpopupmenu.cpp menus/umlscenepopupmenu.cpp menus/associationwidgetpopupmenu.cpp menus/widgetbasepopupmenu.cpp menus/dialogspopupmenu.cpp ) set(libumlwidgets_SRCS umlwidgets/activitywidget.cpp umlwidgets/actorwidget.cpp umlwidgets/artifactwidget.cpp umlwidgets/associationline.cpp umlwidgets/associationwidget.cpp umlwidgets/boxwidget.cpp umlwidgets/categorywidget.cpp umlwidgets/childwidgetplacement.cpp umlwidgets/childwidgetplacementpin.cpp umlwidgets/childwidgetplacementport.cpp umlwidgets/classifierwidget.cpp umlwidgets/combinedfragmentwidget.cpp umlwidgets/componentwidget.cpp umlwidgets/datatypewidget.cpp umlwidgets/entitywidget.cpp umlwidgets/enumwidget.cpp umlwidgets/floatingdashlinewidget.cpp umlwidgets/floatingtextwidget.cpp umlwidgets/forkjoinwidget.cpp umlwidgets/interfacewidget.cpp umlwidgets/layoutgrid.cpp umlwidgets/linkwidget.cpp umlwidgets/messagewidget.cpp umlwidgets/nodewidget.cpp umlwidgets/notewidget.cpp umlwidgets/objectnodewidget.cpp umlwidgets/objectwidget.cpp umlwidgets/packagewidget.cpp umlwidgets/pinportbase.cpp umlwidgets/pinwidget.cpp umlwidgets/portwidget.cpp umlwidgets/preconditionwidget.cpp umlwidgets/regionwidget.cpp umlwidgets/seqlinewidget.cpp umlwidgets/signalwidget.cpp umlwidgets/statewidget.cpp umlwidgets/toolbarstateonewidget.cpp umlwidgets/umlwidget.cpp umlwidgets/usecasewidget.cpp umlwidgets/widget_factory.cpp umlwidgets/widget_utils.cpp umlwidgets/widgetbase.cpp umlwidgets/widgetlist_utils.cpp umlwidgets/statusbartoolbutton.cpp ) set(libfinder_SRCS finder/findresults.cpp finder/umldocfinder.cpp finder/umlfinder.cpp finder/umllistviewfinder.cpp finder/umlscenefinder.cpp ) set(libuml_SRCS uml1model/actor.cpp uml1model/artifact.cpp uml1model/association.cpp uml1model/attribute.cpp uml1model/category.cpp uml1model/checkconstraint.cpp uml1model/classifier.cpp uml1model/classifierlistitem.cpp uml1model/component.cpp uml1model/datatype.cpp uml1model/entity.cpp uml1model/entityattribute.cpp uml1model/entityconstraint.cpp uml1model/enum.cpp uml1model/enumliteral.cpp uml1model/folder.cpp uml1model/foreignkeyconstraint.cpp uml1model/node.cpp uml1model/operation.cpp uml1model/package.cpp uml1model/port.cpp uml1model/stereotype.cpp uml1model/template.cpp uml1model/umlattributelist.cpp uml1model/umlcanvasobject.cpp uml1model/umlclassifierlistitemlist.cpp uml1model/umlentityattributelist.cpp uml1model/umlentityconstraintlist.cpp uml1model/umlobject.cpp uml1model/umlobjectlist.cpp uml1model/umlrole.cpp uml1model/usecase.cpp uml1model/uniqueconstraint.cpp uml1model/instance.cpp uml1model/instanceattribute.cpp ) set(umbrellobase_SRCS assocrules.cpp basictypes.cpp birdview.cpp codeviewerstate.cpp cmdlineexportallviewsevent.cpp diagramswindow.cpp diagram_utils.cpp objectswindow.cpp docwindow.cpp dotgenerator.cpp icon_utils.cpp import_argo.cpp import_rose.cpp layoutgenerator.cpp model_utils.cpp object_factory.cpp optionstate.cpp petalnode.cpp petaltree2uml.cpp stereotypeswindow.cpp toolbarstatearrow.cpp toolbarstateassociation.cpp toolbarstate.cpp toolbarstatefactory.cpp toolbarstatemessages.cpp toolbarstateother.cpp toolbarstatepool.cpp umlappprivate.cpp uml.cpp umldoc.cpp umllistview.cpp umllistviewitem.cpp umlscene.cpp umlview.cpp umlviewimageexporterall.cpp umlviewimageexporter.cpp umlviewimageexportermodel.cpp uniqueid.cpp worktoolbar.cpp ) set(umbrellomodels_SRCS models/diagramsmodel.cpp models/objectsmodel.cpp models/stereotypesmodel.cpp ) kconfig_add_kcfg_files(umbrellobase_SRCS umbrellosettings.kcfgc) set(libumbrello_SRCS ${libdebug_SRCS} ${libdialogs_SRCS} ${libfinder_SRCS} ${librefactoring_SRCS} ${libcodegenwizard_SRCS} ${libcodeimpwizard_SRCS} ${libclassparser_SRCS} ${libclipboard_SRCS} ${libkdevcppparser_SRCS} ${libcodeimport_SRCS} ${libcodegenerator_SRCS} ${libdocgenerator_SRCS} ${libcmds_SRCS} ${libmenus_SRCS} ${libuml_SRCS} ${libumlwidgets_SRCS} ${umbrellobase_SRCS} ${umbrellomodels_SRCS} ) set(umbrello_SRCS main.cpp ) set(LIB_BUILD_MODE STATIC) if(NOT BUILD_KF5) if(CMAKE_MAJOR_VERSION LESS 3) qt4_add_resources(libumbrello_SRCS icons.qrc) else() list(APPEND libumbrello_SRCS icons.qrc) endif() kde4_add_library(libumbrello ${LIB_BUILD_MODE} ${libumbrello_SRCS}) set_target_properties(libumbrello PROPERTIES OUTPUT_NAME umbrello) target_link_libraries(libumbrello Qt4::QtCore Qt4::QtGui Qt4::QtXml Qt4::QtWebKit ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${KDE4_KTEXTEDITOR_LIBS} ${KDE4_KFILE_LIBS} ) if(BUILD_PHP_IMPORT) target_link_libraries(libumbrello ${KDEVPLATFORM_INTERFACES_LIBRARIES} ${KDEVPLATFORM_LANGUAGE_LIBRARIES} ${KDEVPLATFORM_OUTPUTVIEW_LIBRARIES} ${KDEVPLATFORM_PROJECT_LIBRARIES} ${KDEVPLATFORM_SUBLIME_LIBRARIES} ${KDEVPLATFORM_SHELL_LIBRARIES} ${KDEVPLATFORM_UTIL_LIBRARIES} ${KDEVPLATFORM_VCS_LIBRARIES} ${KDEVPLATFORM_DEBUGGER_LIBRARIES} ${KDEVPLATFORM_DOCUMENTATION_LIBRARIES} ${KDEVPLATFORM_TESTS_LIBRARIES} ${KDEVPLATFORM_JSONTESTS_LIBRARIES} kdev4phpparser ) endif() kde4_add_app_icon(umbrello_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/pics/global/kde4/hi*-apps-umbrello.png") kde4_add_executable(umbrello ${umbrello_SRCS}) target_link_libraries(umbrello ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${KDE4_KTEXTEDITOR_LIBS} ${KDE4_KFILE_LIBS} libumbrello) else() if(CMAKE_MAJOR_VERSION LESS 3) qt5_add_resources(libumbrello_SRCS icons.qrc ${CMAKE_CURRENT_BINARY_DIR}/ui.qrc) else() list(APPEND libumbrello_SRCS icons.qrc ${CMAKE_CURRENT_BINARY_DIR}/ui.qrc) endif() add_library(libumbrello ${LIB_BUILD_MODE} ${libumbrello_SRCS}) set_target_properties(libumbrello PROPERTIES OUTPUT_NAME umbrello) target_link_libraries(libumbrello Qt5::Widgets Qt5::Xml Qt5::PrintSupport Qt5::Svg Qt5::WebKitWidgets KF5::Archive KF5::Completion KF5::CoreAddons KF5::I18n KF5::IconThemes KF5::KIOCore KF5::KDELibs4Support KF5::TextEditor KF5::WidgetsAddons KF5::XmlGui KF5::Crash ${LIBXSLT_LIBRARIES} ${LIBXML2_LIBRARIES} ) if(BUILD_PHP_IMPORT) target_link_libraries(libumbrello KDev::Interfaces KDev::Language KDev::Tests kdevphpparser ) endif() ecm_add_app_icon(umbrello_SRCS ICONS ${CMAKE_CURRENT_SOURCE_DIR}/pics/global/16-apps-umbrello.png ${CMAKE_CURRENT_SOURCE_DIR}/pics/global/22-apps-umbrello.png ${CMAKE_CURRENT_SOURCE_DIR}/pics/global/32-apps-umbrello.png ${CMAKE_CURRENT_SOURCE_DIR}/pics/global/48-apps-umbrello.png ${CMAKE_CURRENT_SOURCE_DIR}/pics/global/64-apps-umbrello.png ${CMAKE_CURRENT_SOURCE_DIR}/pics/global/128-apps-umbrello.png ) add_executable(umbrello ${umbrello_SRCS}) target_link_libraries(umbrello libumbrello KF5::Crash KF5::WindowSystem KF5::KDELibs4Support ) set_target_properties(umbrello PROPERTIES OUTPUT_NAME umbrello5) endif() if(LIB_BUILD_MODE EQUAL SHARED) install(TARGETS libumbrello ${INSTALL_TARGETS_DEFAULT_ARGS} ) endif() install(TARGETS umbrello ${INSTALL_TARGETS_DEFAULT_ARGS} ) ########### install files ############# if(NOT BUILD_KF5) install( PROGRAMS org.kde.umbrello.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/umbrelloui.rc DESTINATION ${UMBRELLO_DATA_INSTALL_DIR} ) else() file(READ org.kde.umbrello.desktop UMBRELLO_DESKTOP_OUT) string(REPLACE "Exec=umbrello" "Exec=umbrello5" UMBRELLO_DESKTOP_OUT "${UMBRELLO_DESKTOP_OUT}") file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/org.kde.umbrello.desktop "${UMBRELLO_DESKTOP_OUT}") install( PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/org.kde.umbrello.desktop DESTINATION ${XDG_APPS_INSTALL_DIR}) install(FILES org.kde.umbrello.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR}) endif() -install( FILES - docgenerators/xmi2docbook.xsl - docgenerators/docbook2xhtml.xsl - docgenerators/xmi.css - docgenerators/common.ent - DESTINATION ${UMBRELLO_DATA_INSTALL_DIR} ) - install( DIRECTORY layouts DESTINATION ${UMBRELLO_DATA_INSTALL_DIR} PATTERN .svn EXCLUDE ) add_subdirectory( pics ) diff --git a/umbrello/codeimport/pythonimport.cpp b/umbrello/codeimport/pythonimport.cpp index de62814be..7c6856d29 100644 --- a/umbrello/codeimport/pythonimport.cpp +++ b/umbrello/codeimport/pythonimport.cpp @@ -1,400 +1,469 @@ /*************************************************************************** * 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. * * * * copyright (C) 2006-2014 * * Umbrello UML Modeller Authors * ***************************************************************************/ // own header #include "pythonimport.h" // app includes #include "attribute.h" #include "classifier.h" #include "codeimpthread.h" #include "debug_utils.h" #include "enum.h" #include "import_utils.h" #include "operation.h" #include "package.h" #include "uml.h" #include "umldoc.h" #include "umlpackagelist.h" // qt includes #include /** * Constructor. */ PythonImport::PythonImport(CodeImpThread* thread) : NativeImportBase(QLatin1String("#"), thread) { setMultiLineComment(QLatin1String("\"\"\""), QLatin1String("\"\"\"")); initVars(); } /** * Destructor. */ PythonImport::~PythonImport() { } /** * Reimplement operation from NativeImportBase. */ void PythonImport::initVars() { m_srcIndentIndex = 0; m_srcIndent[m_srcIndentIndex] = 0; m_braceWasOpened = false; m_isStatic = false; } /** * Reimplement operation from NativeImportBase. * In addition to handling multiline comments, this method transforms * changes in leading indentation into braces (opening brace for increase * in indentation, closing brace for decrease in indentation) in m_source. * Removal of Python's indentation sensitivity simplifies subsequent * processing using Umbrello's native import framework. * @param line the line to preprocess * @return success status of operation */ bool PythonImport::preprocess(QString& line) { if (NativeImportBase::preprocess(line)) return true; // Handle single line comment int pos = line.indexOf(m_singleLineCommentIntro); if (pos != -1) { QString cmnt = line.mid(pos); m_source.append(cmnt); m_srcIndex++; if (pos == 0) return true; line = line.left(pos); line.remove(QRegExp(QLatin1String("\\s+$"))); } // Transform changes in indentation into braces a la C++/Java/Perl/... pos = line.indexOf(QRegExp(QLatin1String("\\S"))); if (pos == -1) return true; bool isContinuation = false; int leadingWhite = line.left(pos).count(QRegExp(QLatin1String("\\s"))); if (leadingWhite > m_srcIndent[m_srcIndentIndex]) { if (m_srcIndex == 0) { uError() << "internal error"; return true; } if (m_braceWasOpened) { m_srcIndent[++m_srcIndentIndex] = leadingWhite; m_braceWasOpened = false; } else { isContinuation = true; } } else { while (m_srcIndentIndex > 0 && leadingWhite < m_srcIndent[m_srcIndentIndex]) { m_srcIndentIndex--; m_source.append(QLatin1String("}")); m_srcIndex++; } } if (m_braceWasOpened && m_srcIndentIndex == 0) { m_source.append(QLatin1String("}")); m_srcIndex++; } if (line.endsWith(QLatin1Char(':'))) { line.replace(QRegExp(QLatin1String(":$")), QLatin1String("{")); m_braceWasOpened = true; } else { m_braceWasOpened = false; } if (!isContinuation && !m_braceWasOpened) line += QLatin1Char(';'); return false; // The input was not completely consumed by preprocessing. } /** * Implement abstract operation from NativeImportBase. * @param word whitespace delimited item */ void PythonImport::fillSource(const QString& word) { QString lexeme; const uint len = word.length(); for (uint i = 0; i < len; ++i) { const QChar& c = word[i]; if (c.isLetterOrNumber() || c == QLatin1Char('_') || c == QLatin1Char('.')) { lexeme += c; } else { if (!lexeme.isEmpty()) { m_source.append(lexeme); m_srcIndex++; lexeme.clear(); } m_source.append(QString(c)); m_srcIndex++; } } if (!lexeme.isEmpty()) { m_source.append(lexeme); m_srcIndex++; } } /** * Return an amount of spaces that corresponds to @param level * @return spaces of indentation */ QString PythonImport::indentation(int level) { QString spaces; for (int i = 0; i < level; ++i) { spaces += QLatin1String(" "); } return spaces; } /** * Skip ahead to outermost closing brace. * @return body contents skipped */ QString PythonImport::skipBody() { /* During input preprocessing, changes in indentation were replaced by braces, and a semicolon was appended to each line ending. In order to return the body, we try to reconstruct the original Python syntax by reverting those changes. */ QString body; if (m_source[m_srcIndex] != QLatin1String("{")) skipStmt(QLatin1String("{")); bool firstTokenAfterNewline = true; int braceNesting = 0; QString token; while (!(token = advance()).isNull()) { if (token == QLatin1String("}")) { if (braceNesting <= 0) break; braceNesting--; body += QLatin1Char('\n'); firstTokenAfterNewline = true; } else if (token == QLatin1String("{")) { braceNesting++; body += QLatin1String(":\n"); firstTokenAfterNewline = true; } else if (token == QLatin1String(";")) { body += QLatin1Char('\n'); firstTokenAfterNewline = true; } else { if (firstTokenAfterNewline) { body += indentation(braceNesting); firstTokenAfterNewline = false; } else if (body.contains(QRegExp(QLatin1String("\\w$"))) && token.contains(QRegExp(QLatin1String("^\\w")))) { body += QLatin1Char(' '); } body += token; } } return body; } +/** + * Parses a python initializer + * @param _keyword current string from parser + * @param type returns type of assignment + * @param value returns assignment value + * @return success status of parsing + */ +bool PythonImport::parseInitializer(const QString &_keyword, QString &type, QString &value) +{ + QString keyword = _keyword; + if (_keyword == QLatin1String("-")) + keyword.append(advance()); + + if (keyword == QLatin1String("[")) { + type = QLatin1String("list"); + int index = m_srcIndex; + skipToClosing(QLatin1Char('[')); + for (int i = index; i <= m_srcIndex; i++) + value += m_source[i]; + } else if (keyword == QLatin1String("{")) { + type = QLatin1String("dict"); + int index = m_srcIndex; + skipToClosing(QLatin1Char('{')); + for (int i = index; i <= m_srcIndex; i++) + value += m_source[i]; + } else if (keyword == QLatin1String("(")) { + type = QLatin1String("tuple"); + int index = m_srcIndex; + skipToClosing(QLatin1Char('(')); + for (int i = index; i <= m_srcIndex; i++) + value += m_source[i]; + } else if (keyword.startsWith(QLatin1String("\""))) { + type = QLatin1String("string"); + value = keyword; + } else if (keyword == QLatin1String("True") || keyword == QLatin1String("False")) { + type = QLatin1String("bool"); + value = keyword; + } else if (keyword.contains(QRegExp(QLatin1String("-?\\d+\\.\\d*")))) { + type = QLatin1String("float"); + value = keyword; + } else if (keyword.contains(QRegExp(QLatin1String("-?\\d+")))) { + type = QLatin1String("int"); + value = keyword; + } else if (keyword.toLower() == "none") { + type = QLatin1String("object"); + value = keyword; + } else if (!keyword.isEmpty()) { + if (lookAhead() == "(") { + advance(); + type = keyword; + int index = m_srcIndex; + skipToClosing(QLatin1Char('(')); + for (int i = index; i <= m_srcIndex; i++) + value += m_source[i]; + } else + type = QLatin1String("object"); + } else + type = QLatin1String("object"); + return true; +} + /** * Parse assignments in the form \ '=' \ * Instance variables are identified by a prefixed 'self.'. + * @param keyword current string from parser * @return success status of parsing */ -bool PythonImport::parseAssignmentStmt(const QString keyword) +bool PythonImport::parseAssignmentStmt(const QString &keyword) { - QString variable = keyword; - advance(); - QString value = advance(); - if (value == QLatin1String("-")) - value.append(advance()); + QString variableName = keyword; bool isStatic = true; - if (variable.startsWith(QLatin1String("self."))) { - variable.remove(0,5); + if (variableName.startsWith(QLatin1String("self."))) { + variableName.remove(0,5); isStatic = false; } Uml::Visibility::Enum visibility = Uml::Visibility::Public; - if (variable.startsWith(QLatin1String("__"))) { + if (variableName.startsWith(QLatin1String("__"))) { visibility = Uml::Visibility::Private; - variable.remove(0, 2); - } else if (variable.startsWith(QLatin1String("_"))) { + variableName.remove(0, 2); + } else if (variableName.startsWith(QLatin1String("_"))) { visibility = Uml::Visibility::Protected; - variable.remove(0, 1); + variableName.remove(0, 1); } + QString type; - if (value == QLatin1String("[")) { - if (lookAhead() == QLatin1String("]")) { - advance(); - type = QLatin1String("list"); - value = QLatin1String(""); - } - } else if (value == QLatin1String("{")) { - if (lookAhead() == QLatin1String("}")) { - advance(); - type = QLatin1String("dict"); - value = QLatin1String(""); - } - } else if (value.startsWith(QLatin1String("\""))) { - type = QLatin1String("string"); - } else if (value == QLatin1String("True") || value == QLatin1String("False")) { - type = QLatin1String("bool"); - } else if (value.contains(QRegExp(QLatin1String("-?\\d+\\.\\d*")))) { - type = QLatin1String("float"); - } else if (value.contains(QRegExp(QLatin1String("-?\\d+")))) { - type = QLatin1String("int"); - } else if (!value.isEmpty()) { - type = QLatin1String("object"); + QString initialValue; + if (advance() == QLatin1String("=")) { + + if (!parseInitializer(advance(), type, initialValue)) + return false; } - UMLObject* o = Import_Utils::insertAttribute(m_klass, visibility, variable, + UMLObject* o = Import_Utils::insertAttribute(m_klass, visibility, variableName, type, m_comment, false); UMLAttribute* a = o->asUMLAttribute(); - a->setInitialValue(value); + a->setInitialValue(initialValue); a->setStatic(isStatic); return true; } +/** + * Parses method parameter list + * @param op UMLOperation instance to add parameter + * @return success status of parsing + */ +bool PythonImport::parseMethodParameters(UMLOperation *op) +{ + bool firstParam = true; + UMLAttribute *attr = nullptr; + while (m_srcIndex < m_source.count() && advance() != QLatin1String(")")) { + const QString& parName = m_source[m_srcIndex]; + if (attr && parName == QLatin1String("=")) { + QString type, value; + parseInitializer(advance(), type, value); + attr->setInitialValue(value); + attr->setTypeName(type); + } else { + if (firstParam) { + if (parName.compare(QLatin1String("self"), Qt::CaseInsensitive) != 0) { + m_isStatic = true; + attr = Import_Utils::addMethodParameter(op, QLatin1String("string"), parName); + } + firstParam = false; + } else { + attr = Import_Utils::addMethodParameter(op, QLatin1String("string"), parName); + } + } + if (lookAhead() == QLatin1String(",")) + advance(); + } + return true; +} + /** * Implement abstract operation from NativeImportBase. * @return success status of operation */ bool PythonImport::parseStmt() { const int srcLength = m_source.count(); QString keyword = m_source[m_srcIndex]; if (keyword == QLatin1String("class")) { const QString& name = advance(); UMLObject *ns = Import_Utils::createUMLObject(UMLObject::ot_Class, name, currentScope(), m_comment); pushScope(m_klass = ns->asUMLClassifier()); m_comment.clear(); if (advance() == QLatin1String("(")) { while (m_srcIndex < srcLength - 1 && advance() != QLatin1String(")")) { const QString& baseName = m_source[m_srcIndex]; Import_Utils::createGeneralization(m_klass, baseName); if (advance() != QLatin1String(",")) break; } } if (m_source[m_srcIndex] != QLatin1String("{")) { skipStmt(QLatin1String("{")); } log(QLatin1String("class ") + name); return true; } if (keyword == QLatin1String("@")) { const QString& annotation = m_source[++m_srcIndex]; uDebug() << "annotation:" << annotation; if (annotation == QLatin1String("staticmethod")) m_isStatic = true; return true; } if (keyword == QLatin1String("def")) { if (m_klass == 0) { // skip functions outside of a class skipBody(); return true; } if (!m_klass->hasDoc() && !m_comment.isEmpty()) { m_klass->setDoc(m_comment); m_comment = QString(); } QString name = advance(); + bool isConstructor = name == QLatin1String("__init__"); Uml::Visibility::Enum visibility = Uml::Visibility::Public; - if (name.startsWith(QLatin1String("__"))) { - name = name.mid(2); - visibility = Uml::Visibility::Private; - } else if (name.startsWith(QLatin1String("_"))) { - name = name.mid(1); - visibility = Uml::Visibility::Protected; + if (!isConstructor) { + if (name.startsWith(QLatin1String("__"))) { + name = name.mid(2); + visibility = Uml::Visibility::Private; + } else if (name.startsWith(QLatin1String("_"))) { + name = name.mid(1); + visibility = Uml::Visibility::Protected; + } } UMLOperation *op = Import_Utils::makeOperation(m_klass, name); if (advance() != QLatin1String("(")) { uError() << "importPython def " << name << ": expecting \"(\""; skipBody(); return true; } - bool firstParam = true; - while (m_srcIndex < srcLength && advance() != QLatin1String(")")) { - const QString& parName = m_source[m_srcIndex]; - if (firstParam) { - if (parName.compare(QLatin1String("self"), Qt::CaseInsensitive) != 0) { - m_isStatic = true; - Import_Utils::addMethodParameter(op, QLatin1String("string"), parName); - } - firstParam = false; - } else { - /*UMLAttribute *att =*/ Import_Utils::addMethodParameter(op, QLatin1String("string"), parName); - } - if (advance() != QLatin1String(",")) - break; + if (!parseMethodParameters(op)) { + uError() << "importPython error on parsing method parameter for method " << name; + skipBody(); + return true; } + Import_Utils::insertMethod(m_klass, op, visibility, QLatin1String("string"), m_isStatic, false /*isAbstract*/, false /*isFriend*/, - false /*isConstructor*/, false, m_comment); + isConstructor, false, m_comment); m_isStatic = false; int srcIndex = m_srcIndex; op->setSourceCode(skipBody()); if (!op->hasDoc() && !m_comment.isEmpty()) { op->setDoc(m_comment); m_comment = QString(); } // parse instance variables from __init__ method - if (name == QLatin1String("__init__")) { + if (isConstructor) { int indexSave = m_srcIndex; m_srcIndex = srcIndex; advance(); keyword = advance(); while (m_srcIndex < indexSave) { if (lookAhead() == QLatin1String("=")) { parseAssignmentStmt(keyword); // skip ; inserted by lexer if (lookAhead() == QLatin1String(";")) { advance(); keyword = advance(); } } else { skipStmt(QLatin1String(";")); keyword = advance(); } } m_srcIndex = indexSave; } log(QLatin1String("def ") + name); return true; } // parse class variables if (m_klass && lookAhead() == QLatin1String("=")) { bool result = parseAssignmentStmt(keyword); log(QLatin1String("class attribute ") + keyword); return result; } if (keyword == QLatin1String("}")) { if (scopeIndex()) { m_klass = popScope()->asUMLClassifier(); } else uError() << "parsing: too many }"; return true; } return false; // @todo parsing of attributes } diff --git a/umbrello/codeimport/pythonimport.h b/umbrello/codeimport/pythonimport.h index 49a85a7dd..9234e43c1 100644 --- a/umbrello/codeimport/pythonimport.h +++ b/umbrello/codeimport/pythonimport.h @@ -1,58 +1,62 @@ /*************************************************************************** * 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. * * * * copyright (C) 2006-2014 * * Umbrello UML Modeller Authors * ***************************************************************************/ #ifndef PYTHONIMPORT_H #define PYTHONIMPORT_H #include "nativeimportbase.h" +class UMLOperation; + /** * Python code import * @author Oliver Kellogg * Bugs and comments to umbrello-devel@kde.org or http://bugs.kde.org */ class PythonImport : public NativeImportBase { public: explicit PythonImport(CodeImpThread* thread = 0); virtual ~PythonImport(); protected: void initVars(); - bool parseAssignmentStmt(const QString keyword); + bool parseInitializer(const QString &keyword, QString &type, QString &value); + bool parseAssignmentStmt(const QString &keyword); + bool parseMethodParameters(UMLOperation *op); bool parseStmt(); void fillSource(const QString& line); bool preprocess(QString& line); QString indentation(int level); QString skipBody(); /** * Buffer for number of indentation characters (whitespace, * i.e. tabs or spaces) at beginning of input line. */ int m_srcIndent[100]; /** * Index for m_srcIndent[]. Index 0 is reserved and contains 0. */ int m_srcIndentIndex; bool m_braceWasOpened; ///< Flag denoting the opening of a block. bool m_isStatic; ///< Flag denoting staticness of defined method }; #endif diff --git a/umbrello/docgenerators/CMakeLists.txt b/umbrello/docgenerators/CMakeLists.txt new file mode 100644 index 000000000..e3491c891 --- /dev/null +++ b/umbrello/docgenerators/CMakeLists.txt @@ -0,0 +1,10 @@ +install( FILES + xmi2docbook.xsl + docbook2xhtml.xsl + xmi.css + common.ent + DESTINATION ${UMBRELLO_DATA_INSTALL_DIR} ) + +install( DIRECTORY + simple4125 + DESTINATION ${UMBRELLO_DATA_INSTALL_DIR} ) diff --git a/umbrello/docgenerators/docbookgeneratorjob.cpp b/umbrello/docgenerators/docbookgeneratorjob.cpp index f752fe659..a6bf3f6a8 100644 --- a/umbrello/docgenerators/docbookgeneratorjob.cpp +++ b/umbrello/docgenerators/docbookgeneratorjob.cpp @@ -1,114 +1,204 @@ /*************************************************************************** * 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. * * * * copyright (C) 2008-2014 * * Umbrello UML Modeller Authors * ***************************************************************************/ #include "docbookgeneratorjob.h" #include "debug_utils.h" #include "uml.h" #include "umldoc.h" #include #include #include #include #include #include #include #include #include #include // kde includes #if QT_VERSION < 0x050000 #include #include #endif #include // qt includes #include #if QT_VERSION >= 0x050000 #include #include #endif extern int xmlLoadExtDtdDefaultValue; +#define MAX_PATHS 64 +xmlExternalEntityLoader defaultEntityLoader = NULL; +static xmlChar *paths[MAX_PATHS + 1]; +static int nbpaths = 0; +static QHash replaceURLList; + +/* +* Entity loading control and customization. +* taken from kdelibs/kdoctools/xslt.cpp +*/ +static xmlParserInputPtr xsltprocExternalEntityLoader(const char *_URL, const char *ID,xmlParserCtxtPtr ctxt) +{ + xmlParserInputPtr ret; + warningSAXFunc warning = NULL; + + // use local available dtd versions instead of fetching it everytime from the internet + QString url = QLatin1String(_URL); + QHash::const_iterator i; + for(i = replaceURLList.constBegin(); i != replaceURLList.constEnd(); i++) + { + if (url.startsWith(i.key())) + { + url.replace(i.key(),i.value()); + qDebug() << "converted" << _URL << "to" << url; + } + } + char URL[1024]; + strcpy(URL,url.toLatin1().constData()); + + const char *lastsegment = URL; + const char *iter = URL; + + if (nbpaths > 0) { + while (*iter != 0) { + if (*iter == '/') + lastsegment = iter + 1; + iter++; + } + } + + if ((ctxt != NULL) && (ctxt->sax != NULL)) { + warning = ctxt->sax->warning; + ctxt->sax->warning = NULL; + } + + if (defaultEntityLoader != NULL) { + ret = defaultEntityLoader(URL, ID, ctxt); + if (ret != NULL) { + if (warning != NULL) + ctxt->sax->warning = warning; + qDebug() << "Loaded URL=\"" << URL << "\" ID=\"" << ID << "\""; + return(ret); + } + } + for (int i = 0;i < nbpaths;i++) { + xmlChar *newURL; + + newURL = xmlStrdup((const xmlChar *) paths[i]); + newURL = xmlStrcat(newURL, (const xmlChar *) "/"); + newURL = xmlStrcat(newURL, (const xmlChar *) lastsegment); + if (newURL != NULL) { + ret = defaultEntityLoader((const char *)newURL, ID, ctxt); + if (ret != NULL) { + if (warning != NULL) + ctxt->sax->warning = warning; + qDebug() << "Loaded URL=\"" << newURL << "\" ID=\"" << ID << "\""; + xmlFree(newURL); + return(ret); + } + xmlFree(newURL); + } + } + if (warning != NULL) { + ctxt->sax->warning = warning; + if (URL != NULL) + warning(ctxt, "failed to load external entity \"%s\"\n", URL); + else if (ID != NULL) + warning(ctxt, "failed to load external entity \"%s\"\n", ID); + } + return(NULL); +} + DocbookGeneratorJob::DocbookGeneratorJob(QObject* parent): QThread(parent) { } void DocbookGeneratorJob::run() { UMLApp* app = UMLApp::app(); UMLDoc* umlDoc = app->document(); //write the XMI model in an in-memory char* string QString xmi; QTextStream xmiStream(&xmi, QIODevice::WriteOnly); #if QT_VERSION >= 0x050000 QTemporaryFile file; // we need this tmp file if we are writing to a remote file #else KTemporaryFile file; // we need this tmp file if we are writing to a remote file #endif file.setAutoRemove(false); // lets open the file for writing if (!file.open()) { uError() << "There was a problem saving file" << file.fileName(); return; } umlDoc->saveToXMI1(file); // save the xmi stuff to it xsltStylesheetPtr cur = 0; xmlDocPtr doc, res; const char *params[16 + 1]; int nbparams = 0; params[nbparams] = 0; QString xslBaseName = QLatin1String("xmi2docbook.xsl"); #if QT_VERSION >= 0x050000 QString xsltFile(QStandardPaths::locate(QStandardPaths::DataLocation, xslBaseName)); #else QString xsltFile(KGlobal::dirs()->findResource("appdata", xslBaseName)); #endif if (xsltFile.isEmpty()) xsltFile = QLatin1String(DOCGENERATORS_DIR) + QLatin1Char('/') + xslBaseName; + if (!defaultEntityLoader) { + defaultEntityLoader = xmlGetExternalEntityLoader(); + xmlSetExternalEntityLoader(xsltprocExternalEntityLoader); + QFileInfo xsltFilePath(xsltFile); + + replaceURLList[QLatin1String("http://www.oasis-open.org/docbook/xml/simple/4.1.2.5/sdocbook.dtd")] = QString("file:///%1/simple4125/sdocbook.dtd").arg(xsltFilePath.absolutePath()); + } + xmlSubstituteEntitiesDefault(1); xmlLoadExtDtdDefaultValue = 1; cur = xsltParseStylesheetFile((const xmlChar *)xsltFile.toLatin1().constData()); doc = xmlParseFile((const char*)(file.fileName().toUtf8())); res = xsltApplyStylesheet(cur, doc, params); #if QT_VERSION >= 0x050000 QTemporaryFile tmpDocBook; #else KTemporaryFile tmpDocBook; #endif tmpDocBook.setAutoRemove(false); tmpDocBook.open(); umlDoc->writeToStatusBar(i18n("Exporting to DocBook...")); xsltSaveResultToFd(tmpDocBook.handle(), res, cur); xsltFreeStylesheet(cur); xmlFreeDoc(res); xmlFreeDoc(doc); xsltCleanupGlobals(); xmlCleanupParser(); emit docbookGenerated(tmpDocBook.fileName()); } diff --git a/umbrello/docgenerators/simple4125/sdbcent.mod b/umbrello/docgenerators/simple4125/sdbcent.mod new file mode 100644 index 000000000..88f32a8db --- /dev/null +++ b/umbrello/docgenerators/simple4125/sdbcent.mod @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +%ISOlat1; + + +%ISOnum; + + +%ISOpub; + + + diff --git a/umbrello/docgenerators/simple4125/sdbhier.mod b/umbrello/docgenerators/simple4125/sdbhier.mod new file mode 100644 index 000000000..0428fd7ba --- /dev/null +++ b/umbrello/docgenerators/simple4125/sdbhier.mod @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + diff --git a/umbrello/docgenerators/simple4125/sdbpool.mod b/umbrello/docgenerators/simple4125/sdbpool.mod new file mode 100644 index 000000000..0e16c94dc --- /dev/null +++ b/umbrello/docgenerators/simple4125/sdbpool.mod @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/umbrello/docgenerators/simple4125/sdocbook-custom.dtd b/umbrello/docgenerators/simple4125/sdocbook-custom.dtd new file mode 100644 index 000000000..02947d6d3 --- /dev/null +++ b/umbrello/docgenerators/simple4125/sdocbook-custom.dtd @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + +]]> + + + +%sinclist; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +%sdbcent; + + + + + + + + + + + + + + + + + + + + + +%docbook; + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + +]]> + + + diff --git a/umbrello/docgenerators/simple4125/sdocbook.css b/umbrello/docgenerators/simple4125/sdocbook.css new file mode 100644 index 000000000..95a65fb2d --- /dev/null +++ b/umbrello/docgenerators/simple4125/sdocbook.css @@ -0,0 +1,679 @@ +abbrev +{ + display: inline; +} + +abstract +{ + margin-left: 0.5in; + margin-right: 0.5in; + display: inline; +} + +acronym +{ + display: inline; +} + +address +{ + white-space: pre; + display: block; +} + +anchor +{ + display: inline; +} + +appendix +{ + display: block; +} + +articleinfo +{ + display: none; +} + +article +{ + display: block; +} + +audiodata +{ + display: none; +} + +audioobject +{ + display: none; +} + +author +{ + display: inline; +} + +authorgroup +{ + display: inline; +} + +authorinitials +{ + display: inline; +} + +bibliomisc +{ + display: inline; +} + +bibliomset +{ + display: inline; +} + +biblioset +{ + display: inline; +} + +blockquote +{ + display: block; + margin-left: 0.5in; + margin-right: 0.5in; +} + +caption +{ + display: none; +} + +citetitle +{ + display: inline; + font-style: italic; +} + +city +{ + display: inline; +} + +colspec +{ + display: none; +} + +command +{ + display: inline; + font-style: italic; +} + +computeroutput +{ + display: inline; + font-family: monospace; +} + +copyright +{ + display: inline; +} + +corpauthor +{ + display: inline; +} + +country +{ + display: inline; +} + +date +{ + display: inline; +} + +articleinfo +{ + display: none; +} + +appendixinfo +{ + display: none; +} + +edition +{ + display: inline; +} + +editor +{ + display: inline; +} + +email +{ + display: inline; + font-style: italic; +} + +emphasis +{ + display: inline; + font-style: italic; +} + +entry +{ + display: table-cell; +} + +example +{ + display: block; +} + +fax +{ + display: inline; +} + +figure +{ + display: block; +} + +filename +{ + display: inline; + font-style: italic; +} + +firstname +{ + display: inline; +} + +footnote +{ + display: inline; +} + +holder +{ + display: inline; +} + +honorific +{ + display: inline; +} + +imagedata +{ + display: inline; +} + +imageobject +{ + display: inline; +} + +informaltable +{ + display: block; +} + +inlinemediaobject +{ + display: inline; +} + +isbn +{ + display: inline; +} + +issn +{ + display: inline; +} + +issuenum +{ + display: inline; +} + +itemizedlist +{ + display: block; + list-style-type: disc; +} + +keyword +{ + display: inline; +} + +keywordset +{ + display: inline; +} + +legalnotice +{ + display: inline; +} + +lineage +{ + display: inline; +} + +lineannotation +{ + display: inline; +} + +link +{ + display: inline; +} + +listitem +{ + display: list-item; +} + +literal +{ + display: inline; +} + +literallayout +{ + display: inline; +} + +mediaobject +{ + display: inline; +} + +member +{ + display: inline; +} + +note +{ + display: inline; +} + +objectinfo +{ + display: inline; +} + +option +{ + display: inline; +} + +orderedlist +{ + display: block; + list-style-type: decimal; +} + +otheraddr +{ + display: inline; +} + +othercredit +{ + display: inline; +} + +othername +{ + display: inline; +} + +pagenums +{ + display: inline; +} + +para +{ + display: block; +} + +phone +{ + display: inline; +} + +phrase +{ + display: inline; +} + +pob +{ + display: inline; +} + +postcode +{ + display: inline; +} + +printhistory +{ + display: inline; +} + +procedure +{ + display: inline; +} + +programlisting +{ + display: inline; +} + +pubdate +{ + display: inline; +} + +publisher +{ + display: inline; +} + +publishername +{ + display: inline; +} + +quote +{ + display: inline; +} + +replaceable +{ + display: inline; +} + +revhistory +{ + display: inline; +} + +revision +{ + display: inline; +} + +revnumber +{ + display: inline; +} + +revremark +{ + display: inline; +} + +row +{ + display: table-row; +} + +section +{ + display: block; +} + +sectioninfo +{ + display: none; +} + +sidebar +{ + display: block; +} + +simplelist +{ + display: inline; +} + +state +{ + display: inline; +} + +step +{ + display: inline; +} + +street +{ + display: inline; +} + +substeps +{ + display: inline; +} + +subtitle +{ + display: inline; +} + +surname +{ + display: inline; +} + +systemitem +{ + display: inline; +} + +tbody +{ + display: table-row-group; +} + +term +{ + display: inline; +} + +textobject +{ + display: inline; +} + +tgroup +{ + display: table; +} + +thead +{ + display: table-row-group; +} + +title +{ + display: block; +} + +article title +{ + font-size: 36pt; + font-weight: bold; + display: block; +} + +section title +{ + font-size: 24pt; + font-weight: bold; + display: block; +} + +section section title +{ + font-size: 20pt; + font-weight: bold; + display: block; +} + +section section section title +{ + font-size: 18pt; + font-weight: bold; + display: block; +} + +section section section section title +{ + font-size: 16pt; + font-weight: bold; + display: block; +} + +section section section section section title +{ + font-size: 14pt; + font-weight: bold; + display: block; +} + +section section section section section section title +{ + font-size: 12pt; + font-weight: bold; + display: block; +} + +appendix title +{ + font-size: 24pt; + font-weight: bold; + display: block; +} + +appendix section title +{ + font-size: 22pt; + font-weight: bold; + display: block; +} + +appendix section section title +{ + font-size: 18pt; + font-weight: bold; + display: block; +} + +appendix section section section title +{ + font-size: 16pt; + font-weight: bold; + display: block; +} + +appendix section section section section title +{ + font-size: 14pt; + font-weight: bold; + display: block; +} + +appendix section section section section section title +{ + font-size: 12pt; + font-weight: bold; + display: block; +} + +titleabbrev +{ + display: none; +} + +trademark +{ + display: inline; +} + +ulink +{ + display: inline; +} + +userinput +{ + display: inline; +} + +variablelist +{ + display: inline; +} + +varlistentry +{ + display: inline; +} + +videodata +{ + display: inline; +} + +videoobject +{ + display: inline; +} + +volumenum +{ + display: inline; +} + +xref +{ + display: inline; +} + +year +{ + display: inline; +} + diff --git a/umbrello/docgenerators/simple4125/sdocbook.dtd b/umbrello/docgenerators/simple4125/sdocbook.dtd new file mode 100644 index 000000000..5d4145595 --- /dev/null +++ b/umbrello/docgenerators/simple4125/sdocbook.dtd @@ -0,0 +1,1569 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/umbrello/docgenerators/simple4125/sdocbookref-custom.dtd b/umbrello/docgenerators/simple4125/sdocbookref-custom.dtd new file mode 100644 index 000000000..167aa271c --- /dev/null +++ b/umbrello/docgenerators/simple4125/sdocbookref-custom.dtd @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + +%sdocbook-custom.dtd; + + + diff --git a/umbrello/docgenerators/simple4125/sdocbookref.dtd b/umbrello/docgenerators/simple4125/sdocbookref.dtd new file mode 100644 index 000000000..07b66dd96 --- /dev/null +++ b/umbrello/docgenerators/simple4125/sdocbookref.dtd @@ -0,0 +1,1729 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/umbrello/docgenerators/simple4125/sinclist.mod b/umbrello/docgenerators/simple4125/sinclist.mod new file mode 100644 index 000000000..afb6a50e8 --- /dev/null +++ b/umbrello/docgenerators/simple4125/sinclist.mod @@ -0,0 +1,303 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +