Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp1275206ybi; Fri, 21 Jun 2019 18:01:13 -0700 (PDT) X-Google-Smtp-Source: APXvYqyskM+L4kjTuZ+mNXQgdYDXz0XR0nkRkS9qdzKbu2CrD9SdA7PUdwCqdTd5PBm1kJoLGUrp X-Received: by 2002:a17:90a:bb94:: with SMTP id v20mr10335166pjr.88.1561165273236; Fri, 21 Jun 2019 18:01:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561165273; cv=none; d=google.com; s=arc-20160816; b=ik5fAFjPi/swQKBEpz1DixkSYxs8IZ9koKbmUhXLdoFv/wrMu7f5J28XLBghpurppD FFUUxLW8WnjLYRgeX6eAGf+p26641eschRICTxtjIu7t4Wue8Tg4JC9Z1p/c6XxQXWSo gXmZ2vrMGoZIXYRshm0jxARnFAOUR4X6ILcAq5ihuYf99s6VGJBXzJ1/yiIB7zoTdGj4 b/Jw/GKimz24u98kgcXLGHIDdicQw0cetS+PNvEtsXX5EGUJW+aD1dABvD5HC9cSUJW7 ifIt3nbjv4OeobO0PLQxfasoMYVS2IudWonav3LaADilB2WBVuABTP73FOlIv+JcHwpF o/AQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:subject:cc:to:from:date :dkim-signature; bh=DU48MQ9NZfd+dSFfhOVoqXBfrwMyOEsLPRg6YgjyGVI=; b=Owrf96XSYEz2ZimH7Nb7gr7/1KsOQyCNu8QtYkcIpQ78qczCvUu2SRdc6wKRHiXorE iHeAafcfKJXWXvvxZ8OYef0CKzDp6Gk5lENOKetroTqSGc9FT2QoluVutukXuFk6fUzy 2l5IuI2wgg7RQLvGgd/ZKY3q8J4O1A1Sf+naz7dYBmzxvInd9Tlo18lOdW3ktw2fOFv1 PJbHexdiY7pM9vEsONLYkLbDa5Ipff7P1mdbTFk+V9VD1UEMmJ9Lp+lwadXfO9heFnxW c3KrAXPW9L1I846TxORWR8T+qrLYUl13lOJ287BhZEt8otJbTc1VBeY3QxEC+cWnQ6Sr z59w== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=jhnuriO1; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m39si3938334plg.155.2019.06.21.18.00.57; Fri, 21 Jun 2019 18:01:13 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=jhnuriO1; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726331AbfFVBAw (ORCPT + 99 others); Fri, 21 Jun 2019 21:00:52 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:43690 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726052AbfFVBAv (ORCPT ); Fri, 21 Jun 2019 21:00:51 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Subject:Cc:To: From:Date:Sender:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=DU48MQ9NZfd+dSFfhOVoqXBfrwMyOEsLPRg6YgjyGVI=; b=jhnuriO1MsaxnCd+jswIlYNwI Z9eslOz5YY12SaOn2HmpCg3Jjl4UqJjNP2k5zUwZj75rfZRq1UVKMCePjopb2cwljbOaARcLctBH2 DIViKJ99NFy4w6DrFV48ErW/6qj3bFpd76z3SGTnEIo21MxhAkxSSsWIR4TFBoqJNpUYtEb0IXG+D SipccnLUPJWlru8gtR60doHGE3X6te2sdU8mH+2QFM0faKrN5FxXIyOD93P4cWRoUk20PsX9gxkRk m6RXGIxb7Zv/W9PlhqvMCVq5bNNdFiha/aT2g+TXkua+ML2H1KbQeWS7EYw4BlLxENbiqa2rYWzr3 8paKyQXWA==; Received: from [177.97.20.138] (helo=coco.lan) by bombadil.infradead.org with esmtpsa (Exim 4.92 #3 (Red Hat Linux)) id 1heUOg-00055M-PZ; Sat, 22 Jun 2019 01:00:51 +0000 Date: Fri, 21 Jun 2019 22:00:46 -0300 From: Mauro Carvalho Chehab To: Jonathan Corbet Cc: linux-doc@vger.kernel.org, Matthew Wilcox , Jani Nikula , linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/3] Docs: An initial automarkup extension for sphinx Message-ID: <20190621220046.3de30d9d@coco.lan> In-Reply-To: <20190621235159.6992-2-corbet@lwn.net> References: <20190621235159.6992-1-corbet@lwn.net> <20190621235159.6992-2-corbet@lwn.net> X-Mailer: Claws Mail 3.17.3 (GTK+ 2.24.32; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Fri, 21 Jun 2019 17:51:57 -0600 Jonathan Corbet escreveu: > Rather than fill our text files with :c:func:`function()` syntax, just do > the markup via a hook into the sphinx build process. Didn't test it, but it sounds a way nicer than the past version! > Signed-off-by: Jonathan Corbet > --- > Documentation/conf.py | 3 +- > Documentation/sphinx/automarkup.py | 80 ++++++++++++++++++++++++++++++ > 2 files changed, 82 insertions(+), 1 deletion(-) > create mode 100644 Documentation/sphinx/automarkup.py > > diff --git a/Documentation/conf.py b/Documentation/conf.py > index 7ace3f8852bd..a502baecbb85 100644 > --- a/Documentation/conf.py > +++ b/Documentation/conf.py > @@ -34,7 +34,8 @@ needs_sphinx = '1.3' > # Add any Sphinx extension module names here, as strings. They can be > # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom > # ones. > -extensions = ['kerneldoc', 'rstFlatTable', 'kernel_include', 'cdomain', 'kfigure', 'sphinx.ext.ifconfig'] > +extensions = ['kerneldoc', 'rstFlatTable', 'kernel_include', 'cdomain', > + 'kfigure', 'sphinx.ext.ifconfig', 'automarkup'] > > # The name of the math extension changed on Sphinx 1.4 > if (major == 1 and minor > 3) or (major > 1): > diff --git a/Documentation/sphinx/automarkup.py b/Documentation/sphinx/automarkup.py > new file mode 100644 > index 000000000000..14b09b5d145e > --- /dev/null > +++ b/Documentation/sphinx/automarkup.py > @@ -0,0 +1,80 @@ > +# SPDX-License-Identifier: GPL-2.0 > +# Copyright 2019 Jonathan Corbet > +# > +# Apply kernel-specific tweaks after the initial document processing > +# has been done. > +# > +from docutils import nodes > +from sphinx import addnodes > +import re > + > +# > +# Regex nastiness. Of course. > +# Try to identify "function()" that's not already marked up some > +# other way. Sphinx doesn't like a lot of stuff right after a > +# :c:func: block (i.e. ":c:func:`mmap()`s" flakes out), so the last > +# bit tries to restrict matches to things that won't create trouble. > +# > +RE_function = re.compile(r'([\w_][\w\d_]+\(\))') > + > +# > +# The DVB docs create references for these basic system calls, leading > +# to lots of confusing links. So just don't link them. > +# > +Skipfuncs = [ 'open', 'close', 'write' ] and yeah, of course, if there's something weird, it has to be at the media docs :-) Btw, if I'm not mistaken, we do the same for ioctl. I'm wandering if this could also handle the Documentation/* auto-replace. The patch snipped I did (against your past version is enclosed). diff --git a/Documentation/sphinx/automarkup.py b/Documentation/sphinx/automarkup.py index 39c8f4d5af82..60dad596c790 100644 --- a/Documentation/sphinx/automarkup.py +++ b/Documentation/sphinx/automarkup.py @@ -9,6 +9,7 @@ from __future__ import print_function import re import sphinx +#import sys # Just for debug # # Regex nastiness. Of course. @@ -31,10 +32,26 @@ RE_literal = re.compile(r'^(\s*)(.*::\s*|\.\.\s+code-block::.*)$') # RE_whitesp = re.compile(r'^(\s*)') +# +# Get a documentation reference +# +RE_doc_links = re.compile(r'\bDocumentation/([\w\d\-\_\/]+)\.rst\b') + +# +# Doc link false-positives +# +RE_false_doc_links = re.compile(r':ref:`\s*Documentation/[\w\d\-\_\/]+\.rst') + def MangleFile(app, docname, text): ret = [ ] previous = '' literal = False + + rel_dir = '' + + for depth in range(0, docname.count('/')): + rel_dir += "../" + for line in text[0].split('\n'): # # See if we might be ending a literal block, as denoted by @@ -63,7 +80,18 @@ def MangleFile(app, docname, text): # Normal line - perform substitutions. # else: - ret.append(RE_function.sub(r'\1:c:func:`\2`\3', line)) +# new_line = RE_function.sub(r'\1:c:func:`\2`\3', line) + new_line = line + + if not RE_false_doc_links.search(new_line): + new_line = RE_doc_links.sub(r':doc:`' + rel_dir + r'\1`', new_line) + + # # Just for debug - should be removed on production + # if new_line != line: + # print ("===>" + new_line, file=sys.stderr) + + ret.append(new_line) + # # Might we be starting a literal block? If so make note of # the fact. Thanks, Mauro