ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
* Modifying bibliography entries using lua
@ 2018-07-23 16:42 Stanislav Sokolenko
  2018-07-23 18:40 ` Hans Hagen
  0 siblings, 1 reply; 6+ messages in thread
From: Stanislav Sokolenko @ 2018-07-23 16:42 UTC (permalink / raw)
  To: mailing list for ConTeXt users

Dear list,

I'm struggling to output bibliography entries into lua for string 
modification (like making a particular author name bold). In effect, I 
just need something like the following:

\starttexdefinition btx:customauthor
     \startluacode
     local text = context.btxflush('author')
     -- tex.sprint(text) -- fails because text remains nil
     \stopluacode
\stoptexdefinition

It's clear that btxflux is the wrong function for this as it writes the 
contents to file rather than returning a variable in lua... Is there a 
way to directly access what btxflush is writing through the publications 
table or other means? I've gone over the source code but I can't 
decipher what btxflush is actually doing.

Thanks,

Stan

Longer MNWE:

\stopluacode

\startbuffer[ref]
@article{solo,
   author = {Lastname, Firstname},
   title = {Solo work},
   journal = {Journal},
   year = {2000},
   month = {1},
   volume = {1}
}
\stopbuffer

\usebtxdataset[ref][ref.buffer]
\setupbtx[dataset=ref]

\definebtxrendering[ref][dataset=ref]
\setupbtx[default:cite]
   [alternative=authoryear,
    etallimit=1]


\starttexdefinition btx:customauthor
     \startluacode
     local text = context.btxflush('author')
     -- tex.sprint(text) -- text remains nill
     \stopluacode
\stoptexdefinition

\startsetups btx:default:list:article
     \texdefinition{btx:customauthor}
     \texdefinition{btx:default:title}
     \texdefinition{btx:default:journal}
     \texdefinition{btx:default:year}
     \removeunwantedspaces
     \removepunctuation
     \btxperiod
\stopsetups

\starttext

Citations: \cite[solo]

\startsubject[title=Bibliography]
\placelistofpublications[ref][method=dataset]
\stopsection

\stoptext


___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Modifying bibliography entries using lua
  2018-07-23 16:42 Modifying bibliography entries using lua Stanislav Sokolenko
@ 2018-07-23 18:40 ` Hans Hagen
  2018-07-23 20:17   ` Stanislav Sokolenko
  0 siblings, 1 reply; 6+ messages in thread
From: Hans Hagen @ 2018-07-23 18:40 UTC (permalink / raw)
  To: mailing list for ConTeXt users, Stanislav Sokolenko

On 7/23/2018 6:42 PM, Stanislav Sokolenko wrote:
> Dear list,
> 
> I'm struggling to output bibliography entries into lua for string 
> modification (like making a particular author name bold). In effect, I 
> just need something like the following:
> 
> \starttexdefinition btx:customauthor
>      \startluacode
>      local text = context.btxflush('author')
>      -- tex.sprint(text) -- fails because text remains nil
>      \stopluacode
> \stoptexdefinition
> 
> It's clear that btxflux is the wrong function for this as it writes the 
> contents to file rather than returning a variable in lua... Is there a 
> way to directly access what btxflush is writing through the publications 
> table or other means? I've gone over the source code but I can't 
> decipher what btxflush is actually doing.

This is not for the fainthearted so here we go

\startluacode
     function document.MyBoldPub(set,tag)
      -- local a = publications.getfield(set,tag,"author")
      -- inspect(a)
      -- local c = publications.getcasted(set,tag,"author")
      -- inspect(c)
         if c[1].surnames[1] == "Myname" then
             context.bold(function()
                 context.btxflush('author')
             end )
         else
             context.btxflush('author')
         end
     end
\stopluacode

\starttexdefinition btx:customauthor
     \ctxluacode{document.MyBoldPub("\currentbtxdataset","\currentbtxtag")}
\stoptexdefinition

try to avoid tex.print cum suis, use the proper context.* interface instead


> Thanks,
> 
> Stan
> 
> Longer MNWE:
> 
> \stopluacode
> 
> \startbuffer[ref]
> @article{solo,
>    author = {Lastname, Firstname},
>    title = {Solo work},
>    journal = {Journal},
>    year = {2000},
>    month = {1},
>    volume = {1}
> }
> \stopbuffer
> 
> \usebtxdataset[ref][ref.buffer]
> \setupbtx[dataset=ref]
> 
> \definebtxrendering[ref][dataset=ref]
> \setupbtx[default:cite]
>    [alternative=authoryear,
>     etallimit=1]
> 
> 
> \starttexdefinition btx:customauthor
>      \startluacode
>      local text = context.btxflush('author')
>      -- tex.sprint(text) -- text remains nill
>      \stopluacode
> \stoptexdefinition
> 
> \startsetups btx:default:list:article
>      \texdefinition{btx:customauthor}
>      \texdefinition{btx:default:title}
>      \texdefinition{btx:default:journal}
>      \texdefinition{btx:default:year}
>      \removeunwantedspaces
>      \removepunctuation
>      \btxperiod
> \stopsetups
> 
> \starttext
> 
> Citations: \cite[solo]
> 
> \startsubject[title=Bibliography]
> \placelistofpublications[ref][method=dataset]
> \stopsection
> 
> \stoptext
> 
> 
> ___________________________________________________________________________________ 
> 
> If your question is of interest to others as well, please add an entry 
> to the Wiki!
> 
> maillist : ntg-context@ntg.nl / 
> http://www.ntg.nl/mailman/listinfo/ntg-context
> webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
> archive  : https://bitbucket.org/phg/context-mirror/commits/
> wiki     : http://contextgarden.net
> ___________________________________________________________________________________


-- 

-----------------------------------------------------------------
                                           Hans Hagen | PRAGMA ADE
               Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
        tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Modifying bibliography entries using lua
  2018-07-23 18:40 ` Hans Hagen
@ 2018-07-23 20:17   ` Stanislav Sokolenko
  2018-07-23 21:32     ` Hans Hagen
  0 siblings, 1 reply; 6+ messages in thread
From: Stanislav Sokolenko @ 2018-07-23 20:17 UTC (permalink / raw)
  To: Hans Hagen, mailing list for ConTeXt users

Thanks Hans, that's really helpful!

> This is not for the fainthearted so here we go
>
> \startluacode
>     function document.MyBoldPub(set,tag)
>      -- local a = publications.getfield(set,tag,"author")
>      -- inspect(a)
>      -- local c = publications.getcasted(set,tag,"author")
>      -- inspect(c)
>         if c[1].surnames[1] == "Myname" then
>             context.bold(function()
>                 context.btxflush('author')
>             end )
>         else
>             context.btxflush('author')
>         end
>     end
> \stopluacode

So if I wanted to bold one specific author in a reference of many, I can 
just loop over publications.getcasted(...), and print the appropriate 
names, initials, etc...

That said -- is there any way to call the appropriate authorconversion 
routine based on the \setupbtx settings? I found the 
publications.authorhashers method table, which seems to do most of this 
work, but I'm not sure how to pick the appropriate method and ensure 
that the correct separators are used.

Stan


___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Modifying bibliography entries using lua
  2018-07-23 20:17   ` Stanislav Sokolenko
@ 2018-07-23 21:32     ` Hans Hagen
  2018-07-24 14:41       ` Stanislav Sokolenko
  0 siblings, 1 reply; 6+ messages in thread
From: Hans Hagen @ 2018-07-23 21:32 UTC (permalink / raw)
  To: Stanislav Sokolenko, mailing list for ConTeXt users

On 7/23/2018 10:17 PM, Stanislav Sokolenko wrote:
> Thanks Hans, that's really helpful!
> 
>> This is not for the fainthearted so here we go
>>
>> \startluacode
>>     function document.MyBoldPub(set,tag)
>>      -- local a = publications.getfield(set,tag,"author")
>>      -- inspect(a)
>>      -- local c = publications.getcasted(set,tag,"author")
>>      -- inspect(c)
>>         if c[1].surnames[1] == "Myname" then
>>             context.bold(function()
>>                 context.btxflush('author')
>>             end )
>>         else
>>             context.btxflush('author')
>>         end
>>     end
>> \stopluacode
> 
> So if I wanted to bold one specific author in a reference of many, I can 
> just loop over publications.getcasted(...), and print the appropriate 
> names, initials, etc...
> 
> That said -- is there any way to call the appropriate authorconversion 
> routine based on the \setupbtx settings? I found the 
> publications.authorhashers method table, which seems to do most of this 
> work, but I'm not sure how to pick the appropriate method and ensure 
> that the correct separators are used.
Best use the setups provided than reinvent the logic.

\startluacode
     function document.CheckMeB(set,tag,aut)
         local c = publications.getcasted(set,tag,"author")
         if c[aut].surnames[1] == "Foo" then
             context("\\bf")
         end
     end
\stopluacode


\startsetups btx:list:author:normalshort
     \fastsetup{btx:list:author:concat}
     \begingroup
 
\ctxluacode{document.CheckMeB("\currentbtxdataset","\currentbtxtag",\number\currentbtxauthorindex)}
     \ifx\currentbtxinitials\empty \else
         \currentbtxinitials
         \btxparameter{separator:initials}
     \fi
     \ifx\currentbtxvons\empty \else
         \currentbtxvons
         \ifx\currentbtxsurnames\empty \else
             \btxparameter{separator:vons}
         \fi
     \fi
     \ifx\currentbtxsurnames\empty \else
         \currentbtxsurnames
         \ifx\currentbtxjuniors\empty \else
             \btxparameter{separator:juniors}
             \currentbtxjuniors
         \fi
     \fi
     \endgroup
     \fastsetup{btx:list:author:others}
\stopsetups

Or something similar (there are several wasy to do this).

Hans

-----------------------------------------------------------------
                                           Hans Hagen | PRAGMA ADE
               Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
        tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Modifying bibliography entries using lua
  2018-07-23 21:32     ` Hans Hagen
@ 2018-07-24 14:41       ` Stanislav Sokolenko
  2018-07-24 16:29         ` Hans Hagen
  0 siblings, 1 reply; 6+ messages in thread
From: Stanislav Sokolenko @ 2018-07-24 14:41 UTC (permalink / raw)
  To: Hans Hagen, mailing list for ConTeXt users


[-- Attachment #1.1: Type: text/plain, Size: 3019 bytes --]

That's perfect, thank you!

On 2018-07-23 06:32 PM, Hans Hagen wrote:
> \startsetups btx:list:author:normalshort
>     \fastsetup{btx:list:author:concat}
>     \begingroup
>
> \ctxluacode{document.CheckMeB("\currentbtxdataset","\currentbtxtag",\number\currentbtxauthorindex)} 
>
>     \ifx\currentbtxinitials\empty \else
>         \currentbtxinitials
>         \btxparameter{separator:initials}
>     \fi
>     \ifx\currentbtxvons\empty \else
>         \currentbtxvons
>         \ifx\currentbtxsurnames\empty \else
>             \btxparameter{separator:vons}
>         \fi
>     \fi
>     \ifx\currentbtxsurnames\empty \else
>         \currentbtxsurnames
>         \ifx\currentbtxjuniors\empty \else
>             \btxparameter{separator:juniors}
>             \currentbtxjuniors
>         \fi
>     \fi
>     \endgroup
>     \fastsetup{btx:list:author:others}
> \stopsetups 

I went with the following little extension to match and make bold 
multiple names:

|\startbuffer[ref]@article{solo, author ={MyLast, MyFirst}, title ={Solo 
work}, journal ={Journal}, year ={2000}, month ={1}, volume 
={1}}@article{co, author ={OtherLast, OtherFirst and MyLast, MyFirst and 
CoLast, CoFirst}, title ={Joint work}, journal ={Journal}, month ={1}, 
year ={2000}, volume 
={1}}\stopbuffer\usebtxdataset[ref][ref.buffer]\setupbtx[dataset=ref]\definebtxrendering[ref][dataset=ref]\setupbtx[default:cite][alternative=authoryear, 
etallimit=1, authorconversion=normalshort]\startluacodeBoldNames 
={{firstnames ="MyFirst", surnames ="MyLast"}, {initials ="C", surnames 
="CoLast"}, }function document.CompareNames(reference, targets)-- Loop 
over targets for _, target in pairs(targets)do -- Loop over fields for 
key, value in pairs(target)do if reference[key]==nil then break end 
full_entry ='' for _, part in ipairs(reference[key])do full_entry 
=full_entry .. ' ' .. part end full_entry =string.sub(full_entry, 2)if 
full_entry ==value then return(true)end end end return(false)end 
function document.BoldNames(set, tag, aut)local c 
=publications.getcasted(set, tag, "author")if 
document.CompareNames(c[aut], BoldNames)then context("\\bf")end end 
\stopluacode\startsetupsbtx:list:author:normalshort 
\fastsetup{btx:list:author:concat}\begingroup\ctxluacode{document.BoldNames("\currentbtxdataset","\currentbtxtag",\number\currentbtxauthorindex)}\ifx\currentbtxinitials\empty\else\currentbtxinitials\btxparameter{separator:initials}\fi\ifx\currentbtxvons\empty\else\currentbtxvons\ifx\currentbtxsurnames\empty\else\btxparameter{separator:vons}\fi\fi\ifx\currentbtxsurnames\empty\else\currentbtxsurnames\ifx\currentbtxjuniors\empty\else\btxparameter{separator:juniors}\currentbtxjuniors\fi\fi\endgroup\fastsetup{btx:list:author:others}\stopsetups\starttextCitations: 
\cite[solo]\cite[co]\startsubject[title=Bibliography]\placelistofpublications[ref][method=dataset]\stopsection\stoptext|


Cheers,

Stan


[-- Attachment #1.2: Type: text/html, Size: 12807 bytes --]

[-- Attachment #2: Type: text/plain, Size: 492 bytes --]

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Modifying bibliography entries using lua
  2018-07-24 14:41       ` Stanislav Sokolenko
@ 2018-07-24 16:29         ` Hans Hagen
  0 siblings, 0 replies; 6+ messages in thread
From: Hans Hagen @ 2018-07-24 16:29 UTC (permalink / raw)
  To: Stanislav Sokolenko, mailing list for ConTeXt users

On 7/24/2018 4:41 PM, Stanislav Sokolenko wrote:

> I went with the following little extension to match and make bold 
> multiple names:
ok.

(this document.CompareNames makes a good candidate for a 'how to improve 
your lua code' tutorial ... maybe something for the ctx meeting)

I didn't check what it does but ... for instance

 > BoldNames = {
 > full_entry = ''

use locals!

Hans



-----------------------------------------------------------------
                                           Hans Hagen | PRAGMA ADE
               Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
        tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2018-07-24 16:29 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-23 16:42 Modifying bibliography entries using lua Stanislav Sokolenko
2018-07-23 18:40 ` Hans Hagen
2018-07-23 20:17   ` Stanislav Sokolenko
2018-07-23 21:32     ` Hans Hagen
2018-07-24 14:41       ` Stanislav Sokolenko
2018-07-24 16:29         ` Hans Hagen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).