src/Pure/General/mailman.scala
changeset 74940 fe1d22487427
parent 74938 f76bf7b5baed
child 74941 a63c34c28430
equal deleted inserted replaced
74939:d4d3dec0970a 74940:fe1d22487427
    23 
    23 
    24   private val standard_name: Map[String, String] =
    24   private val standard_name: Map[String, String] =
    25     Map(
    25     Map(
    26       "Aman Pohjola, Johannes (Data61, Kensington NSW)" -> "Johannes Aman Pohjola",
    26       "Aman Pohjola, Johannes (Data61, Kensington NSW)" -> "Johannes Aman Pohjola",
    27       "Andrei de AraÃjo Formiga" -> "Andrei de Araujo Formiga",
    27       "Andrei de AraÃjo Formiga" -> "Andrei de Araujo Formiga",
    28       "Benedikt.AHRENS@unice.fr" -> "benedikt.ahrens@gmail.com",
    28       "Benedikt.AHRENS@unice.fr" -> "Benedikt Ahrens\nBenedikt.AHRENS@unice.fr",
       
    29       "Berg, Nils Erik" -> "Nils Erik Berg",
    29       "Berger U." -> "Ulrich Berger",
    30       "Berger U." -> "Ulrich Berger",
    30       "Bisping, Benjamin" -> "Benjamin Bisping",
    31       "Bisping, Benjamin" -> "Benjamin Bisping",
    31       "Blanchette, J.C." -> "Jasmin Christian Blanchette",
    32       "Blanchette, J.C." -> "Jasmin Christian Blanchette",
    32       "Buday Gergely István" -> "Gergely Buday",
    33       "Buday Gergely István" -> "Gergely Buday",
    33       "CALaF1UJ9Uy0vGCu4WkBmbfuPDxG7nFm8hfeCMP+O3g7_5CQ0Bw@mail.gmail.com" -> "",
    34       "CALaF1UJ9Uy0vGCu4WkBmbfuPDxG7nFm8hfeCMP+O3g7_5CQ0Bw@mail.gmail.com" -> "",
    34       "CRACIUN F." -> "Florin Craciun",
    35       "CRACIUN F." -> "Florin Craciun",
    35       "Carsten Schuermann" -> "Carsten Schürmann",
    36       "Carsten Schuermann" -> "Carsten Schürmann",
       
    37       "Chris" -> "",
    36       "Christoph Lueth" -> "Christoph Lüth",
    38       "Christoph Lueth" -> "Christoph Lüth",
    37       "Claude Marche" -> "Claude Marché",
    39       "Claude Marche" -> "Claude Marché",
    38       "Daniel StÃwe" -> "Daniel Stüwe",
    40       "Daniel StÃwe" -> "Daniel Stüwe",
    39       "Daniel.Matichuk@nicta.com.au" -> "Daniel.Matichuk@data61.csiro.au",
    41       "Daniel.Matichuk@data61.csiro.au" -> "Daniel Matichuk\nDaniel.Matichuk@data61.csiro.au",
       
    42       "Daniel.Matichuk@nicta.com.au" -> "Daniel Matichuk\nDaniel.Matichuk@nicta.com.au",
    40       "David MENTRE" -> "David MENTRÉ",
    43       "David MENTRE" -> "David MENTRÉ",
       
    44       "Dey, Katie" -> "Katie Dey",
    41       "Dr. Brendan Patrick Mahony" -> "Brendan Mahony",
    45       "Dr. Brendan Patrick Mahony" -> "Brendan Mahony",
    42       "Farn" -> "Farn Wang",
    46       "Farn" -> "Farn Wang",
    43       "Farquhar, Colin I" -> "Colin Farquhar",
    47       "Farquhar, Colin I" -> "Colin Farquhar",
       
    48       "Fernandez, Matthew" -> "Matthew Fernandez",
    44       "Filip Maric" -> "Filip Marić",
    49       "Filip Maric" -> "Filip Marić",
    45       "Filip MariÄ" -> "Filip Marić",
    50       "Filip MariÄ" -> "Filip Marić",
    46       "Fleury Mathias" -> "Mathias Fleury",
    51       "Fleury Mathias" -> "Mathias Fleury",
    47       "Francisco Jose Chaves Alonso" -> "Francisco Jose CHAVES ALONSO",
    52       "Francisco Jose CHAVES ALONSO" -> "Francisco Jose Chaves Alonso",
       
    53       "Frederic Tuong (Dr)" -> "Frederic Tuong",
       
    54       "Fulya" -> "Fulya Horozal",
    48       "George K." -> "George Karabotsos",
    55       "George K." -> "George Karabotsos",
    49       "Gidon ERNST" -> "Gidon Ernst",
    56       "Gidon Ernst" -> "Gidon ERNST",
       
    57       "Gransden, Thomas" -> "Thomas Gransden",
    50       "Hans-JÃrg Schurr" -> "Hans-Jörg Schurr",
    58       "Hans-JÃrg Schurr" -> "Hans-Jörg Schurr",
    51       "Henri DEBRAT" -> "Henri Debrat",
    59       "Henri DEBRAT" -> "Henri Debrat",
    52       "Hitoshi Ohsaki (RTA publicity chair)" -> "Hitoshi Ohsaki",
    60       "Hitoshi Ohsaki (RTA publicity chair)" -> "Hitoshi Ohsaki",
       
    61       "Häuselmann Rafael" -> "Rafael Häuselmann",
    53       "Isabelle" -> "",
    62       "Isabelle" -> "",
       
    63       "J. Juhas (TUM)" -> "Jonatan Juhas",
    54       "Jackson, Vincent (Data61, Kensington NSW)" -> "Vincent Jackson",
    64       "Jackson, Vincent (Data61, Kensington NSW)" -> "Vincent Jackson",
    55       "Janney, Mark-P26816" -> "Mark Janney",
    65       "Janney, Mark-P26816" -> "Mark Janney",
    56       "Jean François Molderez" -> "Jean-Francois Molderez",
    66       "Jean François Molderez" -> "Jean-François Molderez",
       
    67       "Jean-Francois Molderez" -> "Jean-François Molderez",
       
    68       "John R Harrison" -> "John Harrison",
    57       "Jose DivasÃn" -> "Jose Divasón",
    69       "Jose DivasÃn" -> "Jose Divasón",
    58       "Julian" -> "",
    70       "Julian" -> "",
    59       "Julien" -> "",
    71       "Julien" -> "",
    60       "Klein, Gerwin (Data61, Kensington NSW)" -> "Gerwin Klein",
    72       "Klein, Gerwin (Data61, Kensington NSW)" -> "Gerwin Klein",
    61       "Kobayashi, Hidetsune" -> "Hidetsune Kobayashi",
    73       "Kobayashi, Hidetsune" -> "Hidetsune Kobayashi",
       
    74       "Kylie Williams (IND)" -> "Kylie Williams",
       
    75       "Laarman, A.W." -> "A.W. Laarman",
    62       "Laurent Thery" -> "Laurent Théry",
    76       "Laurent Thery" -> "Laurent Théry",
       
    77       "Li, Chanjuan" -> "Li Chanjuan",
    63       "Lochbihler Andreas" -> "Andreas Lochbihler",
    78       "Lochbihler Andreas" -> "Andreas Lochbihler",
       
    79       "Luckhardt, Daniel" -> "Daniel Luckhardt",
    64       "Lutz Schroeder" -> "Lutz Schröder",
    80       "Lutz Schroeder" -> "Lutz Schröder",
    65       "Lutz SchrÃder" -> "Lutz Schröder",
    81       "Lutz SchrÃder" -> "Lutz Schröder",
       
    82       "MACKENZIE Carlin" -> "Carlin MACKENZIE",
    66       "Makarius" -> "Makarius Wenzel",
    83       "Makarius" -> "Makarius Wenzel",
    67       "Marco" -> "",
    84       "Marco" -> "",
    68       "Mark" -> "",
    85       "Mark" -> "",
       
    86       "Markus Mueller-Olm" -> "Markus Müller-Olm",
    69       "Markus" -> "",
    87       "Markus" -> "",
       
    88       "Marmsoler, Diego" -> "Diego Marmsoler",
    70       "Martin Klebermass" -> "Martin Klebermaß",
    89       "Martin Klebermass" -> "Martin Klebermaß",
       
    90       "Matthew" -> "",
    71       "Matthews, John R" -> "John Matthews",
    91       "Matthews, John R" -> "John Matthews",
       
    92       "McCarthy, Jim (C3ID)" -> "Jim McCarthy",
       
    93       "McCue, Brian" -> "Brian McCue",
    72       "Michael FÃrber" -> "Michael Färber",
    94       "Michael FÃrber" -> "Michael Färber",
    73       "Moscato, Mariano M. \\(LARC-D320\\)\\[NATIONAL INSTITUTE OF AEROSPACE\\]" -> "Moscato, Mariano M.",
    95       "Michel" -> "",
       
    96       "Miranda, Brando" -> "Brando Miranda",
       
    97       "Moscato, Mariano M. \\(LARC-D320\\)\\[NATIONAL INSTITUTE OF AEROSPACE\\]" -> "Mariano M. Moscato",
       
    98       "Mr Julian Fell" -> "Julian Fell",
       
    99       "Mueller Peter" -> "Peter Müller",
       
   100       "Munoz, Cesar Augusto (LARC-D320)" -> "Cesar A. Munoz",
       
   101       "Nadel, Alexander" -> "Alexander Nadel",
       
   102       "Nagashima, Yutaka" -> "Yutaka Nagashima",
    74       "Norrish, Michael (Data61, Acton)" -> "Michael Norrish",
   103       "Norrish, Michael (Data61, Acton)" -> "Michael Norrish",
       
   104       "O'Leary, John W" -> "John W O'Leary",
    75       "Omar Montano Rivas" -> "Omar Montaño Rivas",
   105       "Omar Montano Rivas" -> "Omar Montaño Rivas",
    76       "Omar MontaÃo Rivas" -> "Omar Montaño Rivas",
   106       "Omar MontaÃo Rivas" -> "Omar Montaño Rivas",
    77       "OndÅej KunÄar" -> "Ondřej Kunčar",
   107       "OndÅej KunÄar" -> "Ondřej Kunčar",
    78       "PAQUI LUCIO" -> "Paqui Lucio",
   108       "PAQUI LUCIO" -> "Paqui Lucio",
       
   109       "Pal, Abhik" -> "Abhik Pal",
       
   110       "Pasupuleti, Vijay" -> "Vijay Pasupuleti",
    79       "Peter Vincent Homeier" -> "Peter V. Homeier",
   111       "Peter Vincent Homeier" -> "Peter V. Homeier",
    80       "Peter" -> "",
   112       "Peter" -> "",
    81       "Philipp Ruemmer" -> "Philipp Rümmer",
   113       "Philipp Ruemmer" -> "Philipp Rümmer",
    82       "Philipp RÃmmer" -> "Philipp Rümmer",
   114       "Philipp RÃmmer" -> "Philipp Rümmer",
       
   115       "RTA publicity chair" -> "",
    83       "Raamsdonk, F. van" -> "Femke van Raamsdonk",
   116       "Raamsdonk, F. van" -> "Femke van Raamsdonk",
    84       "Raul Gutierrez" -> "Raúl Gutiérrez",
   117       "Raul Gutierrez" -> "Raúl Gutiérrez",
    85       "Renà Thiemann" -> "René Thiemann",
   118       "Renà Thiemann" -> "René Thiemann",
       
   119       "Ridgway, John V. E." -> "John V. E. Ridgway",
    86       "Roggenbach M." -> "Markus Roggenbach",
   120       "Roggenbach M." -> "Markus Roggenbach",
       
   121       "Rosu, Grigore" -> "Grigore Rosu",
    87       "Rozman, Mihaela" -> "Mihaela Rozman",
   122       "Rozman, Mihaela" -> "Mihaela Rozman",
       
   123       "Schmaltz, J." -> "Julien Schmaltz",
    88       "Serguei A. Mokhov on behalf of PST-11" -> "Serguei A. Mokhov",
   124       "Serguei A. Mokhov on behalf of PST-11" -> "Serguei A. Mokhov",
    89       "Silvio.Ranise@loria.fr" -> "ranise@dsi.unimi.it",
   125       "Serguei Mokhov" -> "Serguei A. Mokhov",
       
   126       "Shumeiko, Igor" -> "Igor Shumeiko",
       
   127       "Siek, Jeremy" -> "Jeremy Siek",
       
   128       "Silvio.Ranise@loria.fr" -> "Silvio Ranise\nSilvio.Ranise@loria.fr",
       
   129       "Siu, Tony" -> "Tony Siu",
    90       "Stüber, Sebastian" -> "Sebastian Stüber",
   130       "Stüber, Sebastian" -> "Sebastian Stüber",
    91       "Thiemann, Rene" -> "René Thiemann",
   131       "Thiemann, Rene" -> "René Thiemann",
    92       "Thiemann, René" -> "René Thiemann",
   132       "Thiemann, René" -> "René Thiemann",
       
   133       "Thomas Arthur Leck Sewell" -> "Thomas Sewell",
    93       "Thomas Goethel" -> "Thomas Göthel",
   134       "Thomas Goethel" -> "Thomas Göthel",
    94       "Thomas.Sewell@data61.csiro.au" -> "tals4@cam.ac.uk",
   135       "Thomas.Sewell@data61.csiro.au" -> "Thomas Sewell\nThomas.Sewell@data61.csiro.au",
    95       "Toby.Murray@data61.csiro.au" -> "toby.murray@unimelb.edu.au",
   136       "Toby.Murray@data61.csiro.au" -> "Toby Murray\nToby.Murray@data61.csiro.au",
    96       "Urban, Christian" -> "Christian Urban",
   137       "Urban, Christian" -> "Christian Urban",
       
   138       "Ursula Eschbach" -> "",
       
   139       "Van Staden Stephan" -> "Stephan van Staden",
    97       "Viktor Kuncak" -> "Viktor Kunčak",
   140       "Viktor Kuncak" -> "Viktor Kunčak",
    98       "Viorel Preoteasaa" -> "Viorel Preoteasa",
   141       "Viorel Preoteasaa" -> "Viorel Preoteasa",
    99       "Yakoub.Nemouchi@lri.fr" -> "y.nemouchi@ensbiotech.edu.dz",
   142       "Wickerson, John P" -> "John Wickerson",
       
   143       "Wong, Yat" -> "Yat Wong",
       
   144       "YAMADA, Akihisa" -> "Akihisa Yamada",
   100       "YliÃs Falcone" -> "Yliès Falcone",
   145       "YliÃs Falcone" -> "Yliès Falcone",
   101       "daniel.matichuk@nicta.com.au" -> "Daniel.Matichuk@data61.csiro.au",
   146       "amir mohajeri" -> "Amir Mohajeri",
   102       "fredegar@haftmann-online.de" -> "florian@haftmann-online.de",
   147       "aniello murano" -> "Aniello Murano",
       
   148       "barzan stefania" -> "Stefania Barzan",
       
   149       "benhamou" -> "Belaid Benhamou",
       
   150       "charmi panchal" -> "Charmi Panchal",
       
   151       "chen kun" -> "Chen Kun",
       
   152       "chunhan wu" -> "Chunhan Wu",
       
   153       "daniel de la concepción sáez" -> "Daniel de la Concepción Sáez",
       
   154       "daniel.luckhardt@mathematik.uni-goettingen.de" -> "Logiker@gmx.net",
       
   155       "david streader" -> "David Streader",
       
   156       "eschbach@in.tum.de" -> "",
       
   157       "f.rabe@jacobs-university.de" -> "florian.rabe@fau.de",
       
   158       "florian@haftmann-online.de" -> "haftmann@in.tum.de",
       
   159       "fredegar@haftmann-online.de" -> "haftmann@in.tum.de",
   103       "gallais @ ensl.org" -> "Guillaume Allais",
   160       "gallais @ ensl.org" -> "Guillaume Allais",
   104       "haftmann@in.tum.de" -> "Florian Haftmann",
   161       "geng chen" -> "Geng Chen",
       
   162       "henning.seidler" -> "Henning Seidler",
   105       "hkb" -> "Hidetsune Kobayashi",
   163       "hkb" -> "Hidetsune Kobayashi",
   106       "julien@RadboudUniversity" -> "",
   164       "julien@RadboudUniversity" -> "",
       
   165       "jun sun" -> "Jun Sun",
       
   166       "jwang whu.edu.cn (jwang)" -> "jwang",
       
   167       "kostas pouliasis" -> "Kostas Pouliasis",
       
   168       "kristof.teichel@ptb.de" -> "Kristof Teichel\nkristof.teichel@ptb.de",
       
   169       "lucas cavalcante" -> "Lucas Cavalcante",
       
   170       "mahmoud abdelazim" -> "Mahmoud Abdelazim",
       
   171       "manish surolia" -> "Manish Surolia",
   107       "mantel" -> "Heiko Mantel",
   172       "mantel" -> "Heiko Mantel",
       
   173       "marco caminati" -> "Marco Caminati",
   108       "merz@loria.fr" -> "stephan.merz@loria.fr",
   174       "merz@loria.fr" -> "stephan.merz@loria.fr",
       
   175       "michel levy" -> "Michel Levy",
       
   176       "michel.levy2009@laposte.net" -> "Michel Levy\nmichel.levy2009@laposte.net",
   109       "nemouchi" -> "Yakoub Nemouchi",
   177       "nemouchi" -> "Yakoub Nemouchi",
       
   178       "patrick barlatier" -> "Patrick Barlatier",
       
   179       "patrick dabou" -> "Patrick Dabou",
       
   180       "paul zimmermann" -> "Paul Zimmermann",
   110       "popescu2@illinois.edu" -> "Andrei Popescu",
   181       "popescu2@illinois.edu" -> "Andrei Popescu",
   111       "urban@math.lmu.de" -> "Christian Urban",
   182       "recruiting" -> "",
       
   183       "roux cody" -> "Cody Roux",
       
   184       "scott constable" -> "Scott Constable",
       
   185       "superuser@mattweidner.com" -> "Matthew Weidner\nsuperuser@mattweidner.com",
       
   186       "urban@math.lmu.de" -> "Christian Urban\nurban@math.lmu.de",
   112       "veronique.cortier@loria.fr" -> "Veronique.Cortier@loria.fr",
   187       "veronique.cortier@loria.fr" -> "Veronique.Cortier@loria.fr",
       
   188       "vikram singh" -> "Vikram Singh",
   113       "wenzelm@in.tum.de" -> "makarius@sketis.net",
   189       "wenzelm@in.tum.de" -> "makarius@sketis.net",
       
   190       "werner@lix.polytechnique.fr" -> "Benjamin Werner\nwerner@lix.polytechnique.fr",
       
   191       "wmansky@cs.princeton.edu" -> "William Mansky\nwmansky@cs.princeton.edu",
       
   192       "y.nemouchi@ensbiotech.edu.dz" -> "Yakoub Nemouchi\ny.nemouchi@ensbiotech.edu.dz",
   114       "ÐÑÐÐÐÑÐÐÐ ÐÐÐÐÐÐÐÑÐÐÐÑ ÐÐÐÑÐÐÐ" -> "",
   193       "ÐÑÐÐÐÑÐÐÐ ÐÐÐÐÐÐÐÑÐÐÐÑ ÐÐÐÑÐÐÐ" -> "",
   115       "∀X.Xπ - Tutorials about Proofs" -> "Bruno Woltzenlogel Paleo",
   194       "∀X.Xπ - Tutorials about Proofs" -> "Bruno Woltzenlogel Paleo",
   116     ).withDefault(identity)
   195     ).withDefault(identity)
   117 
   196 
   118   def standard_author_info(author_info: List[String]): List[String] =
   197   def standard_author_info(author_info: List[String]): List[String] =
   119     author_info.map(standard_name).filter(_.nonEmpty).distinct
   198     author_info.flatMap(s => split_lines(standard_name.getOrElse(s, s))).distinct
   120 
   199 
   121   sealed case class Message(
   200   sealed case class Message(
   122     name: String,
   201     name: String,
   123     date: Date,
   202     date: Date,
   124     title: String,
   203     title: String,
   177             case a :: _ => a.substring(0, a.indexOf('@')).replace('.', ' ')
   256             case a :: _ => a.substring(0, a.indexOf('@')).replace('.', ' ')
   178             case Nil => error("Empty cluster")
   257             case Nil => error("Empty cluster")
   179           }
   258           }
   180         }
   259         }
   181 
   260 
       
   261       val name_lowercase: String = Word.lowercase(name)
       
   262 
   182       def get_address: Option[String] = addresses.headOption
   263       def get_address: Option[String] = addresses.headOption
   183 
   264 
   184       def unique: Boolean = names.length == 1 && addresses.length == 1
   265       def unique: Boolean = names.length == 1 && addresses.length == 1
   185       def multi: Boolean = names.length > 1 || addresses.length > 1
   266       def multi: Boolean = names.length > 1 || addresses.length > 1
   186 
   267 
   210     def get_address(msg: Message): String =
   291     def get_address(msg: Message): String =
   211       get_cluster(msg).get_address getOrElse error("No author address for " + quote(msg.name))
   292       get_cluster(msg).get_address getOrElse error("No author address for " + quote(msg.name))
   212 
   293 
   213     def check(check_all: Boolean, check_multi: Boolean = false): Unit =
   294     def check(check_all: Boolean, check_multi: Boolean = false): Unit =
   214     {
   295     {
   215       val clusters = sorted.map(get_cluster).distinct.sortBy(_.name)
   296       val clusters = sorted.map(get_cluster).distinct.sortBy(_.name_lowercase)
   216 
   297 
   217       if (check_all) {
   298       if (check_all) {
   218         Output.writeln(cat_lines("clusters:" :: clusters.map(_.print)))
   299         Output.writeln(cat_lines("clusters:" :: clusters.map(_.print)))
   219       }
   300       }
   220       else {
   301       else {