def write_index(self): index = self.screenshot_root.child('index.rst') if self.ref: content = ".. _{0}:\n\n".format(self.ref) else: content = "" content += rstgen.header(1, self.title) content += "\n\n\n" if self.intro: content += unindent(self.intro) content += "\n\n\n" for name, caption, before, after in self.screenshots: content += "\n\n" content += rstgen.header(2, caption) content += """ {before} .. image:: {name} :alt: {caption} :width: 500 {after} """.format(**locals()) index.write_file(content.encode('utf-8'))
def table2story(self, ar, column_names=None, header_level=None, header_links=None, nosummary=False, stripped=True, show_links=False, **kwargs): """ Render the given table request as reStructuredText to stdout. See :meth:`ar.show <lino.core.request.BaseRequest.show>`. """ if ar.actor.master is not None and not nosummary: if ar.actor.display_mode == 'summary': s = to_rst( ar.actor.get_table_summary(ar.master_instance, ar), stripped=stripped) if stripped: s = s.strip() yield s return fields, headers, widths = ar.get_field_info(column_names) sums = [fld.zero for fld in fields] rows = [] recno = 0 for row in ar.sliced_data_iterator: recno += 1 if show_links: rows.append([ to_rst(x) for x in ar.row2html( recno, fields, row, sums)]) else: rows.append([x for x in ar.row2text(fields, row, sums)]) if header_level is not None: h = rstgen.header(header_level, ar.get_title()) if stripped: h = h.strip() yield h # s = h + "\n" + s # s = tostring(E.h2(ar.get_title())) + s if len(rows) == 0: s = str(ar.no_data_text) if not stripped: s = "\n" + s + "\n" yield s return if not ar.actor.hide_sums: has_sum = False for i in sums: if i: #~ print '20120914 zero?', repr(i) has_sum = True break if has_sum: rows.append([x for x in ar.sums2html(fields, sums)]) t = RstTable(headers, **kwargs) yield t.to_rst(rows)
def table2story(self, ar, column_names=None, header_level=None, nosummary=False, stripped=True, show_links=False, **kwargs): """ Render the given table request as reStructuredText to stdout. See :meth:`ar.show <lino.core.request.BaseRequest.show>`. """ if ar.actor.master is not None and not nosummary: if ar.actor.display_mode == 'summary': s = to_rst(ar.actor.get_table_summary(ar.master_instance, ar), stripped=stripped) if stripped: s = s.strip() return s fields, headers, widths = ar.get_field_info(column_names) sums = [fld.zero for fld in fields] rows = [] recno = 0 for row in ar.sliced_data_iterator: recno += 1 if show_links: rows.append( [to_rst(x) for x in ar.row2html(recno, fields, row, sums)]) else: rows.append([x for x in ar.row2text(fields, row, sums)]) if len(rows) == 0: s = str(ar.no_data_text) if not stripped: s = "\n" + s + "\n" return s if not ar.actor.hide_sums: has_sum = False for i in sums: if i: #~ print '20120914 zero?', repr(i) has_sum = True break if has_sum: rows.append([x for x in ar.sums2html(fields, sums)]) t = RstTable(headers, **kwargs) s = t.to_rst(rows) if header_level is not None: h = rstgen.header(header_level, ar.get_title()) if stripped: h = h.strip() s = h + "\n" + s # s = tostring(E.h2(ar.get_title())) + s return s
def write_index(self): index = self.screenshot_root.child('index.rst') if self.ref: content = ".. _{0}:\n\n".format(self.ref) else: content = "" content += rstgen.header(1, self.title) content += "\n\n\n" if self.intro: content += unindent(self.intro) content += "\n\n\n" for name, caption, before, after in self.screenshots: content += "\n\n" content += rstgen.header(2, caption) content += """ {before} .. image:: {name} :alt: {caption} :width: 500 {after} """.format(**locals()) if self.error_message: content += "\n\n" if self.ref: content += ".. _{0}.oops:\n\n".format(self.ref) content += rstgen.header(2, "Not finished") content += "\n\n" content += "Oops, we had a problem when generating this document::\n" isep = '\n ' content += isep content += isep.join(self.error_message.splitlines()) content += "\n\n" if six.PY2: content = content.encode('utf-8') index.write_file(content)
def edit_blog_entry(ctx, today=None): """Edit today's blog entry, create an empty file if it doesn't yet exist. :today: Useful when a working day lasted longer than midnight, or when you start some work in the evening, knowing that you won't commit it before the next morning. Note that you must specify the date using the YYYYMMDD format. Usage example:: $ fab blog:20150727 """ if not ctx.editor_command: raise MissingConfig("editor_command") today = get_current_date(today) entry = get_blog_entry(ctx, today) if not entry.path.exists(): if ctx.languages is None: # txt = today.strftime(ctx.long_date_format) lng = 'en' else: lng = ctx.languages[0] txt = format_date(today, format='full', locale=lng) txt = txt[0].upper() + txt[1:] # estonian weekdays content = rstgen.header(1, txt) content = ":date: {0}\n\n".format(today) + content msg = "{0}\nCreate file {1}?".format(content, entry.path) if not confirm(msg): return # for every year we create a new directory. yd = entry.path.parent if not yd.exists(): if not confirm("Happy New Year! Create directory %s?" % yd): return yd.mkdir() txt = ".. blogger_year::\n" yd.child('index.rst').write_file(txt.encode('utf-8')) if six.PY2: content = content.encode('utf-8') entry.path.write_file(content) # touch it for Sphinx: entry.path.parent.child('index.rst').set_times() args = [ctx.editor_command.format(entry.path)] args += [entry.path] # raise Exception("20160324 %s", args) ctx.run(' '.join(args), pty=True)
def edit_blog_entry(today=None): """Edit today's blog entry, create an empty file if it doesn't yet exist. :today: Useful when a working day lasted longer than midnight, or when you start some work in the evening, knowing that you won't commit it before the next morning. Note that you must specify the date using the YYYYMMDD format. Usage example:: $ fab blog:20150727 """ if not env.editor_command: raise MissingConfig("editor_command") today = get_current_date(today) entry = get_blog_entry(today) if not entry.path.exists(): if not confirm("Create file %s?" % entry.path): return # for every year we create a new directory. yd = entry.path.parent if not yd.exists(): if not confirm("Happy New Year! Create directory %s?" % yd): return yd.mkdir() txt = ".. blogger_year::\n" yd.child('index.rst').write_file(txt.encode('utf-8')) if env.languages is None: txt = today.strftime(env.long_date_format) else: txt = format_date( today, format='full', locale=env.languages[0]) entry.path.write_file(rstgen.header(1, txt).encode('utf-8')) # touch it for Sphinx: entry.path.parent.child('index.rst').set_times() args = [env.editor_command] args += [entry.path] local(' '.join(args))
def edit_blog_entry(today=None): """ Edit today's blog entry, create an empty file if it doesn't yet exist. """ if today is None: today = get_current_date() else: today = i2d(today) entry = get_blog_entry(today) if not entry.path.exists(): if not confirm("Create file %s?" % entry.path): return if env.languages is None: txt = today.strftime(env.long_date_format) else: txt = format_date( today, format='full', locale=env.languages[0]) entry.path.write_file(rstgen.header(1, txt).encode('utf-8')) # touch it for Sphinx: entry.path.parent.child('index.rst').set_times() args = [os.environ['EDITOR']] args += [entry.path] local(' '.join(args))
def write_readme(ctx): """Generate or update `README.txt` or `README.rst` file from `SETUP_INFO`. """ if not atelier.current_project.main_package: return atelier.current_project.load_info() info = atelier.current_project.SETUP_INFO if not info.get('long_description'): return # if len(ctx.doc_trees) == 0: # # when there are no docs, then the README file is manually maintained # return if ctx.revision_control_system == 'git': readme = ctx.root_dir.child('README.rst') else: readme = ctx.root_dir.child('README.txt') # for k in ('name', 'description', 'long_description', 'url'): # if k not in env.current_project.SETUP_INFO: # msg = "SETUP_INFO for {0} has no key '{1}'" # raise Exception(msg.format(env.current_project, k)) title = rstgen.header(1, "The ``{}`` package".format(info['name'])) txt = """\ {title} {long_description} """.format(title=title, **info) if six.PY2: txt = txt.encode('utf-8') if readme.exists() and readme.read_file() == txt: return must_confirm("Overwrite %s" % readme.absolute()) readme.write_file(txt) docs_index = ctx.root_dir.child('docs', 'index.rst') if docs_index.exists(): docs_index.set_times()
def get_rst(self): #~ from actordoc import get_actor_description #~ from django.conf import settings #~ from djangosite.dbutils import set_language with translation.override(self.language): level, cls = resolve_name(self.content[0]) if isinstance(cls, models.Field): fld = cls s = '' name = str(fld.model) + '.' + fld.name title = force_text(fld.verbose_name).strip() s += "\n.. index::\n single: " s += str(_('%(field)s (field in %(model)s)') % dict( field=title, model=model_ref(fld.model))) s += '\n\n' s += rstgen.header(level, _("%s (field)") % title) if len(self.content) > 1: s += '\n'.join(self.content[1:]) s += '\n\n' return s if isinstance(cls, Plugin): s = '' title = str(cls.verbose_name) s += "\n.. index::\n single: " s += str(_('%s (app)') % title) s += '\n\n.. _' + name + ':\n' s += '\n' s += rstgen.header(level, _("%s (app)") % title) return s if not isinstance(cls, type): raise Exception("%s is not an actor." % self.content[0]) if issubclass(cls, models.Model): model = cls s = '' name = model_name(model).lower() title = force_text(model._meta.verbose_name) s += "\n.. index::\n single: " s += str(_('%(model)s (model in %(app)s)') % dict( model=title, app=model._meta.app_label)) s += '\n\n' s += '\n\n.. _' + name + ':\n' s += '\n' s += rstgen.header(level, _("%s (model)") % title) s += '\n' s += '\n:Internal name: ``%s``\n' % full_model_name(cls) s += '\n:Implemented by: %s\n' % typeref(cls) s += '\n' if len(self.content) > 1: s += '\n'.join(self.content[1:]) s += '\n\n' model_reports = [ r for r in kernel.master_tables if r.model is cls] model_reports += [r for r in kernel.slave_tables if r.model is cls] s += rstgen.boldheader(_("Views on %s") % cls._meta.verbose_name) s += actors_overview_ul(model_reports) s += rstgen.boldheader(_("Fields in %s") % cls._meta.verbose_name) s += fields_ul(cls._meta.fields) action_list = cls.get_default_table().get_actions() action_list = [ ba for ba in action_list if not isinstance(ba.action, IGNORED_ACTIONS)] if action_list: s += '\n' s += rstgen.boldheader(_("Actions on %s") % cls._meta.verbose_name) s += actions_ul(action_list) slave_tables = getattr(cls, '_lino_slaves', {}).values() if slave_tables: s += rstgen.boldheader(_("Tables referring to %s") % cls._meta.verbose_name) s += actors_overview_ul(slave_tables) return s if issubclass(cls, actors.Actor): title = force_text(cls.label or cls.title) indextext = _('%(actor)s (view in %(app)s)') % dict( actor=title, app=cls.app_label) name = actor_name(cls) #~ if name == 'welfare.reception.waitingvisitors': #~ self.debug = True #~ print(20130907, name) self.index_entries.append(('single', indextext, name, '')) #~ self.add_ref_target(name,name) s = '' s += '\n\n.. _%s:\n\n' % name s += rstgen.header(level, _("%s (view)") % title) s += '\n:Internal name: ``%s`` (%s)\n' % (cls, typeref(cls)) if len(self.content) > 1: s += '\n'.join(self.content[1:]) s += '\n\n' s += '\n\n' s += get_actor_description(cls) s += '\n\n' return s raise Exception("Cannot handle actor %r." % cls)
def html2rst(e, stripped=False): """ Convert an element tree to reStructuredText. """ #~ print("20120613 html2odftext()", e.tag, e.text) rst = '' if e.tag in ('p', 'li'): if not stripped: rst += '\n\n' elif e.tag in ('ul', 'ol'): rst += '\n' elif e.tag == 'br': if stripped: rst += '\n' else: rst += ' |br| \n' elif e.tag == 'b': rst += '**' elif e.tag == 'em' or e.tag == 'i': rst += '*' elif e.tag == 'a': rst += '`' if e.text: rst += e.text for child in e: rst += html2rst(child, stripped) if e.tag in NEWLINE_TAGS: if stripped: rst += '\n' else: rst += '\n\n' elif e.tag in ('h1', 'h2', 'h3', 'h4', 'h5', 'h6'): rst = rstgen.header(int(e.tag[1]), rst.strip()).strip() if stripped: rst += '\n' else: rst = '\n\n' + rst + '\n\n' elif e.tag == 'b': if rst == '**': rst = '' else: rst += '**' elif e.tag == 'em' or e.tag == 'i': if rst == '*': rst = '' else: rst += '*' elif e.tag == 'a': rst += ' <%s>`__' % e.get('href') elif e.tag == 'img': text = e.get('alt') or e.get('src') rst += '[img %s]' % text elif e.tag in ('td', 'th'): rst += ' ' else: if e.tag not in IGNORED_TAGS: raise Exception("20150723 %s" % e.tag) if e.tail: rst += e.tail return rst
def get_rst(self): #~ from actordoc import get_actor_description #~ from django.conf import settings #~ from djangosite.dbutils import set_language with translation.override(self.language): level, cls = resolve_name(self.content[0]) if isinstance(cls, models.Field): fld = cls s = '' name = str(fld.model) + '.' + fld.name title = force_unicode(fld.verbose_name).strip() s += "\n.. index::\n single: " s += unicode( _('%(field)s (field in %(model)s)') % dict(field=title, model=model_ref(fld.model))) s += '\n\n' s += rstgen.header(level, _("%s (field)") % title) if len(self.content) > 1: s += '\n'.join(self.content[1:]) s += '\n\n' return s if isinstance(cls, Plugin): s = '' title = unicode(cls.verbose_name) s += "\n.. index::\n single: " s += unicode(_('%s (app)') % title) s += '\n\n.. _' + name + ':\n' s += '\n' s += rstgen.header(level, _("%s (app)") % title) return s if not isinstance(cls, type): raise Exception("%s is not an actor." % self.content[0]) if issubclass(cls, models.Model): model = cls s = '' name = model_name(model).lower() title = force_unicode(model._meta.verbose_name) s += "\n.. index::\n single: " s += unicode( _('%(model)s (model in %(app)s)') % dict(model=title, app=model._meta.app_label)) s += '\n\n' s += '\n\n.. _' + name + ':\n' s += '\n' s += rstgen.header(level, _("%s (model)") % title) s += '\n' s += '\n:Internal name: ``%s``\n' % full_model_name(cls) s += '\n:Implemented by: %s\n' % typeref(cls) s += '\n' if len(self.content) > 1: s += '\n'.join(self.content[1:]) s += '\n\n' model_reports = [ r for r in dbtables.master_reports if r.model is cls ] model_reports += [ r for r in dbtables.slave_reports if r.model is cls ] s += rstgen.boldheader( _("Views on %s") % cls._meta.verbose_name) s += actors_overview_ul(model_reports) s += rstgen.boldheader( _("Fields in %s") % cls._meta.verbose_name) s += fields_ul(cls._meta.fields) action_list = cls.get_default_table().get_actions() action_list = [ ba for ba in action_list if not isinstance(ba.action, IGNORED_ACTIONS) ] if action_list: s += '\n' s += rstgen.boldheader( _("Actions on %s") % cls._meta.verbose_name) s += actions_ul(action_list) slave_tables = getattr(cls, '_lino_slaves', {}).values() if slave_tables: s += rstgen.boldheader( _("Tables referring to %s") % cls._meta.verbose_name) s += actors_overview_ul(slave_tables) return s if issubclass(cls, actors.Actor): title = force_unicode(cls.label or cls.title) indextext = _('%(actor)s (view in %(app)s)') % dict( actor=title, app=cls.app_label) name = actor_name(cls) #~ if name == 'welfare.reception.waitingvisitors': #~ self.debug = True #~ print(20130907, name) self.index_entries.append(('single', indextext, name, '')) #~ self.add_ref_target(name,name) s = '' s += '\n\n.. _%s:\n\n' % name s += rstgen.header(level, _("%s (view)") % title) s += '\n:Internal name: ``%s`` (%s)\n' % (cls, typeref(cls)) if len(self.content) > 1: s += '\n'.join(self.content[1:]) s += '\n\n' s += '\n\n' s += get_actor_description(cls) s += '\n\n' return s raise Exception("Cannot handle actor %r." % cls)
def html2rst(e, stripped=False): """The html2rst function.""" # ~ print "20120613 html2odftext()", e.tag, e.text rst = "" if e.tag in ("p", "li"): if not stripped: rst += "\n\n" elif e.tag in ("ul", "ol"): rst += "\n" elif e.tag == "br": if stripped: rst += "\n" else: rst += " |br| \n" elif e.tag == "b": rst += "**" elif e.tag == "em" or e.tag == "i": rst += "*" elif e.tag == "a": rst += "`" if e.text: rst += e.text for child in e: rst += html2rst(child, stripped) if e.tag in NEWLINE_TAGS: if stripped: rst += "\n" else: rst += "\n\n" elif e.tag in ("h1", "h2", "h3", "h4", "h5", "h6"): rst = rstgen.header(int(e.tag[1]), rst.strip()).strip() if stripped: rst += "\n" else: rst = "\n\n" + rst + "\n\n" elif e.tag == "b": if rst == "**": rst = "" else: rst += "**" elif e.tag == "em" or e.tag == "i": if rst == "*": rst = "" else: rst += "*" elif e.tag == "a": rst += " <%s>`__" % e.get("href") elif e.tag == "img": text = e.get("alt") or e.get("src") rst += "[img %s]" % text elif e.tag in ("td", "th"): rst += " " else: if e.tag not in IGNORED_TAGS: raise Exception("20150723 %s" % e.tag) if e.tail: rst += e.tail return rst
def get_rst(self): #~ from actordoc import get_actor_description #~ from django.conf import settings #~ from djangosite.dbutils import set_language with translation.override(self.state.document.settings.env.config.language): #~ lng = self.state.document.settings.env.config.language #~ set_language(lng) level, cls = resolve_name(self.content[0]) if isinstance(cls,models.Field): fld = cls s = '' name = str(fld.model)+'.'+fld.name title = force_unicode(fld.verbose_name).strip() s += "\n.. index::\n single: " s += unicode(_('%s (field in "%s")') % (title,fld.model)) s += '\n\n' s += rstgen.header(level,_("The **%s** field") % title) if len(self.content) > 1: s += '\n'.join(self.content[1:]) s += '\n\n' return s if isinstance(cls,dd.__class__): # it's a module (an app) s = '' name = app_name(cls) app = getattr(cls,'App',None) if app is None: title = name else: title = unicode(app.verbose_name) s += "\n.. index::\n single: " s += unicode(_('%s (app)') % title) s += '\n\n.. _'+ name + ':\n' s += '\n' s += rstgen.header(level,_("The %s app") % title) return s if not isinstance(cls,type): raise Exception("%s is not an actor." % self.content[0]) if issubclass(cls,models.Model): model = cls #~ if full_model_name(cls) == 'newcomers.Broker': #~ self.debug = True #~ self.add_model_index_entry(cls) s = '' name = model_name(model).lower() title = force_unicode(model._meta.verbose_name) s += "\n.. index::\n single: " s += unicode(_('%s (model in app "%s")') % (title,model._meta.app_label)) s += '\n\n' #~ title = unicode(cls._meta.verbose_name) #~ indextext = _('%s (%s)') % (full_model_name(cls),title) #~ name = model_name(cls) #~ self.index_entries.append(('single', indextext, name, '')) #~ self.add_ref_target(name,name) s += '\n\n.. _'+ name + ':\n' s += '\n' s += rstgen.header(level,_("The %s model") % title) #~ print(s) #~ s += rstgen.header(3,_('%s (%s)') % (title,full_model_name(cls))) s += '\n' s += '\n:Internal name: ``%s``\n' % full_model_name(cls) s += '\n:Implemented by: %s\n' % typeref(cls) s += '\n' if len(self.content) > 1: s += '\n'.join(self.content[1:]) s += '\n\n' model_reports = [r for r in dbtables.master_reports if r.model is cls] model_reports += [r for r in dbtables.slave_reports if r.model is cls] #~ s += rstgen.boldheader(_("Tables on a %s") % cls._meta.verbose_name) s += rstgen.boldheader(_("Views on %s") % cls._meta.verbose_name) s += actors_overview_ul(model_reports) s += rstgen.boldheader(_("Fields in %s") % cls._meta.verbose_name) s += fields_ul(cls._meta.fields) action_list = cls._lino_default_table.get_actions() #~ action_list = [ba for ba in action_list if ba.action.sort_index >= 30] action_list = [ba for ba in action_list if not isinstance(ba.action,IGNORED_ACTIONS)] if action_list: s += '\n' s += rstgen.boldheader(_("Actions on %s") % cls._meta.verbose_name) s += actions_ul(action_list) slave_tables = getattr(cls,'_lino_slaves',{}).values() if slave_tables: s += rstgen.boldheader(_("Tables referring to %s") % cls._meta.verbose_name) #~ for tb in slave_tables: #~ s += '\n.. _'+ settings.SITE.userdocs_prefix + str(tb) + ':\n' #~ s += '\n' #~ s += rstgen.header(4,_("Slave tables of %s") % cls._meta.verbose_name) #~ s += "\n\n**%s**\n\n" % _("Tables referring to %s") % cls._meta.verbose_name s += actors_overview_ul(slave_tables) #~ if model_reports: #~ s += '\nMaster tables: %s\n' % rptlist(model_reports) #~ if slave_tables: #~ s += '\nSlave tables: %s\n' % rptlist(slave_tables) return s if issubclass(cls,actors.Actor): title = force_unicode(cls.label or cls.title) indextext = _('%s (table in module %s)') % (title,cls.app_label) name = actor_name(cls) #~ if name == 'welfare.reception.waitingvisitors': #~ self.debug = True #~ print(20130907, name) self.index_entries.append(('single', indextext, name, '')) #~ self.add_ref_target(name,name) s = '' s += '\n\n.. _%s:\n\n' % name s += rstgen.header(level,_("The %s view") % title) s += '\n:Internal name: ``%s`` (%s)\n' % (cls,typeref(cls)) if len(self.content) > 1: s += '\n'.join(self.content[1:]) s += '\n\n' s += '\n\n' s += get_actor_description(cls) s += '\n\n' return s raise Exception("Cannot handle actor %r." % cls)
def html2rst(e, stripped=False): """The html2rst function.""" #~ print "20120613 html2odftext()", e.tag, e.text rst = '' if e.tag in ('p', 'li'): if not stripped: rst += '\n\n' elif e.tag in ('ul', 'ol'): rst += '\n' elif e.tag == 'br': if stripped: rst += '\n' else: rst += ' |br| \n' elif e.tag == 'b': rst += '**' elif e.tag == 'em' or e.tag == 'i': rst += '*' elif e.tag == 'a': rst += '`' if e.text: rst += e.text for child in e: rst += html2rst(child, stripped) if e.tag in NEWLINE_TAGS: if stripped: rst += '\n' else: rst += '\n\n' elif e.tag in ('h1', 'h2', 'h3', 'h4', 'h5', 'h6'): rst = rstgen.header(int(e.tag[1]), rst.strip()).strip() if stripped: rst += '\n' else: rst = '\n\n' + rst + '\n\n' elif e.tag == 'b': if rst == '**': rst = '' else: rst += '**' elif e.tag == 'em': if rst == '*': rst = '' else: rst += '*' elif e.tag == 'a': rst += ' <%s>`__' % e.get('href') elif e.tag == 'img': text = e.get('alt') or e.get('src') rst += '[img %s]' % text elif e.tag in ('td', 'th'): rst += ' ' else: if e.tag not in IGNORED_TAGS: raise Exception("20150723 %s" % e.tag) if e.tail: rst += e.tail return rst