diff options
-rwxr-xr-x | .ikiwiki/IkiWiki/Plugin/pandoc.pm | 185 | ||||
-rw-r--r-- | events/2013/arg-for-fripost-2.mdwn | 19 | ||||
-rw-r--r-- | events/2013/arg-for-fripost.mdwn | 145 | ||||
-rw-r--r-- | events/2013/may-first.mdwn | 21 | ||||
-rw-r--r-- | events/2019/summerparty.mdwn | 30 | ||||
-rw-r--r-- | events/done.mdwn | 6 | ||||
-rw-r--r-- | someevent.mdwn | 116 |
7 files changed, 519 insertions, 3 deletions
diff --git a/.ikiwiki/IkiWiki/Plugin/pandoc.pm b/.ikiwiki/IkiWiki/Plugin/pandoc.pm index da13763..9f3e0c2 100755 --- a/.ikiwiki/IkiWiki/Plugin/pandoc.pm +++ b/.ikiwiki/IkiWiki/Plugin/pandoc.pm @@ -9,6 +9,60 @@ use FileHandle; use IPC::Open2; use File::Path qw/make_path/; use JSON; +use Data::Dumper; + +$Data::Dumper::Indent = 3; + +my $fh = undef; +my $dh = undef; +my $fnm = undef; +my $f = undef; +my $next = 0; +my $base = '/tmp/pandoc'; + +mkdir($base); + +# activate with 'generate_$format' in meta; turn on all with 'generate_all_formats'. +my %extra_formats = ( + pdf => { ext=>'pdf', label=>'PDF', format=>'latex', extra=>[], order=>1 }, + docx => { ext=>'docx', label=>'DOCX', format=>'docx', extra=>[], order=>2 }, + odt => { ext=>'odt', label=>'ODT', format=>'odt', extra=>[], order=>3 }, + beamer => { ext=>'beamer.pdf', label=>'Beamer', format=>'beamer', extra=>[], order=>4 }, + revealjs => { ext=>'revealjs.html', label=>'RevealJS', format=>'revealjs', extra=>['--self-contained'], order=>5 }, + epub => { ext=>'epub', label=>'EPUB', format=>'epub3', extra=>[], order=>6 }, + latex => { ext=>'tex', label=>'LaTeX', format=>'latex', extra=>['--standalone'], order=>7 }, +); + +sub debug_get_filename_prefix { + + my $place = shift; + my $page = shift; + my $fnm_pfx = undef; + + opendir($dh, $base) || die "Can't open $base: $!"; + foreach $f (grep(/^[0-9][0-9]*/, readdir($dh))) { + $f =~ /^([0-9][0-9]*)\.(.*)$/; + $next = $1 + 1 if ($1 >= $next); + } + close($dh); + if ($page) { + $fnm_pfx = sprintf "%s/%.3d.%s.%s", $base, $next, $place, + $page =~ s/\//-/rg; + } else { + $fnm_pfx = sprintf "%s/%.3d.%s", $base, $next, $place; + } + return $fnm_pfx; +} + +# DEBUG Print +print "D: First file read.\n"; +$fnm = debug_get_filename_prefix ("verify"); +open($fh, '>', $fnm) or die "Could not"; +print $fh "Hej du glade på fil\n"; +print $fh "Detta är filen i '/home/gustav/git/fripost/wiki/.ikiwiki/IkiWiki/Plugin'\n"; +close $fh; +# END + # activate with 'generate_$format' in meta; turn on all with 'generate_all_formats'. my %extra_formats = ( @@ -22,6 +76,16 @@ my %extra_formats = ( ); sub import { + + # DEBUG Print + print "D: Run import.\n"; + my $fnm_pfx = debug_get_filename_prefix ("import",""); + my $fnm = $fnm_pfx; + open($fh, '>', $fnm) or die "Could not open $fnm ."; + print $fh "Import.\n"; + close $fh; + # END + my $markdown_ext = $config{pandoc_markdown_ext} || "mdwn"; # May be both a string with a single value, a string containing commas or an arrayref @@ -70,6 +134,11 @@ sub import { sub getsetup () { + + # DEBUG + print "D: Run getsetup.\n"; + # END + return plugin => { safe => 1, @@ -345,6 +414,7 @@ sub getsetup () { sub htmlize ($@) { + my $format = shift; my %params = @_; my $page = $params{page}; @@ -353,6 +423,27 @@ sub htmlize ($@) { local(*PANDOC_IN, *JSON_IN, *JSON_OUT, *PANDOC_OUT); my @args = (); + # DEBUG Print params + print "D: Run htmlize for ", $page, "\n"; + my $fnm_pfx = debug_get_filename_prefix ("htmlize", $page); + my $m = 0; + $fnm = sprintf "%s.%.1d.%s", $fnm_pfx, $m++, "params"; + open($fh, '>', $fnm) or die "Could not"; + $Data::Dumper::Indent = 2; + print $fh Dumper(%params), "\n"; + close $fh; + # END + + # DEBUG Print half way pagestate pagestate + $fnm = sprintf "%s.%.1d.%s", $fnm_pfx, $m++, "early-pagestate"; + open($fh, '>>', $fnm); + my %pagestate_dumper = ( + $page => $pagestate{$page}, + ); + print $fh Data::Dumper->Dump([\%pagestate_dumper], [qw("pagestate")]), "\n"; + close $fh; + # END + # The default assumes pandoc is in PATH my $command = $config{pandoc_command} || "pandoc"; @@ -452,6 +543,20 @@ sub htmlize ($@) { warn "WARNING: Unexpected format for meta block. Incompatible version of Pandoc?\n"; } + # DEBUG Half way content which is plenty data + print "D: Pandoc command: ", " ", $command, " ", '-f', " ", + $markdown_fmt, " ", '-t', " ", 'json', " ", @args, + "\n"; + + $fnm = sprintf "%s.%.1d.%s", $fnm_pfx, $m++, "early-content"; + open($fh, '>>', $fnm); + print $fh Data::Dumper->Dump([$content], [qw(content)]), "\n"; + print $fh Data::Dumper->Dump([$json_content], [qw(json_content)]), "\n"; + print $fh Data::Dumper->Dump([$decoded_json], [qw(decoded_json)]), "\n"; + print $fh Data::Dumper->Dump([$meta], [qw(meta)]), "\n"; + close $fh; + # END + # Get some selected meta attributes, more specifically: # (title date bibliography csl subtitle abstract summary description # version lang locale references author [+ num_authors primary_author]), @@ -460,11 +565,15 @@ sub htmlize ($@) { my @format_keys = grep { $_ ne 'pdf' } keys %extra_formats; my %scalar_meta = map { ($_=>undef) } qw( title date bibliography csl subtitle abstract summary - description version lang locale); + description version lang locale + titlesort tag tags + ); + $scalar_meta{$_.'_template'} = undef for @format_keys; my %bool_meta = map { ("generate_$_"=>0) } keys %extra_formats; - my %list_meta = map { ($_=>[]) } qw/author references/; + my %list_meta = map { ($_=>[]) } qw/author references tags/; $list_meta{$_.'_extra_options'} = [] for @format_keys; + my $have_bibl = 0; foreach my $k (keys %scalar_meta) { next unless $meta->{$k}; @@ -585,16 +694,51 @@ sub htmlize ($@) { close JSON_IN; my @html = <PANDOC_IN>; + close PANDOC_IN; waitpid $to_html_pid, 0; + print "D: Pandoc command: ", " ", $command, " ", '-f', " ", + 'json', " ", '-t', $htmlformat, " ", @html_args, "\n"; + $content = Encode::decode_utf8(join('', @html)); # Reinstate placeholders for inline plugin: $content =~ s{::INLINE::PLACEHOLDER::(\d+)::} {<div class="inline" id="$1"></div>}g; + # DEBUG Print meta + $fnm = sprintf "%s.%.1d.%s", $fnm_pfx, $m++, "meta"; + open($fh, '>>', $fnm) or die "Could not"; + print $fh "\n"; + print $fh Data::Dumper->Dump([\%scalar_meta], [qw(scalar_meta)]), "\n"; + print $fh Data::Dumper->Dump([\%bool_meta], [qw(bool_meta)]), "\n"; + print $fh Data::Dumper->Dump([\%list_meta], [qw(list_meta)]), "\n"; + close $fh; + # END + + # DEBUG Print pagestate again + $fnm = sprintf "%s.%.1d.%s", $fnm_pfx, $m++, "return-pagestate"; + open($fh, '>>', $fnm); + my %pagestate_dumper = ( + $page => $pagestate{$page}, + ); + print $fh Data::Dumper->Dump([\%pagestate_dumper], [qw("pagestate")]), "\n"; + close $fh; + # END + + # DEBUG Print return content + $fnm = sprintf "%s.%.1d.%s", $fnm_pfx, $m++, "return-content"; + open($fh, '>>', $fnm); + print $fh Dumper($content), "\n"; + close $fh; + # END + + # DEBUG + print "D: Return htmlize.\n"; + # END + return $content; } @@ -602,16 +746,36 @@ sub htmlize ($@) { sub pagetemplate (@) { my %params = @_; my $page = $params{page}; + + # DEBUG + print "D: Run pagetemplate for $page\n"; + # END + my $template = $params{template}; foreach my $k (keys %{$pagestate{$page}{meta}}) { next unless $k =~ /^pandoc_/; $template->param($k => $pagestate{$page}{meta}{$k}); } + + # DEBUG Print pagetemplate data + my $fnm_pfx = debug_get_filename_prefix ("pagetemplate", $page); + my $m = 0; + my $fnm = sprintf "%s.%.1d.%s", $fnm_pfx, $m++, "data"; + open($fh, '>', $fnm) or die "Could not"; + print $fh Data::Dumper->Dump([%params], [qw(params)]), "\n"; + print $fh Data::Dumper->Dump([$template], [qw(teplate)]), "\n"; + close $fh; + # END + + return $template; } sub pageactions { my %args = @_; my $page = $args{page}; + + print "D: Run pageactions for ", $page, "\n"; + my @links = (); return unless $pagestate{$page}{pandoc_extra_formats}; my @exts = sort { @@ -633,6 +797,11 @@ sub pageactions { sub export_file { my ($page, $ext, $json_content, $command, @args) = @_; + + # DEBUG + print "D: Run export_file for $page.\n"; + # END + my ($export_path, $export_url) = _export_file_path_and_url($page, $ext); my $subdir = $1 if $export_path =~ /(.*)\//; my @extra_args = @{ $extra_formats{$ext}->{extra} }; @@ -684,6 +853,11 @@ sub export_file { @args, @extra_args) or die "Could not open pipe for $ext: $!"; print EXPORT $json_content; close EXPORT or die "Could not close pipe for $ext: $!"; + + print "D: Pandoc command: ", " ", $command, " ", '-f' => + 'json', " ", '-t' => $to_format, " ", '-o' => + $tmp_export_path, " ", @args, " ", @extra_args; + if ($indirect_pdf && $tmp_export_path ne $export_path) { my @latexmk_args = qw(-quiet -silent); if (grep { /xelatex/ } @extra_args) { @@ -723,6 +897,12 @@ sub remove_exported_file { if ($@) { warn "WARNING: remove_exported_file; page=$page, ext=$ext: $@\n"; } + + # DEBUG + print "D: remove_exported_file: ", + "file removed for $page and $ext: $export_path.\n"; + # END + } } @@ -741,7 +921,6 @@ sub _export_file_path_and_url { return ($export_path, $export_url); } - ## compile_string and unwrap_c are used to make the meta data structures ## easier to work with for perl. diff --git a/events/2013/arg-for-fripost-2.mdwn b/events/2013/arg-for-fripost-2.mdwn new file mode 100644 index 0000000..5137e98 --- /dev/null +++ b/events/2013/arg-for-fripost-2.mdwn @@ -0,0 +1,19 @@ +--- +title: Argumentera för Fripost 2 +author: + - Fripost genom arrangörer + - Fler +date: måndag 19 maj 2013 +titlesort: 2013-05-19 +abstract: | + hej du glade + ta en spade +... + +Tid och plats + : Söndag 19 maj, kl 16, Slottsskogen + +*TODO: Lägg till beskrivning* + + +Test diff --git a/events/2013/arg-for-fripost.mdwn b/events/2013/arg-for-fripost.mdwn new file mode 100644 index 0000000..8c7a41c --- /dev/null +++ b/events/2013/arg-for-fripost.mdwn @@ -0,0 +1,145 @@ +--- +title: Argumentera för Fripost +date: 20 februari 2013 +tag: done +titlesort: 2013-02-20 +... + +[[!tag /events/done]] + +[[!meta title="_" sortas=2013-02-20]] +[[!meta date="Datum"]] + + + + Tid och plats + + : Onsdag 20 februari kl 18:00 på Språkbanken. + + Deltagare + + : Leif-Jöran, Stian, Guilhem, Anna, och Gustav + +Aktivitetsdagen annonserades med + +> Funderar du på hur du ska övertyga dina grannar att det är värt att gå med i +> Fripost? +> +> År du trött på argumentet "Min integritet är inte viktig; jag har inget att +> dölja; dessutom ger Google mig allt som jag behöver"? +> +> Vill du förbättra din argumentation för Friposts sak? +> +> […] +> +> Vi ska arbeta med rollspel och forumteater för att tillsammans +> utveckla hur man kan diskutera de frågor som engagerar Friposts medlemmar. + +Tyvärr var det inte så många som dök upp, men vi som kom lyckades ändå skissa +lite på förutsättningarna för argumentation för fripost. + +# Ämnesområden # + +Till att börja med identifierades ett antal ämnesområden: + + * Reklam kontra komfort + * Moral och ersättning + * Livsstilsval + * Integritet, personlig (min) och som samhällsansvar + * Storlek på tillhandahållaren (Google kontra Fripost) + * Konsument eller Medborgare + * Pålitlighet + * Fri programvara och öppna standarder + +Att sortera dem är en fråga för framtida aktivitetsdagar. + +Det finns flera kopplingar att göra mellan ämnesområdena, och vissa +ämnesområden kan behöva en kommentar. De två första ämnena "Reklam kontra +komfort" och "Moral och ersättning" kontrasterar flera olika inställningar: + + * De som tar del av reklamfinansierade produkterna har ett moraliskt ansvar att låta sig utsättas för reklam. + * De som förespråkar en reklamfri värld har ett moraliskt ansvar att med hjälp av tekniska lösningar, till exempel Adblock, filtrera bort reklamen trots att de tar del av reklamfinansierade produkter. + +Att inte behöva utsättas för reklam har högre komfort. Fripost kan utgöra ett +bekvämt och moraliskt korrekt sätt att få reklamfri e-post. + +Kommersialistiska elektroniska kommunikationslösningar, som till exempel +Facebook, ingår i mångas livsstilsval. Det är viktigt att inte kritisera hur +folk väljer att leva sina liv. + +Distinktionen mellan konsument och medborgare har kopplingar till +integritetsfrågan. Betrakta följande illustration: + + Konsument Medborgare + ------------------------ ------------------------------- + | | + Eget dåligt samvete Ansvar för samhället + | | + Använda Friposts lösning Gå med i föreningen + | | + Personlig integritet Minska stora aktörers påverkan + ------------------------ ------------------------------- + +Denna diskussion kan uttömmas ännu mer. + + +# Kategorier av personer att bemöta # + +Vi identifierade också flera motsatspar av personligheter + + 1. Gällande elektronisk kommunikation + 1. Nybörjare + 2. Erfarna + 2. Gällande inställning till fria lösningar + 1. Vänligt inställda + 2. De som inte bryr sig + 3. Gällande om man är personligt noga + 1. De som bryr sig + 2. De som inte bryr sig + +Vi frågade oss vilka som är lättövertygade, gärna går med, och vilka som +använder lösningen. + +Svårast att övertyga är de som inte bryr sig men är erfarna av +kommunikationslösningar. Lättast att övertyga är de som är erfarna, bryr sig +och är intresserade av fria lösningar. Det kan hända att nybörjare enklare +värvas. + + +# Konkurrenter # + +De två främsta konkurrenterna, som används i argumentationen, är Google och +Facebook. Poängtera igen vikten av att inte anklaga personers val av +livsstil; om Facebook utgör en viktig kommunikationskälla, så ska den +erkännas. Facebook och Fripost kan användas parallellt. + +Lyft fram problematiken att tjänster upphör. Google har till exempel upphört +med stödet för Google wave. + +# Argument för och emot Fripost och hur dessa bemöts # + +Till argumenten för Fripost räknas + + * Vi ar vänliga och trevliga + * Ingen reklam + +Bland argumenten mot ser vi + + * Att fri programvara saknar investerade intressen gör den oförutsägbar + * Gmail har bra sökningsfunktion + * Pålitligheten hos Fripost: "Hur länge orkar folk driva?" (ironi) + +Argumenten mot Fripost kan bemötas med till exempel följande. Stora aktörer +står slätt, med avseende på historien. Microsoft har till exempel släppt +bakåtkompatibiliteten för Worddokumentformatet två gånger. Man kan alltså inte öppna +sina gamla filer längre. Det har aldrig hänt med Open Doument Format. Även +om Roundcubes sökning lämnar saker att önska, så finns bra +sökningsfunktionalitet i lokala klienter. Och slutligen, hållbarhet är ett +kärnvärde för Fripost, och att de som arbetar i föreningen ska orka med +arbetet är lika viktigt som föreningens demokratiska principer. + +Hållbarhetsvärdet är också viktigt i argumentationen. Det är ingen idé att +slösa energi på att övertyga sarkastiska +personer. När man stöter på Googlesökfunktionsargumentet rör det sig +förmodligen om en sådan person. Med såddana gör det större nytta att +diskutera vädret (inte klimatet då, för de är säkert klimetskeptiker också). diff --git a/events/2013/may-first.mdwn b/events/2013/may-first.mdwn new file mode 100644 index 0000000..d656fbc --- /dev/null +++ b/events/2013/may-first.mdwn @@ -0,0 +1,21 @@ +--- +title: Första maj-demonstration +date: Onsdag 1 Maj 2013 +tag: /events/done +... + + Tid och plats + : Den 1 maj 2013 kl 11 på Järntorget + +Aktiviteten annonserades med + +> Vi identifierar första-majfirarna som en viktig rekryteringsgrupp. +> Därför träffas vi och delar ut flygblad. Som förening deltar Fripost +> inte i något första-majtåg, men flera av Friposts medlemmar kommer gå +> i olika tåg för den som vill slå följe. +> +> * Samling kl 11 på Järntorget +> +> * Rutten är Järntorget--Linnégatan--Andra +> Långgatan--Masthuggstorget--Gustav Adolfs Torg + diff --git a/events/2019/summerparty.mdwn b/events/2019/summerparty.mdwn new file mode 100644 index 0000000..b4c27ac --- /dev/null +++ b/events/2019/summerparty.mdwn @@ -0,0 +1,30 @@ +--- +title: Sensommarfest +date: Lördag 31 aug, 2019 +... + +Välkomna äntligen till Friposts sensommarfest! + + Tid + : Lördag 31 aug, kl 13--21 + + Plats + : Keillers park, Rambergsvägen, Hisingen, Göteborg (om vädret + tillåter) + + Anmäl intresse + : Fripost info <info@fripost.org> + +Vi träffas i Keillers park för att fira sommaren och för att se fram +emot september och hösten. Det blir lek och spel och klurig +tävlan. Några vill säkert också beundra Ättestupan eller annan utsikt. + +Alla är välkomna, medlem eller inte. Anmäl dock gärna intresse så att +vi som arrangerar vet hur många som kan väntas. + +[Keillers park][1] är väsentligen Ramberget, vi träffas vid den öppna +parken med dam på Rambersgvägen, hållplats Vågmästareplatsen eller +Wiselgrensplatsen. Vid dåligt väder flyr vi in till en Fripost medlem +i närheten. + +[1]: https://www.openstreetmap.org/relation/7518805 diff --git a/events/done.mdwn b/events/done.mdwn new file mode 100644 index 0000000..e528418 --- /dev/null +++ b/events/done.mdwn @@ -0,0 +1,6 @@ +--- +title: Genomförda evenemang och aktiviteter +... + +[[!inline pages="events/* and link(events/done)" archive=yes]] + diff --git a/someevent.mdwn b/someevent.mdwn new file mode 100644 index 0000000..23d108b --- /dev/null +++ b/someevent.mdwn @@ -0,0 +1,116 @@ +--- +title: Evenemang några stycken +author: Fripost genom Gustav Eek +date: Augusti 2019 +... + +Här följer en lista på evenemang. Listan skapad med +ikiwikis [inline][inl_dr]-direktiv vilket tillhandahålls +av [inline][inl_pl]-insticksmodulen. + +**Innehåll** + +[[!toc levels=10]] + + +# Filtrering + +Passerde aktiviteter filtreras på en absolut wikietikett +([wikitag][tag]) `[[/events/done]]`. Kommande aktiviteter är således +alla övriga aktiviteter. + +Gällande etiketterna funkar wikilänkar ([wikilink][link]) med +godtycklig länktext, `[[Genomförd|/events/done]]`, men inte +Pandoc-länkar, `[genomförd](done)`. Ettiketter är väsentligen dolda +wikilänkar. + +Anledningen till att använda absoluta länkar är att mönstren (glob) +for filtreringen inte verkar fungera för relativa länkar. + +[inl_dr]: https://ikiwiki.info/ikiwiki/directive/inline/ +[inl_pl]: https://ikiwiki.info/plugins/inline/ +[link]: https://ikiwiki.info/ikiwiki/wikilink/ +[tag]: https://ikiwiki.info/ikiwiki/directive/tag/ + +# Sortering + +Visningsordning ska vara omvänt per datum. Tekniskt hur sidorna ska +sorteras är dock inte trivialt. Läs +till [sorting (pagespec)][sorting]. Idealt vore om YAML-metadatafältet +*date* kunde snappats upp (se avsnitt [Metadata och Pandoc]) nedan). + +Förmodligen blir det ikiwiki-direktivet [meta][meta] med parameter +*sortas* som gäller. + +[sorting]: https://ikiwiki.info/ikiwiki/pagespec/sorting/ +[meta]: https://ikiwiki.info/ikiwiki/directive/meta/ + + +# Mallar + +Inkluderingen kontrolleras genom ikiwikis mallar +([templates][templ]). Undertecknade identifierar två fall + + 1. Fullständig visning + 2. Kort översiktslista, typ innehållsförteckning + +Den förra har standardmall *inlinepage.tmpl* +(`template=inlinepage`). Den senare visar inget innehåll, bara +meta-data, varför parametern `archive=yes` ska sättas, och har +standardmall *archivepage.tmpl* (`template=archivepage`). + +Rubriker i de inkluderande dokumenten orsakar såklart +problem. Förmodligen skulle man bara inkludera fram till första +rubriken. + +[templ]: https://ikiwiki.info/ikiwiki/directive/template/ + +# Metadata och Pandoc {#meta} + +En utmaning är att konstruera mallar utifrån Pandoc YAML metadata. För +det behöver insticksmodulen skrven i Perl kompletteras och eventuellt +något mer. I skrivande stund (sep 2019) har undertecknade inte +lyckats. En modifierad version finns i detta förråd, +*/.ikiwiki/IkiWiki/Plugin/pandoc.pm*. Dock är det versionen i +hemkatalogen, *~/.ikiwiki/IkiWiki/Plugin/pandoc.pm* som exekveras. + +Processen har flera steg: + + 1. Pandoc + 1. Extrahera YAML metadata från Markdown-filen + 2. Exportera den som JSON (mellanlagring) + 2. Ikiwiki + 3. Gör tillgänglig som HTML mallvariabel + 4. Placera i mallen: `<TMPL_VAR DATE>` + +# Kommande + +[[!inline pages="events/* and !*/done and !link(*/done)" archive=yes]] + +# Genomförda 2013 -- empty + +[[!inline + pages="events/2013/* and !*/done and link(*/done)" + sort="meta(title)" + reverse=yes + archive=yes + template=empty +]] + +# Genomförda 2013 -- nonempty + +[[!inline + pages="events/2013/* and !*/done and link(*/done)" + sort="meta(title)" + reverse=yes + archive=yes + template=nonempty +]] + +# Genomförda 2013 -- fullständig + +[[!inline + pages="events/2013/* and !*/done and link(*/done)" + sort="meta(title)" + reverse=yes +]] |