<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://wiki.conaondaapps.com/index.php?action=history&amp;feed=atom&amp;title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4%3AAutoCreate.js</id>
	<title>미디어위키:AutoCreate.js - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.conaondaapps.com/index.php?action=history&amp;feed=atom&amp;title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4%3AAutoCreate.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.conaondaapps.com/index.php?title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4:AutoCreate.js&amp;action=history"/>
	<updated>2026-08-20T16:44:02Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.conaondaapps.com/index.php?title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4:AutoCreate.js&amp;diff=83&amp;oldid=prev</id>
		<title>Admina7ec671ac513: migrate: import legacy Wiki content to Vultr</title>
		<link rel="alternate" type="text/html" href="https://wiki.conaondaapps.com/index.php?title=%EB%AF%B8%EB%94%94%EC%96%B4%EC%9C%84%ED%82%A4:AutoCreate.js&amp;diff=83&amp;oldid=prev"/>
		<updated>2026-08-20T04:19:35Z</updated>

		<summary type="html">&lt;p&gt;migrate: import legacy Wiki content to Vultr&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* Conaonda Wiki - 텍스트 선택 자동 문서 생성 (MediaWiki:AutoCreate.js) */&lt;br /&gt;
/*&lt;br /&gt;
 * 위키 페이지에서 텍스트를 선택하면 X(트위터) 모바일처럼 플로팅 메뉴가&lt;br /&gt;
 * 나타난다. &amp;#039;페이지 자동 생성&amp;#039;을 누르면 Worker(/api/generate)가 OpenCode Zen으로&lt;br /&gt;
 * 위키텍스트 초안을 생성하고, &amp;#039;Conaonda Wiki:초안/&amp;lt;키워드&amp;gt;&amp;#039; 문서로 저장한다.&lt;br /&gt;
 * &amp;#039;승인 · 본문으로 이동&amp;#039; 버튼으로 본문 문서로 이동(history 보존)할 수 있다.&lt;br /&gt;
 * 로그인 사용자만 동작한다.&lt;br /&gt;
 */&lt;br /&gt;
( function () {&lt;br /&gt;
  if ( !window.mw || !mw.config ) return;&lt;br /&gt;
  if ( !mw.config.get( &amp;#039;wgUserName&amp;#039; ) ) return;&lt;br /&gt;
  if ( !mw.loader || !mw.loader.using ) return;&lt;br /&gt;
  mw.loader.using( &amp;#039;mediawiki.util&amp;#039; ).then( function () { start(); } );&lt;br /&gt;
&lt;br /&gt;
  function start() {&lt;br /&gt;
  var API = mw.config.get( &amp;#039;wgScriptPath&amp;#039; ) + &amp;#039;/api.php&amp;#039;;&lt;br /&gt;
  var MAX_TITLE = 60;&lt;br /&gt;
&lt;br /&gt;
  /* ---------- DOM helpers ---------- */&lt;br /&gt;
  function el( tag, className, text ) {&lt;br /&gt;
    var node = document.createElement( tag );&lt;br /&gt;
    if ( className ) node.className = className;&lt;br /&gt;
    if ( text !== undefined ) node.textContent = text;&lt;br /&gt;
    return node;&lt;br /&gt;
  }&lt;br /&gt;
  function css( node, props ) {&lt;br /&gt;
    for ( var key in props ) node.style[key] = props[key];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var MENU_STYLE = {&lt;br /&gt;
    position: &amp;#039;fixed&amp;#039;, zIndex: 99999, background: &amp;#039;#fff&amp;#039;, color: &amp;#039;#202122&amp;#039;,&lt;br /&gt;
    border: &amp;#039;1px solid #a2a9b1&amp;#039;, borderRadius: &amp;#039;4px&amp;#039;,&lt;br /&gt;
    boxShadow: &amp;#039;0 2px 8px rgba(0,0,0,.25)&amp;#039;, padding: &amp;#039;4px 0&amp;#039;,&lt;br /&gt;
    fontFamily: &amp;#039;inherit&amp;#039;, fontSize: &amp;#039;13px&amp;#039;, minWidth: &amp;#039;160px&amp;#039;&lt;br /&gt;
  };&lt;br /&gt;
  var ITEM_STYLE = { padding: &amp;#039;7px 14px&amp;#039;, cursor: &amp;#039;pointer&amp;#039;, whiteSpace: &amp;#039;nowrap&amp;#039; };&lt;br /&gt;
  var OVERLAY_STYLE = {&lt;br /&gt;
    position: &amp;#039;fixed&amp;#039;, top: &amp;#039;0&amp;#039;, left: &amp;#039;0&amp;#039;, width: &amp;#039;100%&amp;#039;, height: &amp;#039;100%&amp;#039;,&lt;br /&gt;
    background: &amp;#039;rgba(0,0,0,.45)&amp;#039;, zIndex: 100000,&lt;br /&gt;
    display: &amp;#039;flex&amp;#039;, alignItems: &amp;#039;center&amp;#039;, justifyContent: &amp;#039;center&amp;#039;&lt;br /&gt;
  };&lt;br /&gt;
  var PANEL_STYLE = {&lt;br /&gt;
    background: &amp;#039;#fff&amp;#039;, color: &amp;#039;#202122&amp;#039;, borderRadius: &amp;#039;6px&amp;#039;, padding: &amp;#039;20px 24px&amp;#039;,&lt;br /&gt;
    maxWidth: &amp;#039;440px&amp;#039;, width: &amp;#039;calc(100% - 48px)&amp;#039;,&lt;br /&gt;
    boxShadow: &amp;#039;0 4px 16px rgba(0,0,0,.3)&amp;#039;, fontSize: &amp;#039;14px&amp;#039;, lineHeight: &amp;#039;1.6&amp;#039;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  var menuEl = null;&lt;br /&gt;
  var overlayEl = null;&lt;br /&gt;
&lt;br /&gt;
  /* ---------- 선택 감지와 플로팅 메뉴 ---------- */&lt;br /&gt;
  function isEditable( node ) {&lt;br /&gt;
    while ( node &amp;amp;&amp;amp; node.nodeType === 1 ) {&lt;br /&gt;
      var tag = node.tagName.toLowerCase();&lt;br /&gt;
      if ( tag === &amp;#039;input&amp;#039; || tag === &amp;#039;textarea&amp;#039; || node.isContentEditable ) return true;&lt;br /&gt;
      node = node.parentNode;&lt;br /&gt;
    }&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function selectionInfo() {&lt;br /&gt;
    var sel = window.getSelection();&lt;br /&gt;
    if ( !sel || sel.isCollapsed || !sel.rangeCount ) return null;&lt;br /&gt;
    if ( isEditable( sel.anchorNode ) || isEditable( sel.focusNode ) ) return null;&lt;br /&gt;
    var text = sel.toString().replace( /\s+/g, &amp;#039; &amp;#039; ).trim();&lt;br /&gt;
    if ( text.length &amp;lt; 2 || text.length &amp;gt; MAX_TITLE ) return null;&lt;br /&gt;
    return { text: text, rect: sel.getRangeAt( 0 ).getBoundingClientRect() };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function hideMenu() {&lt;br /&gt;
    if ( menuEl ) { menuEl.remove(); menuEl = null; }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function showMenu( info ) {&lt;br /&gt;
    hideMenu();&lt;br /&gt;
    menuEl = el( &amp;#039;div&amp;#039;, &amp;#039;cx-gen-menu&amp;#039; );&lt;br /&gt;
    css( menuEl, MENU_STYLE );&lt;br /&gt;
    var item = el( &amp;#039;div&amp;#039;, &amp;#039;cx-gen-item&amp;#039;, &amp;#039;⚡ 페이지 자동 생성&amp;#039; );&lt;br /&gt;
    css( item, ITEM_STYLE );&lt;br /&gt;
    item.addEventListener( &amp;#039;mouseenter&amp;#039;, function () { item.style.background = &amp;#039;#eaf3ff&amp;#039;; } );&lt;br /&gt;
    item.addEventListener( &amp;#039;mouseleave&amp;#039;, function () { item.style.background = &amp;#039;&amp;#039;; } );&lt;br /&gt;
    item.addEventListener( &amp;#039;click&amp;#039;, function ( e ) {&lt;br /&gt;
      e.preventDefault();&lt;br /&gt;
      e.stopPropagation();&lt;br /&gt;
      var keep = info.text;&lt;br /&gt;
      hideMenu();&lt;br /&gt;
      startGenerate( keep );&lt;br /&gt;
    } );&lt;br /&gt;
    menuEl.appendChild( item );&lt;br /&gt;
    document.body.appendChild( menuEl );&lt;br /&gt;
    var x = info.rect.left;&lt;br /&gt;
    var y = ( info.rect.bottom || info.rect.top ) + 6;&lt;br /&gt;
    var width = menuEl.offsetWidth;&lt;br /&gt;
    var height = menuEl.offsetHeight;&lt;br /&gt;
    if ( x + width &amp;gt; window.innerWidth - 8 ) x = Math.max( 8, window.innerWidth - width - 8 );&lt;br /&gt;
    if ( y + height &amp;gt; window.innerHeight - 8 ) y = Math.max( 8, ( info.rect.top || info.rect.bottom ) - height - 6 );&lt;br /&gt;
    menuEl.style.left = Math.max( 8, x ) + &amp;#039;px&amp;#039;;&lt;br /&gt;
    menuEl.style.top = Math.max( 8, y ) + &amp;#039;px&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function onSelection() {&lt;br /&gt;
    var info = selectionInfo();&lt;br /&gt;
    if ( !info ) { hideMenu(); return; }&lt;br /&gt;
    showMenu( info );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  document.addEventListener( &amp;#039;mouseup&amp;#039;, onSelection );&lt;br /&gt;
  document.addEventListener( &amp;#039;touchend&amp;#039;, function () { setTimeout( onSelection, 0 ); } );&lt;br /&gt;
  document.addEventListener( &amp;#039;scroll&amp;#039;, hideMenu, true );&lt;br /&gt;
  window.addEventListener( &amp;#039;resize&amp;#039;, hideMenu );&lt;br /&gt;
  document.addEventListener( &amp;#039;mousedown&amp;#039;, function ( e ) {&lt;br /&gt;
    if ( menuEl &amp;amp;&amp;amp; !menuEl.contains( e.target ) ) hideMenu();&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
  /* ---------- 오버레이/결과 UI ---------- */&lt;br /&gt;
  function hideOverlay() {&lt;br /&gt;
    if ( overlayEl ) { overlayEl.remove(); overlayEl = null; }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function showOverlay( inner ) {&lt;br /&gt;
    hideOverlay();&lt;br /&gt;
    overlayEl = el( &amp;#039;div&amp;#039;, &amp;#039;cx-gen-overlay&amp;#039; );&lt;br /&gt;
    css( overlayEl, OVERLAY_STYLE );&lt;br /&gt;
    var panel = el( &amp;#039;div&amp;#039;, &amp;#039;cx-gen-panel&amp;#039; );&lt;br /&gt;
    css( panel, PANEL_STYLE );&lt;br /&gt;
    panel.appendChild( inner );&lt;br /&gt;
    overlayEl.appendChild( panel );&lt;br /&gt;
    document.body.appendChild( overlayEl );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function styleButton( button, primary ) {&lt;br /&gt;
    css( button, {&lt;br /&gt;
      border: primary ? &amp;#039;1px solid #36c&amp;#039; : &amp;#039;1px solid #a2a9b1&amp;#039;,&lt;br /&gt;
      background: primary ? &amp;#039;#36c&amp;#039; : &amp;#039;#f8f9fa&amp;#039;, color: primary ? &amp;#039;#fff&amp;#039; : &amp;#039;#202122&amp;#039;,&lt;br /&gt;
      borderRadius: &amp;#039;2px&amp;#039;, padding: &amp;#039;6px 14px&amp;#039;, cursor: &amp;#039;pointer&amp;#039;, fontSize: &amp;#039;13px&amp;#039;&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function showGenerating( title ) {&lt;br /&gt;
    var box = el( &amp;#039;div&amp;#039; );&lt;br /&gt;
    var spinner = el( &amp;#039;div&amp;#039;, &amp;#039;cx-gen-spinner&amp;#039;, &amp;#039;⏳&amp;#039; );&lt;br /&gt;
    css( spinner, { fontSize: &amp;#039;28px&amp;#039;, textAlign: &amp;#039;center&amp;#039;, marginBottom: &amp;#039;10px&amp;#039; } );&lt;br /&gt;
    var msg = el( &amp;#039;div&amp;#039;, null, &amp;#039;「&amp;#039; + title + &amp;#039;」 문서를 생성하는 중입니다...&amp;#039; );&lt;br /&gt;
    css( msg, { textAlign: &amp;#039;center&amp;#039;, fontWeight: &amp;#039;600&amp;#039; } );&lt;br /&gt;
    var sub = el( &amp;#039;div&amp;#039;, null, &amp;#039;완료되면 초안을 확인하거나 승인할 수 있습니다.&amp;#039; );&lt;br /&gt;
    css( sub, { textAlign: &amp;#039;center&amp;#039;, color: &amp;#039;#72777d&amp;#039;, fontSize: &amp;#039;12px&amp;#039;, marginTop: &amp;#039;6px&amp;#039; } );&lt;br /&gt;
    box.appendChild( spinner );&lt;br /&gt;
    box.appendChild( msg );&lt;br /&gt;
    box.appendChild( sub );&lt;br /&gt;
    showOverlay( box );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function showError( message ) {&lt;br /&gt;
    var box = el( &amp;#039;div&amp;#039; );&lt;br /&gt;
    var msg = el( &amp;#039;div&amp;#039;, null, &amp;#039;❌ &amp;#039; + message );&lt;br /&gt;
    css( msg, { color: &amp;#039;#b32424&amp;#039;, fontWeight: &amp;#039;600&amp;#039;, marginBottom: &amp;#039;14px&amp;#039; } );&lt;br /&gt;
    var close = el( &amp;#039;button&amp;#039;, null, &amp;#039;닫기&amp;#039; );&lt;br /&gt;
    styleButton( close, false );&lt;br /&gt;
    close.addEventListener( &amp;#039;click&amp;#039;, hideOverlay );&lt;br /&gt;
    box.appendChild( msg );&lt;br /&gt;
    box.appendChild( close );&lt;br /&gt;
    showOverlay( box );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function showExists( urlOrTitle ) {&lt;br /&gt;
    var box = el( &amp;#039;div&amp;#039; );&lt;br /&gt;
    var msg = el( &amp;#039;div&amp;#039;, null, &amp;#039;이미 작성된 문서입니다.&amp;#039; );&lt;br /&gt;
    css( msg, { fontWeight: &amp;#039;700&amp;#039;, marginBottom: &amp;#039;14px&amp;#039; } );&lt;br /&gt;
    var open = el( &amp;#039;button&amp;#039;, null, &amp;#039;문서 열기&amp;#039; );&lt;br /&gt;
    styleButton( open, true );&lt;br /&gt;
    open.addEventListener( &amp;#039;click&amp;#039;, function () {&lt;br /&gt;
      location.href = /^https?:/.test( urlOrTitle ) ? urlOrTitle : mw.util.getUrl( urlOrTitle );&lt;br /&gt;
    } );&lt;br /&gt;
    var close = el( &amp;#039;button&amp;#039;, null, &amp;#039;닫기&amp;#039; );&lt;br /&gt;
    styleButton( close, false );&lt;br /&gt;
    close.addEventListener( &amp;#039;click&amp;#039;, hideOverlay );&lt;br /&gt;
    box.appendChild( msg );&lt;br /&gt;
    box.appendChild( open );&lt;br /&gt;
    box.appendChild( close );&lt;br /&gt;
    showOverlay( box );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function showResult( info ) {&lt;br /&gt;
    var box = el( &amp;#039;div&amp;#039; );&lt;br /&gt;
    var head = el( &amp;#039;div&amp;#039;, null, &amp;#039;✅ 초안이 생성되었습니다.&amp;#039; );&lt;br /&gt;
    css( head, { fontWeight: &amp;#039;700&amp;#039;, marginBottom: &amp;#039;6px&amp;#039; } );&lt;br /&gt;
    var sub = el( &amp;#039;div&amp;#039;, null, &amp;#039;「&amp;#039; + info.title + &amp;#039;」 초안: &amp;#039; + info.draftTitle );&lt;br /&gt;
    css( sub, { color: &amp;#039;#54595d&amp;#039;, fontSize: &amp;#039;12px&amp;#039;, marginBottom: &amp;#039;16px&amp;#039;, wordBreak: &amp;#039;break-all&amp;#039; } );&lt;br /&gt;
    var row = el( &amp;#039;div&amp;#039; );&lt;br /&gt;
    css( row, { display: &amp;#039;flex&amp;#039;, gap: &amp;#039;8px&amp;#039;, flexWrap: &amp;#039;wrap&amp;#039; } );&lt;br /&gt;
    var draftBtn = el( &amp;#039;button&amp;#039;, null, &amp;#039;초안 보기&amp;#039; );&lt;br /&gt;
    styleButton( draftBtn, false );&lt;br /&gt;
    draftBtn.addEventListener( &amp;#039;click&amp;#039;, function () { location.href = mw.util.getUrl( info.draftTitle ); } );&lt;br /&gt;
    var approveBtn = el( &amp;#039;button&amp;#039;, null, &amp;#039;승인 · 본문으로 이동&amp;#039; );&lt;br /&gt;
    styleButton( approveBtn, true );&lt;br /&gt;
    approveBtn.addEventListener( &amp;#039;click&amp;#039;, function () { approve( info ); } );&lt;br /&gt;
    var close = el( &amp;#039;button&amp;#039;, null, &amp;#039;닫기&amp;#039; );&lt;br /&gt;
    styleButton( close, false );&lt;br /&gt;
    close.addEventListener( &amp;#039;click&amp;#039;, hideOverlay );&lt;br /&gt;
    row.appendChild( draftBtn );&lt;br /&gt;
    row.appendChild( approveBtn );&lt;br /&gt;
    row.appendChild( close );&lt;br /&gt;
    box.appendChild( head );&lt;br /&gt;
    box.appendChild( sub );&lt;br /&gt;
    box.appendChild( row );&lt;br /&gt;
    showOverlay( box );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function showApproved( title ) {&lt;br /&gt;
    var box = el( &amp;#039;div&amp;#039; );&lt;br /&gt;
    var msg = el( &amp;#039;div&amp;#039;, null, &amp;#039;✅ 「&amp;#039; + title + &amp;#039;」 문서로 게시되었습니다.&amp;#039; );&lt;br /&gt;
    css( msg, { fontWeight: &amp;#039;700&amp;#039;, marginBottom: &amp;#039;14px&amp;#039; } );&lt;br /&gt;
    var open = el( &amp;#039;button&amp;#039;, null, &amp;#039;문서 열기&amp;#039; );&lt;br /&gt;
    styleButton( open, true );&lt;br /&gt;
    open.addEventListener( &amp;#039;click&amp;#039;, function () { location.href = mw.util.getUrl( title ); } );&lt;br /&gt;
    var close = el( &amp;#039;button&amp;#039;, null, &amp;#039;닫기&amp;#039; );&lt;br /&gt;
    styleButton( close, false );&lt;br /&gt;
    close.addEventListener( &amp;#039;click&amp;#039;, hideOverlay );&lt;br /&gt;
    box.appendChild( msg );&lt;br /&gt;
    box.appendChild( open );&lt;br /&gt;
    box.appendChild( close );&lt;br /&gt;
    showOverlay( box );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* ---------- API 호출 ---------- */&lt;br /&gt;
  function getToken( type ) {&lt;br /&gt;
    return fetch( API + &amp;#039;?action=query&amp;amp;meta=tokens&amp;amp;type=&amp;#039; + type + &amp;#039;&amp;amp;format=json&amp;amp;formatversion=2&amp;#039; )&lt;br /&gt;
      .then( function ( r ) { return r.json(); } )&lt;br /&gt;
      .then( function ( d ) {&lt;br /&gt;
        var token = d.query &amp;amp;&amp;amp; d.query.tokens &amp;amp;&amp;amp; d.query.tokens[ type + &amp;#039;token&amp;#039; ];&lt;br /&gt;
        if ( !token ) throw new Error( &amp;#039;인증 토큰을 받지 못했습니다.&amp;#039; );&lt;br /&gt;
        return token;&lt;br /&gt;
      } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function createDraft( info ) {&lt;br /&gt;
    return getToken( &amp;#039;csrf&amp;#039; ).then( function ( token ) {&lt;br /&gt;
      var body = new URLSearchParams();&lt;br /&gt;
      body.set( &amp;#039;action&amp;#039;, &amp;#039;edit&amp;#039; );&lt;br /&gt;
      body.set( &amp;#039;title&amp;#039;, info.draftTitle );&lt;br /&gt;
      body.set( &amp;#039;text&amp;#039;, info.wikitext );&lt;br /&gt;
      body.set( &amp;#039;token&amp;#039;, token );&lt;br /&gt;
      body.set( &amp;#039;summary&amp;#039;, &amp;#039;자동 생성 초안 (AI)&amp;#039; );&lt;br /&gt;
      body.set( &amp;#039;watchlist&amp;#039;, &amp;#039;nochange&amp;#039; );&lt;br /&gt;
      body.set( &amp;#039;format&amp;#039;, &amp;#039;json&amp;#039; );&lt;br /&gt;
      body.set( &amp;#039;formatversion&amp;#039;, &amp;#039;2&amp;#039; );&lt;br /&gt;
      return fetch( API + &amp;#039;?action=edit&amp;amp;format=json&amp;amp;formatversion=2&amp;#039;, {&lt;br /&gt;
        method: &amp;#039;POST&amp;#039;,&lt;br /&gt;
        headers: { &amp;#039;Content-Type&amp;#039;: &amp;#039;application/x-www-form-urlencoded&amp;#039; },&lt;br /&gt;
        body: body&lt;br /&gt;
      } ).then( function ( r ) { return r.json(); } );&lt;br /&gt;
    } ).then( function ( d ) {&lt;br /&gt;
      if ( d.error ) throw new Error( d.error.info || d.error.code );&lt;br /&gt;
      if ( !d.edit || d.edit.result !== &amp;#039;Success&amp;#039; ) throw new Error( &amp;#039;초안 저장에 실패했습니다.&amp;#039; );&lt;br /&gt;
      return info;&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function approve( info ) {&lt;br /&gt;
    var box = el( &amp;#039;div&amp;#039;, null, &amp;#039;본문 문서로 이동하는 중...&amp;#039; );&lt;br /&gt;
    css( box, { fontWeight: &amp;#039;600&amp;#039; } );&lt;br /&gt;
    showOverlay( box );&lt;br /&gt;
    getToken( &amp;#039;csrf&amp;#039; ).then( function ( token ) {&lt;br /&gt;
      var body = new URLSearchParams();&lt;br /&gt;
      body.set( &amp;#039;action&amp;#039;, &amp;#039;move&amp;#039; );&lt;br /&gt;
      body.set( &amp;#039;from&amp;#039;, info.draftTitle );&lt;br /&gt;
      body.set( &amp;#039;to&amp;#039;, info.title );&lt;br /&gt;
      body.set( &amp;#039;token&amp;#039;, token );&lt;br /&gt;
      body.set( &amp;#039;reason&amp;#039;, &amp;#039;자동 생성 초안 승인&amp;#039; );&lt;br /&gt;
      body.set( &amp;#039;suppressredirect&amp;#039;, &amp;#039;1&amp;#039; );&lt;br /&gt;
      body.set( &amp;#039;format&amp;#039;, &amp;#039;json&amp;#039; );&lt;br /&gt;
      body.set( &amp;#039;formatversion&amp;#039;, &amp;#039;2&amp;#039; );&lt;br /&gt;
      return fetch( API + &amp;#039;?action=move&amp;amp;format=json&amp;amp;formatversion=2&amp;#039;, {&lt;br /&gt;
        method: &amp;#039;POST&amp;#039;,&lt;br /&gt;
        headers: { &amp;#039;Content-Type&amp;#039;: &amp;#039;application/x-www-form-urlencoded&amp;#039; },&lt;br /&gt;
        body: body&lt;br /&gt;
      } ).then( function ( r ) { return r.json(); } );&lt;br /&gt;
    } ).then( function ( d ) {&lt;br /&gt;
      if ( d.error ) throw new Error( d.error.info || d.error.code );&lt;br /&gt;
      if ( !d.move || d.move.from !== info.draftTitle ) throw new Error( &amp;#039;이동 결과를 확인할 수 없습니다.&amp;#039; );&lt;br /&gt;
      showApproved( info.title );&lt;br /&gt;
    } ).catch( function ( e ) {&lt;br /&gt;
      showError( &amp;#039;승인 실패: &amp;#039; + ( e.message || &amp;#039;알 수 없는 오류&amp;#039; ) );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function startGenerate( title ) {&lt;br /&gt;
    showGenerating( title );&lt;br /&gt;
    fetch( &amp;#039;/api/generate&amp;#039;, {&lt;br /&gt;
      method: &amp;#039;POST&amp;#039;,&lt;br /&gt;
      headers: { &amp;#039;Content-Type&amp;#039;: &amp;#039;application/json&amp;#039;, &amp;#039;X-Auto-Create&amp;#039;: &amp;#039;1&amp;#039; },&lt;br /&gt;
      body: JSON.stringify( { title: title } )&lt;br /&gt;
    } ).then( function ( r ) {&lt;br /&gt;
      return r.json().then( function ( j ) { return { status: r.status, body: j }; } );&lt;br /&gt;
    } ).then( function ( res ) {&lt;br /&gt;
      if ( res.status === 200 &amp;amp;&amp;amp; res.body.ok ) return createDraft( res.body );&lt;br /&gt;
      if ( res.status === 401 ) throw new Error( &amp;#039;로그인이 필요합니다.&amp;#039; );&lt;br /&gt;
      if ( res.status === 409 ) { showExists( res.body.url || res.body.title ); return null; }&lt;br /&gt;
      if ( res.status === 429 ) throw new Error( &amp;#039;요청이 너무 잦습니다. 잠시 후 다시 시도하세요.&amp;#039; );&lt;br /&gt;
      if ( res.status === 400 ) throw new Error( &amp;#039;사용할 수 없는 제목입니다.&amp;#039; );&lt;br /&gt;
      if ( res.status === 503 ) throw new Error( &amp;#039;자동 생성 기능이 아직 설정되지 않았습니다.&amp;#039; );&lt;br /&gt;
      throw new Error( &amp;#039;생성에 실패했습니다. (&amp;#039; + res.status + &amp;#039;)&amp;#039; );&lt;br /&gt;
    } ).then( function ( info ) {&lt;br /&gt;
      if ( info ) showResult( info );&lt;br /&gt;
    } ).catch( function ( e ) {&lt;br /&gt;
      showError( e.message || &amp;#039;알 수 없는 오류입니다.&amp;#039; );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
  }&lt;br /&gt;
} )();&lt;/div&gt;</summary>
		<author><name>Admina7ec671ac513</name></author>
	</entry>
</feed>