source@mandoc.bsd.lv
 help / color / Atom feed
From: schwarze@mandoc.bsd.lv
To: source@mandoc.bsd.lv
Subject: mandoc: Support -T html -O tag by passing a file:// URI to the pager.
Date: Mon, 15 Jun 2020 12:26:13 -0500 (EST)
Message-ID: <490dd2c913848610@mandoc.bsd.lv> (raw)

Log Message:
-----------
Support -T html -O tag by passing a file:// URI to the pager.
Feature suggested by and implementation based on a patch 
from Abel Romero Perez <romeroperezabel at gmail dot com>.

Modified Files:
--------------
    mandoc:
        main.c

Revision Data
-------------
Index: main.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/main.c,v
retrieving revision 1.349
retrieving revision 1.350
diff -Lmain.c -Lmain.c -u -p -r1.349 -r1.350
--- main.c
+++ main.c
@@ -108,8 +108,8 @@ static	void		  parse(struct mparse *, in
 static	void		  passthrough(int, int);
 static	void		  process_onefile(struct mparse *, struct manpage *,
 				int, struct outstate *, struct manconf *);
-static	void		  run_pager(struct tag_files *, char *);
-static	pid_t		  spawn_pager(struct tag_files *, char *);
+static	void		  run_pager(struct outstate *, char *);
+static	pid_t		  spawn_pager(struct outstate *, char *);
 static	void		  usage(enum argmode) __attribute__((__noreturn__));
 static	int		  woptions(char *, enum mandoc_os *, int *);
 
@@ -643,7 +643,7 @@ out:
 
 	if (outst.tag_files != NULL) {
 		if (term_tag_close() != -1)
-			run_pager(outst.tag_files, conf.output.tag);
+			run_pager(&outst, conf.output.tag);
 		term_tag_unlink();
 	} else if (outst.had_output && outst.outtype != OUTT_LINT)
 		mandoc_msg_summary();
@@ -1144,15 +1144,15 @@ woptions(char *arg, enum mandoc_os *os_e
  * then fork the pager and wait for the user to close it.
  */
 static void
-run_pager(struct tag_files *tag_files, char *tag_target)
+run_pager(struct outstate *outst, char *tag_target)
 {
 	int	 signum, status;
 	pid_t	 man_pgid, tc_pgid;
 	pid_t	 pager_pid, wait_pid;
 
 	man_pgid = getpgid(0);
-	tag_files->tcpgid = man_pgid == getpid() ? getpgid(getppid()) :
-	    man_pgid;
+	outst->tag_files->tcpgid =
+	    man_pgid == getpid() ? getpgid(getppid()) : man_pgid;
 	pager_pid = 0;
 	signum = SIGSTOP;
 
@@ -1166,7 +1166,7 @@ run_pager(struct tag_files *tag_files, c
 				if (signum == SIGTTIN)
 					continue;
 			} else
-				tag_files->tcpgid = tc_pgid;
+				outst->tag_files->tcpgid = tc_pgid;
 			kill(0, signum);
 			continue;
 		}
@@ -1177,7 +1177,7 @@ run_pager(struct tag_files *tag_files, c
 			(void)tcsetpgrp(STDOUT_FILENO, pager_pid);
 			kill(pager_pid, SIGCONT);
 		} else
-			pager_pid = spawn_pager(tag_files, tag_target);
+			pager_pid = spawn_pager(outst, tag_target);
 
 		/* Wait for the pager to stop or exit. */
 
@@ -1198,7 +1198,7 @@ run_pager(struct tag_files *tag_files, c
 }
 
 static pid_t
-spawn_pager(struct tag_files *tag_files, char *tag_target)
+spawn_pager(struct outstate *outst, char *tag_target)
 {
 	const struct timespec timeout = { 0, 100000000 };  /* 0.1s */
 #define MAX_PAGER_ARGS 16
@@ -1211,8 +1211,8 @@ spawn_pager(struct tag_files *tag_files,
 	int		 argc, use_ofn;
 	pid_t		 pager_pid;
 
-	assert(tag_files->ofd == -1);
-	assert(tag_files->tfs == NULL);
+	assert(outst->tag_files->ofd == -1);
+	assert(outst->tag_files->tfs == NULL);
 
 	pager = getenv("MANPAGER");
 	if (pager == NULL || *pager == '\0')
@@ -1243,11 +1243,12 @@ spawn_pager(struct tag_files *tag_files,
 
 	use_ofn = 1;
 #if HAVE_LESS_T
-	if (*tag_files->tfn != '\0' && (cmdlen = strlen(argv[0])) >= 4) {
+	if (*outst->tag_files->tfn != '\0' &&
+	    (cmdlen = strlen(argv[0])) >= 4) {
 		cp = argv[0] + cmdlen - 4;
 		if (strcmp(cp, "less") == 0) {
 			argv[argc++] = mandoc_strdup("-T");
-			argv[argc++] = tag_files->tfn;
+			argv[argc++] = outst->tag_files->tfn;
 			if (tag_target != NULL) {
 				argv[argc++] = mandoc_strdup("-t");
 				argv[argc++] = tag_target;
@@ -1256,8 +1257,14 @@ spawn_pager(struct tag_files *tag_files,
 		}
 	}
 #endif
-	if (use_ofn)
-		argv[argc++] = tag_files->ofn;
+	if (use_ofn) {
+		if (outst->outtype == OUTT_HTML && tag_target != NULL)
+			mandoc_asprintf(&argv[argc], "file://%s#%s",
+			    outst->tag_files->ofn, tag_target);
+		else
+			argv[argc] = outst->tag_files->ofn;
+		argc++;
+	}
 	argv[argc] = NULL;
 
 	switch (pager_pid = fork()) {
@@ -1276,7 +1283,7 @@ spawn_pager(struct tag_files *tag_files,
 			exit(mandoc_msg_getrc());
 		}
 #endif
-		tag_files->pager_pid = pager_pid;
+		outst->tag_files->pager_pid = pager_pid;
 		return pager_pid;
 	}
 
--
 To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv


                 reply index

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=490dd2c913848610@mandoc.bsd.lv \
    --to=schwarze@mandoc.bsd.lv \
    --cc=source@mandoc.bsd.lv \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

source@mandoc.bsd.lv

Archives are clonable: git clone --mirror http://inbox.vuxu.org/mandoc-source

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://inbox.vuxu.org/vuxu.archive.mandoc.source


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git