From 3e6260ada449e1a8b556344c65c32151429bd228 Mon Sep 17 00:00:00 2001 From: Fabian Gallenkamp <fabian.gallenkamp@uni-hamburg.de> Date: Wed, 13 Feb 2019 16:01:50 +0100 Subject: [PATCH] multiple tools added --- app.py | 398 ++++++++++++++++++++++++++++-- sample_db.sqlite | Bin 45056 -> 53248 bytes templates/export/softwares.jinja2 | 7 + 3 files changed, 386 insertions(+), 19 deletions(-) create mode 100644 templates/export/softwares.jinja2 diff --git a/app.py b/app.py index 493dc54..0ce9c30 100644 --- a/app.py +++ b/app.py @@ -85,6 +85,8 @@ class Programminglanguage(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.Unicode(64)) + version = db.Column(db.String(100)) + def __str__(self): return "{}".format(self.name) @@ -121,6 +123,8 @@ class Software(db.Model): programminglanguages = db.relationship('Programminglanguage', secondary=software_programminglanguages_table) + architecture = db.Column(db.Enum('standalone', 'package', 'framework', 'app', 'SaaS', 'other', name='software_types')) + def __str__(self): return "{}".format(self.name) @@ -167,10 +171,11 @@ inline_form_options = { }''' class AdvancedSoftwareView(sqla.ModelView): - column_sortable_list = ('name', ('license', ("license.name", "license.version")), 'lastchanged' , ('softwarecategory', 'softwarecategory.name'),) - column_list = ('name', 'license', 'softwarecategory', 'links', ) + column_sortable_list = ('name', ('license', ("license.name", "license.version")) , ('softwarecategory', 'softwarecategory.name'), 'lastchanged', ) + column_list = ('name', 'license', 'softwarecategory', 'links', 'architecture','programminglanguages', ) inline_models = (Link,) column_hide_backrefs = False + page_size = 100 def _links_formatter(view, context, model, name): form_links = [] @@ -188,13 +193,25 @@ class AdvancedSoftwareView(sqla.ModelView): @action('advancedexport', 'AdvancedExport') def action_advancedexport(self, ids): try: + # Generate sub pages with open('templates/export/software.jinja2', "r", encoding="utf-8") as file_: template = Template(file_.read()) softwares = Software.query.filter(Software.id.in_(ids)) for software_tool in softwares: - template.stream(name=software_tool.name).dump('./data/' + software_tool.name + '.asciidoc', encoding='utf-8') + template.stream(name=software_tool.name).dump('../digitale-Methoden-wiki/Tool_' + software_tool.name.replace(' ','') + '.asciidoc', encoding='utf-8') - base_path = pathlib.Path('./data/') + softwareincategory = [] + software_categorys = SoftwareCategory.query.all() + for software_category in software_categorys: + softwares = Software.query.filter(Software.softwarecategory_id == software_category.id) + softwareincategory.append((software_category,softwares)) + + # Generate overview page + with open('templates/export/softwares.jinja2', "r", encoding="utf-8") as file_: + template = Template(file_.read()) + template.stream(softwareincategory=softwareincategory).dump('../digitale-Methoden-wiki/Softwareübersicht.asciidoc', encoding='utf-8') + + base_path = pathlib.Path('../digitale-Methoden-wiki/') data = io.BytesIO() with zipfile.ZipFile(data, mode='w') as z: for f_name in base_path.iterdir(): @@ -354,23 +371,45 @@ def build_sample_db(): db.drop_all() db.create_all() + lic_bsd = License(name="BSD") + lic_gpl2 = License(name="GPL", version="2.0") lic_gpl3 = License(name="GPL", version="3.0") lic_agpl3 = License(name="AGPL", version="3.0") lic_lgpl = License(name="LGPL") - lic_apache = License(name="Apache", version="2.0") + lic_apache2 = License(name="Apache", version="2.0") lic_mit = License(name="MIT") lic_prop = License(name="Proprietär") db.session.add(lic_gpl3) + db.session.add(lic_gpl3) db.session.add(lic_agpl3) - db.session.add(lic_apache) + db.session.add(lic_apache2) db.session.add(lic_mit) db.session.add(lic_prop) + prol_r = Programminglanguage(name="R") + prol_py = Programminglanguage(name="Python") + prol_cy = Programminglanguage(name="Cython") + prol_java = Programminglanguage(name="Java") + prol_objc = Programminglanguage(name="Objective-C") + db.session.add(prol_r) + db.session.add(prol_py) + db.session.add(prol_java) + db.session.add(prol_objc) + cat_tracking = SoftwareCategory(name="datenschutzkonformes Tracking", short_description="Sammlung von Sensordaten/Logdaten oder Nutzungsdaten mit expliziter Einverständnis mittels Software auf dem Gerät.") cat_scraping = SoftwareCategory(name="Scraping", short_description="Tools im Zusammenhang mit Web-Scraping.") cat_int = SoftwareCategory(name="Forschungsplattformen", short_description="Integrierte Forschungsumgebungen/Plattformen für sozialwissenschaftliche Forschung.") cat_qda = SoftwareCategory(name="QDA-Software", short_description="Computer-gestützte Analyse qualitativer Daten.") + cat_tm = SoftwareCategory(name="Automatisierte Inhaltsanalyse/Text Mining", short_description="") + + cat_senti = SoftwareCategory(name="Sentiment Analysis", short_description="") + cat_topic = SoftwareCategory(name="Topic-Modellierung", short_description="") cat_transkript = SoftwareCategory(name="Audio-Transkribtion", short_description="Transkriptionssoftware") + cat_transkript = SoftwareCategory(name="Audio-Transkribtion", short_description="Transkriptionssoftware") + cat_transkript = SoftwareCategory(name="Audio-Transkribtion", short_description="Transkriptionssoftware") + cat_esmema = SoftwareCategory(name="ESM/EMA-Studien", short_description="Datenerhebung in 'natürlicher' Umgebung.") + cat_transkript = SoftwareCategory(name="Audio-Transkribtion", short_description="Transkriptionssoftware") + cat_misc = SoftwareCategory(name="Weiteres", short_description="Zu speziell zum Einordnen..") db.session.add(cat_tracking) db.session.add(cat_scraping) @@ -379,8 +418,10 @@ def build_sample_db(): aware = Software(name="AWARE", short_description="", developer="", + maintainer="", softwarecategory=cat_tracking, - license=lic_apache) + architecture="framework", + license=lic_apache2) db.session.add(aware) db.session.add(Link(software=aware, type="website", url="http://www.awareframework.com/", comment="")) db.session.add(Link(software=aware, type="repository", url="https://github.com/denzilferreira/aware-client", comment="android")) @@ -391,16 +432,22 @@ def build_sample_db(): meili = Software(name="MEILI", short_description="", developer="Adrian C. Prelipcean", + maintainer="Adrian C. Prelipcean", softwarecategory=cat_tracking, + architecture="framework", license=lic_gpl3) db.session.add(meili) db.session.add(Link(software=meili, type="repository", url="https://github.com/Badger-MEILI", comment="group")) passivedatakit = Software(name="Passive Data Kit", + short_description="", developer="Chris Karr", + maintainer="Chris Karr", softwarecategory=cat_tracking, - license=lic_apache) + architecture="framework", + license=lic_apache2, + programminglanguages=[prol_py,prol_java]) db.session.add(passivedatakit) db.session.add(Link(software=passivedatakit, type="website", url="https://passivedatakit.org/", comment="")) db.session.add(Link(software=passivedatakit, type="repository", url="https://github.com/audaciouscode/PassiveDataKit-Django", comment="djangoserver")) @@ -411,6 +458,7 @@ def build_sample_db(): developer="John Harrison", maintainer="Ju Yeong Kim", softwarecategory=cat_scraping, + architecture="package", license=lic_agpl3) db.session.add(rselenium) db.session.add(Link(software=rselenium, type="repository", url="https://github.com/ropensci/RSelenium", comment="")) @@ -420,6 +468,7 @@ def build_sample_db(): developer="Chris Karr", maintainer="Ju Yeong Kim", softwarecategory=cat_int, + architecture="SaaS", license=lic_agpl3) db.session.add(amcat) db.session.add(Link(software=amcat, type="website", url="http://vanatteveldt.com/amcat/", comment="entwickler")) @@ -431,6 +480,7 @@ def build_sample_db(): developer="", maintainer="", softwarecategory=cat_int, + architecture="standalone", license=lic_prop) db.session.add(cosmos) db.session.add(Link(software=cosmos, type="website", url="http://socialdatalab.net/COSMOS", comment="")) @@ -441,6 +491,7 @@ def build_sample_db(): developer="Gregor Wiedeman, Andreas Niekler", maintainer="", softwarecategory=cat_int, + architecture="framework", license=lic_lgpl) db.session.add(lcm) db.session.add(Link(software=lcm, type="website", url="http://lcm.informatik.uni-leipzig.de/generic.html", comment="")) @@ -449,6 +500,7 @@ def build_sample_db(): short_description="The iLCM(LCM=Leipzig Corpus Miner) project pursues the development of an integrated research environment for the analysis of structured and unstructured data in a ‘Software as a Service’ architecture (SaaS). The research environment addresses requirements for the quantitative evaluation of large amounts of qualitative data using text mining methods and requirements for the reproducibility of data-driven research designs in the social sciences.", developer="Gregor Wiedeman, Andreas Niekler", maintainer="", + architecture="SaaS", softwarecategory=cat_int, license=lic_lgpl) db.session.add(ilcm) @@ -459,6 +511,7 @@ def build_sample_db(): developer="", maintainer="", softwarecategory=cat_qda, + architecture="standalone", license=lic_prop) db.session.add(atlasti) db.session.add(Link(software=atlasti, type="website", url="https://atlasti.com/de/produkt/what-is-atlas-ti/", comment="")) @@ -468,40 +521,347 @@ def build_sample_db(): developer="", maintainer="", softwarecategory=cat_qda, + architecture="standalone", license=lic_prop) db.session.add(leximancer) db.session.add(Link(software=leximancer, type="website", url="https://info.leximancer.com/", comment="")) - maxqda = Software(name="MAXQDA", + tool = Software(name="MAXQDA", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_qda, + architecture="standalone", + license=lic_prop) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="https://www.rrz.uni-hamburg.de/services/software/alphabetisch/maxqda.html", comment="")) + + tool = Software(name="NVivo", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_qda, + license=lic_prop, + programminglanguages=[]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="https://www.qsrinternational.com/nvivo/who-uses-nvivo/academics", comment="")) + + tool = Software(name="QDAMiner", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_qda, + license=lic_prop, + programminglanguages=[]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="https://provalisresearch.com/products/qualitative-data-analysis-software/", comment="")) + + tool = Software(name="ORA Pro", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_qda, + license=lic_prop, + programminglanguages=[]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="http://netanomics.com/", comment="")) + + tool = Software(name="Quirkos", short_description="", developer="", maintainer="", - softwarecategory=cat_transkript, - license=lic_prop) - db.session.add(maxqda) - db.session.add(Link(software=maxqda, type="website", url="https://www.rrz.uni-hamburg.de/services/software/alphabetisch/maxqda.html", comment="")) + softwarecategory=cat_qda, + license=lic_prop, + programminglanguages=[]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="https://www.quirkos.com/", comment="")) + db.session.add(Link(software=tool, type="repository", url="", comment="")) + + tool = Software(name="RQDA", + short_description="It includes a number of standard Computer-Aided Qualitative Data Analysis features. In addition it seamlessly integrates with R, which means that a) statistical analysis on the coding is possible, and b) functions for data manipulation and analysis can be easily extended by writing R functions. To some extent, RQDA and R make an integrated platform for both quantitative and qualitative data analysis.", + developer="Ronggui Huang", + maintainer="Ronggui Huang", + softwarecategory=cat_qda, + license=lic_bsd, + programminglanguages=[prol_r]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="http://rqda.r-forge.r-project.org/", comment="")) + db.session.add(Link(software=tool, type="repository", url="https://github.com/Ronggui/RQDA", comment="")) + + tool = Software(name="TAMS", + short_description="Text Analysis Markup System (TAMS) is both a system of marking documents for qualitative analysis and a series of tools for mining information based on that syntax.", + developer="", + maintainer="", + softwarecategory=cat_qda, + license=lic_gpl2, + programminglanguages=[]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="https://sourceforge.net/projects/tamsys", comment="")) + + tool = Software(name="Apache OpenNLP", + short_description="OpenNLP supports the most common NLP tasks, such as tokenization, sentence segmentation, part-of-speech tagging, named entity extraction, chunking, parsing, language detection and coreference resolution.", + developer="", + maintainer="", + softwarecategory=cat_tm, + license=lic_apache2, + architecture="package", + programminglanguages=[prol_java]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="https://opennlp.apache.org/", comment="")) + db.session.add(Link(software=tool, type="repository", url="", comment="")) + + tool = Software(name="GATE", + short_description="GATE - General Architecture for Text Engineering", + developer="", + maintainer="", + softwarecategory=cat_tm, + architecture="package", + license=lic_lgpl, + programminglanguages=[prol_java]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="https://gate.ac.uk/overview.html", comment="")) + db.session.add(Link(software=tool, type="repository", url="https://github.com/GateNLP/gate-core", comment="")) + + tool = Software(name="NLTK", + short_description="NLTK is a leading platform for building Python programs to work with human language data. It provides easy-to-use interfaces to over 50 corpora and lexical resources such as WordNet, along with a suite of text processing libraries for classification, tokenization, stemming, tagging, parsing, and semantic reasoning, wrappers for industrial-strength NLP libraries, and an active discussion forum.", + developer="", + maintainer="", + softwarecategory=cat_tm, + architecture="package", + license=lic_apache2, + programminglanguages=[prol_py]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="http://www.nltk.org/index.html", comment="")) + db.session.add(Link(software=tool, type="repository", url="https://github.com/nltk/nltk", comment="")) + + tool = Software(name="Gensim", + short_description="Gensim is a Python library for topic modelling, document indexing and similarity retrieval with large corpora. Target audience is the natural language processing (NLP) and information retrieval (IR) community.", + developer="", + maintainer="", + softwarecategory=cat_tm, + architecture="package", + license=lic_lgpl, + programminglanguages=[prol_py]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="https://pypi.org/project/gensim/", comment="")) + db.session.add(Link(software=tool, type="repository", url="", comment="")) + + tool = Software(name="Pandas", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_tm, + architecture="package", + license=lic_bsd, + programminglanguages=[prol_py]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="http://pandas.pydata.org/", comment="")) + db.session.add(Link(software=tool, type="repository", url="https://github.com/pandas-dev/pandas", comment="")) + + tool = Software(name="spaCy", + short_description=" spaCy excels at large-scale information extraction tasks. It's written from the ground up in carefully memory-managed Cython. Independent research has confirmed that spaCy is the fastest in the world. If your application needs to process entire web dumps, spaCy is the library you want to be using.", + developer="", + maintainer="", + softwarecategory=cat_tm, + architecture="package", + license=lic_mit, + programminglanguages=[prol_cy]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="https://spacy.io/", comment="")) + db.session.add(Link(software=tool, type="repository", url="https://github.com/explosion/spaCy", comment="")) + + tool = Software(name="RapidMiner", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_tm, + architecture="framework", + license=lic_agpl3, + programminglanguages=[prol_java]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="https://rapidminer.com/", comment="")) + db.session.add(Link(software=tool, type="repository", url="https://github.com/rapidminer/rapidminer-studio", comment="")) + + tool = Software(name="tm", + short_description="", + developer="Ingo Feinerer, Kurt Hornik", + maintainer="Ingo Feinerer, Kurt Hornik", + softwarecategory=cat_tm, + architecture="package", + license=lic_gpl3, + programminglanguages=[prol_r]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="http://tm.r-forge.r-project.org/", comment="")) + db.session.add(Link(software=tool, type="website", url="https://cran.r-project.org/package=tm", comment="cran")) + db.session.add(Link(software=tool, type="repository", url="", comment="")) + + tool = Software(name="Stanford CoreNLP", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_tm, + architecture="framework", + license=lic_gpl3, + programminglanguages=[prol_java]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="https://stanfordnlp.github.io/CoreNLP/", comment="")) + db.session.add(Link(software=tool, type="repository", url="https://github.com/stanfordnlp/CoreNLP", comment="")) + + tool = Software(name="xtas", + short_description="the eXtensible Text Analysis Suite(xtas) is a collection of natural language processing and text mining tools, brought together in a single software package with built-in distributed computing and support for the Elasticsearch document store.", + developer="", + maintainer="", + softwarecategory=cat_tm, + architecture="framework", + license=lic_apache2, + programminglanguages=[prol_py]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="http://nlesc.github.io/xtas/", comment="")) + db.session.add(Link(software=tool, type="repository", url="https://github.com/NLeSC/xtas", comment="")) + + tool = Software(name="Stm", + short_description="The Structural Topic Model (STM) allows researchers to estimate topic models with document-level covariates. The package also includes tools for model selection, visualization, and estimation of topic-covariate regressions. Methods developed in Roberts et al (2014) <doi:10.1111/ajps.12103> and Roberts et al (2016) <doi:10.1080/01621459.2016.1141684>.", + developer="", + maintainer="", + softwarecategory=cat_topic, + architecture="package", + license=lic_mit, + programminglanguages=[prol_r]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="http://structuraltopicmodel.com", comment="")) + db.session.add(Link(software=tool, type="repository", url="https://github.com/bstewart/stm", comment="")) + tool = Software(name="", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_, + architecture="package", + license=lic_, + programminglanguages=[prol_]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="", comment="")) + db.session.add(Link(software=tool, type="repository", url="", comment="")) + + tool = Software(name="", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_, + architecture="package", + license=lic_, + programminglanguages=[prol_]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="", comment="")) + db.session.add(Link(software=tool, type="repository", url="", comment="")) + + tool = Software(name="", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_, + architecture="package", + license=lic_, + programminglanguages=[prol_]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="", comment="")) + db.session.add(Link(software=tool, type="repository", url="", comment="")) + + tool = Software(name="", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_, + architecture="package", + license=lic_, + programminglanguages=[prol_]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="", comment="")) + db.session.add(Link(software=tool, type="repository", url="", comment="")) + + tool = Software(name="", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_, + architecture="package", + license=lic_, + programminglanguages=[prol_]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="", comment="")) + db.session.add(Link(software=tool, type="repository", url="", comment="")) + + tool = Software(name="", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_, + architecture="package", + license=lic_, + programminglanguages=[prol_]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="", comment="")) + db.session.add(Link(software=tool, type="repository", url="", comment="")) + + tool = Software(name="", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_, + architecture="package", + license=lic_, + programminglanguages=[prol_]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="", comment="")) + db.session.add(Link(software=tool, type="repository", url="", comment="")) + + tool = Software(name="", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_, + architecture="package", + license=lic_, + programminglanguages=[prol_]) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="", comment="")) + db.session.add(Link(software=tool, type="repository", url="", comment="")) ''' tool = Software(name="", - short_description="", - developer="", - maintainer="", - softwarecategory=, - license=lic_) + short_description="", + developer="", + maintainer="", + softwarecategory=cat_, + architecture="package", + license=lic_, + programminglanguages=[prol_]) db.session.add(tool) db.session.add(Link(software=tool, type="website", url="", comment="")) + db.session.add(Link(software=tool, type="repository", url="", comment="")) ''' + paco = Software(name="paco", + short_description="", + developer="Bob Evans", + maintainer="Bob Evans", + softwarecategory=cat_esmema, + architecture="framework", + license=lic_apache2, + programminglanguages=[prol_objc, prol_java]) + db.session.add(paco) + db.session.add(Link(software=paco, type="website", url="https://www.pacoapp.com/", comment="")) + db.session.add(Link(software=paco, type="repository", url="https://github.com/google/paco", comment="")) f4analyse = Software(name="f4analyse", short_description="", developer="", maintainer="", softwarecategory=cat_transkript, + architecture="standalone", license=lic_prop) db.session.add(f4analyse) - db.session.add(Link(software=f4analyse, type="website", url="", comment="")) + db.session.add(Link(software=f4analyse, type="website", url="https://www.audiotranskription.de/f4-analyse", comment="")) db.session.commit() return diff --git a/sample_db.sqlite b/sample_db.sqlite index d94e828b6dace831930de402a07592a3bef3dc3d..81c755dbc5d1178004e2e2b7319413fd5bbc7d35 100644 GIT binary patch literal 53248 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 A^Z)<= delta 466 zcmZozz})bFX@Wc>_e2FxaduV){t|vBzFyvMyk6XXT<M%u9MSBon-v9G**3?rd9rXd zSF*8-%gQpgyKdgVrOG(@Blqda2E6O}L|E9xjg1)_{Yw&)a#ANN@(EAkOP>6JPiS*5 zUpb=y8~+vt{xAH``ET%_=ikS_WwW5d0{+cg<O38ovluW6@bU#Q@Tc<|@g3r8<O|xY zDB!@yq{}+_e5~%~#<+S$IbH?^25zoG2L8AF$NA^;=kXQrS@6!}UdY|W)yY-3Sy3RE zOI?hcn?atJ7o?PtG0h|~FEOXGIF*&Pv5t#}L9sa!Dl=Ij>yw%&CpUvEOs!*xk7KZ2 zNhT{xb14T8gJ`?3FT{||e%UV>`5R@}c^HHnlc9o>y>ln<nz3;+NCv}9{FJNB-&oDc z!yw*lsHn=oz`)2j**xz(uRaSmgFJ&eRKy}*g;$N4n?aXBkpZNJb8=z66d$t+6E}l6 zuPI1~lXLRgd`V$JMvw@|2@H&!j^U0$uFRVhSQHksC<ri%a92%cU!cKQwOLWXi<_TM XgpEO(myx$THK{nWBz1G=>T(tUpHgOR diff --git a/templates/export/softwares.jinja2 b/templates/export/softwares.jinja2 new file mode 100644 index 0000000..7515a18 --- /dev/null +++ b/templates/export/softwares.jinja2 @@ -0,0 +1,7 @@ +{% for softwarecategory in softwareincategory %} +== {{ softwarecategory[0].name }} +_{{softwarecategory[0].short_description}}_ +{% for software in softwarecategory[1] %} +link:Tool_{{ software.name.replace(' ','') }}.asciidoc[{{ software.name }}] ({% for link in software.links %}link:{{link.url}}[{{link.type}}{{'-'+link.comment if link.comment else '' }}] {% endfor %}):: {{software.short_description}} < {{software.license}} | {{software.architecture}} | {% for prol in software.programminglanguages %}{{prol.name}} {% endfor %} > +{% endfor %} +{% endfor %} \ No newline at end of file -- GitLab