#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
 MoinMoin AgPics Parser
 
 @author: Yun, Jonghyouk <ageldama@gmail.com> 2007-03-22
"""

Dependencies = []
import os, sys, string, re
import glob, os.path, stat
import Image
from datetime import datetime
import time
import Image
from MoinMoin.action import AttachFile
from MoinMoin import wikiutil, config
from MoinMoin.Page import Page
from MoinMoin.parser import wiki

### utf8 only?
import sys; reload(sys)
sys.setdefaultencoding('utf8')

### Constants
## gallery2에서 제일 작은 미리보기.
thumbnail_prefix  = "thumbnail_"
thumbnail_regex   = re.compile("^thumbnail_.*")
thumbnail_size    = [256, 256]
## gallery2에서 중간크기 미리보기.
webnail_prefix    = "webnail_"
webnail_regex     = re.compile("^webnail_.*")
## 이미지 파일의 정규식.
image_regex      = re.compile(".*\.(jpg|jpeg|gif|png)$", re.I)

### helpers
def list_all_files(path):
  """특정 디렉토리의 모든 파일명을 되돌린다."""
  return glob.glob(path+"/*")

def filter_filename_matches(regex, files, is_except=False):
  """정규식에 각 파일이름들이 매치하는지(혹은 아닌지)에 따라 그를 걸러낸다"""
  if is_except:
    inv = lambda b: not b
  else:
    inv = lambda b: b
  return filter(lambda f: inv(regex.match(os.path.basename(f))), files)

def filter_image_files(files):
  return filter_filename_matches(image_regex, files)

def filter_except_thumbnails(files):
  return filter_filename_matches(thumbnail_regex, files, True)

def filter_except_webnails(files):
  return filter_filename_matches(webnail_regex, files, True)

def get_attach_url(page, request, file):
  #return page.url(request)+"?action=AttachFile&do=get&target="+wikiutil.url_quote(file)
  return AttachFile.getAttachUrl(page.page_name, file, request)

def filter_only_images(files):
  return filter_except_webnails(filter_except_thumbnails(filter_image_files(files)))

def desc_by_mtime(files):
  ## mtime 기준으로 **역순** 정렬하기!
  l = [ (os.stat(f)[stat.ST_MTIME], f) for f in files ]
  l.sort(lambda l, r: cmp(r[0],l[0]))
  return [ f[1] for f in l ]

def attach_path(page, request):
  return AttachFile.getAttachDir(request, page.page_name, create=1)

def thumbnail_filename(file):
  return thumbnail_prefix+os.path.basename(file)

### AgPics Parser Class
class Parser:
  def __init__(self, raw, request, **kw):
    self.raw = raw
    self.request = request
    self.form = request.form
    self._ = request.getText
    self.kw = {}
    for arg in kw.get('format_args','').split(','):
      if arg.find('=') > -1:
        key, value=arg.split('=')
        self.kw[key]=wikiutil.escape(value, quote=1)
        
  def format(self, formatter):
    page    = formatter.page
    request = self.request
    cur_pagename  =page.page_name
    cur_pageurl   =page.url(request)
    ## 각 파일들에 대해서...
    attchpath = attach_path(page, request)
    all_files = list_all_files(attchpath)
    img_files = filter_only_images(all_files)
    request.write("<ul>")
    for f in desc_by_mtime(img_files):
      ## 파일이름과 url
      abs_filename  = f
      filename      = os.path.basename(f)
      thumbfn       = thumbnail_filename(filename)
      abs_thumbfn   = os.path.dirname(f)+'/'+ thumbfn
      file_url      = get_attach_url(page, request, filename)
      ## stat!
      st = os.stat(f)
      ctime = datetime.fromtimestamp(st[stat.ST_CTIME])
      mtime = datetime.fromtimestamp(st[stat.ST_MTIME])
      ## 섬네일 없거나 원본보다 오래되었으면 만들기...
      mtime_orig = st[stat.ST_MTIME]#os.stat(abs_filename)[stat.ST_MTIME]
      try:
        mtime_thumb = os.stat(abs_thumbfn)[stat.ST_MTIME]
      except:
        mtime_thumb = 0
      img = Image.open(f)
      if mtime_orig > mtime_thumb:
        img_thumb = img.copy()
        img_thumb.thumbnail(thumbnail_size)
        img_thumb.save(abs_thumbfn, img_thumb.format)
      ## 내용출력.
      request.write("<li>")
      request.write("<a href='"+file_url+"'>")
      request.write("<img src='%s' alt='%s'></a><br>" % (get_attach_url(page, request, thumbfn), filename))
      request.write(" name(%s) size(%dx%d)<br>" % (filename, img.size[0], img.size[1]))
      request.write(" ctime(%s)<br> mtime(%s)" % (str(ctime), str(mtime)))
      request.write("<br>")
    request.write("</ul>")


##EOF