citeproc-hs-pandoc-filter (empty) → 0.1
raw patch · 5 files changed
+1191/−0 lines, 5 filesdep +aesondep +basedep +bytestringsetup-changed
Dependencies added: aeson, base, bytestring, citeproc-hs, containers, directory, filepath, mtl, pandoc, pandoc-types, parsec, tagsoup, texmath, utf8-string, yaml
Files
- LICENSE +682/−0
- Setup.lhs +3/−0
- citeproc-hs-pandoc-filter.cabal +38/−0
- src/Text/CSL/Pandoc.hs +416/−0
- src/citeproc-hs-pandoc-filter.hs +52/−0
+ LICENSE view
@@ -0,0 +1,682 @@+Copyright (c) Andrea Rossato++ GNU GENERAL PUBLIC LICENSE+ Version 2, June 1991++ Copyright (C) 1989, 1991 Free Software Foundation, Inc.+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA+ Everyone is permitted to copy and distribute verbatim copies+ of this license document, but changing it is not allowed.++ Preamble++ The licenses for most software are designed to take away your+freedom to share and change it. By contrast, the GNU General Public+License is intended to guarantee your freedom to share and change free+software--to make sure the software is free for all its users. This+General Public License applies to most of the Free Software+Foundation's software and to any other program whose authors commit to+using it. (Some other Free Software Foundation software is covered by+the GNU Library General Public License instead.) You can apply it to+your programs, too.++ When we speak of free software, we are referring to freedom, not+price. Our General Public Licenses are designed to make sure that you+have the freedom to distribute copies of free software (and charge for+this service if you wish), that you receive source code or can get it+if you want it, that you can change the software or use pieces of it+in new free programs; and that you know you can do these things.++ To protect your rights, we need to make restrictions that forbid+anyone to deny you these rights or to ask you to surrender the rights.+These restrictions translate to certain responsibilities for you if you+distribute copies of the software, or if you modify it.++ For example, if you distribute copies of such a program, whether+gratis or for a fee, you must give the recipients all the rights that+you have. You must make sure that they, too, receive or can get the+source code. And you must show them these terms so they know their+rights.++ We protect your rights with two steps: (1) copyright the software, and+(2) offer you this license which gives you legal permission to copy,+distribute and/or modify the software.++ Also, for each author's protection and ours, we want to make certain+that everyone understands that there is no warranty for this free+software. If the software is modified by someone else and passed on, we+want its recipients to know that what they have is not the original, so+that any problems introduced by others will not reflect on the original+authors' reputations.++ Finally, any free program is threatened constantly by software+patents. We wish to avoid the danger that redistributors of a free+program will individually obtain patent licenses, in effect making the+program proprietary. To prevent this, we have made it clear that any+patent must be licensed for everyone's free use or not licensed at all.++ The precise terms and conditions for copying, distribution and+modification follow.++ GNU GENERAL PUBLIC LICENSE+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION++ 0. This License applies to any program or other work which contains+a notice placed by the copyright holder saying it may be distributed+under the terms of this General Public License. The "Program", below,+refers to any such program or work, and a "work based on the Program"+means either the Program or any derivative work under copyright law:+that is to say, a work containing the Program or a portion of it,+either verbatim or with modifications and/or translated into another+language. (Hereinafter, translation is included without limitation in+the term "modification".) Each licensee is addressed as "you".++Activities other than copying, distribution and modification are not+covered by this License; they are outside its scope. The act of+running the Program is not restricted, and the output from the Program+is covered only if its contents constitute a work based on the+Program (independent of having been made by running the Program).+Whether that is true depends on what the Program does.++ 1. You may copy and distribute verbatim copies of the Program's+source code as you receive it, in any medium, provided that you+conspicuously and appropriately publish on each copy an appropriate+copyright notice and disclaimer of warranty; keep intact all the+notices that refer to this License and to the absence of any warranty;+and give any other recipients of the Program a copy of this License+along with the Program.++You may charge a fee for the physical act of transferring a copy, and+you may at your option offer warranty protection in exchange for a fee.++ 2. You may modify your copy or copies of the Program or any portion+of it, thus forming a work based on the Program, and copy and+distribute such modifications or work under the terms of Section 1+above, provided that you also meet all of these conditions:++ a) You must cause the modified files to carry prominent notices+ stating that you changed the files and the date of any change.++ b) You must cause any work that you distribute or publish, that in+ whole or in part contains or is derived from the Program or any+ part thereof, to be licensed as a whole at no charge to all third+ parties under the terms of this License.++ c) If the modified program normally reads commands interactively+ when run, you must cause it, when started running for such+ interactive use in the most ordinary way, to print or display an+ announcement including an appropriate copyright notice and a+ notice that there is no warranty (or else, saying that you provide+ a warranty) and that users may redistribute the program under+ these conditions, and telling the user how to view a copy of this+ License. (Exception: if the Program itself is interactive but+ does not normally print such an announcement, your work based on+ the Program is not required to print an announcement.)++These requirements apply to the modified work as a whole. If+identifiable sections of that work are not derived from the Program,+and can be reasonably considered independent and separate works in+themselves, then this License, and its terms, do not apply to those+sections when you distribute them as separate works. But when you+distribute the same sections as part of a whole which is a work based+on the Program, the distribution of the whole must be on the terms of+this License, whose permissions for other licensees extend to the+entire whole, and thus to each and every part regardless of who wrote it.++Thus, it is not the intent of this section to claim rights or contest+your rights to work written entirely by you; rather, the intent is to+exercise the right to control the distribution of derivative or+collective works based on the Program.++In addition, mere aggregation of another work not based on the Program+with the Program (or with a work based on the Program) on a volume of+a storage or distribution medium does not bring the other work under+the scope of this License.++ 3. You may copy and distribute the Program (or a work based on it,+under Section 2) in object code or executable form under the terms of+Sections 1 and 2 above provided that you also do one of the following:++ a) Accompany it with the complete corresponding machine-readable+ source code, which must be distributed under the terms of Sections+ 1 and 2 above on a medium customarily used for software interchange; or,++ b) Accompany it with a written offer, valid for at least three+ years, to give any third party, for a charge no more than your+ cost of physically performing source distribution, a complete+ machine-readable copy of the corresponding source code, to be+ distributed under the terms of Sections 1 and 2 above on a medium+ customarily used for software interchange; or,++ c) Accompany it with the information you received as to the offer+ to distribute corresponding source code. (This alternative is+ allowed only for noncommercial distribution and only if you+ received the program in object code or executable form with such+ an offer, in accord with Subsection b above.)++The source code for a work means the preferred form of the work for+making modifications to it. For an executable work, complete source+code means all the source code for all modules it contains, plus any+associated interface definition files, plus the scripts used to+control compilation and installation of the executable. However, as a+special exception, the source code distributed need not include+anything that is normally distributed (in either source or binary+form) with the major components (compiler, kernel, and so on) of the+operating system on which the executable runs, unless that component+itself accompanies the executable.++If distribution of executable or object code is made by offering+access to copy from a designated place, then offering equivalent+access to copy the source code from the same place counts as+distribution of the source code, even though third parties are not+compelled to copy the source along with the object code.++ 4. You may not copy, modify, sublicense, or distribute the Program+except as expressly provided under this License. Any attempt+otherwise to copy, modify, sublicense or distribute the Program is+void, and will automatically terminate your rights under this License.+However, parties who have received copies, or rights, from you under+this License will not have their licenses terminated so long as such+parties remain in full compliance.++ 5. You are not required to accept this License, since you have not+signed it. However, nothing else grants you permission to modify or+distribute the Program or its derivative works. These actions are+prohibited by law if you do not accept this License. Therefore, by+modifying or distributing the Program (or any work based on the+Program), you indicate your acceptance of this License to do so, and+all its terms and conditions for copying, distributing or modifying+the Program or works based on it.++ 6. Each time you redistribute the Program (or any work based on the+Program), the recipient automatically receives a license from the+original licensor to copy, distribute or modify the Program subject to+these terms and conditions. You may not impose any further+restrictions on the recipients' exercise of the rights granted herein.+You are not responsible for enforcing compliance by third parties to+this License.++ 7. If, as a consequence of a court judgment or allegation of patent+infringement or for any other reason (not limited to patent issues),+conditions are imposed on you (whether by court order, agreement or+otherwise) that contradict the conditions of this License, they do not+excuse you from the conditions of this License. If you cannot+distribute so as to satisfy simultaneously your obligations under this+License and any other pertinent obligations, then as a consequence you+may not distribute the Program at all. For example, if a patent+license would not permit royalty-free redistribution of the Program by+all those who receive copies directly or indirectly through you, then+the only way you could satisfy both it and this License would be to+refrain entirely from distribution of the Program.++If any portion of this section is held invalid or unenforceable under+any particular circumstance, the balance of the section is intended to+apply and the section as a whole is intended to apply in other+circumstances.++It is not the purpose of this section to induce you to infringe any+patents or other property right claims or to contest validity of any+such claims; this section has the sole purpose of protecting the+integrity of the free software distribution system, which is+implemented by public license practices. Many people have made+generous contributions to the wide range of software distributed+through that system in reliance on consistent application of that+system; it is up to the author/donor to decide if he or she is willing+to distribute software through any other system and a licensee cannot+impose that choice.++This section is intended to make thoroughly clear what is believed to+be a consequence of the rest of this License.++ 8. If the distribution and/or use of the Program is restricted in+certain countries either by patents or by copyrighted interfaces, the+original copyright holder who places the Program under this License+may add an explicit geographical distribution limitation excluding+those countries, so that distribution is permitted only in or among+countries not thus excluded. In such case, this License incorporates+the limitation as if written in the body of this License.++ 9. The Free Software Foundation may publish revised and/or new versions+of the General Public License from time to time. Such new versions will+be similar in spirit to the present version, but may differ in detail to+address new problems or concerns.++Each version is given a distinguishing version number. If the Program+specifies a version number of this License which applies to it and "any+later version", you have the option of following the terms and conditions+either of that version or of any later version published by the Free+Software Foundation. If the Program does not specify a version number of+this License, you may choose any version ever published by the Free Software+Foundation.++ 10. If you wish to incorporate parts of the Program into other free+programs whose distribution conditions are different, write to the author+to ask for permission. For software which is copyrighted by the Free+Software Foundation, write to the Free Software Foundation; we sometimes+make exceptions for this. Our decision will be guided by the two goals+of preserving the free status of all derivatives of our free software and+of promoting the sharing and reuse of software generally.++ NO WARRANTY++ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,+REPAIR OR CORRECTION.++ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE+POSSIBILITY OF SUCH DAMAGES.++ END OF TERMS AND CONDITIONS++ How to Apply These Terms to Your New Programs++ If you develop a new program, and you want it to be of the greatest+possible use to the public, the best way to achieve this is to make it+free software which everyone can redistribute and change under these terms.++ To do so, attach the following notices to the program. It is safest+to attach them to the start of each source file to most effectively+convey the exclusion of warranty; and each file should have at least+the "copyright" line and a pointer to where the full notice is found.++ <one line to give the program's name and a brief idea of what it does.>+ Copyright (C) <year> <name of author>++ This program is free software; you can redistribute it and/or modify+ it under the terms of the GNU General Public License as published by+ the Free Software Foundation; either version 2 of the License, or+ (at your option) any later version.++ This program is distributed in the hope that it will be useful,+ but WITHOUT ANY WARRANTY; without even the implied warranty of+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ GNU General Public License for more details.++ You should have received a copy of the GNU General Public License+ along with this program; if not, write to the Free Software+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA+++Also add information on how to contact you by electronic and paper mail.++If the program is interactive, make it output a short notice like this+when it starts in an interactive mode:++ Gnomovision version 69, Copyright (C) year name of author+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.+ This is free software, and you are welcome to redistribute it+ under certain conditions; type `show c' for details.++The hypothetical commands `show w' and `show c' should show the appropriate+parts of the General Public License. Of course, the commands you use may+be called something other than `show w' and `show c'; they could even be+mouse-clicks or menu items--whatever suits your program.++You should also get your employer (if you work as a programmer) or your+school, if any, to sign a "copyright disclaimer" for the program, if+necessary. Here is a sample; alter the names:++ Yoyodyne, Inc., hereby disclaims all copyright interest in the program+ `Gnomovision' (which makes passes at compilers) written by James Hacker.++ <signature of Ty Coon>, 1 April 1989+ Ty Coon, President of Vice++This General Public License does not permit incorporating your program into+proprietary programs. If your program is a subroutine library, you may+consider it more useful to permit linking proprietary applications with the+library. If this is what you want to do, use the GNU Library General+Public License instead of this License.+ GNU GENERAL PUBLIC LICENSE+ Version 2, June 1991++ Copyright (C) 1989, 1991 Free Software Foundation, Inc.+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA+ Everyone is permitted to copy and distribute verbatim copies+ of this license document, but changing it is not allowed.++ Preamble++ The licenses for most software are designed to take away your+freedom to share and change it. By contrast, the GNU General Public+License is intended to guarantee your freedom to share and change free+software--to make sure the software is free for all its users. This+General Public License applies to most of the Free Software+Foundation's software and to any other program whose authors commit to+using it. (Some other Free Software Foundation software is covered by+the GNU Library General Public License instead.) You can apply it to+your programs, too.++ When we speak of free software, we are referring to freedom, not+price. Our General Public Licenses are designed to make sure that you+have the freedom to distribute copies of free software (and charge for+this service if you wish), that you receive source code or can get it+if you want it, that you can change the software or use pieces of it+in new free programs; and that you know you can do these things.++ To protect your rights, we need to make restrictions that forbid+anyone to deny you these rights or to ask you to surrender the rights.+These restrictions translate to certain responsibilities for you if you+distribute copies of the software, or if you modify it.++ For example, if you distribute copies of such a program, whether+gratis or for a fee, you must give the recipients all the rights that+you have. You must make sure that they, too, receive or can get the+source code. And you must show them these terms so they know their+rights.++ We protect your rights with two steps: (1) copyright the software, and+(2) offer you this license which gives you legal permission to copy,+distribute and/or modify the software.++ Also, for each author's protection and ours, we want to make certain+that everyone understands that there is no warranty for this free+software. If the software is modified by someone else and passed on, we+want its recipients to know that what they have is not the original, so+that any problems introduced by others will not reflect on the original+authors' reputations.++ Finally, any free program is threatened constantly by software+patents. We wish to avoid the danger that redistributors of a free+program will individually obtain patent licenses, in effect making the+program proprietary. To prevent this, we have made it clear that any+patent must be licensed for everyone's free use or not licensed at all.++ The precise terms and conditions for copying, distribution and+modification follow.++ GNU GENERAL PUBLIC LICENSE+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION++ 0. This License applies to any program or other work which contains+a notice placed by the copyright holder saying it may be distributed+under the terms of this General Public License. The "Program", below,+refers to any such program or work, and a "work based on the Program"+means either the Program or any derivative work under copyright law:+that is to say, a work containing the Program or a portion of it,+either verbatim or with modifications and/or translated into another+language. (Hereinafter, translation is included without limitation in+the term "modification".) Each licensee is addressed as "you".++Activities other than copying, distribution and modification are not+covered by this License; they are outside its scope. The act of+running the Program is not restricted, and the output from the Program+is covered only if its contents constitute a work based on the+Program (independent of having been made by running the Program).+Whether that is true depends on what the Program does.++ 1. You may copy and distribute verbatim copies of the Program's+source code as you receive it, in any medium, provided that you+conspicuously and appropriately publish on each copy an appropriate+copyright notice and disclaimer of warranty; keep intact all the+notices that refer to this License and to the absence of any warranty;+and give any other recipients of the Program a copy of this License+along with the Program.++You may charge a fee for the physical act of transferring a copy, and+you may at your option offer warranty protection in exchange for a fee.++ 2. You may modify your copy or copies of the Program or any portion+of it, thus forming a work based on the Program, and copy and+distribute such modifications or work under the terms of Section 1+above, provided that you also meet all of these conditions:++ a) You must cause the modified files to carry prominent notices+ stating that you changed the files and the date of any change.++ b) You must cause any work that you distribute or publish, that in+ whole or in part contains or is derived from the Program or any+ part thereof, to be licensed as a whole at no charge to all third+ parties under the terms of this License.++ c) If the modified program normally reads commands interactively+ when run, you must cause it, when started running for such+ interactive use in the most ordinary way, to print or display an+ announcement including an appropriate copyright notice and a+ notice that there is no warranty (or else, saying that you provide+ a warranty) and that users may redistribute the program under+ these conditions, and telling the user how to view a copy of this+ License. (Exception: if the Program itself is interactive but+ does not normally print such an announcement, your work based on+ the Program is not required to print an announcement.)++These requirements apply to the modified work as a whole. If+identifiable sections of that work are not derived from the Program,+and can be reasonably considered independent and separate works in+themselves, then this License, and its terms, do not apply to those+sections when you distribute them as separate works. But when you+distribute the same sections as part of a whole which is a work based+on the Program, the distribution of the whole must be on the terms of+this License, whose permissions for other licensees extend to the+entire whole, and thus to each and every part regardless of who wrote it.++Thus, it is not the intent of this section to claim rights or contest+your rights to work written entirely by you; rather, the intent is to+exercise the right to control the distribution of derivative or+collective works based on the Program.++In addition, mere aggregation of another work not based on the Program+with the Program (or with a work based on the Program) on a volume of+a storage or distribution medium does not bring the other work under+the scope of this License.++ 3. You may copy and distribute the Program (or a work based on it,+under Section 2) in object code or executable form under the terms of+Sections 1 and 2 above provided that you also do one of the following:++ a) Accompany it with the complete corresponding machine-readable+ source code, which must be distributed under the terms of Sections+ 1 and 2 above on a medium customarily used for software interchange; or,++ b) Accompany it with a written offer, valid for at least three+ years, to give any third party, for a charge no more than your+ cost of physically performing source distribution, a complete+ machine-readable copy of the corresponding source code, to be+ distributed under the terms of Sections 1 and 2 above on a medium+ customarily used for software interchange; or,++ c) Accompany it with the information you received as to the offer+ to distribute corresponding source code. (This alternative is+ allowed only for noncommercial distribution and only if you+ received the program in object code or executable form with such+ an offer, in accord with Subsection b above.)++The source code for a work means the preferred form of the work for+making modifications to it. For an executable work, complete source+code means all the source code for all modules it contains, plus any+associated interface definition files, plus the scripts used to+control compilation and installation of the executable. However, as a+special exception, the source code distributed need not include+anything that is normally distributed (in either source or binary+form) with the major components (compiler, kernel, and so on) of the+operating system on which the executable runs, unless that component+itself accompanies the executable.++If distribution of executable or object code is made by offering+access to copy from a designated place, then offering equivalent+access to copy the source code from the same place counts as+distribution of the source code, even though third parties are not+compelled to copy the source along with the object code.++ 4. You may not copy, modify, sublicense, or distribute the Program+except as expressly provided under this License. Any attempt+otherwise to copy, modify, sublicense or distribute the Program is+void, and will automatically terminate your rights under this License.+However, parties who have received copies, or rights, from you under+this License will not have their licenses terminated so long as such+parties remain in full compliance.++ 5. You are not required to accept this License, since you have not+signed it. However, nothing else grants you permission to modify or+distribute the Program or its derivative works. These actions are+prohibited by law if you do not accept this License. Therefore, by+modifying or distributing the Program (or any work based on the+Program), you indicate your acceptance of this License to do so, and+all its terms and conditions for copying, distributing or modifying+the Program or works based on it.++ 6. Each time you redistribute the Program (or any work based on the+Program), the recipient automatically receives a license from the+original licensor to copy, distribute or modify the Program subject to+these terms and conditions. You may not impose any further+restrictions on the recipients' exercise of the rights granted herein.+You are not responsible for enforcing compliance by third parties to+this License.++ 7. If, as a consequence of a court judgment or allegation of patent+infringement or for any other reason (not limited to patent issues),+conditions are imposed on you (whether by court order, agreement or+otherwise) that contradict the conditions of this License, they do not+excuse you from the conditions of this License. If you cannot+distribute so as to satisfy simultaneously your obligations under this+License and any other pertinent obligations, then as a consequence you+may not distribute the Program at all. For example, if a patent+license would not permit royalty-free redistribution of the Program by+all those who receive copies directly or indirectly through you, then+the only way you could satisfy both it and this License would be to+refrain entirely from distribution of the Program.++If any portion of this section is held invalid or unenforceable under+any particular circumstance, the balance of the section is intended to+apply and the section as a whole is intended to apply in other+circumstances.++It is not the purpose of this section to induce you to infringe any+patents or other property right claims or to contest validity of any+such claims; this section has the sole purpose of protecting the+integrity of the free software distribution system, which is+implemented by public license practices. Many people have made+generous contributions to the wide range of software distributed+through that system in reliance on consistent application of that+system; it is up to the author/donor to decide if he or she is willing+to distribute software through any other system and a licensee cannot+impose that choice.++This section is intended to make thoroughly clear what is believed to+be a consequence of the rest of this License.++ 8. If the distribution and/or use of the Program is restricted in+certain countries either by patents or by copyrighted interfaces, the+original copyright holder who places the Program under this License+may add an explicit geographical distribution limitation excluding+those countries, so that distribution is permitted only in or among+countries not thus excluded. In such case, this License incorporates+the limitation as if written in the body of this License.++ 9. The Free Software Foundation may publish revised and/or new versions+of the General Public License from time to time. Such new versions will+be similar in spirit to the present version, but may differ in detail to+address new problems or concerns.++Each version is given a distinguishing version number. If the Program+specifies a version number of this License which applies to it and "any+later version", you have the option of following the terms and conditions+either of that version or of any later version published by the Free+Software Foundation. If the Program does not specify a version number of+this License, you may choose any version ever published by the Free Software+Foundation.++ 10. If you wish to incorporate parts of the Program into other free+programs whose distribution conditions are different, write to the author+to ask for permission. For software which is copyrighted by the Free+Software Foundation, write to the Free Software Foundation; we sometimes+make exceptions for this. Our decision will be guided by the two goals+of preserving the free status of all derivatives of our free software and+of promoting the sharing and reuse of software generally.++ NO WARRANTY++ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,+REPAIR OR CORRECTION.++ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE+POSSIBILITY OF SUCH DAMAGES.++ END OF TERMS AND CONDITIONS++ How to Apply These Terms to Your New Programs++ If you develop a new program, and you want it to be of the greatest+possible use to the public, the best way to achieve this is to make it+free software which everyone can redistribute and change under these terms.++ To do so, attach the following notices to the program. It is safest+to attach them to the start of each source file to most effectively+convey the exclusion of warranty; and each file should have at least+the "copyright" line and a pointer to where the full notice is found.++ <one line to give the program's name and a brief idea of what it does.>+ Copyright (C) <year> <name of author>++ This program is free software; you can redistribute it and/or modify+ it under the terms of the GNU General Public License as published by+ the Free Software Foundation; either version 2 of the License, or+ (at your option) any later version.++ This program is distributed in the hope that it will be useful,+ but WITHOUT ANY WARRANTY; without even the implied warranty of+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ GNU General Public License for more details.++ You should have received a copy of the GNU General Public License+ along with this program; if not, write to the Free Software+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA+++Also add information on how to contact you by electronic and paper mail.++If the program is interactive, make it output a short notice like this+when it starts in an interactive mode:++ Gnomovision version 69, Copyright (C) year name of author+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.+ This is free software, and you are welcome to redistribute it+ under certain conditions; type `show c' for details.++The hypothetical commands `show w' and `show c' should show the appropriate+parts of the General Public License. Of course, the commands you use may+be called something other than `show w' and `show c'; they could even be+mouse-clicks or menu items--whatever suits your program.++You should also get your employer (if you work as a programmer) or your+school, if any, to sign a "copyright disclaimer" for the program, if+necessary. Here is a sample; alter the names:++ Yoyodyne, Inc., hereby disclaims all copyright interest in the program+ `Gnomovision' (which makes passes at compilers) written by James Hacker.++ <signature of Ty Coon>, 1 April 1989+ Ty Coon, President of Vice++This General Public License does not permit incorporating your program into+proprietary programs. If your program is a subroutine library, you may+consider it more useful to permit linking proprietary applications with the+library. If this is what you want to do, use the GNU Library General+Public License instead of this License.
+ Setup.lhs view
@@ -0,0 +1,3 @@+#!/usr/bin/env runhaskell+> import Distribution.Simple+> main = defaultMain
+ citeproc-hs-pandoc-filter.cabal view
@@ -0,0 +1,38 @@+name: citeproc-hs-pandoc-filter+version: 0.1+homepage: http://istitutocolli.org/repos/citeproc-hs-pandoc-filter/+synopsis: A Pandoc filter for processing bibliographic references with citeproc-hs++description: citeproc-hs is a library for rendering+ bibliographic reference citations into a variety+ of styles using a macro language called Citation+ Style Language (CSL). More details on CSL can be+ found here:+ <http://citationstyles.org/>.+ .+ citeproc-hs-pandoc-filter is a replacement of+ citeproc-pandoc which uses citeproc-hs for+ processing citations.++category: Text+license: GPL-2+license-file: LICENSE+author: Andrea Rossato+maintainer: andrea.rossato@unitn.it+bug-reports: http://code.google.com/p/citeproc-hs/issues/list+cabal-version: >= 1.10+build-type: Simple++executable citeproc-hs+ main-is: citeproc-hs-pandoc-filter.hs+ default-extensions: CPP+ hs-source-dirs: src+ ghc-options: -funbox-strict-fields -Wall+ ghc-prof-options: -prof -auto-all++ build-depends: base >= 4 && < 5, containers, bytestring, utf8-string, mtl,+ parsec, filepath, directory, citeproc-hs >= 0.3.10,+ pandoc-types >= 1.12.3, aeson, texmath >= 0.6.4,+ yaml >= 0.8, pandoc >= 1.12.0.2, tagsoup++ default-language: Haskell98
+ src/Text/CSL/Pandoc.hs view
@@ -0,0 +1,416 @@+{-# LANGUAGE PatternGuards, OverloadedStrings, FlexibleInstances,+ ScopedTypeVariables, CPP #-}+-----------------------------------------------------------------------------+-- |+-- Module : Text.CSL.Pandoc+-- Copyright : (c) Andrea Rossato+-- License : GPL2+--+-- Maintainer : Andrea Rossato <andrea.rossato@unitn.it>+-- Stability : unstable+-- Portability : unportable+--+-- A pandoc filter for citeproc-hs+--+-----------------------------------------------------------------------------++module Text.CSL.Pandoc+ ( processCites+ , processCites'+ ) where++import Control.Applicative ((<|>))+import Control.Monad+import Control.Monad.State+import Data.Aeson+import Data.ByteString.Lazy.UTF8 ( toString )+import Data.Char ( isDigit, isPunctuation, isSpace )+import Data.List ( (\\) )+import qualified Data.Map as M+import Data.Monoid (mempty)++import System.FilePath+import System.Directory (doesFileExist)+import Text.HTML.TagSoup.Entity (lookupEntity)+import Text.Parsec hiding (State, (<|>))++import Text.Pandoc+import Text.Pandoc.Walk+import Text.Pandoc.Builder (Inlines, cite)+import Text.Pandoc.Shared (stringify)++import Text.CSL.Reference hiding (processCites, Value)+import Text.CSL.Input.Bibutils (readBiblioFile)+import Text.CSL.Input.Json (readJsonInputString, readJsonAbbrevFile)+import Text.CSL.Proc+import Text.CSL.Output.Pandoc (renderPandoc, renderPandoc', isPunctuationInQuote)+import Text.CSL.Parser+import Text.CSL.Output.Pandoc ( headInline, tailFirstInlineStr, initInline,+ toCapital )+import Text.CSL.Style hiding (Cite(..), Citation(..), query)+import qualified Text.CSL.Style as CSL++-- | Process a 'Pandoc' document by adding citations formatted+-- according to a CSL style. Add a bibliography (if one is called+-- for) at the end of the document.+processCites :: Style -> [Reference] -> Pandoc -> Pandoc+processCites style refs (Pandoc m b1) =+ let Pandoc _ b2 = evalState (walkM setHashes $ Pandoc m b1) 1++ (nts,grps) = if styleClass style == "note"+ then let cits = query getCite b2+ ncits = map (query getCite) $ query getNote b2+ needNt = cits \\ concat ncits+ in (,) needNt $ getNoteCitations needNt b2+ else (,) [] $ query getCitation b2+ nocite = query getCitation m+ result = citeproc procOpts style refs (setNearNote style $+ map (map toCslCite) $ grps ++ nocite)+ cits_map = M.fromList $ zip grps (citations result)+ biblioList = map (renderPandoc' style) (bibliography result)+ Pandoc _ b3 = bottomUp (mvPunct style) . bottomUp (processCite style cits_map)+ $ Pandoc m b2+ (bs, lastb) = case reverse b3 of+ (Header lev (id',classes,kvs) ys) : xs ->+ (reverse xs, [Header lev (id',classes',kvs) ys])+ where classes' = "unnumbered" :+ [c | c <- classes, c /= "unnumbered"]+ _ -> (b3, [])++ pandocFinal = Pandoc m $ bottomUp (concatMap removeNocaseSpans) $ bs +++ if lookupMeta "suppress-bibliography" m == Just (MetaBool True)+ then []+ else [Div ("",["references"],[]) (lastb ++ biblioList)]+ in if lookupMeta "suppress-note-generation" m == Just (MetaBool True)+ then pandocFinal+ else generateNotes nts pandocFinal++removeNocaseSpans :: Inline -> [Inline]+removeNocaseSpans (Span ("",["nocase"],[]) xs) = xs+removeNocaseSpans x = [x]++-- | Process a 'Pandoc' document by adding citations formatted+-- according to a CSL style. The style filename is derived from+-- the `csl` field of the metadata, and the references are taken+-- from the `references` field or read from a file in the `bibliography`+-- field.+processCites' :: Pandoc -> IO Pandoc+processCites' (Pandoc meta blocks) = do+ let convertRefs = readJsonInputString . toString . encode . metaValueToJSON+ inlineRefs = convertRefs $ maybe (MetaList []) id $ lookupMeta "references" meta+ bibRefs <- getBibRefs $ maybe (MetaList []) id+ $ lookupMeta "bibliography" meta+ let refs = inlineRefs ++ bibRefs+ cslfile = (lookupMeta "csl" meta <|> lookupMeta "citation-style" meta)+ >>= toPath+ csl <- case cslfile of+ Just f | not (null f) -> readCSLFile f+ _ -> error "no CSL file"+ let cslAbbrevFile = lookupMeta "citation-abbreviations" meta >>= toPath+ abbrevs <- maybe (return []) readJsonAbbrevFile cslAbbrevFile+ let csl' = csl{ styleAbbrevs = abbrevs }+ return $ processCites csl' refs $ Pandoc meta blocks++toPath :: MetaValue -> Maybe String+toPath (MetaString s) = Just s+toPath (MetaInlines ils) = Just $ stringify ils+toPath _ = Nothing++getBibRefs :: MetaValue -> IO [Reference]+getBibRefs (MetaList xs) = concat `fmap` mapM getBibRefs xs+getBibRefs (MetaInlines xs) = getBibRefs (MetaString $ stringify xs)+getBibRefs (MetaString s) = do+ path <- findFile ["."] s >>= maybe (error $ "Could not find " ++ s) return+ map unescapeRefId `fmap` readBiblioFile path+getBibRefs _ = return []++-- unescape reference ids, which may contain XML entities, so+-- that we can do lookups with regular string equality+unescapeRefId :: Reference -> Reference+unescapeRefId ref = ref{ refId = decodeEntities (refId ref) }++decodeEntities :: String -> String+decodeEntities [] = []+decodeEntities ('&':xs) =+ let (ys,zs) = break (==';') xs+ in case zs of+ ';':ws -> case lookupEntity ('&':ys ++ ";") of+#if MIN_VERSION_tagsoup(0,13,0)+ Just s -> s ++ decodeEntities ws+#else+ Just c -> [c] ++ decodeEntities ws+#endif+ Nothing -> '&' : decodeEntities xs+ _ -> '&' : decodeEntities xs+decodeEntities (x:xs) = x : decodeEntities xs++-- | Substitute 'Cite' elements with formatted citations.+processCite :: Style -> M.Map [Citation] [FormattedOutput] -> [Inline] -> [Inline]+processCite s cs ((Cite t _):is) =+ case M.lookup t cs of+ Just (x:xs)+ | isTextualCitation t && not (null xs) ->+ renderPandoc s [x] ++ [Space, Cite t (renderPandoc s xs)] ++ processCite s cs is+ | otherwise -> Cite t (renderPandoc s (x:xs)) : processCite s cs is+ _ -> [Strong [Str "???"]] ++ processCite s cs is -- TODO raise error instead?+processCite _ _ x = x++isNote :: Inline -> Bool+isNote (Note _) = True+isNote (Cite _ [Note _]) = True+isNote _ = False++mvPunctInsideQuote :: Inline -> Inline -> [Inline]+mvPunctInsideQuote (Quoted qt ils) (Str s) | s `elem` [".", ","] =+ [Quoted qt (init ils ++ (mvPunctInsideQuote (last ils) (Str s)))]+mvPunctInsideQuote il il' = [il, il']++mvPunct :: Style -> [Inline] -> [Inline]+mvPunct _ (Space : Space : xs) = Space : xs+mvPunct _ (Space : x : ys) | isNote x, startWithPunct ys =+ Str (headInline ys) : x : tailFirstInlineStr ys+mvPunct _ (Cite cs ils : ys) |+ length ils > 1+ , isNote (last ils)+ , startWithPunct ys+ = Cite cs (init ils ++ [Str (headInline ys) | not (endWithPunct (init ils))]+ ++ [last ils]) : tailFirstInlineStr ys+mvPunct sty (q@(Quoted _ _) : w@(Str _) : x : ys)+ | isNote x, isPunctuationInQuote sty =+ mvPunctInsideQuote q w ++ (x : ys)+mvPunct _ (Space : x : ys) | isNote x = x : ys+mvPunct _ (Space : x@(Cite _ (Superscript _ : _)) : ys) = x : ys+mvPunct _ xs = xs++endWithPunct :: [Inline] -> Bool+endWithPunct [] = True+endWithPunct xs@(_:_) = case reverse (stringify xs) of+ [] -> True+ -- covers .), .", etc.:+ (d:c:_) | isPunctuation d+ && isEndPunct c -> True+ (c:_) | isEndPunct c -> True+ | otherwise -> False+ where isEndPunct c = c `elem` ".,;:!?"++startWithPunct :: [Inline] -> Bool+startWithPunct = and . map (`elem` ".,;:!?") . headInline++isTextualCitation :: [Citation] -> Bool+isTextualCitation (c:_) = citationMode c == AuthorInText+isTextualCitation _ = False++-- | Retrieve all citations from a 'Pandoc' docuument. To be used with+-- 'query'.+getCitation :: Inline -> [[Citation]]+getCitation i | Cite t _ <- i = [t]+ | otherwise = []++getCite :: Inline -> [Inline]+getCite i | Cite _ _ <- i = [i]+ | otherwise = []++getNote :: Inline -> [Inline]+getNote i | Note _ <- i = [i]+ | otherwise = []++getNoteCitations :: [Inline] -> [Block] -> [[Citation]]+getNoteCitations needNote+ = let mvCite i = if i `elem` needNote then Note [Para [i]] else i+ setNote = bottomUp mvCite+ getCits = concat . flip (zipWith $ setCiteNoteNum) [1..] .+ map (query getCite) . query getNote . setNote+ in query getCitation . getCits++setCiteNoteNum :: [Inline] -> Int -> [Inline]+setCiteNoteNum ((Cite cs o):xs) n = Cite (setCitationNoteNum n cs) o : setCiteNoteNum xs n+setCiteNoteNum _ _ = []++setCitationNoteNum :: Int -> [Citation] -> [Citation]+setCitationNoteNum i = map $ \c -> c { citationNoteNum = i}++setHashes :: Inline -> State Int Inline+setHashes i | Cite t ils <- i = do t' <- mapM setHash t+ return $ Cite t' ils+ | otherwise = return i++setHash :: Citation -> State Int Citation+setHash c = do+ ident <- get+ put $ ident + 1+ return c{ citationHash = ident }++toCslCite :: Citation -> CSL.Cite+toCslCite c+ = let (l,l', s) = locatorWords $ citationSuffix c+ (la,lo) = parseLocator (l ++ " " ++ l')+ s' = case (la,lo,s) of+ -- treat a bare locator as if it begins with space+ -- so @item1 [blah] is like [@item1, blah]+ ("","",(x:_))+ | not (isPunct x) -> Space : s+ _ -> s+ isPunct (Str (x:_)) = isPunctuation x+ isPunct _ = False+ citMode = case citationMode c of+ AuthorInText -> (True, False)+ SuppressAuthor -> (False,True )+ NormalCitation -> (False,False)+ in emptyCite { CSL.citeId = citationId c+ , CSL.citePrefix = PandocText $ citationPrefix c+ , CSL.citeSuffix = PandocText $ s'+ , CSL.citeLabel = la+ , CSL.citeLocator = lo+ , CSL.citeNoteNumber = show $ citationNoteNum c+ , CSL.authorInText = fst citMode+ , CSL.suppressAuthor = snd citMode+ , CSL.citeHash = citationHash c+ }++locatorWords :: [Inline] -> (String, String, [Inline])+locatorWords inp =+ case parse pLocatorWords "suffix" $+ splitStrWhen (\c -> isPunctuation c || isSpace c) inp of+ Right r -> r+ Left _ -> ("","",inp)++pLocatorWords :: Parsec [Inline] st (String, String, [Inline])+pLocatorWords = do+ (la,lo) <- pLocator+ s <- getInput -- rest is suffix+ return (la, lo, s)++pMatch :: (Inline -> Bool) -> Parsec [Inline] st Inline+pMatch condition = try $ do+ t <- anyToken+ guard $ condition t+ return t++pSpace :: Parsec [Inline] st Inline+pSpace = pMatch (\t -> t == Space || t == Str "\160")++pLocator :: Parsec [Inline] st (String, String)+pLocator = try $ do+ optional $ pMatch (== Str ",")+ optional pSpace+ rawLoc <- many+ (notFollowedBy pSpace >> notFollowedBy (pWordWithDigits True) >> anyToken)+ la <- case stringify rawLoc of+ "" -> lookAhead (optional pSpace >> pDigit) >> return "page"+ s -> return s+ g <- pWordWithDigits True+ gs <- many (pWordWithDigits False)+ let lo = concat (g:gs)+ return (la, lo)++pWordWithDigits :: Bool -> Parsec [Inline] st String+pWordWithDigits isfirst = try $ do+ punct <- if isfirst+ then return ""+ else stringify `fmap` pLocatorPunct+ sp <- option "" (pSpace >> return " ")+ r <- many1 (notFollowedBy pSpace >> notFollowedBy pLocatorPunct >> anyToken)+ let s = stringify r+ guard $ any isDigit s || all (`elem` "IVXLCM") s+ return $ punct ++ sp ++ s++pDigit :: Parsec [Inline] st ()+pDigit = do+ t <- anyToken+ case t of+ Str (d:_) | isDigit d -> return ()+ _ -> mzero++pLocatorPunct :: Parsec [Inline] st Inline+pLocatorPunct = pMatch isLocatorPunct++isLocatorPunct :: Inline -> Bool+isLocatorPunct (Str ",") = True+isLocatorPunct _ = False+++-- Utilities++-- FIXME: isPunctuationInQuote :: Style -> Bool+--isPunctuationInQuote = const False+{-+isPunctuationInQuote :: Style -> Bool+isPunctuationInQuote = or . CSL.query punctIn'+ where+ punctIn' n+ | ("punctuation-in-quote","true") <- n = [True]+ | otherwise = [False]+--}++splitStrWhen :: (Char -> Bool) -> [Inline] -> [Inline]+splitStrWhen _ [] = []+splitStrWhen p (Str xs : ys) = go xs ++ splitStrWhen p ys+ where go [] = []+ go s = case break p s of+ ([],[]) -> []+ (zs,[]) -> [Str zs]+ ([],(w:ws)) -> Str [w] : go ws+ (zs,(w:ws)) -> Str zs : Str [w] : go ws+splitStrWhen p (x : ys) = x : splitStrWhen p ys++findFile :: [FilePath] -> FilePath -> IO (Maybe FilePath)+findFile [] _ = return Nothing+findFile (p:ps) f = do+ exists <- doesFileExist (p </> f)+ if exists+ then return $ Just (p </> f)+ else findFile ps f++++generateNotes :: [Inline] -> Pandoc -> Pandoc+generateNotes needNote = bottomUp (mvCiteInNote needNote)++procInlines :: ([Inline] -> [Inline]) -> Block -> Block+procInlines f b+ | Plain inls <- b = Plain $ f inls+ | Para inls <- b = Para $ f inls+ | Header i x inls <- b = Header i x $ f inls+ | otherwise = b++mvCiteInNote :: [Inline] -> Block -> Block+mvCiteInNote is = --error ("ciao ciao " ++ show is)+ procInlines mvCite+ where+ mvCite :: [Inline] -> [Inline]+ mvCite inls+ | x:i:xs <- inls, startWithPunct xs+ , x == Space, i `elem_` is = switch i xs ++ mvCite (tailFirstInlineStr xs)+ | x:i:xs <- inls+ , x == Space, i `elem_` is = mvInNote i : mvCite xs+ | i:xs <- inls, i `elem_` is+ , startWithPunct xs = switch i xs ++ mvCite (tailFirstInlineStr xs)+ | i:xs <- inls, Note _ <- i = checkNt i : mvCite xs+ | i:xs <- inls = i : mvCite xs+ | otherwise = []+ --elem_ x xs = case x of Cite cs _ -> (Cite cs []) `elem` xs; _ -> False+ elem_ (Cite x _) = not . null . filter (\(Cite cs _) -> cs == x)+ elem_ _ = const False+ switch i xs = Str (headInline xs) : mvInNote i : []+ mvInNote i+ | Cite t o <- i = Note [Para [Cite t $ sanitize o]]+ | otherwise = Note [Para [i ]]+ sanitize i+ | endWithPunct i = toCapital i+ | otherwise = toCapital (i ++ [Str "."])++ checkPt i+ | Cite c o : xs <- i+ , endWithPunct o, startWithPunct xs+ , endWithPunct o = Cite c (initInline o) : checkPt xs+ | x:xs <- i = x : checkPt xs+ | otherwise = []+ checkNt = bottomUp $ procInlines checkPt++metaValueToJSON :: MetaValue -> Value+metaValueToJSON (MetaMap m) = toJSON $ M.map metaValueToJSON m+metaValueToJSON (MetaList xs) = toJSON $ map metaValueToJSON xs+metaValueToJSON (MetaString t) = toJSON t+metaValueToJSON (MetaBool b) = toJSON b+metaValueToJSON (MetaInlines ils) = toJSON (stringify ils)+metaValueToJSON (MetaBlocks bs) = toJSON bs
+ src/citeproc-hs-pandoc-filter.hs view
@@ -0,0 +1,52 @@+module Main where+import Text.CSL.Pandoc (processCites')+import Text.Pandoc.JSON+import Text.Pandoc.Walk+import System.IO (stderr, hPutStrLn)+import System.Console.GetOpt+import System.Environment (getArgs)+import Control.Monad+import System.Exit+import Data.Version (showVersion)+import Paths_citeproc_hs (version)++main :: IO ()+main = do+ argv <- getArgs+ let (flags, _, errs) = getOpt Permute options argv+ let header = "Usage: citeproc-hs"+ unless (null errs) $ do+ hPutStrLn stderr $ usageInfo (unlines $ errs ++ [header]) options+ exitWith $ ExitFailure 1+ when (Version `elem` flags) $ do+ putStrLn $ "citeproc-hs " ++ showVersion version+ exitWith ExitSuccess+ when (Help `elem` flags) $ do+ putStrLn $ usageInfo header options+ exitWith ExitSuccess+ toJSONFilter doCites++doCites :: Pandoc -> IO Pandoc+doCites doc = do+ doc' <- processCites' doc+ hPutStrLn stderr (show doc')+ let warnings = query findWarnings doc'+ mapM_ (hPutStrLn stderr) warnings+ return doc'++findWarnings :: Inline -> [String]+findWarnings (Span (_,["citeproc-not-found"],[("data-reference-id",ref)]) _) =+ ["pandoc-citeproc: reference " ++ ref ++ " not found"]+findWarnings (Span (_,["citeproc-no-output"],_) _) =+ ["pandoc-citeproc: reference with no printed form"]+findWarnings _ = []++data Option =+ Help | Version+ deriving (Ord, Eq, Show)++options :: [OptDescr Option]+options =+ [ Option ['h'] ["help"] (NoArg Help) "show usage information"+ , Option ['V'] ["version"] (NoArg Version) "show program version"+ ]