${edit:+$href }$ctime $blogtype $href2${edit:+$href3} $href4 $href5 |
`echo "$hexhead"|unhexize|htmlescape|hreflink|minitbl` |
: $limitedmsg ($((narts-$nlimit-1))件省略) : |
yuuji@807: $showalllink | yuuji@803: EOF yuuji@801: else yuuji@801: CAT=cat yuuji@801: fi yuuji@801: # Start blog_replies table yuuji@801: $CAT $midfile | yuuji@571: while IFS='|' read id edit notify uid author uname icon aid \ yuuji@571: tm reki new hte fa imgids yuuji@557: do yuuji@807: if [ -n "$omitline" ]; then yuuji@807: n=$((n+1)) yuuji@807: if [ $n -eq 1 ]; then yuuji@807: : yuuji@807: elif [ $n -eq 2 ]; then yuuji@807: cat $omitline yuuji@807: continue yuuji@807: elif [ $n -lt $((narts-nlimit+1)) ]; then yuuji@807: continue yuuji@807: fi yuuji@807: fi yuuji@629: mf2=$tmpd/midfile2 yuuji@407: cachefile="$td/$id.row.html" yuuji@407: stampfile="$td/$id.row.stamp" yuuji@408: editlink="${edit:+編集 }" yuuji@409: nt="" yuuji@559: # fa is file accessibility flag # err "----r=$aid fa=[$fa]----" yuuji@406: yuuji@406: # First, check the availability of user-icon. yuuji@406: # If not existent, clear and reset row cache by rm $stampfile yuuji@407: if [ ! -s "$icon" ]; then yuuji@407: rm -f "$stampfile"; unset stampfile yuuji@406: fi yuuji@403: if test -s "$stampfile" && yuuji@403: test -s "$cachefile" && yuuji@403: { ts=`cat "$stampfile"`; test -n "$ts"; } && yuuji@707: /bin/test "$ts" '>' "$tm" && # Cache timestamp is newer yuuji@422: test "$stampfile" -nt "$icon"; then # UserIcon is older yuuji@422: : Nothing to do yuuji@403: else yuuji@403: { ######## New ROW creation begins here ######## >$cachefile yuuji@641: cachestamp=$tmpd/cache.$$.stamp yuuji@641: touch $cachestamp yuuji@403: tdcls="__NEWCLS__repatt" yuuji@407: if [ -s "$icon" ]; then yuuji@407: icfn=`echo "$icon"|htmlescape` yuuji@570: picon="" yuuji@407: else yuuji@407: echo "DELETE FROM user_s WHERE key='$iconcachekey' AND yuuji@407: val=`sqlquotestr \"$icon\"`;" >> $iconcleaner yuuji@407: picon="" yuuji@407: fi yuuji@406: yuuji@403: cat<${picon}__EDIT__#$aid yuuji@749: `echo $uname|htmlescape` yuuji@571: ${reki:-$tm} yuuji@409: <__NOTIFY__> | yuuji@154: EOF yuuji@403: echo -n "" yuuji@403: echo "$hte"|unhexize|htmlescape|hreflink|minitbl yuuji@403: usecache='' tsfile=$td/$id.stamp yuuji@403: for i in $imgids; do yuuji@403: mrid=${i%%:*}; i=${i#*:}; sz=`size_h ${i%%:*}` yuuji@403: fn=`echo "${i#*:}"|unhexize` yuuji@403: fnb=$fn"(${sz})" yuuji@263: case "$fn" in yuuji@407: *.[Pp][Nn][Gg]|*.[Jj][Pp][Gg]|*.[Jj][Pp][Ee][Gg]|*.[GgTt][Ii][Ff]) yuuji@403: # fmt=${fn##*.} # convert - jpg:- is slow...why yuuji@403: case "$fn" in yuuji@403: *.[Pp][Nn][Gg]) fmt=png ;; yuuji@403: *.[Gg][Ii][Ff]) fmt=gif ;; yuuji@403: *) fmt=jpeg ;; yuuji@403: esac yuuji@403: outfile=$td/$mrid-${fn%.*}.$fmt yuuji@403: #err fn=$fn outfile=$outfile yuuji@403: #err "usecache=$usecache `ls -l $outfile`" yuuji@403: #err tm=$tm yuuji@403: #err tsfile=$tsfile=`cat $tsfile` yuuji@403: if [ -s "$outfile" ] && # $outfile should be > 0 yuuji@403: { [ "$usecache" ] || # And usecache flag is true, or... yuuji@403: { [ -s "$tsfile" ] && [ x"`cat $tsfile`" = x"$tm" ] yuuji@403: };}; then yuuji@403: usecache=1 # Set usecache flag on yuuji@403: cat<<-EOF yuuji@264: yuuji@264: $fnb yuuji@264: EOF yuuji@404: # !!NOTE!! Create row stamp ONLY WHEN imgcache is active yuuji@403: else yuuji@403: query "SELECT hex(bin) FROM article_m WHERE rowid=$mrid;" \ yuuji@629: > $mf2 # Stop query here 2020-04-23 yuuji@641: if cat $mf2 | unhexize \ yuuji@403: | convert -define ${fmt}:size=100x100 -resize 100x100'>' \ yuuji@641: - ${fmt}:- > $outfile yuuji@641: then yuuji@641: cat "$outfile" \ yuuji@403: | hexize \ yuuji@403: | sed -e 's/\(..\)/%\1/g' \ yuuji@403: -e "s|^|$fnb|" yuuji@641: unset stampfile # img data stream is not suitable to cache yuuji@641: echo $tm > $tsfile yuuji@641: else # Failed to convert yuuji@641: rm -f $outfile yuuji@641: echo "$fnb" yuuji@641: fi yuuji@403: fi yuuji@403: ;; yuuji@403: *) yuuji@557: echo "<__UNREADABLE__>$fnb" yuuji@403: ;; yuuji@403: esac yuuji@403: done yuuji@403: echo " | /s,,${notify:+$nt}," \
yuuji@559: -e "/<__UNREADABLE__>/s,,${fa:+$cannotread}," \
yuuji@408: $cachefile
yuuji@263: done
yuuji@452:
yuuji@843: help="=== コメントに使用できる特殊記法(記号は全て半角) ===
yuuji@452: 行頭に href=URL でURLへのリンク
yuuji@452: 行頭に iframe=URL でURL先を開く iframe
yuuji@843: 行頭「* 」で箇条書、次の行頭空白で継続、行頭詰めると箇条書終わり
yuuji@843: 行頭「1. 」で番号付、2行目以降も「1. 」で勝手に番号増える、行頭詰めで終わり
yuuji@452: [[#記事番号]] でs4内の記事番号に飛ぶリンク
yuuji@479: [[#検索キーワード]] でs4内の記事検索(記号はいくつか使えない)
yuuji@495: [[URL]] でURLへのリンク、 [[URL|文字列]]でアンカー文字列指定
yuuji@495: {{画像URL}} でインライン画像、 {{画像URL|幅}} でピクセル幅指定
yuuji@495: {{{URL}}} でURL先を開く iframe、 {{{URL|高さ}}} ピクセル高さ指定
yuuji@495: 行頭: ## 大見出し, ### 中見出し, #### 小見出し
yuuji@495: 行末の2連続スペースで強制改行( ) yuuji@487: |*見出し列|列2|列3… と行頭から始まる縦棒区切り行を続けて表 yuuji@503: ' *語群* ' で強調(両側の空白必要、** でもっと強調。*の代わりに _ でも可) yuuji@503: - [ ] と - [x] でチェックボックス" yuuji@452: touchhelp="${touchpanel:+ $help }" yuuji@513: filehelp="《添付の注意》 yuuji@513: $file_accept_help" yuuji@878: ntmode="通知モード=$blog_notify${blog_team:+ (team=$blog_team)} yuuji@878: 記事の1行目を「## 」(半角シャープシャープ空白=大見出し) yuuji@884: にするとそれより後ろの部分がSubject(件名)になります。 yuuji@878: If the first line begins with "## ", sent it as Subject of email." yuuji@837: textform=$(cat<<-EOF yuuji@837:
yuuji@341:
yuuji@837: EOF
yuuji@837: )
yuuji@219: cat<<-EOF
yuuji@239:
yuuji@193:
|
---|
再読込 / 先頭へ yuuji@823: ${showalllink:+/ `echo $showalllink|sed 's/n:all/&\#bottom/'`$limitedmsg}
yuuji@219: EOF yuuji@219: $iswritable && cat<<-EOF yuuji@219:\)\([^ ]*\) \(.*\) | ,\1$hrb\2\">\3," -e 's,0 | ,0 | ,' yuuji@369: echo '
' yuuji@369: echo "$sql" | query | sed 's/^"[0-9]* /"/' yuuji@369: echo "" yuuji@373: echo "
縦持ちCSV" yuuji@369: else yuuji@369: contenttype "Application/CSV" yuuji@369: printf ".mode csv\n.header ON\n" | query >/dev/null yuuji@369: fn=report-count.csv yuuji@369: printf 'Content-Disposition: filename="%s"\n' "$fn" yuuji@379: outfile=$tmpd/out-$$.csv yuuji@369: echo "$sql" | query | sed 's/^"[0-9]* /"/' > $outfile yuuji@369: echo "Content-Length: " `cat $outfile | wc -c`; echo yuuji@369: yuuji@369: cat $outfile yuuji@369: exit 0 yuuji@369: fi yuuji@369: printf ".mode list\n.header OFF\n.separator |\n" | query yuuji@0: } yuuji@0: lshandoutsub() { yuuji@369: # $1=owner $2=rowid of blog &optional $3=temp_table name yuuji@369: qgname=`sqlquote "$1"` yuuji@436: if isgroup "$1"; then yuuji@369: sample="(select user from grp_mem where gname=$qgname)" yuuji@2: else yuuji@2: sample="(select distinct author as user from arts)" yuuji@67: echo "(集計は板への投稿者のみ)" | html p yuuji@2: fi yuuji@369: tmpname="${3:-handout_$2}" yuuji@369: sql="CREATE TEMPORARY TABLE IF NOT EXISTS $tmpname AS yuuji@369: with arts as (select id,author from article \ yuuji@0: where blogid=(select id from blog where rowid=$2))\ yuuji@0: select (select rowid from user where name=c0.user)||' '|| \ yuuji@366: (select gecos from gecoses where name=c0.user) as 'メンバー',\ yuuji@373: substr(c0.user, 1, instr(c0.user, '@')-1) 'uname',\ yuuji@0: sum(case when c1.key is not null then 1 else 0 end)\ yuuji@369: as '[$title] コメント記入',\ yuuji@0: sum(case when c2.key is not null then 1 else 0 end)\ yuuji@369: as '[$title] ファイルの提出'\ yuuji@2: from $sample c0 \ yuuji@0: left join (select id,author from arts) a\ yuuji@0: on c0.user=a.author\ yuuji@0: left join (select id,key from article_s where key='text') c1\ yuuji@0: on a.id=c1.id left join (select id,key from article_m ) c2\ yuuji@369: on c1.id=c2.id group by c0.user order by c0.user;\ yuuji@369: \ yuuji@369: SELECT * FROM $tmpname;" yuuji@597: # err ishandoutsub: sql="$sql" yuuji@369: echo "$sql" | lshandout_ulink_table yuuji@0: } yuuji@2: gethandout() { yuuji@2: # $1=rowid of blog yuuji@579: rid=`numericalize "$1"` yuuji@866: test x"$2" = x"by_uname" && by_uname="$2" yuuji@579: blog_writable $rid $user yuuji@461: rc=$? # =0: writable, $BLOG_NOTMEM bit set => not member yuuji@402: if [ $((rc & $BLOG_NOTMEM)) -gt 0 ] ; then yuuji@592: contenttype; echo yuuji@64: echo "メンバー以外は利用できません。" | html p; return yuuji@64: fi yuuji@592: # Here, this blog is writable by $user yuuji@774: mode=`getvalbyid blog mode $1` yuuji@592: owner=`getvalbyid blog owner $1` yuuji@774: blogauthor=`getvalbyid blog author $1` yuuji@774: isopenblogauthor=false yuuji@592: if [ x"$user" = x"$owner" ]; then yuuji@592: : OK yuuji@592: elif isgrpowner "$user" "$owner"; then yuuji@592: : OK yuuji@774: elif [ x"$blogauthor" = x"$user" ]; then yuuji@774: # Non-admin Author of blog cannot do gethandout() in report-closed mode yuuji@774: # for avoidance the risk of fake report-closed blog. yuuji@774: case "$mode" in # Only report-open can be handled by blog author yuuji@774: *open*) isopenblogauthor=true ;; yuuji@774: esac yuuji@592: else yuuji@592: contenttype; echo yuuji@774: echo "グループ管理者のみ取得できます。" | html p; return yuuji@592: fi yuuji@592: copy2csv=false yuuji@592: blogid=`getvalbyid blog id $1` yuuji@592: isgroup "$owner" && isgroup=true || isgroup=false yuuji@592: isgrpowner "$user" "$owner" && isgrpadmin=true || isgrpadmin=false yuuji@592: yuuji@2: i=0 yuuji@629: midfile=$tmpd/midfile yuuji@2: bd=$tmpd/archive.$$ yuuji@2: mkdir $bd yuuji@592: case "$mode" in yuuji@616: *quiz*) yuuji@616: copy2csv=true ;; yuuji@592: *enquete*) yuuji@592: copy2csv=true yuuji@592: csvline=`getvalbyid blog heading $1 | grep "..*,." | head -1` yuuji@592: # Create CSV-base table for questionnaire yuuji@592: # If heading in blog_s has at least 1 CSV line, yuuji@592: # we take the line as column list. yuuji@592: # Otherwise we produce two column CSV as below: yuuji@592: # USER,ANSWER yuuji@595: query "DROP TABLE IF EXISTS tmp_q;" yuuji@592: if [ -n "$csvline" ]; then yuuji@595: query <<-EOF yuuji@595: CREATE TEMPORARY TABLE tmp_q("user", $csvline); yuuji@595: EOF yuuji@595: if [ $? != 0 ]; then yuuji@595: contenttype; echo yuuji@595: cat <<-EOF | html p; exit yuuji@595: 掲示板のヘッダにあるCSV定義が不正でCSV出力できません。 yuuji@595: $csvline yuuji@595: 空白なしの項目名を半角カンマ区切りで1行で書いてください。 yuuji@595: EOF yuuji@595: fi yuuji@592: else yuuji@592: query <<-EOF yuuji@592: CREATE TEMPORARY TABLE tmp_q(user text PRIMARY KEY, answer); yuuji@592: EOF yuuji@592: fi yuuji@592: esac yuuji@595: if $copy2csv; then yuuji@595: mkdir $bd/$rid yuuji@595: outcsv=$bd/$rid/migrate-$rid.csv yuuji@616: fullcsv=$bd/$rid/all-text-full-$rid.csv yuuji@595: sq "$db" <<-EOF | tr '|' ',' > $outcsv yuuji@595: SELECT author as "USER", yuuji@595: replace(val, x'0a', ',') as "${csvline:-ANSWER}" yuuji@595: FROM article a JOIN article_s s ON a.id=s.id yuuji@595: AND blogid=(SELECT id FROM blog WHERE rowid=$rid) yuuji@595: AND s.key='text'; yuuji@595: EOF yuuji@616: sq "$db" <<-EOF > $fullcsv yuuji@616: .mode csv yuuji@616: .head 1 yuuji@616: SELECT author as "ユーザ", yuuji@616: (SELECT gecos FROM gecoses g WHERE author=g.name) as "表示名", yuuji@616: val as "テキスト" yuuji@616: FROM article a JOIN article_s s ON a.id=s.id yuuji@616: AND blogid=(SELECT id FROM blog WHERE rowid=$rid) yuuji@616: AND s.key='text'; yuuji@616: EOF yuuji@595: fi yuuji@629: query <<-EOF > $midfile # Using tempfile for quick db-unlock yuuji@616: SELECT a.rowid, a.id artid, a.author, hex(s.val) yuuji@592: FROM article a JOIN article_s s ON a.id=s.id yuuji@866: WHERE blogid=(SELECT id FROM blog WHERE rowid=$rid) yuuji@866: ORDER BY a.rowid; yuuji@592: EOF yuuji@629: cat $midfile | while IFS='|' read rowid artid author text; do yuuji@774: $isgrpowner || $isopenblogauthor \ yuuji@774: || isfilereadable $user article_s $rowid || continue yuuji@866: if [ "$by_uname" ]; then yuuji@866: dir=`printf $bd/%d/%s "$rid" "$author"` yuuji@866: else yuuji@866: dir=`printf $bd/%d/%06d "$rid" "$rowid"` yuuji@866: fi yuuji@866: txt=`printf %06d $rowid`.txt yuuji@867: test -d "$dir" || mkdir -p "$dir" yuuji@867: echo "$author" > "$dir"/Author.txt yuuji@867: echo "$text" | unhexize > "$dir/$txt" yuuji@592: i=0 yuuji@592: query "SELECT m.rowid, m.val FROM article_m m \ yuuji@592: WHERE id='$artid' AND m.key IN ('image', 'document', 'binary');" \ yuuji@592: | while IFS='|' read mrowid filename; do yuuji@620: i=$((i+1)) yuuji@866: if [ "$by_uname" ]; then yuuji@866: outfile=`printf "%s/%06d-%s" "$dir" $rowid "$filename"` yuuji@866: else yuuji@866: outfile=`printf "%s/%02d-%s" "$dir" $i "$filename"` yuuji@866: fi yuuji@592: query "SELECT quote(bin) FROM article_m WHERE rowid=$mrowid;" \ yuuji@866: | unhexize > "$outfile" yuuji@592: done yuuji@592: done yuuji@592: if [ ! -d $bd/$rid ]; then yuuji@2: contenttype; echo yuuji@67: echo "取得できるファイルがありませんでした。" | html p yuuji@2: return yuuji@2: fi yuuji@592: yuuji@592: if $copy2csv; then yuuji@616: query <<-EOF > $bd/$rid/all-text-1stline-$rid.csv yuuji@592: .mode csv yuuji@592: .head 1 yuuji@766: CREATE TEMPORARY TABLE IF NOT EXISTS tmp_q("user", "TEXT"); yuuji@595: .import $outcsv tmp_q yuuji@592: SELECT * FROM tmp_q; yuuji@592: .mode list yuuji@592: .head 0 yuuji@592: EOF yuuji@592: fi yuuji@592: err "BDLIST: `ls -l $bd`" yuuji@592: arcname=archive-$rid.tar.gz yuuji@658: ### outstdout=true yuuji@2: (cd $bd yuuji@592: # query() CANNOT BE used in this subshell yuuji@658: if [ "$outstdout" ]; then yuuji@658: cat <<-EOF yuuji@658: Content-type: application/x-gzip yuuji@658: Content-Disposition: filename="$arcname" yuuji@658: yuuji@658: EOF yuuji@658: tar zcf - $rid yuuji@658: return yuuji@658: else yuuji@658: tar zcf .archive.tar.gz $rid && mv .archive.tar.gz "$arcname" yuuji@658: err Creating tar archive "`ls -l "$arcname"`" yuuji@658: fi yuuji@2: ) yuuji@592: arcfile=$bd/$arcname yuuji@2: echo "Content-type: application/x-gzip" yuuji@592: echo "Content-Length: `cat $arcfile|wc -c`" yuuji@592: echo "Content-Disposition: filename=\"$arcname\"" yuuji@2: echo yuuji@592: cat $arcfile yuuji@2: } yuuji@462: blogseen() { # $1 = blogid yuuji@462: blogid=${1%%[!0-9]*} yuuji@462: if [ -z "$blogid" ]; then yuuji@462: echo "Invalid blog id" | html p; exit yuuji@462: fi yuuji@462: blog_writable "$blogid" "$user" yuuji@462: rc=$? # =0: writable, $BLOG_NOTMEM bit set => not member yuuji@462: if [ $((rc & $BLOG_NOTMEM)) -gt 0 ] ; then yuuji@462: echo "メンバー以外は利用できません。" | html p; return yuuji@462: fi yuuji@462: owner=`getvalbyid blog owner $rowid` yuuji@467: qowner=`sqlquotestr "$owner"` yuuji@467: grprowid=`query "SELECT rowid FROM grp WHERE gname=$qowner;"` yuuji@467: ge=`gecos "$owner" | htmlescape` yuuji@467: title=`getvalbyid blog title $rowid | htmlescape` yuuji@467: h1="アクセス時刻" yuuji@467: link2board="$title" yuuji@467: link2group="$ge" yuuji@467: _m4 -D_TITLE_="$h1" $layout/html.m4.html yuuji@467: echo "$h1" | html h1 yuuji@467: echo "[$link2board]@$link2group" | html h2 yuuji@462: warn=' class="warn"' yuuji@462: cat <<-EOF yuuji@464:
メンバー | uname | 最終閲覧時刻 | "} # If the variable time is set, td= | yuuji@462: td=${td:-" | "} # else td= | yuuji@462: cat <<-EOF yuuji@462: |
---|---|---|
`echo "$hexge"|unhexize|htmlescape` | yuuji@462:`echo ${u%%@*}|htmlescape` | yuuji@462: $td${time:----}